ZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggNjhhNTZhZC4uY2JjN2JiNyAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTIwODUsNiArMjA4NSwxMyBAQAogTDoJa2V4ZWNAbGlzdHMuaW5mcmFkZWFkLm9yZwogUzoJTWFpbnRhaW5lZAogCitLTElCQy9LSU5JVAorUDoJSC4gUGV0ZXIgQW52aW4KK006CWhwYUB6eXRvci5jb20KK0w6CWtsaWJjQHp5dG9yLmNvbQorVDoJZ2l0IGtlcm5lbC5vcmc6cHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2hwYS9saW51eC0yLjYta2xpYmMuZ2l0CitTOglNYWludGFpbmVkCisKIEtQUk9CRVMKIFA6CVByYXNhbm5hIFMgUGFuY2hhbXVraGkKIE06CXByYXNhbm5hQGluLmlibS5jb20KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZTY5OTBlMi4uNjQ1ZTMxOCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTE4Niw3ICsxODYsMTYgQEAKIENST1NTX0NPTVBJTEUJPz0KIAogIyBBcmNoaXRlY3R1cmUgYXMgcHJlc2VudCBpbiBjb21waWxlLmgKLVVUU19NQUNISU5FIDo9ICQoQVJDSCkKK1VUU19NQUNISU5FCTo9ICQoQVJDSCkKKworIyBBcmNoaXRlY3R1cmUgdXNlZCB0byBjb21waWxlIHVzZXItc3BhY2UgY29kZQorS0xJQkNBUkNICT89ICQoQVJDSCkKK0tMSUJDQVJDSERJUgk/PSAkKEtMSUJDQVJDSCkKKworIyBrbGliYyBkZWZpbml0aW9ucworZXhwb3J0IEtMSUJDSU5DIDo9IHVzci9pbmNsdWRlCitleHBvcnQgS0xJQkNTUkMgOj0gJChzcmN0cmVlKS91c3Iva2xpYmMKK2V4cG9ydCBLTElCQ09CSiA6PSAkKG9ianRyZWUpL3Vzci9rbGliYwogCiBLQ09ORklHX0NPTkZJRwk/PSAuY29uZmlnCiAKQEAgLTI4NCw2ICsyOTMsNyBAQAogQ0MJCT0gJChDUk9TU19DT01QSUxFKWdjYwogQ1BQCQk9ICQoQ0MpIC1FCiBBUgkJPSAkKENST1NTX0NPTVBJTEUpYXIKK1JBTkxJQgkJPSAkKENST1NTX0NPTVBJTEUpcmFubGliCiBOTQkJPSAkKENST1NTX0NPTVBJTEUpbm0KIFNUUklQCQk9ICQoQ1JPU1NfQ09NUElMRSlzdHJpcAogT0JKQ09QWQkJPSAkKENST1NTX0NPTVBJTEUpb2JqY29weQpAQCAtMzI0LDYgKzMzNCw3IEBACiBleHBvcnQgQVJDSCBDT05GSUdfU0hFTEwgSE9TVENDIEhPU1RDRkxBR1MgQ1JPU1NfQ09NUElMRSBBUyBMRCBDQwogZXhwb3J0IENQUCBBUiBOTSBTVFJJUCBPQkpDT1BZIE9CSkRVTVAgTUFLRSBBV0sgR0VOS1NZTVMgUEVSTCBVVFNfTUFDSElORQogZXhwb3J0IEhPU1RDWFggSE9TVENYWEZMQUdTIExERkxBR1NfTU9EVUxFIENIRUNLIENIRUNLRkxBR1MKK2V4cG9ydCBSQU5MSUIgS0xJQkNBUkNIIEtMSUJDQVJDSERJUgogCiBleHBvcnQgQ1BQRkxBR1MgTk9TVERJTkNfRkxBR1MgTElOVVhJTkNMVURFIE9CSkNPUFlGTEFHUyBMREZMQUdTCiBleHBvcnQgQ0ZMQUdTIENGTEFHU19LRVJORUwgQ0ZMQUdTX01PRFVMRQpAQCAtMTQxMSw0MSArMTQyMiw0NCBAQAogIyAtIGJ1aWxkIHdoaXRoIG1peGVkIHNvdXJjZSBhbmQgb3V0cHV0CiAjIC0gYnVpbGQgd2l0aCBzZXBhcmF0ZSBvdXRwdXQgZGlyICdtYWtlIE89Li4uJwogIyAtIGV4dGVybmFsIG1vZHVsZXMKKyMgLSBrbGliYyBsaWJyYXJ5IGFuZCBrbGliYyBwcm9ncmFtcyAoZXZlcnl0aGluZyB1bmRlciB1c3IvKQogIwogIyAgdGFyZ2V0LWRpciA9PiB3aGVyZSB0byBzdG9yZSBvdXRwdXRmaWxlCiAjICBidWlsZC1kaXIgID0+IGRpcmVjdG9yeSBpbiBrZXJuZWwgc291cmNlIHRyZWUgdG8gdXNlCiAKIGlmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQorICAgICAgICBzaW5nbGVibGQgID0gJChpZiAkKGZpbHRlciB1c3IvJSwkKGRpciAkQCkpLCQoa2xpYmMpLCQoYnVpbGQpKQogICAgICAgICBidWlsZC1kaXIgID0gJChwYXRzdWJzdCAlLywlLCQoZGlyICRAKSkKICAgICAgICAgdGFyZ2V0LWRpciA9ICQoZGlyICRAKQogZWxzZQorICAgICAgICBzaW5nbGVibGQgID0gJChidWlsZCkKICAgICAgICAgemFwLXNsYXNoPSQoZmlsdGVyLW91dCAuLCQocGF0c3Vic3QgJS8sJSwkKGRpciAkQCkpKQogICAgICAgICBidWlsZC1kaXIgID0gJChLQlVJTERfRVhUTU9EKSQoaWYgJCh6YXAtc2xhc2gpLC8kKHphcC1zbGFzaCkpCiAgICAgICAgIHRhcmdldC1kaXIgPSAkKGlmICQoS0JVSUxEX0VYVE1PRCksJChkaXIgJDwpLCQoZGlyICRAKSkKIGVuZGlmCiAKICUuczogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQotCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCisJJChRKSQoTUFLRSkgJChzaW5nbGVibGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCiAlLmk6ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorCSQoUSkkKE1BS0UpICQoc2luZ2xlYmxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQogJS5vOiAlLmMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCi0JJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKwkkKFEpJChNQUtFKSAkKHNpbmdsZWJsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKICUubHN0OiAlLmMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCi0JJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKwkkKFEpJChNQUtFKSAkKHNpbmdsZWJsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKICUuczogJS5TIHByZXBhcmUgc2NyaXB0cyBGT1JDRQotCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCisJJChRKSQoTUFLRSkgJChzaW5nbGVibGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCiAlLm86ICUuUyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorCSQoUSkkKE1BS0UpICQoc2luZ2xlYmxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQogJS5zeW10eXBlczogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCiAKICMgTW9kdWxlcwogLyAlLzogcHJlcGFyZSBzY3JpcHRzIEZPUkNFCiAJJChRKSQoTUFLRSkgS0JVSUxEX01PRFVMRVM9JChpZiAkKENPTkZJR19NT0RVTEVTKSwxKSBcCi0JJChidWlsZCk9JChidWlsZC1kaXIpCisJJChzaW5nbGVibGQpPSQoYnVpbGQtZGlyKQogJS5rbzogcHJlcGFyZSBzY3JpcHRzIEZPUkNFCiAJJChRKSQoTUFLRSkgS0JVSUxEX01PRFVMRVM9JChpZiAkKENPTkZJR19NT0RVTEVTKSwxKSAgIFwKLQkkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJChAOi5rbz0ubykKKwkkKHNpbmdsZWJsZCk9JChidWlsZC1kaXIpICQoQDoua289Lm8pCiAJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKIAogIyBGSVhNRSBTaG91bGQgZ28gaW50byBhIG1ha2UubGliIG9yIHNvbWV0aGluZyAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggMDQ1M2RjYy4uNzU3OGZlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKQEAgLTU2LDcgKzU2LDYgQEAKIAogZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQoc3RydWN0IG1lbWluZm8gKiwgc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYyk7CiBleHRlcm4gdm9pZCByZWJvb3Rfc2V0dXAoY2hhciAqc3RyKTsKLWV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogZXh0ZXJuIHZvaWQgX3N0ZXh0LCBfdGV4dCwgX2V0ZXh0LCBfX2RhdGFfc3RhcnQsIF9lZGF0YSwgX2VuZDsKIAogdW5zaWduZWQgaW50IHByb2Nlc3Nvcl9pZDsKQEAgLTUyMCwyMCArNTE5LDMxIEBACiAJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0Ci1zZXR1cF9yYW1kaXNrKGludCBkb2xvYWQsIGludCBwcm9tcHQsIGludCBpbWFnZV9zdGFydCwgdW5zaWduZWQgaW50IHJkX3N6KQorLyoKKyAqIEdlbmVyYXRlIC9hcmNoLmNtZCwgd2hpY2ggY29udGFpbnMgY29tbWFuZC1saW5lIGVxdWl2YWxlbnQgb3B0aW9ucworICogZm9yIGtpbml0LiAgV2UgZG8gdGhpcyBpbiB0d28gc3RlcHM6IHNhdmUgaW50byBhIGJ1ZmZlciwgYW5kIHRoZW4KKyAqIHdyaXRlIG91dCB0aGUgZmlsZSwgc2luY2UgdGhlIGZpcnN0IHN0ZXAgd2lsbCB0eXBpY2FsbHkgYmUgZG9uZQorICogdmVyeSBlYXJseSwgYW5kIHRoZSBzZWNvbmQgc3RlcCBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHJvb3RmcyBpcyBmdWxseQorICogb3BlcmF0aW9uYWwuCisgKi8KK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEgYXJjaF9jbWRfYnVmZmVyWzI1Nl07CitzdGF0aWMgaW50IF9faW5pdGRhdGEgYXJjaF9jbWRfbGVuOworCitzdGF0aWMgaW50IF9faW5pdCB3cml0ZV9hcmNoX2luaXRfY29tbWFuZCh2b2lkKQogewotI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQotCWV4dGVybiBpbnQgcmRfc2l6ZSwgcmRfaW1hZ2Vfc3RhcnQsIHJkX3Byb21wdCwgcmRfZG9sb2FkOworCWludCBmZDsKIAotCXJkX2ltYWdlX3N0YXJ0ID0gaW1hZ2Vfc3RhcnQ7Ci0JcmRfcHJvbXB0ID0gcHJvbXB0OwotCXJkX2RvbG9hZCA9IGRvbG9hZDsKKwlmZCA9IHN5c19vcGVuKCIvYXJjaC5jbWQiLCBPX1dST05MWXxPX0NSRUFUfE9fQVBQRU5ELCAwNjY2KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CiAKLQlpZiAocmRfc3opCi0JCXJkX3NpemUgPSByZF9zejsKLSNlbmRpZgorCXN5c193cml0ZShmZCwgYXJjaF9jbWRfYnVmZmVyLCBhcmNoX2NtZF9sZW4pOworCXN5c19jbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKIH0KKwkKK2xhdGVfaW5pdGNhbGwod3JpdGVfYXJjaF9pbml0X2NvbW1hbmQpOwogCiBzdGF0aWMgdm9pZCBfX2luaXQKIHJlcXVlc3Rfc3RhbmRhcmRfcmVzb3VyY2VzKHN0cnVjdCBtZW1pbmZvICptaSwgc3RydWN0IG1hY2hpbmVfZGVzYyAqbWRlc2MpCkBAIC01OTksMTMgKzYwOSwyNyBAQAogICogYSBwYXJhbV9zdHJ1Y3QpLiAgVGhlIGxpc3QgaXMgdGVybWluYXRlZCB3aXRoIGEgemVyby1sZW5ndGggdGFnICh0aGlzIHRhZwogICogaXMgbm90IHBhcnNlZCBpbiBhbnkgd2F5KS4KICAqLworCisKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19jb3JlKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKIHsKKwljaGFyICpidWYgPSBhcmNoX2NtZF9idWZmZXIgKyBhcmNoX2NtZF9sZW47CisJY2hhciAqZW5kID0gYXJjaF9jbWRfYnVmZmVyICsgc2l6ZW9mIGFyY2hfY21kX2J1ZmZlcjsKKworCWlmIChlbmQtYnVmIDw9IDMpCisJCXJldHVybiAtRU5PTUVNOworCisJKmJ1ZisrID0gJ3InOworCSpidWYgPSAnbyc7CiAJaWYgKHRhZy0+aGRyLnNpemUgPiAyKSB7CiAJCWlmICgodGFnLT51LmNvcmUuZmxhZ3MgJiAxKSA9PSAwKQotCQkJcm9vdF9tb3VudGZsYWdzICY9IH5NU19SRE9OTFk7CisJCQkqYnVmID0gJ3cnOwogCQlST09UX0RFViA9IG9sZF9kZWNvZGVfZGV2KHRhZy0+dS5jb3JlLnJvb3RkZXYpOwogCX0KKwlidWYrKzsKKwkqYnVmKysgPSAnXG4nOworCisJYXJjaF9jbWRfbGVuID0gZW5kLWJ1ZjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjU0LDExICs2NzgsMzUgQEAKIAogc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX3JhbWRpc2soY29uc3Qgc3RydWN0IHRhZyAqdGFnKQogewotCXNldHVwX3JhbWRpc2soKHRhZy0+dS5yYW1kaXNrLmZsYWdzICYgMSkgPT0gMCwKLQkJICAgICAgKHRhZy0+dS5yYW1kaXNrLmZsYWdzICYgMikgPT0gMCwKLQkJICAgICAgdGFnLT51LnJhbWRpc2suc3RhcnQsIHRhZy0+dS5yYW1kaXNrLnNpemUpOworI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQorCWNoYXIgKmJ1ZiA9IGFyY2hfY21kX2J1ZmZlciArIGFyY2hfY21kX2xlbjsKKwljaGFyICplbmQgPSBhcmNoX2NtZF9idWZmZXIgKyBzaXplb2YgYXJjaF9jbWRfYnVmZmVyOworCWludCBsZW47CisJCisJbGVuID0gc25wcmludGYoYnVmLCBlbmQtYnVmLAorCQkgICAgICAgInJhbWRpc2tfc3RhcnQ9JXVcbiIKKwkJICAgICAgICJsb2FkX3JhbWRpc2s9JWRcbiIKKwkJICAgICAgICJwcm9tcHRfcmFtZGlzaz0lZFxuIiwKKwkJICAgICAgIHRhZy0+dS5yYW1kaXNrLnN0YXJ0LAorCQkgICAgICAgdGFnLT51LnJhbWRpc2suZmxhZ3MgJiAxID8gMCA6IDEsCisJCSAgICAgICB0YWctPnUucmFtZGlzay5mbGFncyAmIDIgPyAwIDogMSk7CisJaWYgKGxlbiA+PSBlbmQtYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlidWYgKz0gbGVuOworCisJaWYgKHRhZy0+dS5yYW1kaXNrLnNpemUpIHsKKwkJbGVuID0gc25wcmludGYoYnVmLCBlbmQtYnVmLAorCQkJICAgICAgICJyYW1kaXNrX3NpemU9JXVcbiIsCisJCQkgICAgICAgdGFnLT51LnJhbWRpc2suc2l6ZSk7CisJCWlmIChsZW4gPj0gZW5kLWJ1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlidWYgKz0gbGVuOworCX0KKworCWFyY2hfY21kX2xlbiA9IGVuZC1idWY7CisjZW5kaWYKIAlyZXR1cm4gMDsKLX0KK30JCiAKIF9fdGFndGFibGUoQVRBR19SQU1ESVNLLCBwYXJzZV90YWdfcmFtZGlzayk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCA2OThjMjRmLi44NmU2YTI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC0xMjQsNyArMTI0LDYgQEAKICNlbmRpZgogCiBleHRlcm4gdm9pZCBlYXJseV9jcHVfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogCiB1bnNpZ25lZCBsb25nIHNhdmVkX3ZpZGVvbW9kZTsKIApAQCAtNTQyLDExICs1NDEsNiBAQAogCX0KIAlib290bG9hZGVyX3R5cGUgPSBMT0FERVJfVFlQRTsKIAotI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQotCXJkX2ltYWdlX3N0YXJ0ID0gUkFNRElTS19GTEFHUyAmIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSzsKLQlyZF9wcm9tcHQgPSAoKFJBTURJU0tfRkxBR1MgJiBSQU1ESVNLX1BST01QVF9GTEFHKSAhPSAwKTsKLQlyZF9kb2xvYWQgPSAoKFJBTURJU0tfRkxBR1MgJiBSQU1ESVNLX0xPQURfRkxBRykgIT0gMCk7Ci0jZW5kaWYKIAlBUkNIX1NFVFVQCiAJaWYgKGVmaV9lbmFibGVkKQogCQllZmlfaW5pdCgpOwpAQCAtNTU3LDggKzU1MSw2IEBACiAKIAljb3B5X2VkZCgpOwogCi0JaWYgKCFNT1VOVF9ST09UX1JET05MWSkKLQkJcm9vdF9tb3VudGZsYWdzICY9IH5NU19SRE9OTFk7CiAJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpIF90ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgX2V0ZXh0OwogCWluaXRfbW0uZW5kX2RhdGEgPSAodW5zaWduZWQgbG9uZykgX2VkYXRhOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCmluZGV4IGQ2MDE0YTYuLjVmZTEwMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKQEAgLTUzLDYgKzUzLDcgQEAKIGVuZGlmCiAKIFVUU19NQUNISU5FIDo9ICQoT0xEQVJDSCkKK0tMSUJDQVJDSCAgIDo9ICQoT0xEQVJDSCkKIAogaWZlcSAoJChIQVNfQklBUkNIKSx5KQogb3ZlcnJpZGUgQVMJKz0gLWEkKFNaKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL01ha2VmaWxlIGIvYXJjaC9zMzkwL01ha2VmaWxlCmluZGV4IDY4NDQxZTAuLjBiMWU5MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIFVUU19NQUNISU5FCTo9IHMzOTAKIFNUQUNLX1NJWkUJOj0gODE5MgogQ0hFQ0tGTEFHUwkrPSAtRF9fczM5MF9fCitLTElCQ0FSQ0gJOj0gczM5MAogZWxzZQogTERGTEFHUwkJOj0gLW0gZWxmNjRfczM5MAogTU9ERkxBR1MJKz0gLWZwaWMgLURfX1BJQ19fCkBAIC0yOCw4ICsyOSwxMSBAQAogVVRTX01BQ0hJTkUJOj0gczM5MHgKIFNUQUNLX1NJWkUJOj0gMTYzODQKIENIRUNLRkxBR1MJKz0gLURfX3MzOTBfXyAtRF9fczM5MHhfXworS0xJQkNBUkNICTo9IHMzOTB4CiBlbmRpZgogCitLTElCQ0FSQ0hESVIJOj0gczM5MAorCiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfRzUpICAgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9ZzUpCiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWjkwMCkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9ejkwMCkKIGNmbGFncy0kKENPTkZJR19NQVJDSF9aOTkwKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD16OTkwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKaW5kZXggNjRjMGVkOS4uMmIwODlkNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCkBAIC0yMjgsOCArMjI4LDYgQEAKICNkZWZpbmUgUkFNRElTS19QUk9NUFRfRkxBRwkJMHg4MDAwCiAjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHCQkweDQwMDAKIAotZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7Ci0KIGNoYXIgcmVib290X2NvbW1hbmRbQ09NTUFORF9MSU5FX1NJWkVdOwogZW51bSBzcGFyY19jcHUgc3BhcmNfY3B1X21vZGVsOwogCkBAIC0zMTYsMTQgKzMxNCw3IEBACiAJfQogCXBmbl9iYXNlID0gcGh5c19iYXNlID4+IFBBR0VfU0hJRlQ7CiAKLQlpZiAoIXJvb3RfZmxhZ3MpCi0JCXJvb3RfbW91bnRmbGFncyAmPSB+TVNfUkRPTkxZOwogCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYocm9vdF9kZXYpOwotI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQotCXJkX2ltYWdlX3N0YXJ0ID0gcmFtX2ZsYWdzICYgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLOwotCXJkX3Byb21wdCA9ICgocmFtX2ZsYWdzICYgUkFNRElTS19QUk9NUFRfRkxBRykgIT0gMCk7Ci0JcmRfZG9sb2FkID0gKChyYW1fZmxhZ3MgJiBSQU1ESVNLX0xPQURfRkxBRykgIT0gMCk7CQotI2VuZGlmCiAKIAlwcm9tX3NldHN5bmMocHJvbV9zeW5jX21lKTsKIApAQCAtMzc2LDYgKzM2Nyw0NCBAQAogfQogY29uc29sZV9pbml0Y2FsbChzZXRfcHJlZmVycmVkX2NvbnNvbGUpOwogCisvKgorICogUGxhdGZvcm0tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBjb21tYW5kcyB3aGljaCBkb24ndCBjb21lIGZyb20KKyAqIHRoZSBhY3R1YWwga2VybmVsIGNvbW1hbmQgbGluZS4gIFdyaXRlIHRoZW0gaW50byBhIGZpbGUgaW4gcm9vdGZzCisgKiBzbyBraW5pdCBjYW4gcGljayB0aGVtIHVwLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXRfYXJjaF9pbml0X2NvbW1hbmRzKHZvaWQpCit7CisJaW50IGZkID0gc3lzX29wZW4oIi9hcmNoLmNtZCIsIE9fV1JPTkxZfE9fQ1JFQVR8T19BUFBFTkQsIDA2NjYpOworCWNoYXIgYnVmZmVyWzI1Nl07CisJaW50IGxlbiA9IDA7CisKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwlidWZmZXJbMF0gPSAncic7CisJYnVmZmVyWzFdID0gcm9vdF9mbGFncyA/ICdvJyA6ICd3JzsKKwlidWZmZXJbMl0gPSAnXG4nOworCWxlbiA9IDM7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KKwlsZW4gKz0gbWluKChpbnQpKHNpemVvZiBidWZmZXIgLSAxIC0gbGVuKSwKKwkJICAgc25wcmludGYoYnVmZmVyK2xlbiwgc2l6ZW9mIGJ1ZmZlciAtIGxlbiwKKwkJCSAgICAicmFtZGlza19zdGFydD0ldVxuIgorCQkJICAgICJwcm9tcHRfcmFtZGlzaz0lZFxuIgorCQkJICAgICJsb2FkX3JhbWRpc2s9JWRcbiIsCisJCQkgICAgcmFtX2ZsYWdzICYgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLLAorCQkJICAgICEhKHJhbV9mbGFncyAmIFJBTURJU0tfUFJPTVBUX0ZMQUcpLAorCQkJICAgICEhKHJhbV9mbGFncyAmIFJBTURJU0tfTE9BRF9GTEFHKSkpOworI2VuZGlmCisKKwlzeXNfd3JpdGUoZmQsIGJ1ZmZlciwgbGVuKTsKKwlzeXNfY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CisKK2xhdGVfaW5pdGNhbGwoc2V0X2FyY2hfaW5pdF9jb21tYW5kcyk7CisKIGV4dGVybiBjaGFyICpzcGFyY19jcHVfdHlwZTsKIGV4dGVybiBjaGFyICpzcGFyY19mcHVfdHlwZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDQ1MTAyODMuLjBmMjhkOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtOTAsNiArOTEsMTYgQEAKIHsKIH0KIAoraW50IG9icF9zeXN0ZW1faW50cih2b2lkKQoreworCWlmIChib290X2ZsYWdzICYgQk9PVE1FX0RFQlVHKSB7CisJCXByaW50aygiT0JQOiBzeXN0ZW0gaW50ZXJydXB0ZWRcbiIpOworCQlwcm9tX2hhbHQoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiAvKiAKICAqIFByb2Nlc3Mga2VybmVsIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUKICAqIFNQQVJDIG9yIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGxvdy1sZXZlbCBwcm9jZXNzaW5nLgpAQCAtMjAxLDggKzIxMiw2IEBACiAjZGVmaW5lIFJBTURJU0tfUFJPTVBUX0ZMQUcJCTB4ODAwMAogI2RlZmluZSBSQU1ESVNLX0xPQURfRkxBRwkJMHg0MDAwCiAKLWV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwotCiBjaGFyIHJlYm9vdF9jb21tYW5kW0NPTU1BTkRfTElORV9TSVpFXTsKIAogc3RhdGljIHN0cnVjdCBwdF9yZWdzIGZha2Vfc3dhcHBlcl9yZWdzID0geyB7IDAsIH0sIDAsIDAsIDAsIDAgfTsKQEAgLTMwMiw2ICszMTEsNjQgQEAKIAl9CiB9CiAKKy8qCisgKiBQbGF0Zm9ybS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGNvbW1hbmRzIHdoaWNoIGRvbid0IGNvbWUgZnJvbQorICogdGhlIGFjdHVhbCBrZXJuZWwgY29tbWFuZCBsaW5lLiAgV3JpdGUgdGhlbSBpbnRvIGEgZmlsZSBpbiByb290ZnMKKyAqIHNvIGtpbml0IGNhbiBwaWNrIHRoZW0gdXAuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldF9hcmNoX2luaXRfY29tbWFuZHModm9pZCkKK3sKKwlpbnQgZmQgPSBzeXNfb3BlbigiL2FyY2guY21kIiwgT19XUk9OTFl8T19DUkVBVHxPX0FQUEVORCwgMDY2Nik7CisJaW50IGNob3NlbjsKKwl1MzIgY2wsIHN2LCBndzsKKwljaGFyIGJ1ZmZlclsyNTZdOworCWludCBsZW4gPSAwOworCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJYnVmZmVyWzBdID0gJ3InOworCWJ1ZmZlclsxXSA9IHJvb3RfZmxhZ3MgPyAnbycgOiAndyc7CisJYnVmZmVyWzJdID0gJ1xuJzsKKwlsZW4gPSAzOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCisJbGVuICs9IG1pbigoaW50KShzaXplb2YgYnVmZmVyIC0gMSAtIGxlbiksCisJCSAgIHNucHJpbnRmKGJ1ZmZlcitsZW4sIHNpemVvZiBidWZmZXIgLSBsZW4sCisJCQkgICAgInJhbWRpc2tfc3RhcnQ9JXVcbiIKKwkJCSAgICAicHJvbXB0X3JhbWRpc2s9JWRcbiIKKwkJCSAgICAibG9hZF9yYW1kaXNrPSVkXG4iLAorCQkJICAgIHJhbV9mbGFncyAmIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSywKKwkJCSAgICAhIShyYW1fZmxhZ3MgJiBSQU1ESVNLX1BST01QVF9GTEFHKSwKKwkJCSAgICAhIShyYW1fZmxhZ3MgJiBSQU1ESVNLX0xPQURfRkxBRykpKTsKKyNlbmRpZgorCisJY2hvc2VuID0gcHJvbV9maW5kZGV2aWNlKCIvY2hvc2VuIik7CisJY2wgPSBwcm9tX2dldGludGRlZmF1bHQoY2hvc2VuLCAiY2xpZW50LWlwIiwgMCk7CisJc3YgPSBwcm9tX2dldGludGRlZmF1bHQoY2hvc2VuLCAic2VydmVyLWlwIiwgMCk7CisJZ3cgPSBwcm9tX2dldGludGRlZmF1bHQoY2hvc2VuLCAiZ2F0ZXdheS1pcCIsIDApOworCisJaWYgKGNsICYmIHN2KSB7CisJCWxlbiArPSBtaW4oKGludCkoc2l6ZW9mIGJ1ZmZlciAtIDEgLSBsZW4pLAorCQkJICAgc25wcmludGYoYnVmZmVyK2xlbiwgc2l6ZW9mIGJ1ZmZlciAtIGxlbiwKKwkJCQkgICAgImlwPSV1LiV1LiV1LiV1OiV1LiV1LiV1LiV1OiIKKwkJCQkgICAgIiV1LiV1LiV1LiV1XG4iLAorCQkJCSAgICAodTgpKGNsID4+IDI0KSwgKHU4KShjbCA+PiAxNiksCisJCQkJICAgICh1OCkoY2wgPj4gOCksICh1OCljbCwKKwkJCQkgICAgKHU4KShzdiA+PiAyNCksICh1OCkoc3YgPj4gMTYpLAorCQkJCSAgICAodTgpKHN2ID4+IDgpLCAodTgpc3YsCisJCQkJICAgICh1OCkoZ3cgPj4gMjQpLCAodTgpKGd3ID4+IDE2KSwKKwkJCQkgICAgKHU4KShndyA+PiA4KSwgKHU4KWd3KSk7CisJfQorCisJc3lzX3dyaXRlKGZkLCBidWZmZXIsIGxlbik7CisJc3lzX2Nsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKHNldF9hcmNoX2luaXRfY29tbWFuZHMpOworCiAjaWZkZWYgQ09ORklHX1NNUAogdm9pZCBfX2luaXQgYm9vdF9jcHVfaWRfdG9vX2xhcmdlKGludCBjcHUpCiB7CkBAIC0zMzIsMzcgKzM5OSwxMCBAQAogCiAJaWRwcm9tX2luaXQoKTsKIAotCWlmICghcm9vdF9mbGFncykKLQkJcm9vdF9tb3VudGZsYWdzICY9IH5NU19SRE9OTFk7CiAJUk9PVF9ERVYgPSBvbGRfZGVjb2RlX2Rldihyb290X2Rldik7Ci0jaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCi0JcmRfaW1hZ2Vfc3RhcnQgPSByYW1fZmxhZ3MgJiBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0s7Ci0JcmRfcHJvbXB0ID0gKChyYW1fZmxhZ3MgJiBSQU1ESVNLX1BST01QVF9GTEFHKSAhPSAwKTsKLQlyZF9kb2xvYWQgPSAoKHJhbV9mbGFncyAmIFJBTURJU0tfTE9BRF9GTEFHKSAhPSAwKTsJCi0jZW5kaWYKIAogCXRhc2tfdGhyZWFkX2luZm8oJmluaXRfdGFzayktPmtyZWdzID0gJmZha2Vfc3dhcHBlcl9yZWdzOwogCi0jaWZkZWYgQ09ORklHX0lQX1BOUAotCWlmICghaWNfc2V0X21hbnVhbGx5KSB7Ci0JCWludCBjaG9zZW4gPSBwcm9tX2ZpbmRkZXZpY2UgKCIvY2hvc2VuIik7Ci0JCXUzMiBjbCwgc3YsIGd3OwotCQkKLQkJY2wgPSBwcm9tX2dldGludGRlZmF1bHQgKGNob3NlbiwgImNsaWVudC1pcCIsIDApOwotCQlzdiA9IHByb21fZ2V0aW50ZGVmYXVsdCAoY2hvc2VuLCAic2VydmVyLWlwIiwgMCk7Ci0JCWd3ID0gcHJvbV9nZXRpbnRkZWZhdWx0IChjaG9zZW4sICJnYXRld2F5LWlwIiwgMCk7Ci0JCWlmIChjbCAmJiBzdikgewotCQkJaWNfbXlhZGRyID0gY2w7Ci0JCQlpY19zZXJ2YWRkciA9IHN2OwotCQkJaWYgKGd3KQotCQkJCWljX2dhdGV3YXkgPSBndzsKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9QTlBfQk9PVFApIHx8IGRlZmluZWQoQ09ORklHX0lQX1BOUF9SQVJQKQotCQkJaWNfcHJvdG9fZW5hYmxlZCA9IDA7Ci0jZW5kaWYKLQkJfQotCX0KLSNlbmRpZgotCiAJLyogR2V0IGJvb3QgcHJvY2Vzc29yIHRyYXBfYmxvY2tbXSBzZXR1cC4gICovCiAJaW5pdF9jdXJfY3B1X3RyYXAoY3VycmVudF90aHJlYWRfaW5mbygpKTsKIApAQCAtNDI1LDcgKzQ2NSw3IEBACiAKIHN0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqX191bnVzZWQpCiB7Ci0Jc2VxX3ByaW50ZihtLCAKKwlzZXFfcHJpbnRmKG0sCiAJCSAgICJjcHVcdFx0OiAlc1xuIgogCQkgICAiZnB1XHRcdDogJXNcbiIKIAkJICAgInByb21cdFx0OiAlc1xuIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZSBiL2FyY2gvdW0vTWFrZWZpbGUKaW5kZXggNWQ1ZWQ3Mi4uYjNjYTdiZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC01MCw2ICs1MCw4IEBACiBlbmRpZgogU1lTX0RJUgkJOj0gJChBUkNIX0RJUikvaW5jbHVkZS9zeXNkZXAtJChTVUJBUkNIKQogCitLTElCQ0FSQ0gJOj0gJChTVUJBUkNIKQorCiAjIC1Edm1hcD1rZXJuZWxfdm1hcCBwcmV2ZW50cyBhbnl0aGluZyBmcm9tIHJlZmVyZW5jaW5nIHRoZSBsaWJwY2FwLm8gc3ltYm9sIHNvCiAjIG5hbWVkIC0gaXQncyBhIGNvbW1vbiBzeW1ib2wgaW4gbGlicGNhcCwgc28gd2UgZ2V0IGEgYmluYXJ5IHdoaWNoIGNyYXNoZXMuCiAjCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGViNjUyNGYuLjQ3YWVmMzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCkBAIC0yMzEsMTYgKzIzMSw5IEBACiAJc2F2ZWRfdmlkZW9fbW9kZSA9IFNBVkVEX1ZJREVPX01PREU7CiAJYm9vdGxvYWRlcl90eXBlID0gTE9BREVSX1RZUEU7CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KLQlyZF9pbWFnZV9zdGFydCA9IFJBTURJU0tfRkxBR1MgJiBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0s7Ci0JcmRfcHJvbXB0ID0gKChSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19QUk9NUFRfRkxBRykgIT0gMCk7Ci0JcmRfZG9sb2FkID0gKChSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19MT0FEX0ZMQUcpICE9IDApOwotI2VuZGlmCiAJc2V0dXBfbWVtb3J5X3JlZ2lvbigpOwogCWNvcHlfZWRkKCk7CiAKLQlpZiAoIU1PVU5UX1JPT1RfUkRPTkxZKQotCQlyb290X21vdW50ZmxhZ3MgJj0gfk1TX1JET05MWTsKIAlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl90ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKIAlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCAwZmEwYzExLi40YTViZGZmIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTE2OTAsMjAgKzE2OTAsNiBAQAogCSAgVENQIGNvbm5lY3Rpb25zIHVzdWFsbHkgcGVyZm9ybSBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBVRFAgd2hlbgogCSAgdGhlIG5ldHdvcmsgaXMgbG9zc3kgb3IgY29uZ2VzdGVkLiAgSWYgdW5zdXJlLCBzYXkgWS4KIAotY29uZmlnIFJPT1RfTkZTCi0JYm9vbCAiUm9vdCBmaWxlIHN5c3RlbSBvbiBORlMiCi0JZGVwZW5kcyBvbiBORlNfRlM9eSAmJiBJUF9QTlAKLQloZWxwCi0JICBJZiB5b3Ugd2FudCB5b3VyIExpbnV4IGJveCB0byBtb3VudCBpdHMgd2hvbGUgcm9vdCBmaWxlIHN5c3RlbSAodGhlCi0JICBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGZyb20gc29tZSBvdGhlciBjb21wdXRlciBvdmVyIHRoZQotCSAgbmV0IHZpYSBORlMgKHByZXN1bWFibHkgYmVjYXVzZSB5b3VyIGJveCBkb2Vzbid0IGhhdmUgYSBoYXJkIGRpc2spLAotCSAgc2F5IFkuIFJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZnNyb290LnR4dD4gZm9yIGRldGFpbHMuIEl0IGlzCi0JICBsaWtlbHkgdGhhdCBpbiB0aGlzIGNhc2UsIHlvdSBhbHNvIHdhbnQgdG8gc2F5IFkgdG8gIktlcm5lbCBsZXZlbCBJUAotCSAgYXV0b2NvbmZpZ3VyYXRpb24iIHNvIHRoYXQgeW91ciBib3ggY2FuIGRpc2NvdmVyIGl0cyBuZXR3b3JrIGFkZHJlc3MKLQkgIGF0IGJvb3QgdGltZS4KLQotCSAgTW9zdCBwZW9wbGUgc2F5IE4gaGVyZS4KLQogY29uZmlnIExPQ0tECiAJdHJpc3RhdGUKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL01ha2VmaWxlIGIvZnMvbmZzL01ha2VmaWxlCmluZGV4IGY0NTgwYjQuLjk4YjljZDMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9NYWtlZmlsZQorKysgYi9mcy9uZnMvTWFrZWZpbGUKQEAgLTcsNyArNyw2IEBACiBuZnMteSAJCQk6PSBjbGllbnQubyBkaXIubyBmaWxlLm8gZ2V0cm9vdC5vIGlub2RlLm8gc3VwZXIubyBuZnMyeGRyLm8gXAogCQkJICAgcGFnZWxpc3QubyBwcm9jLm8gcmVhZC5vIHN5bWxpbmsubyB1bmxpbmsubyBcCiAJCQkgICB3cml0ZS5vIG5hbWVzcGFjZS5vCi1uZnMtJChDT05GSUdfUk9PVF9ORlMpCSs9IG5mc3Jvb3QubyBtb3VudF9jbG50Lm8gICAgICAKIG5mcy0kKENPTkZJR19ORlNfVjMpCSs9IG5mczNwcm9jLm8gbmZzM3hkci5vCiBuZnMtJChDT05GSUdfTkZTX1YzX0FDTCkJKz0gbmZzM2FjbC5vCiBuZnMtJChDT05GSUdfTkZTX1Y0KQkrPSBuZnM0cHJvYy5vIG5mczR4ZHIubyBuZnM0c3RhdGUubyBuZnM0cmVuZXdkLm8gXApkaWZmIC0tZ2l0IGEvZnMvbmZzL21vdW50X2NsbnQuYyBiL2ZzL25mcy9tb3VudF9jbG50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNWEyNjYuLjAwMDAwMDAKLS0tIGEvZnMvbmZzL21vdW50X2NsbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogbGludXgvZnMvbmZzL21vdW50X2NsbnQuYwotICoKLSAqIE1PVU5UIGNsaWVudCB0byBzdXBwb3J0IE5GU3Jvb3QuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgotI2luY2x1ZGUgPGxpbnV4L25ldC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KLQotI2lmZGVmIFJQQ19ERUJVRwotIyBkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCU5GU0RCR19ST09UCi0jZW5kaWYKLQotLyoKLSNkZWZpbmUgTU9VTlRfUFJPR1JBTQkJMTAwMDA1Ci0jZGVmaW5lIE1PVU5UX1ZFUlNJT04JCTEKLSNkZWZpbmUgTU9VTlRfTU5UCQkxCi0jZGVmaW5lIE1PVU5UX1VNTlQJCTMKLSAqLwotCi1zdGF0aWMgc3RydWN0IHJwY19jbG50ICoJbW50X2NyZWF0ZShjaGFyICosIHN0cnVjdCBzb2NrYWRkcl9pbiAqLAotCQkJCQkJCQlpbnQsIGludCk7Ci1zdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW1udF9wcm9ncmFtOwotCi1zdHJ1Y3QgbW50X2Zoc3RhdHVzIHsKLQl1bnNpZ25lZCBpbnQJCXN0YXR1czsKLQlzdHJ1Y3QgbmZzX2ZoICoJCWZoOwotfTsKLQotLyoKLSAqIE9idGFpbiBhbiBORlMgZmlsZSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBob3N0IGFuZCBwYXRoCi0gKi8KLWludAotbmZzcm9vdF9tb3VudChzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGNoYXIgKnBhdGgsIHN0cnVjdCBuZnNfZmggKmZoLAotCQlpbnQgdmVyc2lvbiwgaW50IHByb3RvY29sKQotewotCXN0cnVjdCBycGNfY2xudAkJKm1udF9jbG50OwotCXN0cnVjdCBtbnRfZmhzdGF0dXMJcmVzdWx0ID0gewotCQkuZmgJCT0gZmgKLQl9OwotCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cJPSB7Ci0JCS5ycGNfYXJncAk9IHBhdGgsCi0JCS5ycGNfcmVzcAk9ICZyZXN1bHQsCi0JfTsKLQljaGFyCQkJaG9zdG5hbWVbMzJdOwotCWludAkJCXN0YXR1czsKLQotCWRwcmludGsoIk5GUzogICAgICBuZnNfbW91bnQoJTA4eDolcylcbiIsCi0JCQkodW5zaWduZWQpbnRvaGwoYWRkci0+c2luX2FkZHIuc19hZGRyKSwgcGF0aCk7Ci0KLQlzcHJpbnRmKGhvc3RuYW1lLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKGFkZHItPnNpbl9hZGRyLnNfYWRkcikpOwotCW1udF9jbG50ID0gbW50X2NyZWF0ZShob3N0bmFtZSwgYWRkciwgdmVyc2lvbiwgcHJvdG9jb2wpOwotCWlmIChJU19FUlIobW50X2NsbnQpKQotCQlyZXR1cm4gUFRSX0VSUihtbnRfY2xudCk7Ci0KLQlpZiAodmVyc2lvbiA9PSBORlNfTU5UM19WRVJTSU9OKQotCQltc2cucnBjX3Byb2MgPSAmbW50X2NsbnQtPmNsX3Byb2NpbmZvW01PVU5UUFJPQzNfTU5UXTsKLQllbHNlCi0JCW1zZy5ycGNfcHJvYyA9ICZtbnRfY2xudC0+Y2xfcHJvY2luZm9bTU5UUFJPQ19NTlRdOwotCi0Jc3RhdHVzID0gcnBjX2NhbGxfc3luYyhtbnRfY2xudCwgJm1zZywgMCk7Ci0JcmV0dXJuIHN0YXR1cyA8IDA/IHN0YXR1cyA6IChyZXN1bHQuc3RhdHVzPyAtRUFDQ0VTIDogMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgotbW50X2NyZWF0ZShjaGFyICpob3N0bmFtZSwgc3RydWN0IHNvY2thZGRyX2luICpzcnZhZGRyLCBpbnQgdmVyc2lvbiwKLQkJaW50IHByb3RvY29sKQotewotCXN0cnVjdCBycGNfY3JlYXRlX2FyZ3MgYXJncyA9IHsKLQkJLnByb3RvY29sCT0gcHJvdG9jb2wsCi0JCS5hZGRyZXNzCT0gKHN0cnVjdCBzb2NrYWRkciAqKXNydmFkZHIsCi0JCS5hZGRyc2l6ZQk9IHNpemVvZigqc3J2YWRkciksCi0JCS5zZXJ2ZXJuYW1lCT0gaG9zdG5hbWUsCi0JCS5wcm9ncmFtCT0gJm1udF9wcm9ncmFtLAotCQkudmVyc2lvbgk9IHZlcnNpb24sCi0JCS5hdXRoZmxhdm9yCT0gUlBDX0FVVEhfVU5JWCwKLQkJLmZsYWdzCQk9IChSUENfQ0xOVF9DUkVBVEVfT05FU0hPVCB8Ci0JCQkJICAgUlBDX0NMTlRfQ1JFQVRFX0lOVFIpLAotCX07Ci0KLQlyZXR1cm4gcnBjX2NyZWF0ZSgmYXJncyk7Ci19Ci0KLS8qCi0gKiBYRFIgZW5jb2RlL2RlY29kZSBmdW5jdGlvbnMgZm9yIE1PVU5UCi0gKi8KLXN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfZGlycGF0aChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBjaGFyICpwYXRoKQotewotCXAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBwYXRoKTsKLQotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAoteGRyX2RlY29kZV9maHN0YXR1cyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbW50X2Zoc3RhdHVzICpyZXMpCi17Ci0Jc3RydWN0IG5mc19maCAqZmggPSByZXMtPmZoOwotCi0JaWYgKChyZXMtPnN0YXR1cyA9IG50b2hsKCpwKyspKSA9PSAwKSB7Ci0JCWZoLT5zaXplID0gTkZTMl9GSFNJWkU7Ci0JCW1lbWNweShmaC0+ZGF0YSwgcCwgTkZTMl9GSFNJWkUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAoteGRyX2RlY29kZV9maHN0YXR1czMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG1udF9maHN0YXR1cyAqcmVzKQotewotCXN0cnVjdCBuZnNfZmggKmZoID0gcmVzLT5maDsKLQotCWlmICgocmVzLT5zdGF0dXMgPSBudG9obCgqcCsrKSkgPT0gMCkgewotCQlpbnQgc2l6ZSA9IG50b2hsKCpwKyspOwotCQlpZiAoc2l6ZSA8PSBORlMzX0ZIU0laRSkgewotCQkJZmgtPnNpemUgPSBzaXplOwotCQkJbWVtY3B5KGZoLT5kYXRhLCBwLCBzaXplKTsKLQkJfSBlbHNlCi0JCQlyZXMtPnN0YXR1cyA9IC1FQkFESEFORExFOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBNTlRfZGlycGF0aF9zegkJKDEgKyAyNTYpCi0jZGVmaW5lIE1OVF9maHN0YXR1c19zegkJKDEgKyA4KQotI2RlZmluZSBNTlRfZmhzdGF0dXMzX3N6CSgxICsgMTYpCi0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2NpbmZvCW1udF9wcm9jZWR1cmVzW10gPSB7Ci1bTU5UUFJPQ19NTlRdID0gewotCSAgLnBfcHJvYwkJPSBNTlRQUk9DX01OVCwKLQkgIC5wX2VuY29kZQkJPSAoa3hkcnByb2NfdCkgeGRyX2VuY29kZV9kaXJwYXRoLAkKLQkgIC5wX2RlY29kZQkJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9maHN0YXR1cywKLQkgIC5wX2FyZ2xlbgkJPSBNTlRfZGlycGF0aF9zeiwKLQkgIC5wX3JlcGxlbgkJPSBNTlRfZmhzdGF0dXNfc3osCi0JICAucF9zdGF0aWR4CQk9IE1OVFBST0NfTU5ULAotCSAgLnBfbmFtZQkJPSAiTU9VTlQiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBtbnQzX3Byb2NlZHVyZXNbXSA9IHsKLVtNT1VOVFBST0MzX01OVF0gPSB7Ci0JICAucF9wcm9jCQk9IE1PVU5UUFJPQzNfTU5ULAotCSAgLnBfZW5jb2RlCQk9IChreGRycHJvY190KSB4ZHJfZW5jb2RlX2RpcnBhdGgsCi0JICAucF9kZWNvZGUJCT0gKGt4ZHJwcm9jX3QpIHhkcl9kZWNvZGVfZmhzdGF0dXMzLAotCSAgLnBfYXJnbGVuCQk9IE1OVF9kaXJwYXRoX3N6LAotCSAgLnBfcmVwbGVuCQk9IE1OVF9maHN0YXR1czNfc3osCi0JICAucF9zdGF0aWR4CQk9IE1PVU5UUFJPQzNfTU5ULAotCSAgLnBfbmFtZQkJPSAiTU9VTlQiLAotCX0sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbW50X3ZlcnNpb24xID0gewotCQkubnVtYmVyCQk9IDEsCi0JCS5ucnByb2NzIAk9IDIsCi0JCS5wcm9jcyAJCT0gbW50X3Byb2NlZHVyZXMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gICAgICAgbW50X3ZlcnNpb24zID0gewotCQkubnVtYmVyCQk9IDMsCi0JCS5ucnByb2NzCT0gMiwKLQkJLnByb2NzCQk9IG1udDNfcHJvY2VkdXJlcwotfTsKLQotc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW1udF92ZXJzaW9uW10gPSB7Ci0JTlVMTCwKLQkmbW50X3ZlcnNpb24xLAotCU5VTEwsCi0JJm1udF92ZXJzaW9uMywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW1udF9zdGF0czsKLQotc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQltbnRfcHJvZ3JhbSA9IHsKLQkubmFtZQkJPSAibW91bnQiLAotCS5udW1iZXIJCT0gTkZTX01OVF9QUk9HUkFNLAotCS5ucnZlcnMJCT0gQVJSQVlfU0laRShtbnRfdmVyc2lvbiksCi0JLnZlcnNpb24JPSBtbnRfdmVyc2lvbiwKLQkuc3RhdHMJCT0gJm1udF9zdGF0cywKLX07CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzcm9vdC5jIGIvZnMvbmZzL25mc3Jvb3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkMTAwOC4uMDAwMDAwMAotLS0gYS9mcy9uZnMvbmZzcm9vdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qCi0gKiAgJElkOiBuZnNyb290LmMsdiAxLjQ1IDE5OTgvMDMvMDcgMTA6NDQ6NDYgbWogRXhwICQKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2ICBHZXJvIEt1aGxtYW5uIDxnZXJvQGdrbWluaXguaGFuLmRlPgotICoKLSAqICBBbGxvdyBhbiBORlMgZmlsZXN5c3RlbSB0byBiZSBtb3VudGVkIGFzIHJvb3QuIFRoZSB3YXkgdGhpcyB3b3JrcyBpczoKLSAqICAgICAoMSkgVXNlIHRoZSBJUCBhdXRvY29uZmlnIG1lY2hhbmlzbSB0byBzZXQgbG9jYWwgSVAgYWRkcmVzc2VzIGFuZCByb3V0ZXMuCi0gKiAgICAgKDIpIEhhbmRsZSBSUEMgbmVnb3RpYXRpb24gd2l0aCB0aGUgc3lzdGVtIHdoaWNoIHJlcGxpZWQgdG8gUkFSUCBvcgotICogICAgICAgICB3YXMgcmVwb3J0ZWQgYXMgYSBib290IHNlcnZlciBieSBCT09UUCBvciBtYW51YWxseS4KLSAqICAgICAoMykgVGhlIGFjdHVhbCBtb3VudGluZyBpcyBkb25lIGxhdGVyLCB3aGVuIGluaXQoKSBpcyBydW5uaW5nLgotICoKLSAqCi0gKglDaGFuZ2VzOgotICoKLSAqCUFsYW4gQ294CToJUmVtb3ZlZCBnZXRfYWRkcmVzcyBuYW1lIGNsYXNoIHdpdGggRlBVLgotICoJQWxhbiBDb3gJOglSZWZvcm1hdHRlZCBhIGJpdC4KLSAqCUdlcm8gS3VobG1hbm4JOglDb2RlIGNsZWFudXAKLSAqCU1pY2hhZWwgUmF1c2NoICA6CUZpeGVkIHJlY29nbml0aW9uIG9mIGFuIGluY29taW5nIFJBUlAgYW5zd2VyLgotICoJTWFydGluIE1hcmVzCTogKDIuMCkJQXV0by1jb25maWd1cmF0aW9uIHZpYSBCT09UUCBzdXBwb3J0ZWQuCi0gKglNYXJ0aW4gTWFyZXMJOglNYW51YWwgc2VsZWN0aW9uIG9mIGludGVyZmFjZSAmIEJPT1RQL1JBUlAuCi0gKglNYXJ0aW4gTWFyZXMJOglVc2luZyBuZXR3b3JrIHJvdXRlcyBpbnN0ZWFkIG9mIGhvc3Qgcm91dGVzLAotICoJCQkJYWxsb3dpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byBiZSB1c2VkCi0gKgkJCQlmb3Igbm9ybWFsIG9wZXJhdGlvbiBvZiB0aGUgaG9zdC4KLSAqCU1hcnRpbiBNYXJlcwk6CVJhbmRvbWl6ZWQgdGltZXIgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmCi0gKgkJCQlpbnN0YWxsZWQgdG8gbWluaW1pemUgbmV0d29yayBjb25nZXN0aW9uLgotICoJTWFydGluIE1hcmVzCToJQ29kZSBjbGVhbnVwLgotICoJTWFydGluIE1hcmVzCTogKDIuMSkJQk9PVFAgYW5kIFJBUlAgbWFkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0gKglNYXJ0aW4gTWFyZXMJOglTZXJ2ZXIgaG9zdG5hbWUgZ2VuZXJhdGlvbiBmaXhlZC4KLSAqCUdlcmQgS25vcnIJOglGaXhlZCB3aXJlZCBpbm9kZSBoYW5kbGluZwotICoJTWFydGluIE1hcmVzCTogKDIuMikJIjAuMC4wLjAiIGFkZHJlc3NlcyBmcm9tIGNvbW1hbmQgbGluZSBpZ25vcmVkLgotICoJTWFydGluIE1hcmVzCToJUkFSUCByZXBsaWVzIG5vdCB0ZXN0ZWQgZm9yIHNlcnZlciBhZGRyZXNzLgotICoJR2VybyBLdWhsbWFubgk6ICgyLjMpIFNvbWUgYnVnIGZpeGVzIGFuZCBjb2RlIGNsZWFudXAgYWdhaW4gKHBsZWFzZQotICoJCQkJc2VuZCBtZSB5b3VyIG5ldyBwYXRjaGVzIF9iZWZvcmVfIGJvdGhlcmluZwotICoJCQkJTGludXMgc28gdGhhdCBJIGRvbicgYWx3YXlzIGhhdmUgdG8gY2xlYW51cAotICoJCQkJX2FmdGVyd2FyZHNfIC0gdGhhbmtzKQotICoJR2VybyBLdWhsbWFubgk6CUxhc3QgY2hhbmdlcyBvZiBNYXJ0aW4gTWFyZXMgdW5kb25lLgotICoJR2VybyBLdWhsbWFubgk6IAlSQVJQIHJlcGxpZXMgYXJlIHRlc3RlZCBmb3Igc3BlY2lmaWVkIHNlcnZlcgotICoJCQkJYWdhaW4uIEhvd2V2ZXIsIGl0J3Mgbm93IHBvc3NpYmxlIHRvIGhhdmUKLSAqCQkJCWRpZmZlcmVudCBSQVJQIGFuZCBORlMgc2VydmVycy4KLSAqCUdlcm8gS3VobG1hbm4JOgkiMC4wLjAuMCIgYWRkcmVzc2VzIGZyb20gY29tbWFuZCBsaW5lIGFyZQotICoJCQkJbm93IG1hcHBlZCB0byBJTkFERFJfTk9ORS4KLSAqCUdlcm8gS3VobG1hbm4JOglGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgQk9PVFAgcGF0aCBuYW1lCi0gKgkJCQlmcm9tIGJlaW5nIHVzZWQgKHRoYW5rcyB0byBMZW8gU3BpZWttYW4pCi0gKglBbmR5IFdhbGtlcgk6CUFsbG93IHRvIHNwZWNpZnkgdGhlIE5GUyBzZXJ2ZXIgaW4gbmZzX3Jvb3QKLSAqCQkJCXdpdGhvdXQgZ2l2aW5nIGEgcGF0aCBuYW1lCi0gKglTd2VuIFRo/G1tbGVyCToJQWxsb3cgdG8gc3BlY2lmeSB0aGUgTkZTIG9wdGlvbnMgaW4gbmZzX3Jvb3QKLSAqCQkJCXdpdGhvdXQgZ2l2aW5nIGEgcGF0aCBuYW1lLiBGaXggQk9PVFAgcmVxdWVzdAotICoJCQkJZm9yIGRvbWFpbm5hbWUgKGRvbWFpbm5hbWUgaXMgTklTIGRvbWFpbiwgbm90Ci0gKgkJCQlETlMgZG9tYWluISkuIFNraXAgZHVtbXkgZGV2aWNlcyBmb3IgQk9PVFAuCi0gKglKYWNlayBaYXBhbGEJOglGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgc2VydmVyLWlwIGFkZHJlc3MKLSAqCQkJCWZyb20gbmZzcm9vdCBwYXJhbWV0ZXIgZnJvbSBiZWluZyB1c2VkLgotICoJT2xhZiBLaXJjaAk6CUFkYXB0ZWQgdG8gbmV3IE5GUyBjb2RlLgotICoJSmFrdWIgSmVsaW5lawk6CUZyZWUgdXNlZCBjb2RlIHNlZ21lbnQuCi0gKglNYXJrbyBLb2h0YWxhCToJRml4ZWQgc29tZSBidWdzLgotICoJTWFydGluIE1hcmVzCToJRGVidWcgbWVzc2FnZSBjbGVhbnVwCi0gKglNYXJ0aW4gTWFyZXMJOglDaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IGdlbmVyaWMgSVAgbGF5ZXIgYXV0b2NvbmZpZwotICoJCQkJY29kZS4gQk9PVFAgYW5kIFJBUlAgbW92ZWQgdGhlcmUuCi0gKglNYXJ0aW4gTWFyZXMJOglEZWZhdWx0IHBhdGggbm93IGNvbnRhaW5zIGhvc3QgbmFtZSBpbnN0ZWFkIG9mCi0gKgkJCQlob3N0IElQIGFkZHJlc3MgKGJ1dCBob3N0IG5hbWUgZGVmYXVsdHMgdG8gSVAKLSAqCQkJCWFkZHJlc3MgYW55d2F5KS4KLSAqCU1hcnRpbiBNYXJlcwk6CVVzZSByb290X3NlcnZlcl9hZGRyIGFwcHJvcHJpYXRlbHkgZHVyaW5nIHNldHVwLgotICoJTWFydGluIE1hcmVzCToJUmV3cm90ZSBwYXJhbWV0ZXIgcGFyc2luZywgbm93IGhvcGVmdWxseSBnaXZpbmcKLSAqCQkJCWNvcnJlY3Qgb3ZlcnJpZGluZy4KLSAqCVRyb25kIE15a2xlYnVzdCA6CUFkZCBpbiBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBORlN2MyBhbmQgVENQLgotICoJCQkJRml4IGJ1ZyBpbiByb290X25mc19hZGRyKCkuIG5mc19kYXRhLm5hbWxlbgotICoJCQkJaXMgTk9UIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBob3N0bmFtZS4KLSAqCUh1YSBRaW4JCToJU3VwcG9ydCBmb3IgbW91bnRpbmcgcm9vdCBmaWxlIHN5c3RlbSB2aWEKLSAqCQkJCU5GUyBvdmVyIFRDUC4KLSAqCUZhYmlhbiBGcmVkZXJpY2s6CU9wdGlvbiBwYXJzZXIgcmVidWlsdCAodXNpbmcgcGFyc2VyIGxpYikKLSovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgotI2luY2x1ZGUgPGxpbnV4L25mcy5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+Ci0jaW5jbHVkZSA8bmV0L2lwY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+Ci0KLS8qIERlZmluZSB0aGlzIHRvIGFsbG93IGRlYnVnZ2luZyBvdXRwdXQgKi8KLSN1bmRlZiBORlNST09UX0RFQlVHCi0jZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfUk9PVAotCi0vKiBEZWZhdWx0IHBhdGggd2UgdHJ5IHRvIG1vdW50LiAiJXMiIGdldHMgcmVwbGFjZWQgYnkgb3VyIElQIGFkZHJlc3MgKi8KLSNkZWZpbmUgTkZTX1JPT1QJCSIvdGZ0cGJvb3QvJXMiCi0KLS8qIFBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgKi8KLXN0YXRpYyBjaGFyIG5mc19yb290X25hbWVbMjU2XSBfX2luaXRkYXRhID0gIiI7Ci0KLS8qIEFkZHJlc3Mgb2YgTkZTIHNlcnZlciAqLwotc3RhdGljIF9fYmUzMiBzZXJ2YWRkciBfX2luaXRkYXRhID0gMDsKLQotLyogTmFtZSBvZiBkaXJlY3RvcnkgdG8gbW91bnQgKi8KLXN0YXRpYyBjaGFyIG5mc19wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9OwotCi0vKiBORlMtcmVsYXRlZCBkYXRhICovCi1zdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIG5mc19kYXRhIF9faW5pdGRhdGEgPSB7IDAsIH07LyogTkZTIG1vdW50IGluZm8gKi8KLXN0YXRpYyBpbnQgbmZzX3BvcnQgX19pbml0ZGF0YSA9IDA7CQkvKiBQb3J0IHRvIGNvbm5lY3QgdG8gZm9yIE5GUyAqLwotc3RhdGljIGludCBtb3VudF9wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogTW91bnQgZGFlbW9uIHBvcnQgbnVtYmVyICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JCQkgICAgIFBhcnNpbmcgb2Ygb3B0aW9ucwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1lbnVtIHsKLQkvKiBPcHRpb25zIHRoYXQgdGFrZSBpbnRlZ2VyIGFyZ3VtZW50cyAqLwotCU9wdF9wb3J0LCBPcHRfcnNpemUsIE9wdF93c2l6ZSwgT3B0X3RpbWVvLCBPcHRfcmV0cmFucywgT3B0X2FjcmVnbWluLAotCU9wdF9hY3JlZ21heCwgT3B0X2FjZGlybWluLCBPcHRfYWNkaXJtYXgsCi0JLyogT3B0aW9ucyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzICovCi0JT3B0X3NvZnQsIE9wdF9oYXJkLCBPcHRfaW50ciwKLQlPcHRfbm9pbnRyLCBPcHRfcG9zaXgsIE9wdF9ub3Bvc2l4LCBPcHRfY3RvLCBPcHRfbm9jdG8sIE9wdF9hYywgCi0JT3B0X25vYWMsIE9wdF9sb2NrLCBPcHRfbm9sb2NrLCBPcHRfdjIsIE9wdF92MywgT3B0X3VkcCwgT3B0X3RjcCwKLQlPcHRfYWNsLCBPcHRfbm9hY2wsCi0JLyogRXJyb3IgdG9rZW4gKi8KLQlPcHRfZXJyCi19OwotCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCBfX2luaXRkYXRhIHRva2VucyA9IHsKLQl7T3B0X3BvcnQsICJwb3J0PSV1In0sCi0Je09wdF9yc2l6ZSwgInJzaXplPSV1In0sCi0Je09wdF93c2l6ZSwgIndzaXplPSV1In0sCi0Je09wdF90aW1lbywgInRpbWVvPSV1In0sCi0Je09wdF9yZXRyYW5zLCAicmV0cmFucz0ldSJ9LAotCXtPcHRfYWNyZWdtaW4sICJhY3JlZ21pbj0ldSJ9LAotCXtPcHRfYWNyZWdtYXgsICJhY3JlZ21heD0ldSJ9LAotCXtPcHRfYWNkaXJtaW4sICJhY2Rpcm1pbj0ldSJ9LAotCXtPcHRfYWNkaXJtYXgsICJhY2Rpcm1heD0ldSJ9LAotCXtPcHRfc29mdCwgInNvZnQifSwKLQl7T3B0X2hhcmQsICJoYXJkIn0sCi0Je09wdF9pbnRyLCAiaW50ciJ9LAotCXtPcHRfbm9pbnRyLCAibm9pbnRyIn0sCi0Je09wdF9wb3NpeCwgInBvc2l4In0sCi0Je09wdF9ub3Bvc2l4LCAibm9wb3NpeCJ9LAotCXtPcHRfY3RvLCAiY3RvIn0sCi0Je09wdF9ub2N0bywgIm5vY3RvIn0sCi0Je09wdF9hYywgImFjIn0sCi0Je09wdF9ub2FjLCAibm9hYyJ9LAotCXtPcHRfbG9jaywgImxvY2sifSwKLQl7T3B0X25vbG9jaywgIm5vbG9jayJ9LAotCXtPcHRfdjIsICJuZnN2ZXJzPTIifSwKLQl7T3B0X3YyLCAidjIifSwKLQl7T3B0X3YzLCAibmZzdmVycz0zIn0sCi0Je09wdF92MywgInYzIn0sCi0Je09wdF91ZHAsICJwcm90bz11ZHAifSwKLQl7T3B0X3VkcCwgInVkcCJ9LAotCXtPcHRfdGNwLCAicHJvdG89dGNwIn0sCi0Je09wdF90Y3AsICJ0Y3AifSwKLQl7T3B0X2FjbCwgImFjbCJ9LAotCXtPcHRfbm9hY2wsICJub2FjbCJ9LAotCXtPcHRfZXJyLCBOVUxMfQotCQotfTsKLQotLyoKLSAqICBQYXJzZSBvcHRpb24gc3RyaW5nLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX3BhcnNlKGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZikKLXsKLQotCWNoYXIgKnA7Ci0Jc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwotCWludCBvcHRpb247Ci0KLQlpZiAoIW5hbWUpCi0JCXJldHVybiAxOwotCi0JLyogU2V0IHRoZSBORlMgcmVtb3RlIHBhdGggKi8KLQlwID0gc3Ryc2VwKCZuYW1lLCAiLCIpOwotCWlmIChwWzBdICE9ICdcMCcgJiYgc3RyY21wKHAsICJkZWZhdWx0IikgIT0gMCkKLQkJc3RybGNweShidWYsIHAsIE5GU19NQVhQQVRITEVOKTsKLQotCXdoaWxlICgocCA9IHN0cnNlcCAoJm5hbWUsICIsIikpICE9IE5VTEwpIHsKLQkJaW50IHRva2VuOyAKLQkJaWYgKCEqcCkKLQkJCWNvbnRpbnVlOwotCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7Ci0KLQkJLyogJXUgdG9rZW5zIG9ubHkuIEJld2FyZSBpZiB5b3UgYWRkIG5ldyB0b2tlbnMhICovCi0JCWlmICh0b2tlbiA8IE9wdF9zb2Z0ICYmIG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCi0JCQlyZXR1cm4gMDsKLQkJc3dpdGNoICh0b2tlbikgewotCQkJY2FzZSBPcHRfcG9ydDoKLQkJCQluZnNfcG9ydCA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X3JzaXplOgotCQkJCW5mc19kYXRhLnJzaXplID0gb3B0aW9uOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfd3NpemU6Ci0JCQkJbmZzX2RhdGEud3NpemUgPSBvcHRpb247Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF90aW1lbzoKLQkJCQluZnNfZGF0YS50aW1lbyA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X3JldHJhbnM6Ci0JCQkJbmZzX2RhdGEucmV0cmFucyA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjcmVnbWluOgotCQkJCW5mc19kYXRhLmFjcmVnbWluID0gb3B0aW9uOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfYWNyZWdtYXg6Ci0JCQkJbmZzX2RhdGEuYWNyZWdtYXggPSBvcHRpb247Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9hY2Rpcm1pbjoKLQkJCQluZnNfZGF0YS5hY2Rpcm1pbiA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjZGlybWF4OgotCQkJCW5mc19kYXRhLmFjZGlybWF4ID0gb3B0aW9uOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfc29mdDoKLQkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfU09GVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2hhcmQ6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9TT0ZUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfaW50cjoKLQkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfSU5UUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X25vaW50cjoKLQkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX0lOVFI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9wb3NpeDoKLQkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfUE9TSVg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9ub3Bvc2l4OgotCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfUE9TSVg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9jdG86Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0NUTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X25vY3RvOgotCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9OT0NUTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjOgotCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQzsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X25vYWM6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQUM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9sb2NrOgotCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9OTE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9ub2xvY2s6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PTkxNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfdjI6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9WRVIzOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfdjM6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1ZFUjM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF91ZHA6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9UQ1A7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF90Y3A6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjbDoKLQkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX05PQUNMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfbm9hY2w6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQUNMOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSb290LU5GUzogdW5rbm93biAiCi0JCQkJCSJvcHRpb246ICVzXG4iLCBwKTsKLQkJCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAxOwotfQotCi0vKgotICogIFByZXBhcmUgdGhlIE5GUyBkYXRhIHN0cnVjdHVyZSBhbmQgcGFyc2UgYWxsIG9wdGlvbnMuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX25hbWUoY2hhciAqbmFtZSkKLXsKLQlzdGF0aWMgY2hhciBidWZbTkZTX01BWFBBVEhMRU5dIF9faW5pdGRhdGE7Ci0JY2hhciAqY3A7Ci0KLQkvKiBTZXQgc29tZSBkZWZhdWx0IHZhbHVlcyAqLwotCW1lbXNldCgmbmZzX2RhdGEsIDAsIHNpemVvZihuZnNfZGF0YSkpOwotCW5mc19wb3J0ICAgICAgICAgID0gLTE7Ci0JbmZzX2RhdGEudmVyc2lvbiAgPSBORlNfTU9VTlRfVkVSU0lPTjsKLQluZnNfZGF0YS5mbGFncyAgICA9IE5GU19NT1VOVF9OT05MTTsJLyogTm8gbG9ja2QgaW4gbmZzIHJvb3QgeWV0ICovCi0JbmZzX2RhdGEucnNpemUgICAgPSBORlNfREVGX0ZJTEVfSU9fU0laRTsKLQluZnNfZGF0YS53c2l6ZSAgICA9IE5GU19ERUZfRklMRV9JT19TSVpFOwotCW5mc19kYXRhLmFjcmVnbWluID0gMzsKLQluZnNfZGF0YS5hY3JlZ21heCA9IDYwOwotCW5mc19kYXRhLmFjZGlybWluID0gMzA7Ci0JbmZzX2RhdGEuYWNkaXJtYXggPSA2MDsKLQlzdHJjcHkoYnVmLCBORlNfUk9PVCk7Ci0KLQkvKiBQcm9jZXNzIG9wdGlvbnMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciAqLwotCXJvb3RfbmZzX3BhcnNlKHJvb3Rfc2VydmVyX3BhdGgsIGJ1Zik7Ci0KLQkvKiBPdmVycmlkZSB0aGVtIGJ5IG9wdGlvbnMgc2V0IG9uIGtlcm5lbCBjb21tYW5kLWxpbmUgKi8KLQlyb290X25mc19wYXJzZShuYW1lLCBidWYpOwotCi0JY3AgPSB1dHNuYW1lKCktPm5vZGVuYW1lOwotCWlmIChzdHJsZW4oYnVmKSArIHN0cmxlbihjcCkgPiBORlNfTUFYUEFUSExFTikgewotCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBQYXRobmFtZSBmb3IgcmVtb3RlIGRpcmVjdG9yeSB0b28gbG9uZy5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNwcmludGYobmZzX3BhdGgsIGJ1ZiwgY3ApOwotCi0JcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqICBHZXQgTkZTIHNlcnZlciBhZGRyZXNzLgotICovCi1zdGF0aWMgaW50IF9faW5pdCByb290X25mc19hZGRyKHZvaWQpCi17Ci0JaWYgKChzZXJ2YWRkciA9IHJvb3Rfc2VydmVyX2FkZHIpID09IGh0b25sKElOQUREUl9OT05FKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBObyBORlMgc2VydmVyIGF2YWlsYWJsZSwgZ2l2aW5nIHVwLlxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzbnByaW50ZihuZnNfZGF0YS5ob3N0bmFtZSwgc2l6ZW9mKG5mc19kYXRhLmhvc3RuYW1lKSwKLQkJICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoc2VydmFkZHIpKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqICBUZWxsIHRoZSB1c2VyIHdoYXQncyBnb2luZyBvbi4KLSAqLwotI2lmZGVmIE5GU1JPT1RfREVCVUcKLXN0YXRpYyB2b2lkIF9faW5pdCByb290X25mc19wcmludCh2b2lkKQotewotCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6IE1vdW50aW5nICVzIG9uIHNlcnZlciAlcyBhcyByb290XG4iLAotCQluZnNfcGF0aCwgbmZzX2RhdGEuaG9zdG5hbWUpOwotCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6ICAgICByc2l6ZSA9ICVkLCB3c2l6ZSA9ICVkLCB0aW1lbyA9ICVkLCByZXRyYW5zID0gJWRcbiIsCi0JCW5mc19kYXRhLnJzaXplLCBuZnNfZGF0YS53c2l6ZSwgbmZzX2RhdGEudGltZW8sIG5mc19kYXRhLnJldHJhbnMpOwotCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6ICAgICBhY3JlZyAobWluLG1heCkgPSAoJWQsJWQpLCBhY2RpciAobWluLG1heCkgPSAoJWQsJWQpXG4iLAotCQluZnNfZGF0YS5hY3JlZ21pbiwgbmZzX2RhdGEuYWNyZWdtYXgsCi0JCW5mc19kYXRhLmFjZGlybWluLCBuZnNfZGF0YS5hY2Rpcm1heCk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIG5mc2QgcG9ydCA9ICVkLCBtb3VudGQgcG9ydCA9ICVkLCBmbGFncyA9ICUwOHhcbiIsCi0JCW5mc19wb3J0LCBtb3VudF9wb3J0LCBuZnNfZGF0YS5mbGFncyk7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IF9faW5pdCByb290X25mc19pbml0KHZvaWQpCi17Ci0jaWZkZWYgTkZTUk9PVF9ERUJVRwotCW5mc19kZWJ1ZyB8PSBORlNEQkdfUk9PVDsKLSNlbmRpZgotCi0JLyoKLQkgKiBEZWNvZGUgdGhlIHJvb3QgZGlyZWN0b3J5IHBhdGggbmFtZSBhbmQgTkZTIG9wdGlvbnMgZnJvbQotCSAqIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBUaGlzIGhhcyB0byBnbyBoZXJlIGluIG9yZGVyIHRvCi0JICogYmUgYWJsZSB0byB1c2UgdGhlIGNsaWVudCBJUCBhZGRyZXNzIGZvciB0aGUgcmVtb3RlIHJvb3QKLQkgKiBkaXJlY3RvcnkgKG5lY2Vzc2FyeSBmb3IgcHVyZSBSQVJQIGJvb3RpbmcpLgotCSAqLwotCWlmIChyb290X25mc19uYW1lKG5mc19yb290X25hbWUpIDwgMCB8fAotCSAgICByb290X25mc19hZGRyKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLSNpZmRlZiBORlNST09UX0RFQlVHCi0Jcm9vdF9uZnNfcHJpbnQoKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqICBQYXJzZSBORlMgc2VydmVyIGFuZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24gcGFzc2VkIG9uIHRoZSBrZXJuZWwKLSAqICBjb21tYW5kIGxpbmUuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG5mc19yb290X3NldHVwKGNoYXIgKmxpbmUpCi17Ci0JUk9PVF9ERVYgPSBSb290X05GUzsKLQlpZiAobGluZVswXSA9PSAnLycgfHwgbGluZVswXSA9PSAnLCcgfHwgKGxpbmVbMF0gPj0gJzAnICYmIGxpbmVbMF0gPD0gJzknKSkgewotCQlzdHJsY3B5KG5mc19yb290X25hbWUsIGxpbmUsIHNpemVvZihuZnNfcm9vdF9uYW1lKSk7Ci0JfSBlbHNlIHsKLQkJaW50IG4gPSBzdHJsZW4obGluZSkgKyBzaXplb2YoTkZTX1JPT1QpIC0gMTsKLQkJaWYgKG4gPj0gc2l6ZW9mKG5mc19yb290X25hbWUpKQotCQkJbGluZVtzaXplb2YobmZzX3Jvb3RfbmFtZSkgLSBzaXplb2YoTkZTX1JPT1QpIC0gMl0gPSAnXDAnOwotCQlzcHJpbnRmKG5mc19yb290X25hbWUsIE5GU19ST09ULCBsaW5lKTsKLQl9Ci0Jcm9vdF9zZXJ2ZXJfYWRkciA9IHJvb3RfbmZzX3BhcnNlX2FkZHIobmZzX3Jvb3RfbmFtZSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoIm5mc3Jvb3Q9IiwgbmZzX3Jvb3Rfc2V0dXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQkgICAgICAgUm91dGluZXMgdG8gYWN0dWFsbHkgbW91bnQgdGhlIHJvb3QgZGlyZWN0b3J5Ci0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiAgQ29uc3RydWN0IHNvY2thZGRyX2luIGZyb20gYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBfX2JlMzIgYWRkciwgX19iZTE2IHBvcnQpCi17Ci0Jc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7Ci0Jc2luLT5zaW5fcG9ydCA9IHBvcnQ7Ci19Ci0KLS8qCi0gKiAgUXVlcnkgc2VydmVyIHBvcnRtYXBwZXIgZm9yIHRoZSBwb3J0IG9mIGEgZGFlbW9uIHByb2dyYW0uCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldHBvcnQoaW50IHByb2dyYW0sIGludCB2ZXJzaW9uLCBpbnQgcHJvdG8pCi17Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQotCXByaW50ayhLRVJOX05PVElDRSAiTG9va2luZyB1cCBwb3J0IG9mIFJQQyAlZC8lZCBvbiAldS4ldS4ldS4ldVxuIiwKLQkJcHJvZ3JhbSwgdmVyc2lvbiwgTklQUVVBRChzZXJ2YWRkcikpOwotCXNldF9zb2NrYWRkcigmc2luLCBzZXJ2YWRkciwgMCk7Ci0JcmV0dXJuIHJwY2JfZ2V0cG9ydF9leHRlcm5hbCgmc2luLCBwcm9ncmFtLCB2ZXJzaW9uLCBwcm90byk7Ci19Ci0KLQotLyoKLSAqICBVc2UgcG9ydG1hcHBlciB0byBmaW5kIG1vdW50ZCBhbmQgbmZzZCBwb3J0IG51bWJlcnMgaWYgbm90IG92ZXJyaWRlbgotICogIGJ5IHRoZSB1c2VyLiBVc2UgZGVmYXVsdHMgaWYgcG9ydG1hcHBlciBpcyBub3QgYXZhaWxhYmxlLgotICogIFhYWDogSXMgdGhlcmUgYW55IG5mcyBzZXJ2ZXIgd2l0aCBubyBwb3J0bWFwcGVyPwotICovCi1zdGF0aWMgaW50IF9faW5pdCByb290X25mc19wb3J0cyh2b2lkKQotewotCWludCBwb3J0OwotCWludCBuZnNkX3ZlciwgbW91bnRkX3ZlcjsKLQlpbnQgbmZzZF9wb3J0LCBtb3VudGRfcG9ydDsKLQlpbnQgcHJvdG87Ci0KLQlpZiAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgewotCQluZnNkX3ZlciA9IE5GUzNfVkVSU0lPTjsKLQkJbW91bnRkX3ZlciA9IE5GU19NTlQzX1ZFUlNJT047Ci0JCW5mc2RfcG9ydCA9IE5GU19QT1JUOwotCQltb3VudGRfcG9ydCA9IE5GU19NTlRfUE9SVDsKLQl9IGVsc2UgewotCQluZnNkX3ZlciA9IE5GUzJfVkVSU0lPTjsKLQkJbW91bnRkX3ZlciA9IE5GU19NTlRfVkVSU0lPTjsKLQkJbmZzZF9wb3J0ID0gTkZTX1BPUlQ7Ci0JCW1vdW50ZF9wb3J0ID0gTkZTX01OVF9QT1JUOwotCX0KLQotCXByb3RvID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPyBJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQOwotCi0JaWYgKG5mc19wb3J0IDwgMCkgewotCQlpZiAoKHBvcnQgPSByb290X25mc19nZXRwb3J0KE5GU19QUk9HUkFNLCBuZnNkX3ZlciwgcHJvdG8pKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFVuYWJsZSB0byBnZXQgbmZzZCBwb3J0ICIKLQkJCQkJIm51bWJlciBmcm9tIHNlcnZlciwgdXNpbmcgZGVmYXVsdFxuIik7Ci0JCQlwb3J0ID0gbmZzZF9wb3J0OwotCQl9Ci0JCW5mc19wb3J0ID0gcG9ydDsKLQkJZHByaW50aygiUm9vdC1ORlM6IFBvcnRtYXBwZXIgb24gc2VydmVyIHJldHVybmVkICVkICIKLQkJCSJhcyBuZnNkIHBvcnRcbiIsIHBvcnQpOwotCX0KLQotCWlmICgocG9ydCA9IHJvb3RfbmZzX2dldHBvcnQoTkZTX01OVF9QUk9HUkFNLCBtb3VudGRfdmVyLCBwcm90bykpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBVbmFibGUgdG8gZ2V0IG1vdW50ZCBwb3J0ICIKLQkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKLQkJcG9ydCA9IG1vdW50ZF9wb3J0OwotCX0KLQltb3VudF9wb3J0ID0gcG9ydDsKLQlkcHJpbnRrKCJSb290LU5GUzogbW91bnRkIHBvcnQgaXMgJWRcbiIsIHBvcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqICBHZXQgYSBmaWxlIGhhbmRsZSBmcm9tIHRoZSBzZXJ2ZXIgZm9yIHRoZSBkaXJlY3Rvcnkgd2hpY2ggaXMgdG8gYmUKLSAqICBtb3VudGVkLgotICovCi1zdGF0aWMgaW50IF9faW5pdCByb290X25mc19nZXRfaGFuZGxlKHZvaWQpCi17Ci0Jc3RydWN0IG5mc19maCBmaDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwotCWludCBzdGF0dXM7Ci0JaW50IHByb3RvY29sID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPwotCQkJCQlJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQOwotCWludCB2ZXJzaW9uID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpID8KLQkJCQkJTkZTX01OVDNfVkVSU0lPTiA6IE5GU19NTlRfVkVSU0lPTjsKLQotCXNldF9zb2NrYWRkcigmc2luLCBzZXJ2YWRkciwgaHRvbnMobW91bnRfcG9ydCkpOwotCXN0YXR1cyA9IG5mc3Jvb3RfbW91bnQoJnNpbiwgbmZzX3BhdGgsICZmaCwgdmVyc2lvbiwgcHJvdG9jb2wpOwotCWlmIChzdGF0dXMgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBTZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQgIgotCQkJCSJ3aGlsZSBtb3VudGluZyAlc1xuIiwgc3RhdHVzLCBuZnNfcGF0aCk7Ci0JZWxzZSB7Ci0JCW5mc19kYXRhLnJvb3Quc2l6ZSA9IGZoLnNpemU7Ci0JCW1lbWNweShuZnNfZGF0YS5yb290LmRhdGEsIGZoLmRhdGEsIGZoLnNpemUpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiAgR2V0IHRoZSBORlMgcG9ydCBudW1iZXJzIGFuZCBmaWxlIGhhbmRsZSwgYW5kIHJldHVybiB0aGUgcHJlcGFyZWQgJ2RhdGEnCi0gKiAgYXJndW1lbnQgZm9yIG1vdW50KCkgaWYgZXZlcnl0aGluZyB3ZW50IE9LLiBSZXR1cm4gTlVMTCBvdGhlcndpc2UuCi0gKi8KLXZvaWQgKiBfX2luaXQgbmZzX3Jvb3RfZGF0YSh2b2lkKQotewotCWlmIChyb290X25mc19pbml0KCkgPCAwCi0JIHx8IHJvb3RfbmZzX3BvcnRzKCkgPCAwCi0JIHx8IHJvb3RfbmZzX2dldF9oYW5kbGUoKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZuZnNfZGF0YS5hZGRyLCBzZXJ2YWRkciwgaHRvbnMobmZzX3BvcnQpKTsKLQlyZXR1cm4gKHZvaWQqKSZuZnNfZGF0YTsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW91bnQuaCBiL2luY2x1ZGUvbGludXgvbW91bnQuaAppbmRleCA2ZDMwNDdkLi5mYTg5ZWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vdW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9tb3VudC5oCkBAIC0xMDEsNyArMTAxLDYgQEAKIGV4dGVybiB2b2lkIHNocmlua19zdWJtb3VudHMoc3RydWN0IHZmc21vdW50ICptb3VudHBvaW50LCBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpOwogCiBleHRlcm4gc3BpbmxvY2tfdCB2ZnNtb3VudF9sb2NrOwotZXh0ZXJuIGRldl90IG5hbWVfdG9fZGV2X3QoY2hhciAqbmFtZSk7CiAKICNlbmRpZgogI2VuZGlmIC8qIF9MSU5VWF9NT1VOVF9IICovCmRpZmYgLS1naXQgYS9pbml0L01ha2VmaWxlIGIvaW5pdC9NYWtlZmlsZQppbmRleCAwMTU0YWVhLi5hY2ZkYjJjIDEwMDY0NAotLS0gYS9pbml0L01ha2VmaWxlCisrKyBiL2luaXQvTWFrZWZpbGUKQEAgLTIsMTkgKzIsOSBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KICMKIAotb2JqLXkgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IG1haW4ubyB2ZXJzaW9uLm8gbW91bnRzLm8KLWlmbmVxICgkKENPTkZJR19CTEtfREVWX0lOSVRSRCkseSkKLW9iai15ICAgICAgICAgICAgICAgICAgICAgICAgICArPSBub2luaXRyYW1mcy5vCi1lbHNlCi1vYmotJChDT05GSUdfQkxLX0RFVl9JTklUUkQpICAgKz0gaW5pdHJhbWZzLm8KLWVuZGlmCitvYmoteQkJCQk6PSBtYWluLm8gdmVyc2lvbi5vIGluaXRyYW1mcy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVkpICs9IGNhbGlicmF0ZS5vCiAKLW1vdW50cy15CQkJOj0gZG9fbW91bnRzLm8KLW1vdW50cy0kKENPTkZJR19CTEtfREVWX1JBTSkJKz0gZG9fbW91bnRzX3JkLm8KLW1vdW50cy0kKENPTkZJR19CTEtfREVWX0lOSVRSRCkJKz0gZG9fbW91bnRzX2luaXRyZC5vCi1tb3VudHMtJChDT05GSUdfQkxLX0RFVl9NRCkJKz0gZG9fbW91bnRzX21kLm8KLQogIyBmaWxlcyB0byBiZSByZW1vdmVkIHVwb24gbWFrZSBjbGVhbgogY2xlYW4tZmlsZXMgOj0gLi4vaW5jbHVkZS9saW51eC9jb21waWxlLmgKIApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZmU0MDcuLjAwMDAwMDAKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZkLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KLQotI2luY2x1ZGUgImRvX21vdW50cy5oIgotCi1leHRlcm4gaW50IGdldF9maWxlc3lzdGVtX2xpc3QoY2hhciAqIGJ1Zik7Ci0KLWludCBfX2luaXRkYXRhIHJkX2RvbG9hZDsJLyogMSA9IGxvYWQgUkFNIGRpc2ssIDAgPSBkb24ndCBsb2FkICovCi0KLWludCByb290X21vdW50ZmxhZ3MgPSBNU19SRE9OTFkgfCBNU19TSUxFTlQ7Ci1jaGFyICogX19pbml0ZGF0YSByb290X2RldmljZV9uYW1lOwotc3RhdGljIGNoYXIgX19pbml0ZGF0YSBzYXZlZF9yb290X25hbWVbNjRdOwotCi1kZXZfdCBST09UX0RFVjsKLQotc3RhdGljIGludCBfX2luaXQgbG9hZF9yYW1kaXNrKGNoYXIgKnN0cikKLXsKLQlyZF9kb2xvYWQgPSBzaW1wbGVfc3RydG9sKHN0cixOVUxMLDApICYgMzsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoImxvYWRfcmFtZGlzaz0iLCBsb2FkX3JhbWRpc2spOwotCi1zdGF0aWMgaW50IF9faW5pdCByZWFkb25seShjaGFyICpzdHIpCi17Ci0JaWYgKCpzdHIpCi0JCXJldHVybiAwOwotCXJvb3RfbW91bnRmbGFncyB8PSBNU19SRE9OTFk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJlYWR3cml0ZShjaGFyICpzdHIpCi17Ci0JaWYgKCpzdHIpCi0JCXJldHVybiAwOwotCXJvb3RfbW91bnRmbGFncyAmPSB+TVNfUkRPTkxZOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJybyIsIHJlYWRvbmx5KTsKLV9fc2V0dXAoInJ3IiwgcmVhZHdyaXRlKTsKLQotc3RhdGljIGRldl90IHRyeV9uYW1lKGNoYXIgKm5hbWUsIGludCBwYXJ0KQotewotCWNoYXIgcGF0aFs2NF07Ci0JY2hhciBidWZbMzJdOwotCWludCByYW5nZTsKLQlkZXZfdCByZXM7Ci0JY2hhciAqczsKLQlpbnQgbGVuOwotCWludCBmZDsKLQl1bnNpZ25lZCBpbnQgbWFqLCBtaW47Ci0KLQkvKiByZWFkIGRldmljZSBudW1iZXIgZnJvbSAuLi4vZGV2ICovCi0KLQlzcHJpbnRmKHBhdGgsICIvc3lzL2Jsb2NrLyVzL2RldiIsIG5hbWUpOwotCWZkID0gc3lzX29wZW4ocGF0aCwgMCwgMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZ290byBmYWlsOwotCWxlbiA9IHN5c19yZWFkKGZkLCBidWYsIDMyKTsKLQlzeXNfY2xvc2UoZmQpOwotCWlmIChsZW4gPD0gMCB8fCBsZW4gPT0gMzIgfHwgYnVmW2xlbiAtIDFdICE9ICdcbicpCi0JCWdvdG8gZmFpbDsKLQlidWZbbGVuIC0gMV0gPSAnXDAnOwotCWlmIChzc2NhbmYoYnVmLCAiJXU6JXUiLCAmbWFqLCAmbWluKSA9PSAyKSB7Ci0JCS8qCi0JCSAqIFRyeSB0aGUgJXU6JXUgZm9ybWF0IC0tIHNlZSBwcmludF9kZXZfdCgpCi0JCSAqLwotCQlyZXMgPSBNS0RFVihtYWosIG1pbik7Ci0JCWlmIChtYWogIT0gTUFKT1IocmVzKSB8fCBtaW4gIT0gTUlOT1IocmVzKSkKLQkJCWdvdG8gZmFpbDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBOb3BlLiAgVHJ5IG9sZC1zdHlsZSAiMDMyMSIKLQkJICovCi0JCXJlcyA9IG5ld19kZWNvZGVfZGV2KHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnMsIDE2KSk7Ci0JCWlmICgqcykKLQkJCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBpZiBpdCdzIHRoZXJlIGFuZCB3ZSBhcmUgbm90IGxvb2tpbmcgZm9yIGEgcGFydGl0aW9uIC0gdGhhdCdzIGl0ICovCi0JaWYgKCFwYXJ0KQotCQlyZXR1cm4gcmVzOwotCi0JLyogb3RoZXJ3aXNlIHJlYWQgcmFuZ2UgZnJvbSAuLi4vcmFuZ2UgKi8KLQlzcHJpbnRmKHBhdGgsICIvc3lzL2Jsb2NrLyVzL3JhbmdlIiwgbmFtZSk7Ci0JZmQgPSBzeXNfb3BlbihwYXRoLCAwLCAwKTsKLQlpZiAoZmQgPCAwKQotCQlnb3RvIGZhaWw7Ci0JbGVuID0gc3lzX3JlYWQoZmQsIGJ1ZiwgMzIpOwotCXN5c19jbG9zZShmZCk7Ci0JaWYgKGxlbiA8PSAwIHx8IGxlbiA9PSAzMiB8fCBidWZbbGVuIC0gMV0gIT0gJ1xuJykKLQkJZ290byBmYWlsOwotCWJ1ZltsZW4gLSAxXSA9ICdcMCc7Ci0JcmFuZ2UgPSBzaW1wbGVfc3RydG91bChidWYsICZzLCAxMCk7Ci0JaWYgKCpzKQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBpZiBwYXJ0aXRpb24gaXMgd2l0aGluIHJhbmdlIC0gd2UgZ290IGl0ICovCi0JaWYgKHBhcnQgPCByYW5nZSkKLQkJcmV0dXJuIHJlcyArIHBhcnQ7Ci1mYWlsOgotCXJldHVybiAwOwotfQotCi0vKgotICoJQ29udmVydCBhIG5hbWUgaW50byBkZXZpY2UgbnVtYmVyLiAgV2UgYWNjZXB0IHRoZSBmb2xsb3dpbmcgdmFyaWFudHM6Ci0gKgotICoJMSkgZGV2aWNlIG51bWJlciBpbiBoZXhhZGVjaW1hbAlyZXByZXNlbnRzIGl0c2VsZgotICoJMikgL2Rldi9uZnMgcmVwcmVzZW50cyBSb290X05GUyAoMHhmZikKLSAqCTMpIC9kZXYvPGRpc2tfbmFtZT4gcmVwcmVzZW50cyB0aGUgZGV2aWNlIG51bWJlciBvZiBkaXNrCi0gKgk0KSAvZGV2LzxkaXNrX25hbWU+PGRlY2ltYWw+IHJlcHJlc2VudHMgdGhlIGRldmljZSBudW1iZXIKLSAqICAgICAgICAgb2YgcGFydGl0aW9uIC0gZGV2aWNlIG51bWJlciBvZiBkaXNrIHBsdXMgdGhlIHBhcnRpdGlvbiBudW1iZXIKLSAqCTUpIC9kZXYvPGRpc2tfbmFtZT5wPGRlY2ltYWw+IC0gc2FtZSBhcyB0aGUgYWJvdmUsIHRoYXQgZm9ybSBpcwotICoJICAgdXNlZCB3aGVuIGRpc2sgbmFtZSBvZiBwYXJ0aXRpb25lZCBkaXNrIGVuZHMgb24gYSBkaWdpdC4KLSAqCi0gKglJZiBuYW1lIGRvZXNuJ3QgaGF2ZSBmYWxsIGludG8gdGhlIGNhdGVnb3JpZXMgYWJvdmUsIHdlIHJldHVybiAwLgotICoJU3lzZnMgaXMgdXNlZCB0byBjaGVjayBpZiBzb21ldGhpbmcgaXMgYSBkaXNrIG5hbWUgLSBpdCBoYXMKLSAqCWFsbCBrbm93biBkaXNrcyB1bmRlciBidXMvYmxvY2svZGV2aWNlcy4gIElmIHRoZSBkaXNrIG5hbWUKLSAqCWNvbnRhaW5zIHNsYXNoZXMsIG5hbWUgb2Ygc3lzZnMgbm9kZSBoYXMgdGhlbSByZXBsYWNlZCB3aXRoCi0gKgliYW5ncy4gIHRyeV9uYW1lKCkgZG9lcyB0aGUgYWN0dWFsIGNoZWNrcywgYXNzdW1pbmcgdGhhdCBzeXNmcwotICoJaXMgbW91bnRlZCBvbiByb290ZnMgL3N5cy4KLSAqLwotCi1kZXZfdCBuYW1lX3RvX2Rldl90KGNoYXIgKm5hbWUpCi17Ci0JY2hhciBzWzMyXTsKLQljaGFyICpwOwotCWRldl90IHJlcyA9IDA7Ci0JaW50IHBhcnQ7Ci0KLSNpZmRlZiBDT05GSUdfU1lTRlMKLQlpbnQgbWtkaXJfZXJyID0gc3lzX21rZGlyKCIvc3lzIiwgMDcwMCk7Ci0JaWYgKHN5c19tb3VudCgic3lzZnMiLCAiL3N5cyIsICJzeXNmcyIsIDAsIE5VTEwpIDwgMCkKLQkJZ290byBvdXQ7Ci0jZW5kaWYKLQotCWlmIChzdHJuY21wKG5hbWUsICIvZGV2LyIsIDUpICE9IDApIHsKLQkJdW5zaWduZWQgbWFqLCBtaW47Ci0KLQkJaWYgKHNzY2FuZihuYW1lLCAiJXU6JXUiLCAmbWFqLCAmbWluKSA9PSAyKSB7Ci0JCQlyZXMgPSBNS0RFVihtYWosIG1pbik7Ci0JCQlpZiAobWFqICE9IE1BSk9SKHJlcykgfHwgbWluICE9IE1JTk9SKHJlcykpCi0JCQkJZ290byBmYWlsOwotCQl9IGVsc2UgewotCQkJcmVzID0gbmV3X2RlY29kZV9kZXYoc2ltcGxlX3N0cnRvdWwobmFtZSwgJnAsIDE2KSk7Ci0JCQlpZiAoKnApCi0JCQkJZ290byBmYWlsOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JbmFtZSArPSA1OwotCXJlcyA9IFJvb3RfTkZTOwotCWlmIChzdHJjbXAobmFtZSwgIm5mcyIpID09IDApCi0JCWdvdG8gZG9uZTsKLQlyZXMgPSBSb290X1JBTTA7Ci0JaWYgKHN0cmNtcChuYW1lLCAicmFtIikgPT0gMCkKLQkJZ290byBkb25lOwotCi0JaWYgKHN0cmxlbihuYW1lKSA+IDMxKQotCQlnb3RvIGZhaWw7Ci0Jc3RyY3B5KHMsIG5hbWUpOwotCWZvciAocCA9IHM7ICpwOyBwKyspCi0JCWlmICgqcCA9PSAnLycpCi0JCQkqcCA9ICchJzsKLQlyZXMgPSB0cnlfbmFtZShzLCAwKTsKLQlpZiAocmVzKQotCQlnb3RvIGRvbmU7Ci0KLQl3aGlsZSAocCA+IHMgJiYgaXNkaWdpdChwWy0xXSkpCi0JCXAtLTsKLQlpZiAocCA9PSBzIHx8ICEqcCB8fCAqcCA9PSAnMCcpCi0JCWdvdG8gZmFpbDsKLQlwYXJ0ID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMTApOwotCSpwID0gJ1wwJzsKLQlyZXMgPSB0cnlfbmFtZShzLCBwYXJ0KTsKLQlpZiAocmVzKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAocCA8IHMgKyAyIHx8ICFpc2RpZ2l0KHBbLTJdKSB8fCBwWy0xXSAhPSAncCcpCi0JCWdvdG8gZmFpbDsKLQlwWy0xXSA9ICdcMCc7Ci0JcmVzID0gdHJ5X25hbWUocywgcGFydCk7Ci1kb25lOgotI2lmZGVmIENPTkZJR19TWVNGUwotCXN5c191bW91bnQoIi9zeXMiLCAwKTsKLW91dDoKLQlpZiAoIW1rZGlyX2VycikKLQkJc3lzX3JtZGlyKCIvc3lzIik7Ci0jZW5kaWYKLQlyZXR1cm4gcmVzOwotZmFpbDoKLQlyZXMgPSAwOwotCWdvdG8gZG9uZTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcm9vdF9kZXZfc2V0dXAoY2hhciAqbGluZSkKLXsKLQlzdHJsY3B5KHNhdmVkX3Jvb3RfbmFtZSwgbGluZSwgc2l6ZW9mKHNhdmVkX3Jvb3RfbmFtZSkpOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJyb290PSIsIHJvb3RfZGV2X3NldHVwKTsKLQotc3RhdGljIGNoYXIgKiBfX2luaXRkYXRhIHJvb3RfbW91bnRfZGF0YTsKLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfZGF0YV9zZXR1cChjaGFyICpzdHIpCi17Ci0Jcm9vdF9tb3VudF9kYXRhID0gc3RyOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqIF9faW5pdGRhdGEgcm9vdF9mc19uYW1lczsKLXN0YXRpYyBpbnQgX19pbml0IGZzX25hbWVzX3NldHVwKGNoYXIgKnN0cikKLXsKLQlyb290X2ZzX25hbWVzID0gc3RyOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgcm9vdF9kZWxheTsKLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfZGVsYXlfc2V0dXAoY2hhciAqc3RyKQotewotCXJvb3RfZGVsYXkgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJyb290ZmxhZ3M9Iiwgcm9vdF9kYXRhX3NldHVwKTsKLV9fc2V0dXAoInJvb3Rmc3R5cGU9IiwgZnNfbmFtZXNfc2V0dXApOwotX19zZXR1cCgicm9vdGRlbGF5PSIsIHJvb3RfZGVsYXlfc2V0dXApOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2V0X2ZzX25hbWVzKGNoYXIgKnBhZ2UpCi17Ci0JY2hhciAqcyA9IHBhZ2U7Ci0KLQlpZiAocm9vdF9mc19uYW1lcykgewotCQlzdHJjcHkocGFnZSwgcm9vdF9mc19uYW1lcyk7Ci0JCXdoaWxlICgqcysrKSB7Ci0JCQlpZiAoc1stMV0gPT0gJywnKQotCQkJCXNbLTFdID0gJ1wwJzsKLQkJfQotCX0gZWxzZSB7Ci0JCWludCBsZW4gPSBnZXRfZmlsZXN5c3RlbV9saXN0KHBhZ2UpOwotCQljaGFyICpwLCAqbmV4dDsKLQotCQlwYWdlW2xlbl0gPSAnXDAnOwotCQlmb3IgKHAgPSBwYWdlLTE7IHA7IHAgPSBuZXh0KSB7Ci0JCQluZXh0ID0gc3RyY2hyKCsrcCwgJ1xuJyk7Ci0JCQlpZiAoKnArKyAhPSAnXHQnKQotCQkJCWNvbnRpbnVlOwotCQkJd2hpbGUgKCgqcysrID0gKnArKykgIT0gJ1xuJykKLQkJCQk7Ci0JCQlzWy0xXSA9ICdcMCc7Ci0JCX0KLQl9Ci0JKnMgPSAnXDAnOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBkb19tb3VudF9yb290KGNoYXIgKm5hbWUsIGNoYXIgKmZzLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVyciA9IHN5c19tb3VudChuYW1lLCAiL3Jvb3QiLCBmcywgZmxhZ3MsIGRhdGEpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlzeXNfY2hkaXIoIi9yb290Iik7Ci0JUk9PVF9ERVYgPSBjdXJyZW50LT5mcy0+cHdkbW50LT5tbnRfc2ItPnNfZGV2OwotCXByaW50aygiVkZTOiBNb3VudGVkIHJvb3QgKCVzIGZpbGVzeXN0ZW0pJXMuXG4iLAotCSAgICAgICBjdXJyZW50LT5mcy0+cHdkbW50LT5tbnRfc2ItPnNfdHlwZS0+bmFtZSwKLQkgICAgICAgY3VycmVudC0+ZnMtPnB3ZG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZID8gCi0JICAgICAgICIgcmVhZG9ubHkiIDogIiIpOwotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCBtb3VudF9ibG9ja19yb290KGNoYXIgKm5hbWUsIGludCBmbGFncykKLXsKLQljaGFyICpmc19uYW1lcyA9IF9fZ2V0bmFtZSgpOwotCWNoYXIgKnA7Ci0jaWZkZWYgQ09ORklHX0JMT0NLCi0JY2hhciBiW0JERVZOQU1FX1NJWkVdOwotI2Vsc2UKLQljb25zdCBjaGFyICpiID0gbmFtZTsKLSNlbmRpZgotCi0JZ2V0X2ZzX25hbWVzKGZzX25hbWVzKTsKLXJldHJ5OgotCWZvciAocCA9IGZzX25hbWVzOyAqcDsgcCArPSBzdHJsZW4ocCkrMSkgewotCQlpbnQgZXJyID0gZG9fbW91bnRfcm9vdChuYW1lLCBwLCBmbGFncywgcm9vdF9tb3VudF9kYXRhKTsKLQkJc3dpdGNoIChlcnIpIHsKLQkJCWNhc2UgMDoKLQkJCQlnb3RvIG91dDsKLQkJCWNhc2UgLUVBQ0NFUzoKLQkJCQlmbGFncyB8PSBNU19SRE9OTFk7Ci0JCQkJZ290byByZXRyeTsKLQkJCWNhc2UgLUVJTlZBTDoKLQkJCQljb250aW51ZTsKLQkJfQotCSAgICAgICAgLyoKLQkJICogQWxsb3cgdGhlIHVzZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmYWlsZWQgc3lzX29wZW4KLQkJICogYW5kIGJhZCBzdXBlcmJsb2NrIG9uIHJvb3QgZGV2aWNlLgotCQkgKiBhbmQgZ2l2ZSB0aGVtIGEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGRldmljZXMKLQkJICovCi0jaWZkZWYgQ09ORklHX0JMT0NLCi0JCV9fYmRldm5hbWUoUk9PVF9ERVYsIGIpOwotI2VuZGlmCi0JCXByaW50aygiVkZTOiBDYW5ub3Qgb3BlbiByb290IGRldmljZSBcIiVzXCIgb3IgJXNcbiIsCi0JCQkJcm9vdF9kZXZpY2VfbmFtZSwgYik7Ci0JCXByaW50aygiUGxlYXNlIGFwcGVuZCBhIGNvcnJlY3QgXCJyb290PVwiIGJvb3Qgb3B0aW9uOyBoZXJlIGFyZSB0aGUgYXZhaWxhYmxlIHBhcnRpdGlvbnM6XG4iKTsKLQotCQlwcmludGtfYWxsX3BhcnRpdGlvbnMoKTsKLQkJcGFuaWMoIlZGUzogVW5hYmxlIHRvIG1vdW50IHJvb3QgZnMgb24gJXMiLCBiKTsKLQl9Ci0KLQlwcmludGsoIkxpc3Qgb2YgYWxsIHBhcnRpdGlvbnM6XG4iKTsKLQlwcmludGtfYWxsX3BhcnRpdGlvbnMoKTsKLQlwcmludGsoIk5vIGZpbGVzeXN0ZW0gY291bGQgbW91bnQgcm9vdCwgdHJpZWQ6ICIpOwotCWZvciAocCA9IGZzX25hbWVzOyAqcDsgcCArPSBzdHJsZW4ocCkrMSkKLQkJcHJpbnRrKCIgJXMiLCBwKTsKLQlwcmludGsoIlxuIik7Ci0jaWZkZWYgQ09ORklHX0JMT0NLCi0JX19iZGV2bmFtZShST09UX0RFViwgYik7Ci0jZW5kaWYKLQlwYW5pYygiVkZTOiBVbmFibGUgdG8gbW91bnQgcm9vdCBmcyBvbiAlcyIsIGIpOwotb3V0OgotCXB1dG5hbWUoZnNfbmFtZXMpOwotfQotIAotI2lmZGVmIENPTkZJR19ST09UX05GUwotc3RhdGljIGludCBfX2luaXQgbW91bnRfbmZzX3Jvb3Qodm9pZCkKLXsKLQl2b2lkICpkYXRhID0gbmZzX3Jvb3RfZGF0YSgpOwotCi0JY3JlYXRlX2RldigiL2Rldi9yb290IiwgUk9PVF9ERVYpOwotCWlmIChkYXRhICYmCi0JICAgIGRvX21vdW50X3Jvb3QoIi9kZXYvcm9vdCIsICJuZnMiLCByb290X21vdW50ZmxhZ3MsIGRhdGEpID09IDApCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX1JBTSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9GRCkKLXZvaWQgX19pbml0IGNoYW5nZV9mbG9wcHkoY2hhciAqZm10LCAuLi4pCi17Ci0Jc3RydWN0IHRlcm1pb3MgdGVybWlvczsKLQljaGFyIGJ1Zls4MF07Ci0JY2hhciBjOwotCWludCBmZDsKLQl2YV9saXN0IGFyZ3M7Ci0JdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCWZkID0gc3lzX29wZW4oIi9kZXYvcm9vdCIsIE9fUkRXUiB8IE9fTkRFTEFZLCAwKTsKLQlpZiAoZmQgPj0gMCkgewotCQlzeXNfaW9jdGwoZmQsIEZERUpFQ1QsIDApOwotCQlzeXNfY2xvc2UoZmQpOwotCX0KLQlwcmludGsoS0VSTl9OT1RJQ0UgIlZGUzogSW5zZXJ0ICVzIGFuZCBwcmVzcyBFTlRFUlxuIiwgYnVmKTsKLQlmZCA9IHN5c19vcGVuKCIvZGV2L2NvbnNvbGUiLCBPX1JEV1IsIDApOwotCWlmIChmZCA+PSAwKSB7Ci0JCXN5c19pb2N0bChmZCwgVENHRVRTLCAobG9uZykmdGVybWlvcyk7Ci0JCXRlcm1pb3MuY19sZmxhZyAmPSB+SUNBTk9OOwotCQlzeXNfaW9jdGwoZmQsIFRDU0VUU0YsIChsb25nKSZ0ZXJtaW9zKTsKLQkJc3lzX3JlYWQoZmQsICZjLCAxKTsKLQkJdGVybWlvcy5jX2xmbGFnIHw9IElDQU5PTjsKLQkJc3lzX2lvY3RsKGZkLCBUQ1NFVFNGLCAobG9uZykmdGVybWlvcyk7Ci0JCXN5c19jbG9zZShmZCk7Ci0JfQotfQotI2VuZGlmCi0KLXZvaWQgX19pbml0IG1vdW50X3Jvb3Qodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfUk9PVF9ORlMKLQlpZiAoTUFKT1IoUk9PVF9ERVYpID09IFVOTkFNRURfTUFKT1IpIHsKLQkJaWYgKG1vdW50X25mc19yb290KCkpCi0JCQlyZXR1cm47Ci0KLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFVuYWJsZSB0byBtb3VudCByb290IGZzIHZpYSBORlMsIHRyeWluZyBmbG9wcHkuXG4iKTsKLQkJUk9PVF9ERVYgPSBSb290X0ZEMDsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9GRAotCWlmIChNQUpPUihST09UX0RFVikgPT0gRkxPUFBZX01BSk9SKSB7Ci0JCS8qIHJkX2RvbG9hZCBpcyAyIGZvciBhIGR1YWwgaW5pdHJkL3JhbWxvYWQgc2V0dXAgKi8KLQkJaWYgKHJkX2RvbG9hZD09MikgewotCQkJaWYgKHJkX2xvYWRfZGlzaygxKSkgewotCQkJCVJPT1RfREVWID0gUm9vdF9SQU0xOwotCQkJCXJvb3RfZGV2aWNlX25hbWUgPSBOVUxMOwotCQkJfQotCQl9IGVsc2UKLQkJCWNoYW5nZV9mbG9wcHkoInJvb3QgZmxvcHB5Iik7Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JMT0NLCi0JY3JlYXRlX2RldigiL2Rldi9yb290IiwgUk9PVF9ERVYpOwotCW1vdW50X2Jsb2NrX3Jvb3QoIi9kZXYvcm9vdCIsIHJvb3RfbW91bnRmbGFncyk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFByZXBhcmUgdGhlIG5hbWVzcGFjZSAtIGRlY2lkZSB3aGF0L3doZXJlIHRvIG1vdW50LCBsb2FkIHJhbWRpc2tzLCBldGMuCi0gKi8KLXZvaWQgX19pbml0IHByZXBhcmVfbmFtZXNwYWNlKHZvaWQpCi17Ci0JaW50IGlzX2Zsb3BweTsKLQotCWlmIChyb290X2RlbGF5KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIldhaXRpbmcgJWRzZWMgYmVmb3JlIG1vdW50aW5nIHJvb3QgZGV2aWNlLi4uXG4iLAotCQkgICAgICAgcm9vdF9kZWxheSk7Ci0JCXNzbGVlcChyb290X2RlbGF5KTsKLQl9Ci0KLQkvKiB3YWl0IGZvciB0aGUga25vd24gZGV2aWNlcyB0byBjb21wbGV0ZSB0aGVpciBwcm9iaW5nICovCi0Jd2hpbGUgKGRyaXZlcl9wcm9iZV9kb25lKCkgIT0gMCkKLQkJbXNsZWVwKDEwMCk7Ci0KLQltZF9ydW5fc2V0dXAoKTsKLQotCWlmIChzYXZlZF9yb290X25hbWVbMF0pIHsKLQkJcm9vdF9kZXZpY2VfbmFtZSA9IHNhdmVkX3Jvb3RfbmFtZTsKLQkJaWYgKCFzdHJuY21wKHJvb3RfZGV2aWNlX25hbWUsICJtdGQiLCAzKSkgewotCQkJbW91bnRfYmxvY2tfcm9vdChyb290X2RldmljZV9uYW1lLCByb290X21vdW50ZmxhZ3MpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJUk9PVF9ERVYgPSBuYW1lX3RvX2Rldl90KHJvb3RfZGV2aWNlX25hbWUpOwotCQlpZiAoc3RybmNtcChyb290X2RldmljZV9uYW1lLCAiL2Rldi8iLCA1KSA9PSAwKQotCQkJcm9vdF9kZXZpY2VfbmFtZSArPSA1OwotCX0KLQotCWlzX2Zsb3BweSA9IE1BSk9SKFJPT1RfREVWKSA9PSBGTE9QUFlfTUFKT1I7Ci0KLQlpZiAoaW5pdHJkX2xvYWQoKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoaXNfZmxvcHB5ICYmIHJkX2RvbG9hZCAmJiByZF9sb2FkX2Rpc2soMCkpCi0JCVJPT1RfREVWID0gUm9vdF9SQU0wOwotCi0JbW91bnRfcm9vdCgpOwotb3V0OgotCXN5c19tb3VudCgiLiIsICIvIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCk7Ci0Jc3lzX2Nocm9vdCgiLiIpOwotCXNlY3VyaXR5X3NiX3Bvc3RfbW91bnRyb290KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzLmggYi9pbml0L2RvX21vdW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzU3MDVkLi4wMDAwMDAwCi0tLSBhL2luaXQvZG9fbW91bnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgotCi12b2lkICBjaGFuZ2VfZmxvcHB5KGNoYXIgKmZtdCwgLi4uKTsKLXZvaWQgIG1vdW50X2Jsb2NrX3Jvb3QoY2hhciAqbmFtZSwgaW50IGZsYWdzKTsKLXZvaWQgIG1vdW50X3Jvb3Qodm9pZCk7Ci1leHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKLWV4dGVybiBjaGFyICpyb290X2RldmljZV9uYW1lOwotCi1zdGF0aWMgaW5saW5lIGludCBjcmVhdGVfZGV2KGNoYXIgKm5hbWUsIGRldl90IGRldikKLXsKLQlzeXNfdW5saW5rKG5hbWUpOwotCXJldHVybiBzeXNfbWtub2QobmFtZSwgU19JRkJMS3wwNjAwLCBuZXdfZW5jb2RlX2RldihkZXYpKTsKLX0KLQotI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKLXN0YXRpYyBpbmxpbmUgdTMyIGJzdGF0KGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHN0YXQ2NCBzdGF0OwotCWlmIChzeXNfc3RhdDY0KG5hbWUsICZzdGF0KSAhPSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoIVNfSVNCTEsoc3RhdC5zdF9tb2RlKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHN0YXQuc3RfcmRldiAhPSAodTMyKXN0YXQuc3RfcmRldikKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHN0YXQuc3RfcmRldjsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHUzMiBic3RhdChjaGFyICpuYW1lKQotewotCXN0cnVjdCBzdGF0IHN0YXQ7Ci0JaWYgKHN5c19uZXdzdGF0KG5hbWUsICZzdGF0KSAhPSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoIVNfSVNCTEsoc3RhdC5zdF9tb2RlKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHN0YXQuc3RfcmRldjsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCi0KLWludCBfX2luaXQgcmRfbG9hZF9kaXNrKGludCBuKTsKLWludCBfX2luaXQgcmRfbG9hZF9pbWFnZShjaGFyICpmcm9tKTsKLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSBpbnQgcmRfbG9hZF9kaXNrKGludCBuKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCByZF9sb2FkX2ltYWdlKGNoYXIgKmZyb20pIHsgcmV0dXJuIDA7IH0KLQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQotaW50IF9faW5pdCBpbml0cmRfbG9hZCh2b2lkKTsKLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSBpbnQgaW5pdHJkX2xvYWQodm9pZCkgeyByZXR1cm4gMDsgfQotCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX01ECi0KLXZvaWQgbWRfcnVuX3NldHVwKHZvaWQpOwotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWRfcnVuX3NldHVwKHZvaWQpIHt9Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMgYi9pbml0L2RvX21vdW50c19pbml0cmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyMmNlOS4uMDAwMDAwMAotLS0gYS9pbml0L2RvX21vdW50c19pbml0cmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taW5peF9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9yb21mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotCi0jaW5jbHVkZSAiZG9fbW91bnRzLmgiCi0KLXVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kOwotaW50IGluaXRyZF9iZWxvd19zdGFydF9vazsKLXVuc2lnbmVkIGludCByZWFsX3Jvb3RfZGV2OwkvKiBkb19wcm9jX2RvaW50dmVjIGNhbm5vdCBoYW5kbGUga2Rldl90ICovCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgb2xkX2ZkLCByb290X2ZkOwotc3RhdGljIGludCBfX2luaXRkYXRhIG1vdW50X2luaXRyZCA9IDE7Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5vX2luaXRyZChjaGFyICpzdHIpCi17Ci0JbW91bnRfaW5pdHJkID0gMDsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgibm9pbml0cmQiLCBub19pbml0cmQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBkb19saW51eHJjKHZvaWQgKiBzaGVsbCkKLXsKLQlzdGF0aWMgY2hhciAqYXJndltdID0geyAibGludXhyYyIsIE5VTEwsIH07Ci0JZXh0ZXJuIGNoYXIgKiBlbnZwX2luaXRbXTsKLQotCXN5c19jbG9zZShvbGRfZmQpO3N5c19jbG9zZShyb290X2ZkKTsKLQlzeXNfY2xvc2UoMCk7c3lzX2Nsb3NlKDEpO3N5c19jbG9zZSgyKTsKLQlzeXNfc2V0c2lkKCk7Ci0JKHZvaWQpIHN5c19vcGVuKCIvZGV2L2NvbnNvbGUiLE9fUkRXUiwwKTsKLQkodm9pZCkgc3lzX2R1cCgwKTsKLQkodm9pZCkgc3lzX2R1cCgwKTsKLQlyZXR1cm4ga2VybmVsX2V4ZWN2ZShzaGVsbCwgYXJndiwgZW52cF9pbml0KTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGhhbmRsZV9pbml0cmQodm9pZCkKLXsKLQlpbnQgZXJyb3I7Ci0JaW50IHBpZDsKLQotCXJlYWxfcm9vdF9kZXYgPSBuZXdfZW5jb2RlX2RldihST09UX0RFVik7Ci0JY3JlYXRlX2RldigiL2Rldi9yb290Lm9sZCIsIFJvb3RfUkFNMCk7Ci0JLyogbW91bnQgaW5pdHJkIG9uIHJvb3RmcycgL3Jvb3QgKi8KLQltb3VudF9ibG9ja19yb290KCIvZGV2L3Jvb3Qub2xkIiwgcm9vdF9tb3VudGZsYWdzICYgfk1TX1JET05MWSk7Ci0Jc3lzX21rZGlyKCIvb2xkIiwgMDcwMCk7Ci0Jcm9vdF9mZCA9IHN5c19vcGVuKCIvIiwgMCwgMCk7Ci0Jb2xkX2ZkID0gc3lzX29wZW4oIi9vbGQiLCAwLCAwKTsKLQkvKiBtb3ZlIGluaXRyZCBvdmVyIC8gYW5kIGNoZGlyL2Nocm9vdCBpbiBpbml0cmQgcm9vdCAqLwotCXN5c19jaGRpcigiL3Jvb3QiKTsKLQlzeXNfbW91bnQoIi4iLCAiLyIsIE5VTEwsIE1TX01PVkUsIE5VTEwpOwotCXN5c19jaHJvb3QoIi4iKTsKLQotCXBpZCA9IGtlcm5lbF90aHJlYWQoZG9fbGludXhyYywgIi9saW51eHJjIiwgU0lHQ0hMRCk7Ci0JaWYgKHBpZCA+IDApIHsKLQkJd2hpbGUgKHBpZCAhPSBzeXNfd2FpdDQoLTEsIE5VTEwsIDAsIE5VTEwpKSB7Ci0JCQl0cnlfdG9fZnJlZXplKCk7Ci0JCQl5aWVsZCgpOwotCQl9Ci0JfQotCi0JLyogbW92ZSBpbml0cmQgdG8gcm9vdGZzJyAvb2xkICovCi0Jc3lzX2ZjaGRpcihvbGRfZmQpOwotCXN5c19tb3VudCgiLyIsICIuIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCk7Ci0JLyogc3dpdGNoIHJvb3QgYW5kIGN3ZCBiYWNrIHRvIC8gb2Ygcm9vdGZzICovCi0Jc3lzX2ZjaGRpcihyb290X2ZkKTsKLQlzeXNfY2hyb290KCIuIik7Ci0Jc3lzX2Nsb3NlKG9sZF9mZCk7Ci0Jc3lzX2Nsb3NlKHJvb3RfZmQpOwotCi0JaWYgKG5ld19kZWNvZGVfZGV2KHJlYWxfcm9vdF9kZXYpID09IFJvb3RfUkFNMCkgewotCQlzeXNfY2hkaXIoIi9vbGQiKTsKLQkJcmV0dXJuOwotCX0KLQotCVJPT1RfREVWID0gbmV3X2RlY29kZV9kZXYocmVhbF9yb290X2Rldik7Ci0JbW91bnRfcm9vdCgpOwotCi0JcHJpbnRrKEtFUk5fTk9USUNFICJUcnlpbmcgdG8gbW92ZSBvbGQgcm9vdCB0byAvaW5pdHJkIC4uLiAiKTsKLQllcnJvciA9IHN5c19tb3VudCgiL29sZCIsICIvcm9vdC9pbml0cmQiLCBOVUxMLCBNU19NT1ZFLCBOVUxMKTsKLQlpZiAoIWVycm9yKQotCQlwcmludGsoIm9rYXlcbiIpOwotCWVsc2UgewotCQlpbnQgZmQgPSBzeXNfb3BlbigiL2Rldi9yb290Lm9sZCIsIE9fUkRXUiwgMCk7Ci0JCWlmIChlcnJvciA9PSAtRU5PRU5UKQotCQkJcHJpbnRrKCIvaW5pdHJkIGRvZXMgbm90IGV4aXN0LiBJZ25vcmVkLlxuIik7Ci0JCWVsc2UKLQkJCXByaW50aygiZmFpbGVkXG4iKTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJVbm1vdW50aW5nIG9sZCByb290XG4iKTsKLQkJc3lzX3Vtb3VudCgiL29sZCIsIE1OVF9ERVRBQ0gpOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlRyeWluZyB0byBmcmVlIHJhbWRpc2sgbWVtb3J5IC4uLiAiKTsKLQkJaWYgKGZkIDwgMCkgewotCQkJZXJyb3IgPSBmZDsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0gc3lzX2lvY3RsKGZkLCBCTEtGTFNCVUYsIDApOwotCQkJc3lzX2Nsb3NlKGZkKTsKLQkJfQotCQlwcmludGsoIWVycm9yID8gIm9rYXlcbiIgOiAiZmFpbGVkXG4iKTsKLQl9Ci19Ci0KLWludCBfX2luaXQgaW5pdHJkX2xvYWQodm9pZCkKLXsKLQlpZiAobW91bnRfaW5pdHJkKSB7Ci0JCWNyZWF0ZV9kZXYoIi9kZXYvcmFtIiwgUm9vdF9SQU0wKTsKLQkJLyoKLQkJICogTG9hZCB0aGUgaW5pdHJkIGRhdGEgaW50byAvZGV2L3JhbTAuIEV4ZWN1dGUgaXQgYXMgaW5pdHJkCi0JCSAqIHVubGVzcyAvZGV2L3JhbTAgaXMgc3VwcG9zZWQgdG8gYmUgb3VyIGFjdHVhbCByb290IGRldmljZSwKLQkJICogaW4gdGhhdCBjYXNlIHRoZSByYW0gZGlzayBpcyBqdXN0IHNldCB1cCBoZXJlLCBhbmQgZ2V0cwotCQkgKiBtb3VudGVkIGluIHRoZSBub3JtYWwgcGF0aC4KLQkJICovCi0JCWlmIChyZF9sb2FkX2ltYWdlKCIvaW5pdHJkLmltYWdlIikgJiYgUk9PVF9ERVYgIT0gUm9vdF9SQU0wKSB7Ci0JCQlzeXNfdW5saW5rKCIvaW5pdHJkLmltYWdlIik7Ci0JCQloYW5kbGVfaW5pdHJkKCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlzeXNfdW5saW5rKCIvaW5pdHJkLmltYWdlIik7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19tZC5jIGIvaW5pdC9kb19tb3VudHNfbWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzZGM1NC4uMDAwMDAwMAotLS0gYS9pbml0L2RvX21vdW50c19tZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLQotI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWQuaD4KLQotI2luY2x1ZGUgImRvX21vdW50cy5oIgotCi0vKgotICogV2hlbiBtZCAoYW5kIGFueSByZXF1aXJlIHBlcnNvbmFsaXRpZXMpIGFyZSBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwKLSAqIChub3QgYSBtb2R1bGUpLCBhcnJheXMgY2FuIGJlIGFzc2VtYmxlcyBhcmUgYm9vdCB0aW1lIHVzaW5nIHdpdGggQVVUT0RFVEVDVAotICogd2hlcmUgc3BlY2lhbGx5IG1hcmtlZCBwYXJ0aXRpb25zIGFyZSByZWdpc3RlcmVkIHdpdGggbWRfYXV0b2RldGVjdF9kZXYoKSwKLSAqIGFuZCB3aXRoIE1EX0JPT1Qgd2hlcmUgZGV2aWNlcyB0byBiZSBjb2xsZWN0ZWQgYXJlIGdpdmVuIG9uIHRoZSBib290IGxpbmUKLSAqIHdpdGggbWQ9Li4uLi4KLSAqIFRoZSBjb2RlIGZvciB0aGF0IGlzIGhlcmUuCi0gKi8KLQotc3RhdGljIGludCBfX2luaXRkYXRhIHJhaWRfbm9hdXRvZGV0ZWN0LCByYWlkX2F1dG9wYXJ0OwotCi1zdGF0aWMgc3RydWN0IHsKLQlpbnQgbWlub3I7Ci0JaW50IHBhcnRpdGlvbmVkOwotCWludCBsZXZlbDsKLQlpbnQgY2h1bms7Ci0JY2hhciAqZGV2aWNlX25hbWVzOwotfSBtZF9zZXR1cF9hcmdzWzI1Nl0gX19pbml0ZGF0YTsKLQotc3RhdGljIGludCBtZF9zZXR1cF9lbnRzIF9faW5pdGRhdGE7Ci0KLWV4dGVybiBpbnQgbWRwX21ham9yOwotLyoKLSAqIFBhcnNlIHRoZSBjb21tYW5kLWxpbmUgcGFyYW1ldGVycyBnaXZlbiBvdXIga2VybmVsLCBidXQgZG8gbm90Ci0gKiBhY3R1YWxseSB0cnkgdG8gaW52b2tlIHRoZSBNRCBkZXZpY2Ugbm93OyB0aGF0IGlzIGhhbmRsZWQgYnkKLSAqIG1kX3NldHVwX2RyaXZlIGFmdGVyIHRoZSBsb3ctbGV2ZWwgZGlzayBkcml2ZXJzIGhhdmUgaW5pdGlhbGlzZWQuCi0gKgotICogMjcvMTEvMTk5OTogRml4ZWQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgMi4zIGtlcm5lbCAod2hpY2gKLSAqICAgICAgICAgICAgIGFzc2lnbnMgdGhlIHRhc2sgb2YgcGFyc2luZyBpbnRlZ2VyIGFyZ3VtZW50cyB0byB0aGUKLSAqICAgICAgICAgICAgIGludm9rZWQgcHJvZ3JhbSBub3cpLiAgQWRkZWQgYWJpbGl0eSB0byBpbml0aWFsaXNlIGFsbAotICogICAgICAgICAgICAgdGhlIE1EIGRldmljZXMgKGJ5IHNwZWNpZnlpbmcgbXVsdGlwbGUgIm1kPSIgbGluZXMpCi0gKiAgICAgICAgICAgICBpbnN0ZWFkIG9mIGp1c3Qgb25lLiAgLS0gS1RLCi0gKiAxOE1heTIwMDA6IEFkZGVkIHN1cHBvcnQgZm9yIHBlcnNpc3RlbnQtc3VwZXJibG9jayBhcnJheXM6Ci0gKiAgICAgICAgICAgICBtZD1uLDAsZmFjdG9yLGZhdWx0LGRldmljZS1saXN0ICAgdXNlcyBSQUlEMCBmb3IgZGV2aWNlIG4KLSAqICAgICAgICAgICAgIG1kPW4sLTEsZmFjdG9yLGZhdWx0LGRldmljZS1saXN0ICB1c2VzIExJTkVBUiBmb3IgZGV2aWNlIG4KLSAqICAgICAgICAgICAgIG1kPW4sZGV2aWNlLWxpc3QgICAgICByZWFkcyBhIFJBSUQgc3VwZXJibG9jayBmcm9tIHRoZSBkZXZpY2VzCi0gKiAgICAgICAgICAgICBlbGVtZW50cyBpbiBkZXZpY2UtbGlzdCBhcmUgcmVhZCBieSBuYW1lX3RvX2tkZXZfdCBzbyBjYW4gYmUKLSAqICAgICAgICAgICAgIGEgaGV4IG51bWJlciBvciBzb21ldGhpbmcgbGlrZSAvZGV2L2hkYTEgL2Rldi9zZGIKLSAqIDIwMDEtMDYtMDM6IERhdmUgQ2luZWdlIDxkY2luZWdlQHBzeWNob3Npcy5jb20+Ci0gKgkJU2hpZnRlZCBuYW1lX3RvX2tkZXZfdCgpIGFuZCByZWxhdGVkIG9wZXJhdGlvbnMgdG8gbWRfc2V0X2RyaXZlKCkKLSAqCQlmb3IgbGF0ZXIgZXhlY3V0aW9uLiBSZXdyb3RlIHNlY3Rpb24gdG8gbWFrZSBkZXZmcyBjb21wYXRpYmxlLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBtZF9zZXR1cChjaGFyICpzdHIpCi17Ci0JaW50IG1pbm9yLCBsZXZlbCwgZmFjdG9yLCBmYXVsdCwgcGFydGl0aW9uZWQgPSAwOwotCWNoYXIgKnBlcm5hbWUgPSAiIjsKLQljaGFyICpzdHIxOwotCWludCBlbnQ7Ci0KLQlpZiAoKnN0ciA9PSAnZCcpIHsKLQkJcGFydGl0aW9uZWQgPSAxOwotCQlzdHIrKzsKLQl9Ci0JaWYgKGdldF9vcHRpb24oJnN0ciwgJm1pbm9yKSAhPSAyKSB7CS8qIE1EIE51bWJlciAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZDogVG9vIGZldyBhcmd1bWVudHMgc3VwcGxpZWQgdG8gbWQ9LlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlzdHIxID0gc3RyOwotCWZvciAoZW50PTAgOyBlbnQ8IG1kX3NldHVwX2VudHMgOyBlbnQrKykKLQkJaWYgKG1kX3NldHVwX2FyZ3NbZW50XS5taW5vciA9PSBtaW5vciAmJgotCQkgICAgbWRfc2V0dXBfYXJnc1tlbnRdLnBhcnRpdGlvbmVkID09IHBhcnRpdGlvbmVkKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZDogbWQ9JXMlZCwgU3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlLiAiCi0JCQkgICAgICAgIlJlcGxhY2luZyBwcmV2aW91cyBkZWZpbml0aW9uLlxuIiwgcGFydGl0aW9uZWQ/ImQiOiIiLCBtaW5vcik7Ci0JCQlicmVhazsKLQkJfQotCWlmIChlbnQgPj0gQVJSQVlfU0laRShtZF9zZXR1cF9hcmdzKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZDogbWQ9JXMlZCAtIHRvbyBtYW55IG1kIGluaXRpYWxpc2F0aW9uc1xuIiwgcGFydGl0aW9uZWQ/ImQiOiIiLCBtaW5vcik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZW50ID49IG1kX3NldHVwX2VudHMpCi0JCW1kX3NldHVwX2VudHMrKzsKLQlzd2l0Y2ggKGdldF9vcHRpb24oJnN0ciwgJmxldmVsKSkgewkvKiBSQUlEIGxldmVsICovCi0JY2FzZSAyOiAvKiBjb3VsZCBiZSAwIG9yIC0xLi4gKi8KLQkJaWYgKGxldmVsID09IDAgfHwgbGV2ZWwgPT0gTEVWRUxfTElORUFSKSB7Ci0JCQlpZiAoZ2V0X29wdGlvbigmc3RyLCAmZmFjdG9yKSAhPSAyIHx8CS8qIENodW5rIFNpemUgKi8KLQkJCQkJZ2V0X29wdGlvbigmc3RyLCAmZmF1bHQpICE9IDIpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZDogVG9vIGZldyBhcmd1bWVudHMgc3VwcGxpZWQgdG8gbWQ9LlxuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQltZF9zZXR1cF9hcmdzW2VudF0ubGV2ZWwgPSBsZXZlbDsKLQkJCW1kX3NldHVwX2FyZ3NbZW50XS5jaHVuayA9IDEgPDwgKGZhY3RvcisxMik7Ci0JCQlpZiAobGV2ZWwgPT0gIExFVkVMX0xJTkVBUikKLQkJCQlwZXJuYW1lID0gImxpbmVhciI7Ci0JCQllbHNlCi0JCQkJcGVybmFtZSA9ICJyYWlkMCI7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBGQUxMIFRIUk9VR0ggKi8KLQljYXNlIDE6IC8qIHRoZSBmaXJzdCBkZXZpY2UgaXMgbnVtZXJpYyAqLwotCQlzdHIgPSBzdHIxOwotCQkvKiBGQUxMIFRIUk9VR0ggKi8KLQljYXNlIDA6Ci0JCW1kX3NldHVwX2FyZ3NbZW50XS5sZXZlbCA9IExFVkVMX05PTkU7Ci0JCXBlcm5hbWU9InN1cGVyLWJsb2NrIjsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJtZDogV2lsbCBjb25maWd1cmUgbWQlZCAoJXMpIGZyb20gJXMsIGJlbG93LlxuIiwKLQkJbWlub3IsIHBlcm5hbWUsIHN0cik7Ci0JbWRfc2V0dXBfYXJnc1tlbnRdLmRldmljZV9uYW1lcyA9IHN0cjsKLQltZF9zZXR1cF9hcmdzW2VudF0ucGFydGl0aW9uZWQgPSBwYXJ0aXRpb25lZDsKLQltZF9zZXR1cF9hcmdzW2VudF0ubWlub3IgPSBtaW5vcjsKLQotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIE1kcE1pbm9yU2hpZnQgNgotCi1zdGF0aWMgdm9pZCBfX2luaXQgbWRfc2V0dXBfZHJpdmUodm9pZCkKLXsKLQlpbnQgbWlub3IsIGksIGVudCwgcGFydGl0aW9uZWQ7Ci0JZGV2X3QgZGV2OwotCWRldl90IGRldmljZXNbTURfU0JfRElTS1MrMV07Ci0KLQlmb3IgKGVudCA9IDA7IGVudCA8IG1kX3NldHVwX2VudHMgOyBlbnQrKykgewotCQlpbnQgZmQ7Ci0JCWludCBlcnIgPSAwOwotCQljaGFyICpkZXZuYW1lOwotCQltZHVfZGlza19pbmZvX3QgZGluZm87Ci0JCWNoYXIgbmFtZVsxNl07Ci0KLQkJbWlub3IgPSBtZF9zZXR1cF9hcmdzW2VudF0ubWlub3I7Ci0JCXBhcnRpdGlvbmVkID0gbWRfc2V0dXBfYXJnc1tlbnRdLnBhcnRpdGlvbmVkOwotCQlkZXZuYW1lID0gbWRfc2V0dXBfYXJnc1tlbnRdLmRldmljZV9uYW1lczsKLQotCQlzcHJpbnRmKG5hbWUsICIvZGV2L21kJXMlZCIsIHBhcnRpdGlvbmVkPyJfZCI6IiIsIG1pbm9yKTsKLQkJaWYgKHBhcnRpdGlvbmVkKQotCQkJZGV2ID0gTUtERVYobWRwX21ham9yLCBtaW5vciA8PCBNZHBNaW5vclNoaWZ0KTsKLQkJZWxzZQotCQkJZGV2ID0gTUtERVYoTURfTUFKT1IsIG1pbm9yKTsKLQkJY3JlYXRlX2RldihuYW1lLCBkZXYpOwotCQlmb3IgKGkgPSAwOyBpIDwgTURfU0JfRElTS1MgJiYgZGV2bmFtZSAhPSAwOyBpKyspIHsKLQkJCWNoYXIgKnA7Ci0JCQljaGFyIGNvbXBfbmFtZVs2NF07Ci0JCQl1MzIgcmRldjsKLQotCQkJcCA9IHN0cmNocihkZXZuYW1lLCAnLCcpOwotCQkJaWYgKHApCi0JCQkJKnArKyA9IDA7Ci0KLQkJCWRldiA9IG5hbWVfdG9fZGV2X3QoZGV2bmFtZSk7Ci0JCQlpZiAoc3RybmNtcChkZXZuYW1lLCAiL2Rldi8iLCA1KSA9PSAwKQotCQkJCWRldm5hbWUgKz0gNTsKLQkJCXNucHJpbnRmKGNvbXBfbmFtZSwgNjMsICIvZGV2LyVzIiwgZGV2bmFtZSk7Ci0JCQlyZGV2ID0gYnN0YXQoY29tcF9uYW1lKTsKLQkJCWlmIChyZGV2KQotCQkJCWRldiA9IG5ld19kZWNvZGVfZGV2KHJkZXYpOwotCQkJaWYgKCFkZXYpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZDogVW5rbm93biBkZXZpY2UgbmFtZTogJXNcbiIsIGRldm5hbWUpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlkZXZpY2VzW2ldID0gZGV2OwotCi0JCQlkZXZuYW1lID0gcDsKLQkJfQotCQlkZXZpY2VzW2ldID0gMDsKLQotCQlpZiAoIWkpCi0JCQljb250aW51ZTsKLQotCQlwcmludGsoS0VSTl9JTkZPICJtZDogTG9hZGluZyBtZCVzJWQ6ICVzXG4iLAotCQkJcGFydGl0aW9uZWQgPyAiX2QiIDogIiIsIG1pbm9yLAotCQkJbWRfc2V0dXBfYXJnc1tlbnRdLmRldmljZV9uYW1lcyk7Ci0KLQkJZmQgPSBzeXNfb3BlbihuYW1lLCAwLCAwKTsKLQkJaWYgKGZkIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJtZDogb3BlbiBmYWlsZWQgLSBjYW5ub3Qgc3RhcnQgIgotCQkJCQkiYXJyYXkgJXNcbiIsIG5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN5c19pb2N0bChmZCwgU0VUX0FSUkFZX0lORk8sIDApID09IC1FQlVTWSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJtZDogSWdub3JpbmcgbWQ9JWQsIGFscmVhZHkgYXV0b2RldGVjdGVkLiAoVXNlIHJhaWQ9bm9hdXRvZGV0ZWN0KVxuIiwKLQkJCSAgICAgICBtaW5vcik7Ci0JCQlzeXNfY2xvc2UoZmQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAobWRfc2V0dXBfYXJnc1tlbnRdLmxldmVsICE9IExFVkVMX05PTkUpIHsKLQkJCS8qIG5vbi1wZXJzaXN0ZW50ICovCi0JCQltZHVfYXJyYXlfaW5mb190IGFpbmZvOwotCQkJYWluZm8ubGV2ZWwgPSBtZF9zZXR1cF9hcmdzW2VudF0ubGV2ZWw7Ci0JCQlhaW5mby5zaXplID0gMDsKLQkJCWFpbmZvLm5yX2Rpc2tzID0wOwotCQkJYWluZm8ucmFpZF9kaXNrcyA9MDsKLQkJCXdoaWxlIChkZXZpY2VzW2FpbmZvLnJhaWRfZGlza3NdKQotCQkJCWFpbmZvLnJhaWRfZGlza3MrKzsKLQkJCWFpbmZvLm1kX21pbm9yID1taW5vcjsKLQkJCWFpbmZvLm5vdF9wZXJzaXN0ZW50ID0gMTsKLQotCQkJYWluZm8uc3RhdGUgPSAoMSA8PCBNRF9TQl9DTEVBTik7Ci0JCQlhaW5mby5sYXlvdXQgPSAwOwotCQkJYWluZm8uY2h1bmtfc2l6ZSA9IG1kX3NldHVwX2FyZ3NbZW50XS5jaHVuazsKLQkJCWVyciA9IHN5c19pb2N0bChmZCwgU0VUX0FSUkFZX0lORk8sIChsb25nKSZhaW5mbyk7Ci0JCQlmb3IgKGkgPSAwOyAhZXJyICYmIGkgPD0gTURfU0JfRElTS1M7IGkrKykgewotCQkJCWRldiA9IGRldmljZXNbaV07Ci0JCQkJaWYgKCFkZXYpCi0JCQkJCWJyZWFrOwotCQkJCWRpbmZvLm51bWJlciA9IGk7Ci0JCQkJZGluZm8ucmFpZF9kaXNrID0gaTsKLQkJCQlkaW5mby5zdGF0ZSA9ICgxPDxNRF9ESVNLX0FDVElWRSl8KDE8PE1EX0RJU0tfU1lOQyk7Ci0JCQkJZGluZm8ubWFqb3IgPSBNQUpPUihkZXYpOwotCQkJCWRpbmZvLm1pbm9yID0gTUlOT1IoZGV2KTsKLQkJCQllcnIgPSBzeXNfaW9jdGwoZmQsIEFERF9ORVdfRElTSywgKGxvbmcpJmRpbmZvKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIHBlcnNpc3RlbnQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPD0gTURfU0JfRElTS1M7IGkrKykgewotCQkJCWRldiA9IGRldmljZXNbaV07Ci0JCQkJaWYgKCFkZXYpCi0JCQkJCWJyZWFrOwotCQkJCWRpbmZvLm1ham9yID0gTUFKT1IoZGV2KTsKLQkJCQlkaW5mby5taW5vciA9IE1JTk9SKGRldik7Ci0JCQkJc3lzX2lvY3RsKGZkLCBBRERfTkVXX0RJU0ssIChsb25nKSZkaW5mbyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFlcnIpCi0JCQllcnIgPSBzeXNfaW9jdGwoZmQsIFJVTl9BUlJBWSwgMCk7Ci0JCWlmIChlcnIpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZDogc3RhcnRpbmcgbWQlZCBmYWlsZWRcbiIsIG1pbm9yKTsKLQkJZWxzZSB7Ci0JCQkvKiByZXJlYWQgdGhlIHBhcnRpdGlvbiB0YWJsZS4KLQkJCSAqIEkgKG5laWxiKSBhbmQgbm90IHN1cmUgd2h5IHRoaXMgaXMgbmVlZGVkLCBidXQgSSBjYW5ub3QKLQkJCSAqIGJvb3QgYSBrZXJuZWwgd2l0aCBkZXZmcyBjb21waWxlZCBpbiBmcm9tIHBhcnRpdGlvbmVkIG1kCi0JCQkgKiBhcnJheSB3aXRob3V0IGl0Ci0JCQkgKi8KLQkJCXN5c19jbG9zZShmZCk7Ci0JCQlmZCA9IHN5c19vcGVuKG5hbWUsIDAsIDApOwotCQkJc3lzX2lvY3RsKGZkLCBCTEtSUlBBUlQsIDApOwotCQl9Ci0JCXN5c19jbG9zZShmZCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9faW5pdCByYWlkX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpbnQgbGVuLCBwb3M7Ci0KLQlsZW4gPSBzdHJsZW4oc3RyKSArIDE7Ci0JcG9zID0gMDsKLQotCXdoaWxlIChwb3MgPCBsZW4pIHsKLQkJY2hhciAqY29tbWEgPSBzdHJjaHIoc3RyK3BvcywgJywnKTsKLQkJaW50IHdsZW47Ci0JCWlmIChjb21tYSkKLQkJCXdsZW4gPSAoY29tbWEtc3RyKS1wb3M7Ci0JCWVsc2UJd2xlbiA9IChsZW4tMSktcG9zOwotCi0JCWlmICghc3RybmNtcChzdHIsICJub2F1dG9kZXRlY3QiLCB3bGVuKSkKLQkJCXJhaWRfbm9hdXRvZGV0ZWN0ID0gMTsKLQkJaWYgKHN0cm5jbXAoc3RyLCAicGFydGl0aW9uYWJsZSIsIHdsZW4pPT0wKQotCQkJcmFpZF9hdXRvcGFydCA9IDE7Ci0JCWlmIChzdHJuY21wKHN0ciwgInBhcnQiLCB3bGVuKT09MCkKLQkJCXJhaWRfYXV0b3BhcnQgPSAxOwotCQlwb3MgKz0gd2xlbisxOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgicmFpZD0iLCByYWlkX3NldHVwKTsKLV9fc2V0dXAoIm1kPSIsIG1kX3NldHVwKTsKLQotdm9pZCBfX2luaXQgbWRfcnVuX3NldHVwKHZvaWQpCi17Ci0JY3JlYXRlX2RldigiL2Rldi9tZDAiLCBNS0RFVihNRF9NQUpPUiwgMCkpOwotCWlmIChyYWlkX25vYXV0b2RldGVjdCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IFNraXBwaW5nIGF1dG9kZXRlY3Rpb24gb2YgUkFJRCBhcnJheXMuIChyYWlkPW5vYXV0b2RldGVjdClcbiIpOwotCWVsc2UgewotCQlpbnQgZmQgPSBzeXNfb3BlbigiL2Rldi9tZDAiLCAwLCAwKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCXN5c19pb2N0bChmZCwgUkFJRF9BVVRPUlVOLCByYWlkX2F1dG9wYXJ0KTsKLQkJCXN5c19jbG9zZShmZCk7Ci0JCX0KLQl9Ci0JbWRfc2V0dXBfZHJpdmUoKTsKLX0KZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzX3JkLmMgYi9pbml0L2RvX21vdW50c19yZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDY1MmY0Li4wMDAwMDAwCi0tLSBhL2luaXQvZG9fbW91bnRzX3JkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taW5peF9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9yb21mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYW1mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotCi0jaW5jbHVkZSAiZG9fbW91bnRzLmgiCi0KLSNkZWZpbmUgQlVJTERfQ1JBTURJU0sKLQotaW50IF9faW5pdGRhdGEgcmRfcHJvbXB0ID0gMTsvKiAxID0gcHJvbXB0IGZvciBSQU0gZGlzaywgMCA9IGRvbid0IHByb21wdCAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9tcHRfcmFtZGlzayhjaGFyICpzdHIpCi17Ci0JcmRfcHJvbXB0ID0gc2ltcGxlX3N0cnRvbChzdHIsTlVMTCwwKSAmIDE7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJwcm9tcHRfcmFtZGlzaz0iLCBwcm9tcHRfcmFtZGlzayk7Ci0KLWludCBfX2luaXRkYXRhIHJkX2ltYWdlX3N0YXJ0OwkJLyogc3RhcnRpbmcgYmxvY2sgIyBvZiBpbWFnZSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCByYW1kaXNrX3N0YXJ0X3NldHVwKGNoYXIgKnN0cikKLXsKLQlyZF9pbWFnZV9zdGFydCA9IHNpbXBsZV9zdHJ0b2woc3RyLE5VTEwsMCk7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJyYW1kaXNrX3N0YXJ0PSIsIHJhbWRpc2tfc3RhcnRfc2V0dXApOwotCi1zdGF0aWMgaW50IF9faW5pdCBjcmRfbG9hZChpbnQgaW5fZmQsIGludCBvdXRfZmQpOwotCi0vKgotICogVGhpcyByb3V0aW5lIHRyaWVzIHRvIGZpbmQgYSBSQU0gZGlzayBpbWFnZSB0byBsb2FkLCBhbmQgcmV0dXJucyB0aGUKLSAqIG51bWJlciBvZiBibG9ja3MgdG8gcmVhZCBmb3IgYSBub24tY29tcHJlc3NlZCBpbWFnZSwgMCBpZiB0aGUgaW1hZ2UKLSAqIGlzIGEgY29tcHJlc3NlZCBpbWFnZSwgYW5kIC0xIGlmIGFuIGltYWdlIHdpdGggdGhlIHJpZ2h0IG1hZ2ljCi0gKiBudW1iZXJzIGNvdWxkIG5vdCBiZSBmb3VuZC4KLSAqCi0gKiBXZSBjdXJyZW50bHkgY2hlY2sgZm9yIHRoZSBmb2xsb3dpbmcgbWFnaWMgbnVtYmVyczoKLSAqIAltaW5peAotICogCWV4dDIKLSAqCXJvbWZzCi0gKgljcmFtZnMKLSAqIAlnemlwCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IAotaWRlbnRpZnlfcmFtZGlza19pbWFnZShpbnQgZmQsIGludCBzdGFydF9ibG9jaykKLXsKLQljb25zdCBpbnQgc2l6ZSA9IDUxMjsKLQlzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKm1pbml4c2I7Ci0Jc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmV4dDJzYjsKLQlzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgKnJvbWZzYjsKLQlzdHJ1Y3QgY3JhbWZzX3N1cGVyICpjcmFtZnNiOwotCWludCBuYmxvY2tzID0gLTE7Ci0JdW5zaWduZWQgY2hhciAqYnVmOwotCi0JYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IDApCi0JCXJldHVybiAtMTsKLQotCW1pbml4c2IgPSAoc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICopIGJ1ZjsKLQlleHQyc2IgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKikgYnVmOwotCXJvbWZzYiA9IChzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgKikgYnVmOwotCWNyYW1mc2IgPSAoc3RydWN0IGNyYW1mc19zdXBlciAqKSBidWY7Ci0JbWVtc2V0KGJ1ZiwgMHhlNSwgc2l6ZSk7Ci0KLQkvKgotCSAqIFJlYWQgYmxvY2sgMCB0byB0ZXN0IGZvciBnemlwcGVkIGtlcm5lbAotCSAqLwotCXN5c19sc2VlayhmZCwgc3RhcnRfYmxvY2sgKiBCTE9DS19TSVpFLCAwKTsKLQlzeXNfcmVhZChmZCwgYnVmLCBzaXplKTsKLQotCS8qCi0JICogSWYgaXQgbWF0Y2hlcyB0aGUgZ3ppcCBtYWdpYyBudW1iZXJzLCByZXR1cm4gLTEKLQkgKi8KLQlpZiAoYnVmWzBdID09IDAzNyAmJiAoKGJ1ZlsxXSA9PSAwMjEzKSB8fCAoYnVmWzFdID09IDAyMzYpKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJICAgICAgICJSQU1ESVNLOiBDb21wcmVzc2VkIGltYWdlIGZvdW5kIGF0IGJsb2NrICVkXG4iLAotCQkgICAgICAgc3RhcnRfYmxvY2spOwotCQluYmxvY2tzID0gMDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIHJvbWZzIGlzIGF0IGJsb2NrIHplcm8gdG9vICovCi0JaWYgKHJvbWZzYi0+d29yZDAgPT0gUk9NU0JfV09SRDAgJiYKLQkgICAgcm9tZnNiLT53b3JkMSA9PSBST01TQl9XT1JEMSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJICAgICAgICJSQU1ESVNLOiByb21mcyBmaWxlc3lzdGVtIGZvdW5kIGF0IGJsb2NrICVkXG4iLAotCQkgICAgICAgc3RhcnRfYmxvY2spOwotCQluYmxvY2tzID0gKG50b2hsKHJvbWZzYi0+c2l6ZSkrQkxPQ0tfU0laRS0xKT4+QkxPQ0tfU0laRV9CSVRTOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNyYW1mc2ItPm1hZ2ljID09IENSQU1GU19NQUdJQykgewotCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJICAgICAgICJSQU1ESVNLOiBjcmFtZnMgZmlsZXN5c3RlbSBmb3VuZCBhdCBibG9jayAlZFxuIiwKLQkJICAgICAgIHN0YXJ0X2Jsb2NrKTsKLQkJbmJsb2NrcyA9IChjcmFtZnNiLT5zaXplICsgQkxPQ0tfU0laRSAtIDEpID4+IEJMT0NLX1NJWkVfQklUUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qCi0JICogUmVhZCBibG9jayAxIHRvIHRlc3QgZm9yIG1pbml4IGFuZCBleHQyIHN1cGVyYmxvY2sKLQkgKi8KLQlzeXNfbHNlZWsoZmQsIChzdGFydF9ibG9jaysxKSAqIEJMT0NLX1NJWkUsIDApOwotCXN5c19yZWFkKGZkLCBidWYsIHNpemUpOwotCi0JLyogVHJ5IG1pbml4ICovCi0JaWYgKG1pbml4c2ItPnNfbWFnaWMgPT0gTUlOSVhfU1VQRVJfTUFHSUMgfHwKLQkgICAgbWluaXhzYi0+c19tYWdpYyA9PSBNSU5JWF9TVVBFUl9NQUdJQzIpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiUkFNRElTSzogTWluaXggZmlsZXN5c3RlbSBmb3VuZCBhdCBibG9jayAlZFxuIiwKLQkJICAgICAgIHN0YXJ0X2Jsb2NrKTsKLQkJbmJsb2NrcyA9IG1pbml4c2ItPnNfbnpvbmVzIDw8IG1pbml4c2ItPnNfbG9nX3pvbmVfc2l6ZTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFRyeSBleHQyICovCi0JaWYgKGV4dDJzYi0+c19tYWdpYyA9PSBjcHVfdG9fbGUxNihFWFQyX1NVUEVSX01BR0lDKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJICAgICAgICJSQU1ESVNLOiBleHQyIGZpbGVzeXN0ZW0gZm91bmQgYXQgYmxvY2sgJWRcbiIsCi0JCSAgICAgICBzdGFydF9ibG9jayk7Ci0JCW5ibG9ja3MgPSBsZTMyX3RvX2NwdShleHQyc2ItPnNfYmxvY2tzX2NvdW50KSA8PAotCQkJbGUzMl90b19jcHUoZXh0MnNiLT5zX2xvZ19ibG9ja19zaXplKTsKLQkJZ290byBkb25lOwotCX0KLQotCXByaW50ayhLRVJOX05PVElDRQotCSAgICAgICAiUkFNRElTSzogQ291bGRuJ3QgZmluZCB2YWxpZCBSQU0gZGlzayBpbWFnZSBzdGFydGluZyBhdCAlZC5cbiIsCi0JICAgICAgIHN0YXJ0X2Jsb2NrKTsKLQkKLWRvbmU6Ci0Jc3lzX2xzZWVrKGZkLCBzdGFydF9ibG9jayAqIEJMT0NLX1NJWkUsIDApOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIG5ibG9ja3M7Ci19Ci0KLWludCBfX2luaXQgcmRfbG9hZF9pbWFnZShjaGFyICpmcm9tKQotewotCWludCByZXMgPSAwOwotCWludCBpbl9mZCwgb3V0X2ZkOwotCXVuc2lnbmVkIGxvbmcgcmRfYmxvY2tzLCBkZXZibG9ja3M7Ci0JaW50IG5ibG9ja3MsIGksIGRpc2s7Ci0JY2hhciAqYnVmID0gTlVMTDsKLQl1bnNpZ25lZCBzaG9ydCByb3RhdGUgPSAwOwotI2lmICFkZWZpbmVkKENPTkZJR19TMzkwKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpCi0JY2hhciByb3RhdG9yWzRdID0geyAnfCcgLCAnLycgLCAnLScgLCAnXFwnIH07Ci0jZW5kaWYKLQotCW91dF9mZCA9IHN5c19vcGVuKCIvZGV2L3JhbSIsIE9fUkRXUiwgMCk7Ci0JaWYgKG91dF9mZCA8IDApCi0JCWdvdG8gb3V0OwotCi0JaW5fZmQgPSBzeXNfb3Blbihmcm9tLCBPX1JET05MWSwgMCk7Ci0JaWYgKGluX2ZkIDwgMCkKLQkJZ290byBub2Nsb3NlX2lucHV0OwotCi0JbmJsb2NrcyA9IGlkZW50aWZ5X3JhbWRpc2tfaW1hZ2UoaW5fZmQsIHJkX2ltYWdlX3N0YXJ0KTsKLQlpZiAobmJsb2NrcyA8IDApCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuYmxvY2tzID09IDApIHsKLSNpZmRlZiBCVUlMRF9DUkFNRElTSwotCQlpZiAoY3JkX2xvYWQoaW5fZmQsIG91dF9mZCkgPT0gMCkKLQkJCWdvdG8gc3VjY2Vzc2Z1bF9sb2FkOwotI2Vsc2UKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiUkFNRElTSzogS2VybmVsIGRvZXMgbm90IHN1cHBvcnQgY29tcHJlc3NlZCAiCi0JCSAgICAgICAiUkFNIGRpc2sgaW1hZ2VzXG4iKTsKLSNlbmRpZgotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyoKLQkgKiBOT1RFIE5PVEU6IG5ibG9ja3MgaXMgbm90IGFjdHVhbGx5IGJsb2NrcyBidXQKLQkgKiB0aGUgbnVtYmVyIG9mIGtpYmlieXRlcyBvZiBkYXRhIHRvIGxvYWQgaW50byBhIHJhbWRpc2suCi0JICogU28gYW55IHJhbWRpc2sgYmxvY2sgc2l6ZSB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgMUtpQiBzaG91bGQKLQkgKiB3b3JrIHdoZW4gdGhlIGFwcHJvcHJpYXRlIHJhbWRpc2tfYmxvY2tzaXplIGlzIHNwZWNpZmllZAotCSAqIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0JICoKLQkgKiBUaGUgZGVmYXVsdCByYW1kaXNrX2Jsb2Nrc2l6ZSBpcyAxS2lCIGFuZCBpdCBpcyBnZW5lcmFsbHkKLQkgKiBzaWxseSB0byB1c2UgYW55dGhpbmcgZWxzZSwgc28gbWFrZSBzdXJlIHRvIHVzZSAxS2lCCi0JICogYmxvY2tzaXplIHdoaWxlIGdlbmVyYXRpbmcgZXh0MmZzIHJhbWRpc2staW1hZ2VzLgotCSAqLwotCWlmIChzeXNfaW9jdGwob3V0X2ZkLCBCTEtHRVRTSVpFLCAodW5zaWduZWQgbG9uZykmcmRfYmxvY2tzKSA8IDApCi0JCXJkX2Jsb2NrcyA9IDA7Ci0JZWxzZQotCQlyZF9ibG9ja3MgPj49IDE7Ci0KLQlpZiAobmJsb2NrcyA+IHJkX2Jsb2NrcykgewotCQlwcmludGsoIlJBTURJU0s6IGltYWdlIHRvbyBiaWchICglZEtpQi8lbGRLaUIpXG4iLAotCQkgICAgICAgbmJsb2NrcywgcmRfYmxvY2tzKTsKLQkJZ290byBkb25lOwotCX0KLQkJCi0JLyoKLQkgKiBPSywgdGltZSB0byBjb3B5IGluIHRoZSBkYXRhCi0JICovCi0JaWYgKHN5c19pb2N0bChpbl9mZCwgQkxLR0VUU0laRSwgKHVuc2lnbmVkIGxvbmcpJmRldmJsb2NrcykgPCAwKQotCQlkZXZibG9ja3MgPSAwOwotCWVsc2UKLQkJZGV2YmxvY2tzID4+PSAxOwotCi0JaWYgKHN0cmNtcChmcm9tLCAiL2luaXRyZC5pbWFnZSIpID09IDApCi0JCWRldmJsb2NrcyA9IG5ibG9ja3M7Ci0KLQlpZiAoZGV2YmxvY2tzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJSQU1ESVNLOiBjb3VsZCBub3QgZGV0ZXJtaW5lIGRldmljZSBzaXplXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQotCWJ1ZiA9IGttYWxsb2MoQkxPQ0tfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUkFNRElTSzogY291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlclxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcmludGsoS0VSTl9OT1RJQ0UgIlJBTURJU0s6IExvYWRpbmcgJWRLaUIgWyVsZCBkaXNrJXNdIGludG8gcmFtIGRpc2suLi4gIiwKLQkJbmJsb2NrcywgKChuYmxvY2tzLTEpL2RldmJsb2NrcykrMSwgbmJsb2Nrcz5kZXZibG9ja3MgPyAicyIgOiAiIik7Ci0JZm9yIChpID0gMCwgZGlzayA9IDE7IGkgPCBuYmxvY2tzOyBpKyspIHsKLQkJaWYgKGkgJiYgKGkgJSBkZXZibG9ja3MgPT0gMCkpIHsKLQkJCXByaW50aygiZG9uZSBkaXNrICMlZC5cbiIsIGRpc2srKyk7Ci0JCQlyb3RhdGUgPSAwOwotCQkJaWYgKHN5c19jbG9zZShpbl9mZCkpIHsKLQkJCQlwcmludGsoIkVycm9yIGNsb3NpbmcgdGhlIGRpc2suXG4iKTsKLQkJCQlnb3RvIG5vY2xvc2VfaW5wdXQ7Ci0JCQl9Ci0JCQljaGFuZ2VfZmxvcHB5KCJkaXNrICMlZCIsIGRpc2spOwotCQkJaW5fZmQgPSBzeXNfb3Blbihmcm9tLCBPX1JET05MWSwgMCk7Ci0JCQlpZiAoaW5fZmQgPCAwKSAgewotCQkJCXByaW50aygiRXJyb3Igb3BlbmluZyBkaXNrLlxuIik7Ci0JCQkJZ290byBub2Nsb3NlX2lucHV0OwotCQkJfQotCQkJcHJpbnRrKCJMb2FkaW5nIGRpc2sgIyVkLi4uICIsIGRpc2spOwotCQl9Ci0JCXN5c19yZWFkKGluX2ZkLCBidWYsIEJMT0NLX1NJWkUpOwotCQlzeXNfd3JpdGUob3V0X2ZkLCBidWYsIEJMT0NLX1NJWkUpOwotI2lmICFkZWZpbmVkKENPTkZJR19TMzkwKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpCi0JCWlmICghKGkgJSAxNikpIHsKLQkJCXByaW50aygiJWNcYiIsIHJvdGF0b3Jbcm90YXRlICYgMHgzXSk7Ci0JCQlyb3RhdGUrKzsKLQkJfQotI2VuZGlmCi0JfQotCXByaW50aygiZG9uZS5cbiIpOwotCi1zdWNjZXNzZnVsX2xvYWQ6Ci0JcmVzID0gMTsKLWRvbmU6Ci0Jc3lzX2Nsb3NlKGluX2ZkKTsKLW5vY2xvc2VfaW5wdXQ6Ci0Jc3lzX2Nsb3NlKG91dF9mZCk7Ci1vdXQ6Ci0Ja2ZyZWUoYnVmKTsKLQlzeXNfdW5saW5rKCIvZGV2L3JhbSIpOwotCXJldHVybiByZXM7Ci19Ci0KLWludCBfX2luaXQgcmRfbG9hZF9kaXNrKGludCBuKQotewotCWlmIChyZF9wcm9tcHQpCi0JCWNoYW5nZV9mbG9wcHkoInJvb3QgZmxvcHB5IGRpc2sgdG8gYmUgbG9hZGVkIGludG8gUkFNIGRpc2siKTsKLQljcmVhdGVfZGV2KCIvZGV2L3Jvb3QiLCBST09UX0RFVik7Ci0JY3JlYXRlX2RldigiL2Rldi9yYW0iLCBNS0RFVihSQU1ESVNLX01BSk9SLCBuKSk7Ci0JcmV0dXJuIHJkX2xvYWRfaW1hZ2UoIi9kZXYvcm9vdCIpOwotfQotCi0jaWZkZWYgQlVJTERfQ1JBTURJU0sKLQotLyoKLSAqIGd6aXAgZGVjbGFyYXRpb25zCi0gKi8KLQotI2RlZmluZSBPRihhcmdzKSAgYXJncwotCi0jaWZuZGVmIG1lbXplcm8KLSNkZWZpbmUgbWVtemVybyhzLCBuKSAgICAgbWVtc2V0ICgocyksIDAsIChuKSkKLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7Ci0KLSNkZWZpbmUgSU5CVUZTSVogNDA5NgotI2RlZmluZSBXU0laRSAweDgwMDAgICAgLyogd2luZG93IHNpemUtLW11c3QgYmUgYSBwb3dlciBvZiB0d28sIGFuZCAqLwotCQkJLyogIGF0IGxlYXN0IDMySyBmb3IgemlwJ3MgZGVmbGF0ZSBtZXRob2QgKi8KLQotc3RhdGljIHVjaCAqaW5idWY7Ci1zdGF0aWMgdWNoICp3aW5kb3c7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnNpemU7ICAvKiB2YWxpZCBieXRlcyBpbiBpbmJ1ZiAqLwotc3RhdGljIHVuc2lnbmVkIGlucHRyOyAgIC8qIGluZGV4IG9mIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQgaW4gaW5idWYgKi8KLXN0YXRpYyB1bnNpZ25lZCBvdXRjbnQ7ICAvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCi1zdGF0aWMgaW50IGV4aXRfY29kZTsKLXN0YXRpYyBpbnQgdW56aXBfZXJyb3I7Ci1zdGF0aWMgbG9uZyBieXRlc19vdXQ7Ci1zdGF0aWMgaW50IGNyZF9pbmZkLCBjcmRfb3V0ZmQ7Ci0KLSNkZWZpbmUgZ2V0X2J5dGUoKSAgKGlucHRyIDwgaW5zaXplID8gaW5idWZbaW5wdHIrK10gOiBmaWxsX2luYnVmKCkpCi0JCQotLyogRGlhZ25vc3RpYyBmdW5jdGlvbnMgKHN0dWJiZWQgb3V0KSAqLwotI2RlZmluZSBBc3NlcnQoY29uZCxtc2cpCi0jZGVmaW5lIFRyYWNlKHgpCi0jZGVmaW5lIFRyYWNldih4KQotI2RlZmluZSBUcmFjZXZ2KHgpCi0jZGVmaW5lIFRyYWNlYyhjLHgpCi0jZGVmaW5lIFRyYWNlY3YoYyx4KQotCi0jZGVmaW5lIFNUQVRJQyBzdGF0aWMKLSNkZWZpbmUgSU5JVCBfX2luaXQKLQotc3RhdGljIGludCAgX19pbml0IGZpbGxfaW5idWYodm9pZCk7Ci1zdGF0aWMgdm9pZCBfX2luaXQgZmx1c2hfd2luZG93KHZvaWQpOwotc3RhdGljIHZvaWQgX19pbml0ICptYWxsb2Moc2l6ZV90IHNpemUpOwotc3RhdGljIHZvaWQgX19pbml0IGZyZWUodm9pZCAqd2hlcmUpOwotc3RhdGljIHZvaWQgX19pbml0IGVycm9yKGNoYXIgKm0pOwotc3RhdGljIHZvaWQgX19pbml0IGd6aXBfbWFyayh2b2lkICoqKTsKLXN0YXRpYyB2b2lkIF9faW5pdCBnemlwX3JlbGVhc2Uodm9pZCAqKik7Ci0KLSNpbmNsdWRlICIuLi9saWIvaW5mbGF0ZS5jIgotCi1zdGF0aWMgdm9pZCBfX2luaXQgKm1hbGxvYyhzaXplX3Qgc2l6ZSkKLXsKLQlyZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGZyZWUodm9pZCAqd2hlcmUpCi17Ci0Ja2ZyZWUod2hlcmUpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZ3ppcF9tYXJrKHZvaWQgKipwdHIpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBnemlwX3JlbGVhc2Uodm9pZCAqKnB0cikKLXsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZpbGwgdGhlIGlucHV0IGJ1ZmZlci4gVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZW1wdHkKLSAqIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyByZWFsbHkgbmVlZGVkLgotICogUmV0dXJuaW5nIC0xIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGd1bnppcCgpIHdpbGwgZXZlciByZXR1cm4uCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGZpbGxfaW5idWYodm9pZCkKLXsKLQlpZiAoZXhpdF9jb2RlKSByZXR1cm4gLTE7Ci0JCi0JaW5zaXplID0gc3lzX3JlYWQoY3JkX2luZmQsIGluYnVmLCBJTkJVRlNJWik7Ci0JaWYgKGluc2l6ZSA9PSAwKSB7Ci0JCWVycm9yKCJSQU1ESVNLOiByYW4gb3V0IG9mIGNvbXByZXNzZWQgZGF0YSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaW5wdHIgPSAxOwotCi0JcmV0dXJuIGluYnVmWzBdOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFdyaXRlIHRoZSBvdXRwdXQgd2luZG93IHdpbmRvd1swLi5vdXRjbnQtMV0gYW5kIHVwZGF0ZSBjcmMgYW5kIGJ5dGVzX291dC4KLSAqIChVc2VkIGZvciB0aGUgZGVjb21wcmVzc2VkIGRhdGEgb25seS4pCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBmbHVzaF93aW5kb3codm9pZCkKLXsKLSAgICB1bGcgYyA9IGNyYzsgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KLSAgICB1bnNpZ25lZCBuLCB3cml0dGVuOwotICAgIHVjaCAqaW4sIGNoOwotICAgIAotICAgIHdyaXR0ZW4gPSBzeXNfd3JpdGUoY3JkX291dGZkLCB3aW5kb3csIG91dGNudCk7Ci0gICAgaWYgKHdyaXR0ZW4gIT0gb3V0Y250ICYmIHVuemlwX2Vycm9yID09IDApIHsKLQlwcmludGsoS0VSTl9FUlIgIlJBTURJU0s6IGluY29tcGxldGUgd3JpdGUgKCVkICE9ICVkKSAlbGRcbiIsCi0JICAgICAgIHdyaXR0ZW4sIG91dGNudCwgYnl0ZXNfb3V0KTsKLQl1bnppcF9lcnJvciA9IDE7Ci0gICAgfQotICAgIGluID0gd2luZG93OwotICAgIGZvciAobiA9IDA7IG4gPCBvdXRjbnQ7IG4rKykgewotCSAgICBjaCA9ICppbisrOwotCSAgICBjID0gY3JjXzMyX3RhYlsoKGludCljIF4gY2gpICYgMHhmZl0gXiAoYyA+PiA4KTsKLSAgICB9Ci0gICAgY3JjID0gYzsKLSAgICBieXRlc19vdXQgKz0gKHVsZylvdXRjbnQ7Ci0gICAgb3V0Y250ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGVycm9yKGNoYXIgKngpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICIlc1xuIiwgeCk7Ci0JZXhpdF9jb2RlID0gMTsKLQl1bnppcF9lcnJvciA9IDE7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNyZF9sb2FkKGludCBpbl9mZCwgaW50IG91dF9mZCkKLXsKLQlpbnQgcmVzdWx0OwotCi0JaW5zaXplID0gMDsJCS8qIHZhbGlkIGJ5dGVzIGluIGluYnVmICovCi0JaW5wdHIgPSAwOwkJLyogaW5kZXggb2YgbmV4dCBieXRlIHRvIGJlIHByb2Nlc3NlZCBpbiBpbmJ1ZiAqLwotCW91dGNudCA9IDA7CQkvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCi0JZXhpdF9jb2RlID0gMDsKLQlieXRlc19vdXQgPSAwOwotCWNyYyA9ICh1bGcpMHhmZmZmZmZmZkw7IC8qIHNoaWZ0IHJlZ2lzdGVyIGNvbnRlbnRzICovCi0KLQljcmRfaW5mZCA9IGluX2ZkOwotCWNyZF9vdXRmZCA9IG91dF9mZDsKLQlpbmJ1ZiA9IGttYWxsb2MoSU5CVUZTSVosIEdGUF9LRVJORUwpOwotCWlmIChpbmJ1ZiA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUkFNRElTSzogQ291bGRuJ3QgYWxsb2NhdGUgZ3ppcCBidWZmZXJcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXdpbmRvdyA9IGttYWxsb2MoV1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICh3aW5kb3cgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlJBTURJU0s6IENvdWxkbid0IGFsbG9jYXRlIGd6aXAgd2luZG93XG4iKTsKLQkJa2ZyZWUoaW5idWYpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1ha2VjcmMoKTsKLQlyZXN1bHQgPSBndW56aXAoKTsKLQlpZiAodW56aXBfZXJyb3IpCi0JCXJlc3VsdCA9IDE7Ci0Ja2ZyZWUoaW5idWYpOwotCWtmcmVlKHdpbmRvdyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotI2VuZGlmICAvKiBCVUlMRF9DUkFNRElTSyAqLwpkaWZmIC0tZ2l0IGEvaW5pdC9pbml0cmFtZnMuYyBiL2luaXQvaW5pdHJhbWZzLmMKaW5kZXggMDBlZmY3YS4uMWRlNWNhZCAxMDA2NDQKLS0tIGEvaW5pdC9pbml0cmFtZnMuYworKysgYi9pbml0L2luaXRyYW1mcy5jCkBAIC03LDYgKzcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAKK3Vuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQ7CitpbnQgX19pbml0ZGF0YSBpbml0cmRfYmVsb3dfc3RhcnRfb2s7CisKIHN0YXRpYyBfX2luaXRkYXRhIGNoYXIgKm1lc3NhZ2U7CiBzdGF0aWMgdm9pZCBfX2luaXQgZXJyb3IoY2hhciAqeCkKIHsKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggMTk0MGZhNy4uNmEzMTUxYiAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTcsNiArNyw4IEBACiAgKiAgQWRkZWQgaW5pdHJkICYgY2hhbmdlX3Jvb3Q6IFdlcm5lciBBbG1lc2JlcmdlciAmIEhhbnMgTGVybWVuLCBGZWIgJzk2CiAgKiAgTW9hbiBlYXJseSBpZiBnY2MgaXMgb2xkLCBhdm9pZGluZyBib2d1cyBrZXJuZWxzIC0gUGF1bCBHb3J0bWFrZXIsIE1heSAnOTYKICAqICBTaW1wbGlmaWVkIHN0YXJ0aW5nIG9mIGluaXQ6ICBNaWNoYWVsIEEuIEdyaWZmaXRoIDxncmlmQGFjbS5vcmc+IAorICoKKyAqICAyMDA2LTAyLTEyIEguIFBldGVyIEFudmluOiBFbGltaW5hdGVkIGluLWtlcm5lbCByb290IG1vdW50aW5nLgogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNDgsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KQEAgLTEzNSw2ICsxMzgsMTEgQEAKIC8qIFNldHVwIGNvbmZpZ3VyZWQgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyB0byBhY3RpdmF0ZSAqLwogc3RhdGljIHVuc2lnbmVkIGludCBtYXhfY3B1cyA9IE5SX0NQVVM7CiAKKy8qIFJPT1RfREVWIGNvbnRhaW5zIGFueSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgZGVmYXVsdCByb290IGRldmljZS4gKi8KKy8qIHJlYWxfcm9vdF9kZXYgaXMgdXNlZCAodmlhIHN5c2N0bCkgdG8gY29tbXVuaWNhdGUgUk9PVF9ERVYgdG8ga2luaXQuICovCitkZXZfdCBST09UX0RFVjsKK3Vuc2lnbmVkIGludCByZWFsX3Jvb3RfZGV2OworCiAvKgogICogSWYgc2V0LCB0aGlzIGlzIGFuIGluZGljYXRpb24gdG8gdGhlIGRyaXZlcnMgdGhhdCByZXNldCB0aGUgdW5kZXJseWluZwogICogZGV2aWNlIGJlZm9yZSBnb2luZyBhaGVhZCB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBvdGhlcndpc2UgZHJpdmVyIG1pZ2h0CkBAIC03NTMsMzUgKzc2MSwxNSBAQAogCXN5c3RlbV9zdGF0ZSA9IFNZU1RFTV9SVU5OSU5HOwogCW51bWFfZGVmYXVsdF9wb2xpY3koKTsKIAorCS8qIFRoaXMgY291bGQgYmUgZG9uZSBieSAoaylpbml0IGFzIHdlbGwuLi4gKi8KIAlpZiAoc3lzX29wZW4oKGNvbnN0IGNoYXIgX191c2VyICopICIvZGV2L2NvbnNvbGUiLCBPX1JEV1IsIDApIDwgMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogdW5hYmxlIHRvIG9wZW4gYW4gaW5pdGlhbCBjb25zb2xlLlxuIik7CiAKIAkodm9pZCkgc3lzX2R1cCgwKTsKIAkodm9pZCkgc3lzX2R1cCgwKTsKIAotCWlmIChyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCkgewotCQlydW5faW5pdF9wcm9jZXNzKHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGV4ZWN1dGUgJXNcbiIsCi0JCQkJcmFtZGlza19leGVjdXRlX2NvbW1hbmQpOwotCX0KLQotCS8qCi0JICogV2UgdHJ5IGVhY2ggb2YgdGhlc2UgdW50aWwgb25lIHN1Y2NlZWRzLgotCSAqCi0JICogVGhlIEJvdXJuZSBzaGVsbCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGluaXQgaWYgd2UgYXJlCi0JICogdHJ5aW5nIHRvIHJlY292ZXIgYSByZWFsbHkgYnJva2VuIG1hY2hpbmUuCi0JICovCi0JaWYgKGV4ZWN1dGVfY29tbWFuZCkgewotCQlydW5faW5pdF9wcm9jZXNzKGV4ZWN1dGVfY29tbWFuZCk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBleGVjdXRlICVzLiAgQXR0ZW1wdGluZyAiCi0JCQkJCSJkZWZhdWx0cy4uLlxuIiwgZXhlY3V0ZV9jb21tYW5kKTsKLQl9Ci0JcnVuX2luaXRfcHJvY2VzcygiL3NiaW4vaW5pdCIpOwotCXJ1bl9pbml0X3Byb2Nlc3MoIi9ldGMvaW5pdCIpOwotCXJ1bl9pbml0X3Byb2Nlc3MoIi9iaW4vaW5pdCIpOwotCXJ1bl9pbml0X3Byb2Nlc3MoIi9iaW4vc2giKTsKLQotCXBhbmljKCJObyBpbml0IGZvdW5kLiAgVHJ5IHBhc3NpbmcgaW5pdD0gb3B0aW9uIHRvIGtlcm5lbC4iKTsKKwlydW5faW5pdF9wcm9jZXNzKHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kKTsKKwlwYW5pYygiRmFpbGVkIHRvIGV4ZWN1dGUgJXMiLCByYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGtlcm5lbF9pbml0KHZvaWQgKiB1bnVzZWQpCkBAIC04MTYsNiArODA0LDEyIEBACiAJZG9fYmFzaWNfc2V0dXAoKTsKIAogCS8qCisJICogSWYgd2UgaGF2ZSBhIHJvb3QgZGV2aWNlIHNldCBieSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgbWVhbnMsCisJICogbGV0IGtpbml0IGtub3cgYWJvdXQgaXQuCisJICovCisJcmVhbF9yb290X2RldiA9IG5ld19lbmNvZGVfZGV2KFJPT1RfREVWKTsKKworCS8qCiAJICogY2hlY2sgaWYgdGhlcmUgaXMgYW4gZWFybHkgdXNlcnNwYWNlIGluaXQuICBJZiB5ZXMsIGxldCBpdCBkbyBhbGwKIAkgKiB0aGUgd29yawogCSAqLwpAQCAtODIzLDExICs4MTcsNiBAQAogCWlmICghcmFtZGlza19leGVjdXRlX2NvbW1hbmQpCiAJCXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kID0gIi9pbml0IjsKIAotCWlmIChzeXNfYWNjZXNzKChjb25zdCBjaGFyIF9fdXNlciAqKSByYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCwgMCkgIT0gMCkgewotCQlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCA9IE5VTEw7Ci0JCXByZXBhcmVfbmFtZXNwYWNlKCk7Ci0JfQotCiAJLyoKIAkgKiBPaywgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlIGluaXRpYWwgYm9vdHVwLCBhbmQKIAkgKiB3ZSdyZSBlc3NlbnRpYWxseSB1cCBhbmQgcnVubmluZy4gR2V0IHJpZCBvZiB0aGUKZGlmZiAtLWdpdCBhL2luaXQvbm9pbml0cmFtZnMuYyBiL2luaXQvbm9pbml0cmFtZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjMWEzYS4uMDAwMDAwMAotLS0gYS9pbml0L25vaW5pdHJhbWZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogaW5pdC9ub2luaXRyYW1mcy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCBOWFAgU2VtaWNvbmR1Y3RvcnMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqIEF1dGhvcjogSmVhbi1QYXVsIFNhbWFuIDxqZWFuLXBhdWwuc2FtYW5AbnhwLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLQotLyoKLSAqIENyZWF0ZSBhIHNpbXBsZSByb290ZnMgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBkZWZhdWx0IGluaXRyYW1mcwotICovCi1zdGF0aWMgaW50IF9faW5pdCBkZWZhdWx0X3Jvb3Rmcyh2b2lkKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBzeXNfbWtkaXIoIi9kZXYiLCAwNzU1KTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBzeXNfbWtub2QoKGNvbnN0IGNoYXIgX191c2VyICopICIvZGV2L2NvbnNvbGUiLAotCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAotCQkJbmV3X2VuY29kZV9kZXYoTUtERVYoNSwgMSkpKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBzeXNfbWtkaXIoIi9yb290IiwgMDcwMCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JcmV0dXJuIDA7Ci0KLW91dDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gY3JlYXRlIGEgcm9vdGZzXG4iKTsKLQlyZXR1cm4gZXJyOwotfQotcm9vdGZzX2luaXRjYWxsKGRlZmF1bHRfcm9vdGZzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IGI1ZjA1NDMuLjZiYTk3ZGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtMjUsOCArMjUsNiBAQAogI2luY2x1ZGUgInBvd2VyLmgiCiAKIAotc3RhdGljIGludCBub3Jlc3VtZSA9IDA7Ci1jaGFyIHJlc3VtZV9maWxlWzI1Nl0gPSBDT05GSUdfUE1fU1REX1BBUlRJVElPTjsKIGRldl90IHN3c3VzcF9yZXN1bWVfZGV2aWNlOwogc2VjdG9yX3Qgc3dzdXNwX3Jlc3VtZV9ibG9jazsKIApAQCAtMjU2LDI2ICsyNTQsMTMgQEAKIAogCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAlpZiAoIXN3c3VzcF9yZXN1bWVfZGV2aWNlKSB7Ci0JCWlmICghc3RybGVuKHJlc3VtZV9maWxlKSkgewotCQkJbXV0ZXhfdW5sb2NrKCZwbV9tdXRleCk7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCQlzd3N1c3BfcmVzdW1lX2RldmljZSA9IG5hbWVfdG9fZGV2X3QocmVzdW1lX2ZpbGUpOwotCQlwcl9kZWJ1Zygic3dzdXNwOiBSZXN1bWUgRnJvbSBQYXJ0aXRpb24gJXNcbiIsIHJlc3VtZV9maWxlKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1Zygic3dzdXNwOiBSZXN1bWUgRnJvbSBQYXJ0aXRpb24gJWQ6JWRcbiIsCi0JCQkgTUFKT1Ioc3dzdXNwX3Jlc3VtZV9kZXZpY2UpLCBNSU5PUihzd3N1c3BfcmVzdW1lX2RldmljZSkpOwotCX0KLQotCWlmIChub3Jlc3VtZSkgewotCQkvKioKLQkJICogRklYTUU6IElmIG5vcmVzdW1lIGlzIHNwZWNpZmllZCwgd2UgbmVlZCB0byBmaW5kIHRoZSBwYXJ0aXRpb24KLQkJICogYW5kIHJlc2V0IGl0IGJhY2sgdG8gbm9ybWFsIHN3YXAgc3BhY2UuCi0JCSAqLwotCQltdXRleF91bmxvY2soJnBtX211dGV4KTsKKwkJcHJfZGVidWcoInN3c3VzcDogTm8gZGV2aWNlIGdpdmVuIVxuIik7CiAJCXJldHVybiAwOwogCX0KIAorCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlZDolZFxuIiwKKwkJIE1BSk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSwgTUlOT1Ioc3dzdXNwX3Jlc3VtZV9kZXZpY2UpKTsKKwogCXByX2RlYnVnKCJQTTogQ2hlY2tpbmcgc3dzdXNwIGltYWdlLlxuIik7CiAJZXJyb3IgPSBzd3N1c3BfY2hlY2soKTsKIAlpZiAoZXJyb3IpCkBAIC0zMzYsOCArMzIxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotbGF0ZV9pbml0Y2FsbChzb2Z0d2FyZV9yZXN1bWUpOwotCiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGliZXJuYXRpb25fbW9kZXNbXSA9IHsKIAlbSElCRVJOQVRJT05fUExBVEZPUk1dCT0gInBsYXRmb3JtIiwKQEAgLTQ1OCw4ICs0NDEsOSBAQAogCXVuc2lnbmVkIGludCBtYWosIG1pbjsKIAlkZXZfdCByZXM7CiAJaW50IHJldCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCA9IDA7CiAKLQlpZiAoc3NjYW5mKGJ1ZiwgIiV1OiV1IiwgJm1haiwgJm1pbikgIT0gMikKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1OiV1OiVsbHUiLCAmbWFqLCAmbWluLCAmb2Zmc2V0KSA8IDIpCiAJCWdvdG8gb3V0OwogCiAJcmVzID0gTUtERVYobWFqLG1pbik7CkBAIC00NjgsOSArNDUyLDkgQEAKIAogCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAlzd3N1c3BfcmVzdW1lX2RldmljZSA9IHJlczsKKwlzd3N1c3BfcmVzdW1lX2Jsb2NrID0gb2Zmc2V0OwogCW11dGV4X3VubG9jaygmcG1fbXV0ZXgpOwogCXByaW50aygiQXR0ZW1wdGluZyBtYW51YWwgcmVzdW1lXG4iKTsKLQlub3Jlc3VtZSA9IDA7CiAJc29mdHdhcmVfcmVzdW1lKCk7CiAJcmV0ID0gbjsKICBvdXQ6CkBAIC01MTcsMzYgKzUwMSwzIEBACiB9CiAKIGNvcmVfaW5pdGNhbGwocG1fZGlza19pbml0KTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCByZXN1bWVfc2V0dXAoY2hhciAqc3RyKQotewotCWlmIChub3Jlc3VtZSkKLQkJcmV0dXJuIDE7Ci0KLQlzdHJuY3B5KCByZXN1bWVfZmlsZSwgc3RyLCAyNTUgKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcmVzdW1lX29mZnNldF9zZXR1cChjaGFyICpzdHIpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldDsKLQotCWlmIChub3Jlc3VtZSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoc3NjYW5mKHN0ciwgIiVsbHUiLCAmb2Zmc2V0KSA9PSAxKQotCQlzd3N1c3BfcmVzdW1lX2Jsb2NrID0gb2Zmc2V0OwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5vcmVzdW1lX3NldHVwKGNoYXIgKnN0cikKLXsKLQlub3Jlc3VtZSA9IDE7Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoIm5vcmVzdW1lIiwgbm9yZXN1bWVfc2V0dXApOwotX19zZXR1cCgicmVzdW1lX29mZnNldD0iLCByZXN1bWVfb2Zmc2V0X3NldHVwKTsKLV9fc2V0dXAoInJlc3VtZT0iLCByZXN1bWVfc2V0dXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvTWFrZWZpbGUgYi9uZXQvaXB2NC9NYWtlZmlsZQppbmRleCA0ZmY2YzE1Li5mOTE3ZTk1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtMjgsNyArMjgsNiBAQAogb2JqLSQoQ09ORklHX0lORVRfVFVOTkVMKSArPSB0dW5uZWw0Lm8KIG9iai0kKENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQpICs9IHhmcm00X21vZGVfdHJhbnNwb3J0Lm8KIG9iai0kKENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwpICs9IHhmcm00X21vZGVfdHVubmVsLm8KLW9iai0kKENPTkZJR19JUF9QTlApICs9IGlwY29uZmlnLm8KIG9iai0kKENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfUlIpICs9IG11bHRpcGF0aF9yci5vCiBvYmotJChDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1JBTkRPTSkgKz0gbXVsdGlwYXRoX3JhbmRvbS5vCiBvYmotJChDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1dSQU5ET00pICs9IG11bHRpcGF0aF93cmFuZG9tLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDJjYThkLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTExICswLDAgQEAKLS8qCi0gKiAgJElkOiBpcGNvbmZpZy5jLHYgMS40NiAyMDAyLzAyLzAxIDIyOjAxOjA0IGRhdmVtIEV4cCAkCi0gKgotICogIEF1dG9tYXRpYyBDb25maWd1cmF0aW9uIG9mIElQIC0tIHVzZSBESENQLCBCT09UUCwgUkFSUCwgb3IKLSAqICB1c2VyLXN1cHBsaWVkIGluZm9ybWF0aW9uIHRvIGNvbmZpZ3VyZSBvd24gSVAgYWRkcmVzcyBhbmQgcm91dGVzLgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KLSAqCi0gKiAgRGVyaXZlZCBmcm9tIG5ldHdvcmsgY29uZmlndXJhdGlvbiBjb2RlIGluIGZzL25mcy9uZnNyb290LmMsCi0gKiAgb3JpZ2luYWxseSBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgR2VybyBLdWhsbWFubiBhbmQgbWUuCi0gKgotICogIEJPT1RQIHJld3JpdHRlbiB0byBjb25zdHJ1Y3QgYW5kIGFuYWx5c2UgcGFja2V0cyBpdHNlbGYgaW5zdGVhZAotICogIG9mIG1pc3VzaW5nIHRoZSBJUCBsYXllci4gbnVtX2J1Z3NfY2F1c2luZ193cm9uZ19hcnBfcmVwbGllcy0tOwotICoJCQkJCSAgICAgLS0gTUosIERlY2VtYmVyIDE5OTgKLSAqCi0gKiAgRml4ZWQgaXBfYXV0b19jb25maWdfc2V0dXAgY2FsbGluZyBhdCBzdGFydHVwIGluIHRoZSBuZXcgIkxpbmtlciBNYWdpYyIKLSAqICBpbml0aWFsaXphdGlvbiBzY2hlbWUuCi0gKgktIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiwgMDgvMTEvMTk5OQotICoKLSAqICBESENQIHN1cHBvcnQgYWRkZWQuICBUbyB1c2VycyB0aGlzIGxvb2tzIGxpa2UgYSB3aG9sZSBzZXBhcmF0ZQotICogIHByb3RvY29sLCBidXQgd2Uga25vdyBpdCdzIGp1c3QgYSBiYWcgb24gdGhlIHNpZGUgb2YgQk9PVFAuCi0gKgkJLS0gQ2hpcCBTYWx6ZW5iZXJnIDxjaGlwQHZhbGludXguY29tPiwgTWF5IDIwMDAKLSAqCi0gKiAgUG9ydGVkIERIQ1Agc3VwcG9ydCBmcm9tIDIuMi4xNiB0byAyLjQuMC10ZXN0NAotICogICAgICAgICAgICAgIC0tIEVyaWMgQmllZGVybWFuIDxlYmllZGVybWFuQGxueGkuY29tPiwgMzAgQXVnIDIwMDAKLSAqCi0gKiAgTWVyZ2VkIGNoYW5nZXMgZnJvbSAyLjIuMTkgaW50byAyLjQuMwotICogICAgICAgICAgICAgIC0tIEVyaWMgQmllZGVybWFuIDxlYmllZGVybWFuQGxueGkuY29tPiwgMjIgQXByaWwgQXVnIDIwMDEKLSAqCi0gKiAgTXVsdGlwbGUgTmFtZXNlcnZlcnMgaW4gL3Byb2MvbmV0L3BucAotICogICAgICAgICAgICAgIC0tICBKb3NlZiBTaWVtZXMgPGpzaWVtZXNAd2ViLmRlPiwgQXVnIDIwMDIKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldC5oPgotI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+Ci0jaW5jbHVkZSA8bmV0L2FycC5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC9pcGNvbmZpZy5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0KLS8qIERlZmluZSB0aGlzIHRvIGFsbG93IGRlYnVnZ2luZyBvdXRwdXQgKi8KLSN1bmRlZiBJUENPTkZJR19ERUJVRwotCi0jaWZkZWYgSVBDT05GSUdfREVCVUcKLSNkZWZpbmUgREJHKHgpIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBEQkcoeCkgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX1BOUF9ESENQKQotI2RlZmluZSBJUENPTkZJR19ESENQCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9QTlBfQk9PVFApIHx8IGRlZmluZWQoQ09ORklHX0lQX1BOUF9ESENQKQotI2RlZmluZSBJUENPTkZJR19CT09UUAotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfUE5QX1JBUlApCi0jZGVmaW5lIElQQ09ORklHX1JBUlAKLSNlbmRpZgotI2lmIGRlZmluZWQoSVBDT05GSUdfQk9PVFApIHx8IGRlZmluZWQoSVBDT05GSUdfUkFSUCkKLSNkZWZpbmUgSVBDT05GSUdfRFlOQU1JQwotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgZnJpZW5kbHkgZGVsYXkgYmVmb3JlIGFuZCBhZnRlciBvcGVuaW5nIG5ldCBkZXZpY2VzICovCi0jZGVmaW5lIENPTkZfUFJFX09QRU4JCTUwMAkvKiBCZWZvcmUgb3BlbmluZzogMS8yIHNlY29uZCAqLwotI2RlZmluZSBDT05GX1BPU1RfT1BFTgkJMQkvKiBBZnRlciBvcGVuaW5nOiAxIHNlY29uZCAqLwotCi0vKiBEZWZpbmUgdGhlIHRpbWVvdXQgZm9yIHdhaXRpbmcgZm9yIGEgREhDUC9CT09UUC9SQVJQIHJlcGx5ICovCi0jZGVmaW5lIENPTkZfT1BFTl9SRVRSSUVTIAkyCS8qIChSZSlvcGVuIGRldmljZXMgdHdpY2UgKi8KLSNkZWZpbmUgQ09ORl9TRU5EX1JFVFJJRVMgCTYJLyogU2VuZCBzaXggcmVxdWVzdHMgcGVyIG9wZW4gKi8KLSNkZWZpbmUgQ09ORl9JTlRFUl9USU1FT1VUCShIWi8yKQkvKiBJbnRlci1kZXZpY2UgdGltZW91dDogMS8yIHNlY29uZCAqLwotI2RlZmluZSBDT05GX0JBU0VfVElNRU9VVAkoSFoqMikJLyogSW5pdGlhbCB0aW1lb3V0OiAyIHNlY29uZHMgKi8KLSNkZWZpbmUgQ09ORl9USU1FT1VUX1JBTkRPTQkoSFopCS8qIE1heGltdW0gYW1vdW50IG9mIHJhbmRvbWl6YXRpb24gKi8KLSNkZWZpbmUgQ09ORl9USU1FT1VUX01VTFQJKjcvNAkvKiBSYXRlIG9mIHRpbWVvdXQgZ3Jvd3RoICovCi0jZGVmaW5lIENPTkZfVElNRU9VVF9NQVgJKEhaKjMwKQkvKiBNYXhpbXVtIGFsbG93ZWQgdGltZW91dCAqLwotI2RlZmluZSBDT05GX05BTUVTRVJWRVJTX01BWCAgIDMgICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgbmFtZXNlcnZlcnMKLQkJCQkJICAgLSAnMycgZnJvbSByZXNvbHYuaCAqLwotCi0jZGVmaW5lIE5PTkUgX19jb25zdGFudF9odG9ubChJTkFERFJfTk9ORSkKLQotLyoKLSAqIFB1YmxpYyBJUCBjb25maWd1cmF0aW9uCi0gKi8KLQotLyogVGhpcyBpcyB1c2VkIGJ5IHBsYXRmb3JtcyB3aGljaCBtaWdodCBiZSBhYmxlIHRvIHNldCB0aGUgaXBjb25maWcKLSAqIHZhcmlhYmxlcyB1c2luZyBmaXJtd2FyZSBlbnZpcm9ubWVudCB2YXJzLiAgSWYgdGhpcyBpcyBzZXQsIGl0IHdpbGwKLSAqIGlnbm9yZSBzdWNoIGZpcm13YXJlIHZhcmlhYmxlcy4KLSAqLwotaW50IGljX3NldF9tYW51YWxseSBfX2luaXRkYXRhID0gMDsJCS8qIElQY29uZmlnIHBhcmFtZXRlcnMgc2V0IG1hbnVhbGx5ICovCi0KLXN0YXRpYyBpbnQgaWNfZW5hYmxlIF9faW5pdGRhdGEgPSAwOwkJLyogSVAgY29uZmlnIGVuYWJsZWQ/ICovCi0KLS8qIFByb3RvY29sIGNob2ljZSAqLwotaW50IGljX3Byb3RvX2VuYWJsZWQgX19pbml0ZGF0YSA9IDAKLSNpZmRlZiBJUENPTkZJR19CT09UUAotCQkJfCBJQ19CT09UUAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lQX1BOUF9ESENQCi0JCQl8IElDX1VTRV9ESENQCi0jZW5kaWYKLSNpZmRlZiBJUENPTkZJR19SQVJQCi0JCQl8IElDX1JBUlAKLSNlbmRpZgotCQkJOwotCi1zdGF0aWMgaW50IGljX2hvc3RfbmFtZV9zZXQgX19pbml0ZGF0YSA9IDA7CS8qIEhvc3QgbmFtZSBzZXQgYnkgdXM/ICovCi0KLV9fYmUzMiBpY19teWFkZHIgPSBOT05FOwkJLyogTXkgSVAgYWRkcmVzcyAqLwotc3RhdGljIF9fYmUzMiBpY19uZXRtYXNrID0gTk9ORTsJLyogTmV0bWFzayBmb3IgbG9jYWwgc3VibmV0ICovCi1fX2JlMzIgaWNfZ2F0ZXdheSA9IE5PTkU7CS8qIEdhdGV3YXkgSVAgYWRkcmVzcyAqLwotCi1fX2JlMzIgaWNfc2VydmFkZHIgPSBOT05FOwkvKiBCb290IHNlcnZlciBJUCBhZGRyZXNzICovCi0KLV9fYmUzMiByb290X3NlcnZlcl9hZGRyID0gTk9ORTsJLyogQWRkcmVzcyBvZiBORlMgc2VydmVyICovCi11OCByb290X3NlcnZlcl9wYXRoWzI1Nl0gPSB7IDAsIH07CS8qIFBhdGggdG8gbW91bnQgYXMgcm9vdCAqLwotCi0vKiBQZXJzaXN0ZW50IGRhdGE6ICovCi0KLXN0YXRpYyBpbnQgaWNfcHJvdG9fdXNlZDsJCQkvKiBQcm90b2NvbCB1c2VkLCBpZiBhbnkgKi8KLXN0YXRpYyBfX2JlMzIgaWNfbmFtZXNlcnZlcnNbQ09ORl9OQU1FU0VSVkVSU19NQVhdOyAvKiBETlMgU2VydmVyIElQIGFkZHJlc3NlcyAqLwotc3RhdGljIHU4IGljX2RvbWFpbls2NF07CQkvKiBETlMgKG5vdCBOSVMpIGRvbWFpbiBuYW1lICovCi0KLS8qCi0gKiBQcml2YXRlIHN0YXRlLgotICovCi0KLS8qIE5hbWUgb2YgdXNlci1zZWxlY3RlZCBib290IGRldmljZSAqLwotc3RhdGljIGNoYXIgdXNlcl9kZXZfbmFtZVtJRk5BTVNJWl0gX19pbml0ZGF0YSA9IHsgMCwgfTsKLQotLyogUHJvdG9jb2xzIHN1cHBvcnRlZCBieSBhdmFpbGFibGUgaW50ZXJmYWNlcyAqLwotc3RhdGljIGludCBpY19wcm90b19oYXZlX2lmIF9faW5pdGRhdGEgPSAwOwotCi0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotc3RhdGljIERFRklORV9TUElOTE9DSyhpY19yZWN2X2xvY2spOwotc3RhdGljIHZvbGF0aWxlIGludCBpY19nb3RfcmVwbHkgX19pbml0ZGF0YSA9IDA7ICAgIC8qIFByb3RvKHMpIHRoYXQgcmVwbGllZCAqLwotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfREhDUAotc3RhdGljIGludCBpY19kaGNwX21zZ3R5cGUgX19pbml0ZGF0YSA9IDA7CS8qIERIQ1AgbXNnIHR5cGUgcmVjZWl2ZWQgKi8KLSNlbmRpZgotCi0KLS8qCi0gKglOZXR3b3JrIGRldmljZXMKLSAqLwotCi1zdHJ1Y3QgaWNfZGV2aWNlIHsKLQlzdHJ1Y3QgaWNfZGV2aWNlICpuZXh0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgc2hvcnQgZmxhZ3M7Ci0Jc2hvcnQgYWJsZTsKLQlfX2JlMzIgeGlkOwotfTsKLQotc3RhdGljIHN0cnVjdCBpY19kZXZpY2UgKmljX2ZpcnN0X2RldiBfX2luaXRkYXRhID0gTlVMTDsvKiBMaXN0IG9mIG9wZW4gZGV2aWNlICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmljX2RldiBfX2luaXRkYXRhID0gTlVMTDsJLyogU2VsZWN0ZWQgZGV2aWNlICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGljX29wZW5fZGV2cyh2b2lkKQotewotCXN0cnVjdCBpY19kZXZpY2UgKmQsICoqbGFzdDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXVuc2lnbmVkIHNob3J0IG9mbGFnczsKLQotCWxhc3QgPSAmaWNfZmlyc3RfZGV2OwotCXJ0bmxfbG9jaygpOwotCi0JLyogYnJpbmcgbG9vcGJhY2sgZGV2aWNlIHVwIGZpcnN0ICovCi0JaWYgKGRldl9jaGFuZ2VfZmxhZ3MoJmxvb3BiYWNrX2RldiwgbG9vcGJhY2tfZGV2LmZsYWdzIHwgSUZGX1VQKSA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBGYWlsZWQgdG8gb3BlbiAlc1xuIiwgbG9vcGJhY2tfZGV2Lm5hbWUpOwotCi0JZm9yX2VhY2hfbmV0ZGV2KGRldikgewotCQlpZiAoZGV2ID09ICZsb29wYmFja19kZXYpCi0JCQljb250aW51ZTsKLQkJaWYgKHVzZXJfZGV2X25hbWVbMF0gPyAhc3RyY21wKGRldi0+bmFtZSwgdXNlcl9kZXZfbmFtZSkgOgotCQkgICAgKCEoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKLQkJICAgICAoZGV2LT5mbGFncyAmIChJRkZfUE9JTlRPUE9JTlR8SUZGX0JST0FEQ0FTVCkpICYmCi0JCSAgICAgc3RybmNtcChkZXYtPm5hbWUsICJkdW1teSIsIDUpKSkgewotCQkJaW50IGFibGUgPSAwOwotCQkJaWYgKGRldi0+bXR1ID49IDM2NCkKLQkJCQlhYmxlIHw9IElDX0JPT1RQOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRIQ1AvQk9PVFA6IElnbm9yaW5nIGRldmljZSAlcywgTVRVICVkIHRvbyBzbWFsbCIsIGRldi0+bmFtZSwgZGV2LT5tdHUpOwotCQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9OT0FSUCkpCi0JCQkJYWJsZSB8PSBJQ19SQVJQOwotCQkJYWJsZSAmPSBpY19wcm90b19lbmFibGVkOwotCQkJaWYgKGljX3Byb3RvX2VuYWJsZWQgJiYgIWFibGUpCi0JCQkJY29udGludWU7Ci0JCQlvZmxhZ3MgPSBkZXYtPmZsYWdzOwotCQkJaWYgKGRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBvZmxhZ3MgfCBJRkZfVVApIDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBGYWlsZWQgdG8gb3BlbiAlc1xuIiwgZGV2LT5uYW1lKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghKGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWNfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCQkJcnRubF91bmxvY2soKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlkLT5kZXYgPSBkZXY7Ci0JCQkqbGFzdCA9IGQ7Ci0JCQlsYXN0ID0gJmQtPm5leHQ7Ci0JCQlkLT5mbGFncyA9IG9mbGFnczsKLQkJCWQtPmFibGUgPSBhYmxlOwotCQkJaWYgKGFibGUgJiBJQ19CT09UUCkKLQkJCQlnZXRfcmFuZG9tX2J5dGVzKCZkLT54aWQsIHNpemVvZihfX2JlMzIpKTsKLQkJCWVsc2UKLQkJCQlkLT54aWQgPSAwOwotCQkJaWNfcHJvdG9faGF2ZV9pZiB8PSBhYmxlOwotCQkJREJHKCgiSVAtQ29uZmlnOiAlcyBVUCAoYWJsZT0lZCwgeGlkPSUwOHgpXG4iLAotCQkJCWRldi0+bmFtZSwgYWJsZSwgZC0+eGlkKSk7Ci0JCX0KLQl9Ci0JcnRubF91bmxvY2soKTsKLQotCSpsYXN0ID0gTlVMTDsKLQotCWlmICghaWNfZmlyc3RfZGV2KSB7Ci0JCWlmICh1c2VyX2Rldl9uYW1lWzBdKQotCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IERldmljZSBgJXMnIG5vdCBmb3VuZC5cbiIsIHVzZXJfZGV2X25hbWUpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogTm8gbmV0d29yayBkZXZpY2VzIGF2YWlsYWJsZS5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaWNfY2xvc2VfZGV2cyh2b2lkKQotewotCXN0cnVjdCBpY19kZXZpY2UgKmQsICpuZXh0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0KLQlydG5sX2xvY2soKTsKLQluZXh0ID0gaWNfZmlyc3RfZGV2OwotCXdoaWxlICgoZCA9IG5leHQpKSB7Ci0JCW5leHQgPSBkLT5uZXh0OwotCQlkZXYgPSBkLT5kZXY7Ci0JCWlmIChkZXYgIT0gaWNfZGV2KSB7Ci0JCQlEQkcoKCJJUC1Db25maWc6IERvd25pbmcgJXNcbiIsIGRldi0+bmFtZSkpOwotCQkJZGV2X2NoYW5nZV9mbGFncyhkZXYsIGQtPmZsYWdzKTsKLQkJfQotCQlrZnJlZShkKTsKLQl9Ci0JcnRubF91bmxvY2soKTsKLX0KLQotLyoKLSAqCUludGVyZmFjZSB0byB2YXJpb3VzIG5ldHdvcmsgZnVuY3Rpb25zLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBfX2JlMzIgYWRkciwgX19iZTE2IHBvcnQpCi17Ci0Jc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7Ci0Jc2luLT5zaW5fcG9ydCA9IHBvcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGljX2Rldl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgaWZyZXEgKmFyZykKLXsKLQlpbnQgcmVzOwotCi0JbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7Ci0Jc2V0X2ZzKGdldF9kcygpKTsKLQlyZXMgPSBkZXZpbmV0X2lvY3RsKGNtZCwgKHN0cnVjdCBpZnJlcSBfX3VzZXIgKikgYXJnKTsKLQlzZXRfZnMob2xkZnMpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGljX3JvdXRlX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBydGVudHJ5ICphcmcpCi17Ci0JaW50IHJlczsKLQotCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOwotCXNldF9mcyhnZXRfZHMoKSk7Ci0JcmVzID0gaXBfcnRfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQlzZXRfZnMob2xkZnMpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKglTZXQgdXAgaW50ZXJmYWNlIGFkZHJlc3NlcyBhbmQgcm91dGVzLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGljX3NldHVwX2lmKHZvaWQpCi17Ci0Jc3RydWN0IGlmcmVxIGlyOwotCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHZvaWQgKikgJmlyLmlmcl9pZnJ1LmlmcnVfYWRkcjsKLQlpbnQgZXJyOwotCi0JbWVtc2V0KCZpciwgMCwgc2l6ZW9mKGlyKSk7Ci0Jc3RyY3B5KGlyLmlmcl9pZnJuLmlmcm5fbmFtZSwgaWNfZGV2LT5uYW1lKTsKLQlzZXRfc29ja2FkZHIoc2luLCBpY19teWFkZHIsIDApOwotCWlmICgoZXJyID0gaWNfZGV2X2lvY3RsKFNJT0NTSUZBRERSLCAmaXIpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IFVuYWJsZSB0byBzZXQgaW50ZXJmYWNlIGFkZHJlc3MgKCVkKS5cbiIsIGVycik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2V0X3NvY2thZGRyKHNpbiwgaWNfbmV0bWFzaywgMCk7Ci0JaWYgKChlcnIgPSBpY19kZXZfaW9jdGwoU0lPQ1NJRk5FVE1BU0ssICZpcikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogVW5hYmxlIHRvIHNldCBpbnRlcmZhY2UgbmV0bWFzayAoJWQpLlxuIiwgZXJyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzZXRfc29ja2FkZHIoc2luLCBpY19teWFkZHIgfCB+aWNfbmV0bWFzaywgMCk7Ci0JaWYgKChlcnIgPSBpY19kZXZfaW9jdGwoU0lPQ1NJRkJSREFERFIsICZpcikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogVW5hYmxlIHRvIHNldCBpbnRlcmZhY2UgYnJvYWRjYXN0IGFkZHJlc3MgKCVkKS5cbiIsIGVycik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGljX3NldHVwX3JvdXRlcyh2b2lkKQotewotCS8qIE5vIG5lZWQgdG8gc2V0dXAgZGV2aWNlIHJvdXRlcywgb25seSB0aGUgZGVmYXVsdCByb3V0ZS4uLiAqLwotCi0JaWYgKGljX2dhdGV3YXkgIT0gTk9ORSkgewotCQlzdHJ1Y3QgcnRlbnRyeSBybTsKLQkJaW50IGVycjsKLQotCQltZW1zZXQoJnJtLCAwLCBzaXplb2Yocm0pKTsKLQkJaWYgKChpY19nYXRld2F5IF4gaWNfbXlhZGRyKSAmIGljX25ldG1hc2spIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBHYXRld2F5IG5vdCBvbiBkaXJlY3RseSBjb25uZWN0ZWQgbmV0d29yay5cbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZybS5ydF9kc3QsIDAsIDApOwotCQlzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcm0ucnRfZ2VubWFzaywgMCwgMCk7Ci0JCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZybS5ydF9nYXRld2F5LCBpY19nYXRld2F5LCAwKTsKLQkJcm0ucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfR0FURVdBWTsKLQkJaWYgKChlcnIgPSBpY19yb3V0ZV9pb2N0bChTSU9DQUREUlQsICZybSkpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IENhbm5vdCBhZGQgZGVmYXVsdCByb3V0ZSAoJWQpLlxuIiwgZXJyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICoJRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG1pc3NpbmcgcGFyYW1ldGVycy4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBpY19kZWZhdWx0cyh2b2lkKQotewotCS8qCi0JICoJQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHVzZXJzcGFjZSBydW5uaW5nIHNvIG5lZWQgbm90Ci0JICoJY2xhaW0gbG9ja3Mgb24gc3lzdGVtX3V0c25hbWUKLQkgKi8KLQotCWlmICghaWNfaG9zdF9uYW1lX3NldCkKLQkJc3ByaW50Zihpbml0X3V0c25hbWUoKS0+bm9kZW5hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfbXlhZGRyKSk7Ci0KLQlpZiAocm9vdF9zZXJ2ZXJfYWRkciA9PSBOT05FKQotCQlyb290X3NlcnZlcl9hZGRyID0gaWNfc2VydmFkZHI7Ci0KLQlpZiAoaWNfbmV0bWFzayA9PSBOT05FKSB7Ci0JCWlmIChJTl9DTEFTU0EobnRvaGwoaWNfbXlhZGRyKSkpCi0JCQlpY19uZXRtYXNrID0gaHRvbmwoSU5fQ0xBU1NBX05FVCk7Ci0JCWVsc2UgaWYgKElOX0NMQVNTQihudG9obChpY19teWFkZHIpKSkKLQkJCWljX25ldG1hc2sgPSBodG9ubChJTl9DTEFTU0JfTkVUKTsKLQkJZWxzZSBpZiAoSU5fQ0xBU1NDKG50b2hsKGljX215YWRkcikpKQotCQkJaWNfbmV0bWFzayA9IGh0b25sKElOX0NMQVNTQ19ORVQpOwotCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBVbmFibGUgdG8gZ3Vlc3MgbmV0bWFzayBmb3IgYWRkcmVzcyAldS4ldS4ldS4ldVxuIiwKLQkJCQlOSVBRVUFEKGljX215YWRkcikpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXByaW50aygiSVAtQ29uZmlnOiBHdWVzc2luZyBuZXRtYXNrICV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGljX25ldG1hc2spKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCVJBUlAgc3VwcG9ydC4KLSAqLwotCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCi1zdGF0aWMgaW50IGljX3JhcnBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpOwotCi1zdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIHJhcnBfcGFja2V0X3R5cGUgX19pbml0ZGF0YSA9IHsKLQkudHlwZSA9CV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUkFSUCksCi0JLmZ1bmMgPQlpY19yYXJwX3JlY3YsCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaWNfcmFycF9pbml0KHZvaWQpCi17Ci0JZGV2X2FkZF9wYWNrKCZyYXJwX3BhY2tldF90eXBlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGljX3JhcnBfY2xlYW51cCh2b2lkKQotewotCWRldl9yZW1vdmVfcGFjaygmcmFycF9wYWNrZXRfdHlwZSk7Ci19Ci0KLS8qCi0gKiAgUHJvY2VzcyByZWNlaXZlZCBSQVJQIHBhY2tldC4KLSAqLwotc3RhdGljIGludCBfX2luaXQKLWljX3JhcnBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCi17Ci0Jc3RydWN0IGFycGhkciAqcmFycDsKLQl1bnNpZ25lZCBjaGFyICpyYXJwX3B0cjsKLQlfX2JlMzIgc2lwLCB0aXA7Ci0JdW5zaWduZWQgY2hhciAqc2hhLCAqdGhhOwkJLyogcyBmb3IgInNvdXJjZSIsIHQgZm9yICJ0YXJnZXQiICovCi0Jc3RydWN0IGljX2RldmljZSAqZDsKLQotCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSkpCi0JCWdvdG8gZHJvcDsKLQotCS8qIEJhc2ljIHNhbml0eSBjaGVja3MgY2FuIGJlIGRvbmUgd2l0aG91dCB0aGUgbG9jay4gICovCi0JcmFycCA9IChzdHJ1Y3QgYXJwaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKLQotCS8qIElmIHRoaXMgdGVzdCBkb2Vzbid0IHBhc3MsIGl0J3Mgbm90IElQLCBvciB3ZSBzaG91bGQKLQkgKiBpZ25vcmUgaXQgYW55d2F5LgotCSAqLwotCWlmIChyYXJwLT5hcl9obG4gIT0gZGV2LT5hZGRyX2xlbiB8fCBkZXYtPnR5cGUgIT0gbnRvaHMocmFycC0+YXJfaHJkKSkKLQkJZ290byBkcm9wOwotCi0JLyogSWYgaXQncyBub3QgYSBSQVJQIHJlcGx5LCBkZWxldGUgaXQuICovCi0JaWYgKHJhcnAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JSRVBMWSkpCi0JCWdvdG8gZHJvcDsKLQotCS8qIElmIGl0J3Mgbm90IEV0aGVybmV0LCBkZWxldGUgaXQuICovCi0JaWYgKHJhcnAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkpCi0JCWdvdG8gZHJvcDsKLQotCWlmICghcHNrYl9tYXlfcHVsbChza2IsCi0JCQkgICBzaXplb2Yoc3RydWN0IGFycGhkcikgKwotCQkJICAgKDIgKiBkZXYtPmFkZHJfbGVuKSArCi0JCQkgICAoMiAqIDQpKSkKLQkJZ290byBkcm9wOwotCi0JLyogT0ssIGl0IGlzIGFsbCB0aGVyZSBhbmQgbG9va3MgdmFsaWQsIHByb2Nlc3MuLi4gKi8KLQlyYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwotCXJhcnBfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgKHJhcnAgKyAxKTsKLQotCS8qIE9uZSByZXBseSBhdCBhIHRpbWUsIHBsZWFzZS4gKi8KLQlzcGluX2xvY2soJmljX3JlY3ZfbG9jayk7Ci0KLQkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXBseSwganVzdCBkcm9wIHRoZSBwYWNrZXQgKi8KLQlpZiAoaWNfZ290X3JlcGx5KQotCQlnb3RvIGRyb3BfdW5sb2NrOwotCi0JLyogRmluZCB0aGUgaWNfZGV2aWNlIHRoYXQgdGhlIHBhY2tldCBhcnJpdmVkIG9uICovCi0JZCA9IGljX2ZpcnN0X2RldjsKLQl3aGlsZSAoZCAmJiBkLT5kZXYgIT0gZGV2KQotCQlkID0gZC0+bmV4dDsKLQlpZiAoIWQpCi0JCWdvdG8gZHJvcF91bmxvY2s7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLQotCS8qIEV4dHJhY3QgdmFyaWFibGUtd2lkdGggZmllbGRzICovCi0Jc2hhID0gcmFycF9wdHI7Ci0JcmFycF9wdHIgKz0gZGV2LT5hZGRyX2xlbjsKLQltZW1jcHkoJnNpcCwgcmFycF9wdHIsIDQpOwotCXJhcnBfcHRyICs9IDQ7Ci0JdGhhID0gcmFycF9wdHI7Ci0JcmFycF9wdHIgKz0gZGV2LT5hZGRyX2xlbjsKLQltZW1jcHkoJnRpcCwgcmFycF9wdHIsIDQpOwotCi0JLyogRGlzY2FyZCBwYWNrZXRzIHdoaWNoIGFyZSBub3QgbWVhbnQgZm9yIHVzLiAqLwotCWlmIChtZW1jbXAodGhhLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKSkKLQkJZ290byBkcm9wX3VubG9jazsKLQotCS8qIERpc2NhcmQgcGFja2V0cyB3aGljaCBhcmUgbm90IGZyb20gc3BlY2lmaWVkIHNlcnZlci4gKi8KLQlpZiAoaWNfc2VydmFkZHIgIT0gTk9ORSAmJiBpY19zZXJ2YWRkciAhPSBzaXApCi0JCWdvdG8gZHJvcF91bmxvY2s7Ci0KLQkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwotCWljX2RldiA9IGRldjsKLQlpZiAoaWNfbXlhZGRyID09IE5PTkUpCi0JCWljX215YWRkciA9IHRpcDsKLQlpY19zZXJ2YWRkciA9IHNpcDsKLQlpY19nb3RfcmVwbHkgPSBJQ19SQVJQOwotCi1kcm9wX3VubG9jazoKLQkvKiBTaG93J3Mgb3Zlci4gIE5vdGhpbmcgdG8gc2VlIGhlcmUuICAqLwotCXNwaW5fdW5sb2NrKCZpY19yZWN2X2xvY2spOwotCi1kcm9wOgotCS8qIFRocm93IHRoZSBwYWNrZXQgb3V0LiAqLwotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiAgU2VuZCBSQVJQIHJlcXVlc3QgcGFja2V0IG92ZXIgYSBzaW5nbGUgaW50ZXJmYWNlLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaWNfcmFycF9zZW5kX2lmKHN0cnVjdCBpY19kZXZpY2UgKmQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGQtPmRldjsKLQlhcnBfc2VuZChBUlBPUF9SUkVRVUVTVCwgRVRIX1BfUkFSUCwgMCwgZGV2LCAwLCBOVUxMLAotCQkgZGV2LT5kZXZfYWRkciwgZGV2LT5kZXZfYWRkcik7Ci19Ci0jZW5kaWYKLQotLyoKLSAqCURIQ1AvQk9PVFAgc3VwcG9ydC4KLSAqLwotCi0jaWZkZWYgSVBDT05GSUdfQk9PVFAKLQotc3RydWN0IGJvb3RwX3BrdCB7CQkvKiBCT09UUCBwYWNrZXQgZm9ybWF0ICovCi0Jc3RydWN0IGlwaGRyIGlwaDsJLyogSVAgaGVhZGVyICovCi0Jc3RydWN0IHVkcGhkciB1ZHBoOwkvKiBVRFAgaGVhZGVyICovCi0JdTggb3A7CQkJLyogMT1yZXF1ZXN0LCAyPXJlcGx5ICovCi0JdTggaHR5cGU7CQkvKiBIVyBhZGRyZXNzIHR5cGUgKi8KLQl1OCBobGVuOwkJLyogSFcgYWRkcmVzcyBsZW5ndGggKi8KLQl1OCBob3BzOwkJLyogVXNlZCBvbmx5IGJ5IGdhdGV3YXlzICovCi0JX19iZTMyIHhpZDsJCS8qIFRyYW5zYWN0aW9uIElEICovCi0JX19iZTE2IHNlY3M7CQkvKiBTZWNvbmRzIHNpbmNlIHdlIHN0YXJ0ZWQgKi8KLQlfX2JlMTYgZmxhZ3M7CQkvKiBKdXN0IHdoYXQgaXQgc2F5cyAqLwotCV9fYmUzMiBjbGllbnRfaXA7CQkvKiBDbGllbnQncyBJUCBhZGRyZXNzIGlmIGtub3duICovCi0JX19iZTMyIHlvdXJfaXA7CQkvKiBBc3NpZ25lZCBJUCBhZGRyZXNzICovCi0JX19iZTMyIHNlcnZlcl9pcDsJCS8qIChOZXh0LCBlLmcuIE5GUykgU2VydmVyJ3MgSVAgYWRkcmVzcyAqLwotCV9fYmUzMiByZWxheV9pcDsJCS8qIElQIGFkZHJlc3Mgb2YgQk9PVFAgcmVsYXkgKi8KLQl1OCBod19hZGRyWzE2XTsJCS8qIENsaWVudCdzIEhXIGFkZHJlc3MgKi8KLQl1OCBzZXJ2X25hbWVbNjRdOwkvKiBTZXJ2ZXIgaG9zdCBuYW1lICovCi0JdTggYm9vdF9maWxlWzEyOF07CS8qIE5hbWUgb2YgYm9vdCBmaWxlICovCi0JdTggZXh0ZW5bMzEyXTsJCS8qIERIQ1Agb3B0aW9ucyAvIEJPT1RQIHZlbmRvciBleHRlbnNpb25zICovCi19OwotCi0vKiBwYWNrZXQgb3BzICovCi0jZGVmaW5lIEJPT1RQX1JFUVVFU1QJMQotI2RlZmluZSBCT09UUF9SRVBMWQkyCi0KLS8qIERIQ1AgbWVzc2FnZSB0eXBlcyAqLwotI2RlZmluZSBESENQRElTQ09WRVIJMQotI2RlZmluZSBESENQT0ZGRVIJMgotI2RlZmluZSBESENQUkVRVUVTVAkzCi0jZGVmaW5lIERIQ1BERUNMSU5FCTQKLSNkZWZpbmUgREhDUEFDSwkJNQotI2RlZmluZSBESENQTkFLCQk2Ci0jZGVmaW5lIERIQ1BSRUxFQVNFCTcKLSNkZWZpbmUgREhDUElORk9STQk4Ci0KLXN0YXRpYyBpbnQgaWNfYm9vdHBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpOwotCi1zdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGJvb3RwX3BhY2tldF90eXBlIF9faW5pdGRhdGEgPSB7Ci0JLnR5cGUgPQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSwKLQkuZnVuYyA9CWljX2Jvb3RwX3JlY3YsCi19OwotCi0KLS8qCi0gKiAgSW5pdGlhbGl6ZSBESENQL0JPT1RQIGV4dGVuc2lvbiBmaWVsZHMgaW4gdGhlIHJlcXVlc3QuCi0gKi8KLQotc3RhdGljIGNvbnN0IHU4IGljX2Jvb3RwX2Nvb2tpZVs0XSA9IHsgOTksIDEzMCwgODMsIDk5IH07Ci0KLSNpZmRlZiBJUENPTkZJR19ESENQCi0KLXN0YXRpYyB2b2lkIF9faW5pdAotaWNfZGhjcF9pbml0X29wdGlvbnModTggKm9wdGlvbnMpCi17Ci0JdTggbXQgPSAoKGljX3NlcnZhZGRyID09IE5PTkUpCi0JCSA/IERIQ1BESVNDT1ZFUiA6IERIQ1BSRVFVRVNUKTsKLQl1OCAqZSA9IG9wdGlvbnM7Ci0KLSNpZmRlZiBJUENPTkZJR19ERUJVRwotCXByaW50aygiREhDUDogU2VuZGluZyBtZXNzYWdlIHR5cGUgJWRcbiIsIG10KTsKLSNlbmRpZgotCi0JbWVtY3B5KGUsIGljX2Jvb3RwX2Nvb2tpZSwgNCk7CS8qIFJGQzEwNDggTWFnaWMgQ29va2llICovCi0JZSArPSA0OwotCi0JKmUrKyA9IDUzOwkJLyogREhDUCBtZXNzYWdlIHR5cGUgKi8KLQkqZSsrID0gMTsKLQkqZSsrID0gbXQ7Ci0KLQlpZiAobXQgPT0gREhDUFJFUVVFU1QpIHsKLQkJKmUrKyA9IDU0OwkvKiBTZXJ2ZXIgSUQgKElQIGFkZHJlc3MpICovCi0JCSplKysgPSA0OwotCQltZW1jcHkoZSwgJmljX3NlcnZhZGRyLCA0KTsKLQkJZSArPSA0OwotCi0JCSplKysgPSA1MDsJLyogUmVxdWVzdGVkIElQIGFkZHJlc3MgKi8KLQkJKmUrKyA9IDQ7Ci0JCW1lbWNweShlLCAmaWNfbXlhZGRyLCA0KTsKLQkJZSArPSA0OwotCX0KLQotCS8qIGFsd2F5cz8gKi8KLQl7Ci0JCXN0YXRpYyBjb25zdCB1OCBpY19yZXFfcGFyYW1zW10gPSB7Ci0JCQkxLAkvKiBTdWJuZXQgbWFzayAqLwotCQkJMywJLyogRGVmYXVsdCBnYXRld2F5ICovCi0JCQk2LAkvKiBETlMgc2VydmVyICovCi0JCQkxMiwJLyogSG9zdCBuYW1lICovCi0JCQkxNSwJLyogRG9tYWluIG5hbWUgKi8KLQkJCTE3LAkvKiBCb290IHBhdGggKi8KLQkJCTQwLAkvKiBOSVMgZG9tYWluIG5hbWUgKi8KLQkJfTsKLQotCQkqZSsrID0gNTU7CS8qIFBhcmFtZXRlciByZXF1ZXN0IGxpc3QgKi8KLQkJKmUrKyA9IHNpemVvZihpY19yZXFfcGFyYW1zKTsKLQkJbWVtY3B5KGUsIGljX3JlcV9wYXJhbXMsIHNpemVvZihpY19yZXFfcGFyYW1zKSk7Ci0JCWUgKz0gc2l6ZW9mKGljX3JlcV9wYXJhbXMpOwotCX0KLQotCSplKysgPSAyNTU7CS8qIEVuZCBvZiB0aGUgbGlzdCAqLwotfQotCi0jZW5kaWYgLyogSVBDT05GSUdfREhDUCAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaWNfYm9vdHBfaW5pdF9leHQodTggKmUpCi17Ci0JbWVtY3B5KGUsIGljX2Jvb3RwX2Nvb2tpZSwgNCk7CS8qIFJGQzEwNDggTWFnaWMgQ29va2llICovCi0JZSArPSA0OwotCSplKysgPSAxOwkJLyogU3VibmV0IG1hc2sgcmVxdWVzdCAqLwotCSplKysgPSA0OwotCWUgKz0gNDsKLQkqZSsrID0gMzsJCS8qIERlZmF1bHQgZ2F0ZXdheSByZXF1ZXN0ICovCi0JKmUrKyA9IDQ7Ci0JZSArPSA0OwotCSplKysgPSA1OwkJLyogTmFtZSBzZXJ2ZXIgcmVxdWVzdCAqLwotCSplKysgPSA4OwotCWUgKz0gODsKLQkqZSsrID0gMTI7CQkvKiBIb3N0IG5hbWUgcmVxdWVzdCAqLwotCSplKysgPSAzMjsKLQllICs9IDMyOwotCSplKysgPSA0MDsJCS8qIE5JUyBEb21haW4gbmFtZSByZXF1ZXN0ICovCi0JKmUrKyA9IDMyOwotCWUgKz0gMzI7Ci0JKmUrKyA9IDE3OwkJLyogQm9vdCBwYXRoICovCi0JKmUrKyA9IDQwOwotCWUgKz0gNDA7Ci0KLQkqZSsrID0gNTc7CQkvKiBzZXQgZXh0ZW5zaW9uIGJ1ZmZlciBzaXplIGZvciByZXBseSAqLwotCSplKysgPSAyOwotCSplKysgPSAxOwkJLyogMTI4KzIzNis4KzIwKzE0LCBzZWUgZGhjcGQgc291cmNlcyAqLwotCSplKysgPSAxNTA7Ci0KLQkqZSsrID0gMjU1OwkJLyogRW5kIG9mIHRoZSBsaXN0ICovCi19Ci0KLQotLyoKLSAqICBJbml0aWFsaXplIHRoZSBESENQL0JPT1RQIG1lY2hhbmlzbS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGljX2Jvb3RwX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBDT05GX05BTUVTRVJWRVJTX01BWDsgaSsrKQotCQlpY19uYW1lc2VydmVyc1tpXSA9IE5PTkU7Ci0KLQlkZXZfYWRkX3BhY2soJmJvb3RwX3BhY2tldF90eXBlKTsKLX0KLQotCi0vKgotICogIERIQ1AvQk9PVFAgY2xlYW51cC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGljX2Jvb3RwX2NsZWFudXAodm9pZCkKLXsKLQlkZXZfcmVtb3ZlX3BhY2soJmJvb3RwX3BhY2tldF90eXBlKTsKLX0KLQotCi0vKgotICogIFNlbmQgREhDUC9CT09UUCByZXF1ZXN0IHRvIHNpbmdsZSBpbnRlcmZhY2UuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpY19ib290cF9zZW5kX2lmKHN0cnVjdCBpY19kZXZpY2UgKmQsIHVuc2lnbmVkIGxvbmcgamlmZmllc19kaWZmKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkLT5kZXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgYm9vdHBfcGt0ICpiOwotCWludCBoaF9sZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOwotCXN0cnVjdCBpcGhkciAqaDsKLQotCS8qIEFsbG9jYXRlIHBhY2tldCAqLwotCXNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkgKyBoaF9sZW4gKyAxNSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IpCi0JCXJldHVybjsKLQlza2JfcmVzZXJ2ZShza2IsIGhoX2xlbik7Ci0JYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkpOwotCW1lbXNldChiLCAwLCBzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkpOwotCi0JLyogQ29uc3RydWN0IElQIGhlYWRlciAqLwotCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwotCWggPSBpcF9oZHIoc2tiKTsKLQloLT52ZXJzaW9uID0gNDsKLQloLT5paGwgPSA1OwotCWgtPnRvdF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkpOwotCWgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOwotCWgtPnR0bCA9IDY0OwotCWgtPnByb3RvY29sID0gSVBQUk9UT19VRFA7Ci0JaC0+ZGFkZHIgPSBodG9ubChJTkFERFJfQlJPQURDQVNUKTsKLQloLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKSBoLCBoLT5paGwpOwotCi0JLyogQ29uc3RydWN0IFVEUCBoZWFkZXIgKi8KLQliLT51ZHBoLnNvdXJjZSA9IGh0b25zKDY4KTsKLQliLT51ZHBoLmRlc3QgPSBodG9ucyg2Nyk7Ci0JYi0+dWRwaC5sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkgLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7Ci0JLyogVURQIGNoZWNrc3VtIG5vdCBjYWxjdWxhdGVkIC0tIGV4cGxpY2l0bHkgYWxsb3dlZCBpbiBCT09UUCBSRkMgKi8KLQotCS8qIENvbnN0cnVjdCBESENQL0JPT1RQIGhlYWRlciAqLwotCWItPm9wID0gQk9PVFBfUkVRVUVTVDsKLQlpZiAoZGV2LT50eXBlIDwgMjU2KSAvKiBjaGVjayBmb3IgZmFsc2UgdHlwZXMgKi8KLQkJYi0+aHR5cGUgPSBkZXYtPnR5cGU7Ci0JZWxzZSBpZiAoZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyX1RSKSAvKiBmaXggZm9yIHRva2VuIHJpbmcgKi8KLQkJYi0+aHR5cGUgPSBBUlBIUkRfSUVFRTgwMjsKLQllbHNlIGlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0ZEREkpCi0JCWItPmh0eXBlID0gQVJQSFJEX0VUSEVSOwotCWVsc2UgewotCQlwcmludGsoIlVua25vd24gQVJQIHR5cGUgMHglMDR4IGZvciBkZXZpY2UgJXNcbiIsIGRldi0+dHlwZSwgZGV2LT5uYW1lKTsKLQkJYi0+aHR5cGUgPSBkZXYtPnR5cGU7IC8qIGNhbiBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IgKi8KLQl9Ci0JYi0+aGxlbiA9IGRldi0+YWRkcl9sZW47Ci0JYi0+eW91cl9pcCA9IE5PTkU7Ci0JYi0+c2VydmVyX2lwID0gTk9ORTsKLQltZW1jcHkoYi0+aHdfYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0JYi0+c2VjcyA9IGh0b25zKGppZmZpZXNfZGlmZiAvIEhaKTsKLQliLT54aWQgPSBkLT54aWQ7Ci0KLQkvKiBhZGQgREhDUCBvcHRpb25zIG9yIEJPT1RQIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBJUENPTkZJR19ESENQCi0JaWYgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkKLQkJaWNfZGhjcF9pbml0X29wdGlvbnMoYi0+ZXh0ZW4pOwotCWVsc2UKLSNlbmRpZgotCQlpY19ib290cF9pbml0X2V4dChiLT5leHRlbik7Ci0KLQkvKiBDaGFpbiBwYWNrZXQgZG93biB0aGUgbGluZS4uLiAqLwotCXNrYi0+ZGV2ID0gZGV2OwotCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7Ci0JaWYgKChkZXYtPmhhcmRfaGVhZGVyICYmCi0JICAgICBkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhza2ItPnByb3RvY29sKSwgZGV2LT5icm9hZGNhc3QsIGRldi0+ZGV2X2FkZHIsIHNrYi0+bGVuKSA8IDApIHx8Ci0JICAgIGRldl9xdWV1ZV94bWl0KHNrYikgPCAwKQotCQlwcmludGsoIkUiKTsKLX0KLQotCi0vKgotICogIENvcHkgQk9PVFAtc3VwcGxpZWQgc3RyaW5nIGlmIG5vdCBhbHJlYWR5IHNldC4KLSAqLwotc3RhdGljIGludCBfX2luaXQgaWNfYm9vdHBfc3RyaW5nKGNoYXIgKmRlc3QsIGNoYXIgKnNyYywgaW50IGxlbiwgaW50IG1heCkKLXsKLQlpZiAoIWxlbikKLQkJcmV0dXJuIDA7Ci0JaWYgKGxlbiA+IG1heC0xKQotCQlsZW4gPSBtYXgtMTsKLQltZW1jcHkoZGVzdCwgc3JjLCBsZW4pOwotCWRlc3RbbGVuXSA9ICdcMCc7Ci0JcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqICBQcm9jZXNzIEJPT1RQIGV4dGVuc2lvbnMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpY19kb19ib290cF9leHQodTggKmV4dCkKLXsKLSAgICAgICB1OCBzZXJ2ZXJzOwotICAgICAgIGludCBpOwotCi0jaWZkZWYgSVBDT05GSUdfREVCVUcKLQl1OCAqYzsKLQotCXByaW50aygiREhDUC9CT09UUDogR290IGV4dGVuc2lvbiAlZDoiLCpleHQpOwotCWZvciAoYz1leHQrMjsgYzxleHQrMitleHRbMV07IGMrKykKLQkJcHJpbnRrKCIgJTAyeCIsICpjKTsKLQlwcmludGsoIlxuIik7Ci0jZW5kaWYKLQotCXN3aXRjaCAoKmV4dCsrKSB7Ci0JCWNhc2UgMToJCS8qIFN1Ym5ldCBtYXNrICovCi0JCQlpZiAoaWNfbmV0bWFzayA9PSBOT05FKQotCQkJCW1lbWNweSgmaWNfbmV0bWFzaywgZXh0KzEsIDQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoJCS8qIERlZmF1bHQgZ2F0ZXdheSAqLwotCQkJaWYgKGljX2dhdGV3YXkgPT0gTk9ORSkKLQkJCQltZW1jcHkoJmljX2dhdGV3YXksIGV4dCsxLCA0KTsKLQkJCWJyZWFrOwotCQljYXNlIDY6CQkvKiBETlMgc2VydmVyICovCi0JCQlzZXJ2ZXJzPSAqZXh0LzQ7Ci0JCQlpZiAoc2VydmVycyA+IENPTkZfTkFNRVNFUlZFUlNfTUFYKQotCQkJCXNlcnZlcnMgPSBDT05GX05BTUVTRVJWRVJTX01BWDsKLQkJCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJzOyBpKyspIHsKLQkJCQlpZiAoaWNfbmFtZXNlcnZlcnNbaV0gPT0gTk9ORSkKLQkJCQkJbWVtY3B5KCZpY19uYW1lc2VydmVyc1tpXSwgZXh0KzErNCppLCA0KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDEyOgkvKiBIb3N0IG5hbWUgKi8KLQkJCWljX2Jvb3RwX3N0cmluZyh1dHNuYW1lKCktPm5vZGVuYW1lLCBleHQrMSwgKmV4dCwgX19ORVdfVVRTX0xFTik7Ci0JCQlpY19ob3N0X25hbWVfc2V0ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDE1OgkvKiBEb21haW4gbmFtZSAoRE5TKSAqLwotCQkJaWNfYm9vdHBfc3RyaW5nKGljX2RvbWFpbiwgZXh0KzEsICpleHQsIHNpemVvZihpY19kb21haW4pKTsKLQkJCWJyZWFrOwotCQljYXNlIDE3OgkvKiBSb290IHBhdGggKi8KLQkJCWlmICghcm9vdF9zZXJ2ZXJfcGF0aFswXSkKLQkJCQlpY19ib290cF9zdHJpbmcocm9vdF9zZXJ2ZXJfcGF0aCwgZXh0KzEsICpleHQsIHNpemVvZihyb290X3NlcnZlcl9wYXRoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSA0MDoJLyogTklTIERvbWFpbiBuYW1lIChfbm90XyBETlMpICovCi0JCQlpY19ib290cF9zdHJpbmcodXRzbmFtZSgpLT5kb21haW5uYW1lLCBleHQrMSwgKmV4dCwgX19ORVdfVVRTX0xFTik7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotLyoKLSAqICBSZWNlaXZlIEJPT1RQIHJlcGx5LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpY19ib290cF9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKLXsKLQlzdHJ1Y3QgYm9vdHBfcGt0ICpiOwotCXN0cnVjdCBpcGhkciAqaDsKLQlzdHJ1Y3QgaWNfZGV2aWNlICpkOwotCWludCBsZW4sIGV4dF9sZW47Ci0KLQkvKiBQZXJmb3JtIHZlcmlmaWNhdGlvbnMgYmVmb3JlIHRha2luZyB0aGUgbG9jay4gICovCi0JaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKLQkJZ290byBkcm9wOwotCi0JaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsKLQkJCSAgIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkpCi0JCWdvdG8gZHJvcDsKLQotCWIgPSAoc3RydWN0IGJvb3RwX3BrdCAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwotCWggPSAmYi0+aXBoOwotCi0JaWYgKGgtPmlobCAhPSA1IHx8IGgtPnZlcnNpb24gIT0gNCB8fCBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCkKLQkJZ290byBkcm9wOwotCi0JLyogRnJhZ21lbnRzIGFyZSBub3Qgc3VwcG9ydGVkICovCi0JaWYgKGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUIHwgSVBfTUYpKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIgIkRIQ1AvQk9PVFA6IElnbm9yaW5nIGZyYWdtZW50ZWQgIgotCQkJICAgICAgICJyZXBseS5cbiIpOwotCQlnb3RvIGRyb3A7Ci0JfQotCi0JaWYgKHNrYi0+bGVuIDwgbnRvaHMoaC0+dG90X2xlbikpCi0JCWdvdG8gZHJvcDsKLQotCWlmIChpcF9mYXN0X2NzdW0oKGNoYXIgKikgaCwgaC0+aWhsKSkKLQkJZ290byBkcm9wOwotCi0JaWYgKGItPnVkcGguc291cmNlICE9IGh0b25zKDY3KSB8fCBiLT51ZHBoLmRlc3QgIT0gaHRvbnMoNjgpKQotCQlnb3RvIGRyb3A7Ci0KLQlpZiAobnRvaHMoaC0+dG90X2xlbikgPCBudG9ocyhiLT51ZHBoLmxlbikgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSkKLQkJZ290byBkcm9wOwotCi0JbGVuID0gbnRvaHMoYi0+dWRwaC5sZW4pIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWV4dF9sZW4gPSBsZW4gLSAoc2l6ZW9mKCpiKSAtCi0JCQkgc2l6ZW9mKHN0cnVjdCBpcGhkcikgLQotCQkJIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAtCi0JCQkgc2l6ZW9mKGItPmV4dGVuKSk7Ci0JaWYgKGV4dF9sZW4gPCAwKQotCQlnb3RvIGRyb3A7Ci0KLQkvKiBPayB0aGUgZnJvbnQgbG9va3MgZ29vZCwgbWFrZSBzdXJlIHdlIGNhbiBnZXQgYXQgdGhlIHJlc3QuICAqLwotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkKLQkJZ290byBkcm9wOwotCi0JYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Ci0JaCA9ICZiLT5pcGg7Ci0KLQkvKiBPbmUgcmVwbHkgYXQgYSB0aW1lLCBwbGVhc2UuICovCi0Jc3Bpbl9sb2NrKCZpY19yZWN2X2xvY2spOwotCi0JLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgcmVwbHksIGp1c3QgZHJvcCB0aGUgcGFja2V0ICovCi0JaWYgKGljX2dvdF9yZXBseSkKLQkJZ290byBkcm9wX3VubG9jazsKLQotCS8qIEZpbmQgdGhlIGljX2RldmljZSB0aGF0IHRoZSBwYWNrZXQgYXJyaXZlZCBvbiAqLwotCWQgPSBpY19maXJzdF9kZXY7Ci0Jd2hpbGUgKGQgJiYgZC0+ZGV2ICE9IGRldikKLQkJZCA9IGQtPm5leHQ7Ci0JaWYgKCFkKQotCQlnb3RvIGRyb3BfdW5sb2NrOyAgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCi0JLyogSXMgaXQgYSByZXBseSB0byBvdXIgQk9PVFAgcmVxdWVzdD8gKi8KLQlpZiAoYi0+b3AgIT0gQk9PVFBfUkVQTFkgfHwKLQkgICAgYi0+eGlkICE9IGQtPnhpZCkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJESENQL0JPT1RQOiBSZXBseSBub3QgZm9yIHVzLCAiCi0JCQkgICAgICAgIm9wWyV4XSB4aWRbJXhdXG4iLAotCQkJICAgICAgIGItPm9wLCBiLT54aWQpOwotCQlnb3RvIGRyb3BfdW5sb2NrOwotCX0KLQotCS8qIFBhcnNlIGV4dGVuc2lvbnMgKi8KLQlpZiAoZXh0X2xlbiA+PSA0ICYmCi0JICAgICFtZW1jbXAoYi0+ZXh0ZW4sIGljX2Jvb3RwX2Nvb2tpZSwgNCkpIHsgLyogQ2hlY2sgbWFnaWMgY29va2llICovCi0JCXU4ICplbmQgPSAodTggKikgYiArIG50b2hzKGItPmlwaC50b3RfbGVuKTsKLQkJdTggKmV4dDsKLQotI2lmZGVmIElQQ09ORklHX0RIQ1AKLQkJaWYgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkgewotCQkJX19iZTMyIHNlcnZlcl9pZCA9IE5PTkU7Ci0JCQlpbnQgbXQgPSAwOwotCi0JCQlleHQgPSAmYi0+ZXh0ZW5bNF07Ci0JCQl3aGlsZSAoZXh0IDwgZW5kICYmICpleHQgIT0gMHhmZikgewotCQkJCXU4ICpvcHQgPSBleHQrKzsKLQkJCQlpZiAoKm9wdCA9PSAwKQkvKiBQYWRkaW5nICovCi0JCQkJCWNvbnRpbnVlOwotCQkJCWV4dCArPSAqZXh0ICsgMTsKLQkJCQlpZiAoZXh0ID49IGVuZCkKLQkJCQkJYnJlYWs7Ci0JCQkJc3dpdGNoICgqb3B0KSB7Ci0JCQkJY2FzZSA1MzoJLyogTWVzc2FnZSB0eXBlICovCi0JCQkJCWlmIChvcHRbMV0pCi0JCQkJCQltdCA9IG9wdFsyXTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1NDoJLyogU2VydmVyIElEIChJUCBhZGRyZXNzKSAqLwotCQkJCQlpZiAob3B0WzFdID49IDQpCi0JCQkJCQltZW1jcHkoJnNlcnZlcl9pZCwgb3B0ICsgMiwgNCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotI2lmZGVmIElQQ09ORklHX0RFQlVHCi0JCQlwcmludGsoIkRIQ1A6IEdvdCBtZXNzYWdlIHR5cGUgJWRcbiIsIG10KTsKLSNlbmRpZgotCi0JCQlzd2l0Y2ggKG10KSB7Ci0JCQljYXNlIERIQ1BPRkZFUjoKLQkJCQkvKiBXaGlsZSBpbiB0aGUgcHJvY2VzcyBvZiBhY2NlcHRpbmcgb25lIG9mZmVyLAotCQkJCSAqIGlnbm9yZSBhbGwgb3RoZXJzLgotCQkJCSAqLwotCQkJCWlmIChpY19teWFkZHIgIT0gTk9ORSkKLQkJCQkJZ290byBkcm9wX3VubG9jazsKLQotCQkJCS8qIExldCdzIGFjY2VwdCB0aGF0IG9mZmVyLiAqLwotCQkJCWljX215YWRkciA9IGItPnlvdXJfaXA7Ci0JCQkJaWNfc2VydmFkZHIgPSBzZXJ2ZXJfaWQ7Ci0jaWZkZWYgSVBDT05GSUdfREVCVUcKLQkJCQlwcmludGsoIkRIQ1A6IE9mZmVyZWQgYWRkcmVzcyAldS4ldS4ldS4ldSIsCi0JCQkJICAgICAgIE5JUFFVQUQoaWNfbXlhZGRyKSk7Ci0JCQkJcHJpbnRrKCIgYnkgc2VydmVyICV1LiV1LiV1LiV1XG4iLAotCQkJCSAgICAgICBOSVBRVUFEKGljX3NlcnZhZGRyKSk7Ci0jZW5kaWYKLQkJCQkvKiBUaGUgREhDUCBpbmRpY2F0ZWQgc2VydmVyIGFkZHJlc3MgdGFrZXMKLQkJCQkgKiBwcmVjZWRlbmNlIG92ZXIgdGhlIGJvb3RwIGhlYWRlciBvbmUgaWYKLQkJCQkgKiB0aGV5IGFyZSBkaWZmZXJlbnQuCi0JCQkJICovCi0JCQkJaWYgKChzZXJ2ZXJfaWQgIT0gTk9ORSkgJiYKLQkJCQkgICAgKGItPnNlcnZlcl9pcCAhPSBzZXJ2ZXJfaWQpKQotCQkJCQliLT5zZXJ2ZXJfaXAgPSBpY19zZXJ2YWRkcjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBESENQQUNLOgotCQkJCWlmIChtZW1jbXAoZGV2LT5kZXZfYWRkciwgYi0+aHdfYWRkciwgZGV2LT5hZGRyX2xlbikgIT0gMCkKLQkJCQkJZ290byBkcm9wX3VubG9jazsKLQotCQkJCS8qIFllYWghICovCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJLyogVXJxdWUuICBGb3JnZXQgaXQqLwotCQkJCWljX215YWRkciA9IE5PTkU7Ci0JCQkJaWNfc2VydmFkZHIgPSBOT05FOwotCQkJCWdvdG8gZHJvcF91bmxvY2s7Ci0JCQl9Ci0KLQkJCWljX2RoY3BfbXNndHlwZSA9IG10OwotCi0JCX0KLSNlbmRpZiAvKiBJUENPTkZJR19ESENQICovCi0KLQkJZXh0ID0gJmItPmV4dGVuWzRdOwotCQl3aGlsZSAoZXh0IDwgZW5kICYmICpleHQgIT0gMHhmZikgewotCQkJdTggKm9wdCA9IGV4dCsrOwotCQkJaWYgKCpvcHQgPT0gMCkJLyogUGFkZGluZyAqLwotCQkJCWNvbnRpbnVlOwotCQkJZXh0ICs9ICpleHQgKyAxOwotCQkJaWYgKGV4dCA8IGVuZCkKLQkJCQlpY19kb19ib290cF9leHQob3B0KTsKLQkJfQotCX0KLQotCS8qIFdlIGhhdmUgYSB3aW5uZXIhICovCi0JaWNfZGV2ID0gZGV2OwotCWljX215YWRkciA9IGItPnlvdXJfaXA7Ci0JaWNfc2VydmFkZHIgPSBiLT5zZXJ2ZXJfaXA7Ci0JaWYgKGljX2dhdGV3YXkgPT0gTk9ORSAmJiBiLT5yZWxheV9pcCkKLQkJaWNfZ2F0ZXdheSA9IGItPnJlbGF5X2lwOwotCWlmIChpY19uYW1lc2VydmVyc1swXSA9PSBOT05FKQotCQlpY19uYW1lc2VydmVyc1swXSA9IGljX3NlcnZhZGRyOwotCWljX2dvdF9yZXBseSA9IElDX0JPT1RQOwotCi1kcm9wX3VubG9jazoKLQkvKiBTaG93J3Mgb3Zlci4gIE5vdGhpbmcgdG8gc2VlIGhlcmUuICAqLwotCXNwaW5fdW5sb2NrKCZpY19yZWN2X2xvY2spOwotCi1kcm9wOgotCS8qIFRocm93IHRoZSBwYWNrZXQgb3V0LiAqLwotCWtmcmVlX3NrYihza2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotI2VuZGlmCi0KLQotLyoKLSAqCUR5bmFtaWMgSVAgY29uZmlndXJhdGlvbiAtLSBESENQLCBCT09UUCwgUkFSUC4KLSAqLwotCi0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotCi1zdGF0aWMgaW50IF9faW5pdCBpY19keW5hbWljKHZvaWQpCi17Ci0JaW50IHJldHJpZXM7Ci0Jc3RydWN0IGljX2RldmljZSAqZDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X2ppZmZpZXMsIHRpbWVvdXQsIGppZmY7Ci0JaW50IGRvX2Jvb3RwID0gaWNfcHJvdG9faGF2ZV9pZiAmIElDX0JPT1RQOwotCWludCBkb19yYXJwID0gaWNfcHJvdG9faGF2ZV9pZiAmIElDX1JBUlA7Ci0KLQkvKgotCSAqIElmIG5vbmUgb2YgREhDUC9CT09UUC9SQVJQIHdhcyBzZWxlY3RlZCwgcmV0dXJuIHdpdGggYW4gZXJyb3IuCi0JICogVGhpcyByb3V0aW5lIGdldHMgb25seSBjYWxsZWQgd2hlbiBzb21lIHBpZWNlcyBvZiBpbmZvcm1hdGlvbgotCSAqIGFyZSBtaXNzaW5nLCBhbmQgd2l0aG91dCBESENQL0JPT1RQL1JBUlAgd2UgYXJlIHVuYWJsZSB0byBnZXQgaXQuCi0JICovCi0JaWYgKCFpY19wcm90b19lbmFibGVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBJbmNvbXBsZXRlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0jaWZkZWYgSVBDT05GSUdfQk9PVFAKLQlpZiAoKGljX3Byb3RvX2VuYWJsZWQgXiBpY19wcm90b19oYXZlX2lmKSAmIElDX0JPT1RQKQotCQlwcmludGsoS0VSTl9FUlIgIkRIQ1AvQk9PVFA6IE5vIHN1aXRhYmxlIGRldmljZSBmb3VuZC5cbiIpOwotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCWlmICgoaWNfcHJvdG9fZW5hYmxlZCBeIGljX3Byb3RvX2hhdmVfaWYpICYgSUNfUkFSUCkKLQkJcHJpbnRrKEtFUk5fRVJSICJSQVJQOiBObyBzdWl0YWJsZSBkZXZpY2UgZm91bmQuXG4iKTsKLSNlbmRpZgotCi0JaWYgKCFpY19wcm90b19oYXZlX2lmKQotCQkvKiBFcnJvciBtZXNzYWdlIGFscmVhZHkgcHJpbnRlZCAqLwotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIFNldHVwIHByb3RvY29scwotCSAqLwotI2lmZGVmIElQQ09ORklHX0JPT1RQCi0JaWYgKGRvX2Jvb3RwKQotCQlpY19ib290cF9pbml0KCk7Ci0jZW5kaWYKLSNpZmRlZiBJUENPTkZJR19SQVJQCi0JaWYgKGRvX3JhcnApCi0JCWljX3JhcnBfaW5pdCgpOwotI2VuZGlmCi0KLQkvKgotCSAqIFNlbmQgcmVxdWVzdHMgYW5kIHdhaXQsIHVudGlsIHdlIGdldCBhbiBhbnN3ZXIuIFRoaXMgbG9vcAotCSAqIHNlZW1zIHRvIGJlIGEgdGVycmlibGUgd2FzdGUgb2YgQ1BVIHRpbWUsIGJ1dCBhY3R1YWxseSB0aGVyZSBpcwotCSAqIG9ubHkgb25lIHByb2Nlc3MgcnVubmluZyBhdCBhbGwsIHNvIHdlIGRvbid0IG5lZWQgdG8gdXNlIGFueQotCSAqIHNjaGVkdWxlciBmdW5jdGlvbnMuCi0JICogW0FjdHVhbGx5IHdlIGNvdWxkIG5vdywgYnV0IHRoZSBub3RoaW5nIGVsc2UgcnVubmluZyBub3RlIHN0aWxsCi0JICogIGFwcGxpZXMuLiAtIEFDXQotCSAqLwotCXByaW50ayhLRVJOX05PVElDRSAiU2VuZGluZyAlcyVzJXMgcmVxdWVzdHMgLiIsCi0JICAgICAgIGRvX2Jvb3RwCi0JCT8gKChpY19wcm90b19lbmFibGVkICYgSUNfVVNFX0RIQ1ApID8gIkRIQ1AiIDogIkJPT1RQIikgOiAiIiwKLQkgICAgICAgKGRvX2Jvb3RwICYmIGRvX3JhcnApID8gIiBhbmQgIiA6ICIiLAotCSAgICAgICBkb19yYXJwID8gIlJBUlAiIDogIiIpOwotCi0Jc3RhcnRfamlmZmllcyA9IGppZmZpZXM7Ci0JZCA9IGljX2ZpcnN0X2RldjsKLQlyZXRyaWVzID0gQ09ORl9TRU5EX1JFVFJJRVM7Ci0JZ2V0X3JhbmRvbV9ieXRlcygmdGltZW91dCwgc2l6ZW9mKHRpbWVvdXQpKTsKLQl0aW1lb3V0ID0gQ09ORl9CQVNFX1RJTUVPVVQgKyAodGltZW91dCAlICh1bnNpZ25lZCkgQ09ORl9USU1FT1VUX1JBTkRPTSk7Ci0JZm9yICg7OykgewotI2lmZGVmIElQQ09ORklHX0JPT1RQCi0JCWlmIChkb19ib290cCAmJiAoZC0+YWJsZSAmIElDX0JPT1RQKSkKLQkJCWljX2Jvb3RwX3NlbmRfaWYoZCwgamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpOwotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCQlpZiAoZG9fcmFycCAmJiAoZC0+YWJsZSAmIElDX1JBUlApKQotCQkJaWNfcmFycF9zZW5kX2lmKGQpOwotI2VuZGlmCi0KLQkJamlmZiA9IGppZmZpZXMgKyAoZC0+bmV4dCA/IENPTkZfSU5URVJfVElNRU9VVCA6IHRpbWVvdXQpOwotCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgamlmZikgJiYgIWljX2dvdF9yZXBseSkKLQkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotI2lmZGVmIElQQ09ORklHX0RIQ1AKLQkJLyogREhDUCBpc24ndCBkb25lIHVudGlsIHdlIGdldCBhIERIQ1BBQ0suICovCi0JCWlmICgoaWNfZ290X3JlcGx5ICYgSUNfQk9PVFApCi0JCSAgICAmJiAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKQotCQkgICAgJiYgaWNfZGhjcF9tc2d0eXBlICE9IERIQ1BBQ0spCi0JCXsKLQkJCWljX2dvdF9yZXBseSA9IDA7Ci0JCQlwcmludGsoIiwiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0jZW5kaWYgLyogSVBDT05GSUdfREhDUCAqLwotCi0JCWlmIChpY19nb3RfcmVwbHkpIHsKLQkJCXByaW50aygiIE9LXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKChkID0gZC0+bmV4dCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoISAtLXJldHJpZXMpIHsKLQkJCXByaW50aygiIHRpbWVkIG91dCFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkID0gaWNfZmlyc3RfZGV2OwotCi0JCXRpbWVvdXQgPSB0aW1lb3V0IENPTkZfVElNRU9VVF9NVUxUOwotCQlpZiAodGltZW91dCA+IENPTkZfVElNRU9VVF9NQVgpCi0JCQl0aW1lb3V0ID0gQ09ORl9USU1FT1VUX01BWDsKLQotCQlwcmludGsoIi4iKTsKLQl9Ci0KLSNpZmRlZiBJUENPTkZJR19CT09UUAotCWlmIChkb19ib290cCkKLQkJaWNfYm9vdHBfY2xlYW51cCgpOwotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCWlmIChkb19yYXJwKQotCQlpY19yYXJwX2NsZWFudXAoKTsKLSNlbmRpZgotCi0JaWYgKCFpY19nb3RfcmVwbHkpIHsKLQkJaWNfbXlhZGRyID0gTk9ORTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaW50aygiSVAtQ29uZmlnOiBHb3QgJXMgYW5zd2VyIGZyb20gJXUuJXUuJXUuJXUsICIsCi0JCSgoaWNfZ290X3JlcGx5ICYgSUNfUkFSUCkgPyAiUkFSUCIKLQkJIDogKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkgPyAiREhDUCIgOiAiQk9PVFAiKSwKLQkJTklQUVVBRChpY19zZXJ2YWRkcikpOwotCXByaW50aygibXkgYWRkcmVzcyBpcyAldS4ldS4ldS4ldVxuIiwgTklQUVVBRChpY19teWFkZHIpKTsKLQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogSVBDT05GSUdfRFlOQU1JQyAqLwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQotc3RhdGljIGludCBwbnBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlpZiAoaWNfcHJvdG9fdXNlZCAmIElDX1BST1RPKQotCQlzZXFfcHJpbnRmKHNlcSwgIiNQUk9UTzogJXNcbiIsCi0JCQkgICAoaWNfcHJvdG9fdXNlZCAmIElDX1JBUlApID8gIlJBUlAiCi0JCQkgICA6IChpY19wcm90b191c2VkICYgSUNfVVNFX0RIQ1ApID8gIkRIQ1AiIDogIkJPT1RQIik7Ci0JZWxzZQotCQlzZXFfcHV0cyhzZXEsICIjTUFOVUFMXG4iKTsKLQotCWlmIChpY19kb21haW5bMF0pCi0JCXNlcV9wcmludGYoc2VxLAotCQkJICAgImRvbWFpbiAlc1xuIiwgaWNfZG9tYWluKTsKLQlmb3IgKGkgPSAwOyBpIDwgQ09ORl9OQU1FU0VSVkVSU19NQVg7IGkrKykgewotCQlpZiAoaWNfbmFtZXNlcnZlcnNbaV0gIT0gTk9ORSkKLQkJCXNlcV9wcmludGYoc2VxLAotCQkJCSAgICJuYW1lc2VydmVyICV1LiV1LiV1LiV1XG4iLAotCQkJCSAgIE5JUFFVQUQoaWNfbmFtZXNlcnZlcnNbaV0pKTsKLQl9Ci0JaWYgKGljX3NlcnZhZGRyICE9IE5PTkUpCi0JCXNlcV9wcmludGYoc2VxLAotCQkJICAgImJvb3RzZXJ2ZXIgJXUuJXUuJXUuJXVcbiIsCi0JCQkgICBOSVBRVUFEKGljX3NlcnZhZGRyKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG5wX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5kb2UsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwbnBfc2VxX3Nob3csIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbnBfc2VxX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHBucF9zZXFfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotCi0vKgotICogIEV4dHJhY3QgSVAgYWRkcmVzcyBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RyaW5nIGlmIG5lZWRlZC4gTm90ZSB0aGF0IHdlCi0gKiAgbmVlZCB0byBoYXZlIHJvb3Rfc2VydmVyX2FkZHIgc2V0IF9iZWZvcmVfIElQQ29uZmlnIGdldHMgY2FsbGVkIGFzIGl0Ci0gKiAgY2FuIG92ZXJyaWRlIGl0LgotICovCi1fX2JlMzIgX19pbml0IHJvb3RfbmZzX3BhcnNlX2FkZHIoY2hhciAqbmFtZSkKLXsKLQlfX2JlMzIgYWRkcjsKLQlpbnQgb2N0ZXRzID0gMDsKLQljaGFyICpjcCwgKmNxOwotCi0JY3AgPSBjcSA9IG5hbWU7Ci0Jd2hpbGUgKG9jdGV0cyA8IDQpIHsKLQkJd2hpbGUgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLQkJCWNwKys7Ci0JCWlmIChjcCA9PSBjcSB8fCBjcCAtIGNxID4gMykKLQkJCWJyZWFrOwotCQlpZiAoKmNwID09ICcuJyB8fCBvY3RldHMgPT0gMykKLQkJCW9jdGV0cysrOwotCQlpZiAob2N0ZXRzIDwgNCkKLQkJCWNwKys7Ci0JCWNxID0gY3A7Ci0JfQotCWlmIChvY3RldHMgPT0gNCAmJiAoKmNwID09ICc6JyB8fCAqY3AgPT0gJ1wwJykpIHsKLQkJaWYgKCpjcCA9PSAnOicpCi0JCQkqY3ArKyA9ICdcMCc7Ci0JCWFkZHIgPSBpbl9hdG9uKG5hbWUpOwotCQltZW1tb3ZlKG5hbWUsIGNwLCBzdHJsZW4oY3ApICsgMSk7Ci0JfSBlbHNlCi0JCWFkZHIgPSBOT05FOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qCi0gKglJUCBBdXRvY29uZmlnIGRpc3BhdGNoZXIuCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgaXBfYXV0b19jb25maWcodm9pZCkKLXsKLQlfX2JlMzIgYWRkcjsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcHJvY19uZXRfZm9wc19jcmVhdGUoInBucCIsIFNfSVJVR08sICZwbnBfc2VxX2ZvcHMpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0KLQlpZiAoIWljX2VuYWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQlEQkcoKCJJUC1Db25maWc6IEVudGVyZWQuXG4iKSk7Ci0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotIHRyeV90cnlfYWdhaW46Ci0jZW5kaWYKLQkvKiBHaXZlIGhhcmR3YXJlIGEgY2hhbmNlIHRvIHNldHRsZSAqLwotCW1zbGVlcChDT05GX1BSRV9PUEVOKTsKLQotCS8qIFNldHVwIGFsbCBuZXR3b3JrIGRldmljZXMgKi8KLQlpZiAoaWNfb3Blbl9kZXZzKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBHaXZlIGRyaXZlcnMgYSBjaGFuY2UgdG8gc2V0dGxlICovCi0Jc3NsZWVwKENPTkZfUE9TVF9PUEVOKTsKLQotCS8qCi0JICogSWYgdGhlIGNvbmZpZyBpbmZvcm1hdGlvbiBpcyBpbnN1ZmZpY2llbnQgKGUuZy4sIG91ciBJUCBhZGRyZXNzIG9yCi0JICogSVAgYWRkcmVzcyBvZiB0aGUgYm9vdCBzZXJ2ZXIgaXMgbWlzc2luZyBvciB3ZSBoYXZlIG11bHRpcGxlIG5ldHdvcmsKLQkgKiBpbnRlcmZhY2VzIGFuZCBubyBkZWZhdWx0IHdhcyBzZXQpLCB1c2UgQk9PVFAgb3IgUkFSUCB0byBnZXQgdGhlCi0JICogbWlzc2luZyB2YWx1ZXMuCi0JICovCi0JaWYgKGljX215YWRkciA9PSBOT05FIHx8Ci0jaWZkZWYgQ09ORklHX1JPT1RfTkZTCi0JICAgIChNQUpPUihST09UX0RFVikgPT0gVU5OQU1FRF9NQUpPUgotCSAgICAgJiYgcm9vdF9zZXJ2ZXJfYWRkciA9PSBOT05FCi0JICAgICAmJiBpY19zZXJ2YWRkciA9PSBOT05FKSB8fAotI2VuZGlmCi0JICAgIGljX2ZpcnN0X2Rldi0+bmV4dCkgewotI2lmZGVmIElQQ09ORklHX0RZTkFNSUMKLQotCQlpbnQgcmV0cmllcyA9IENPTkZfT1BFTl9SRVRSSUVTOwotCi0JCWlmIChpY19keW5hbWljKCkgPCAwKSB7Ci0JCQlpY19jbG9zZV9kZXZzKCk7Ci0KLQkJCS8qCi0JCQkgKiBJIGRvbid0IGtub3cgd2h5LCBidXQgc29tZXRpbWVzIHRoZQotCQkJICogZWVwcm8xMDAgZHJpdmVyIChhdCBsZWFzdCkgZ2V0cyB1cHNldCBhbmQKLQkJCSAqIGRvZXNuJ3Qgd29yayB0aGUgZmlyc3QgdGltZSBpdCdzIG9wZW5lZC4KLQkJCSAqIEJ1dCB0aGVuIGlmIHlvdSBjbG9zZSBpdCBhbmQgcmVvcGVuIGl0LCBpdAotCQkJICogd29ya3MganVzdCBmaW5lLiAgU28gd2UgbmVlZCB0byB0cnkgdGhhdCBhdAotCQkJICogbGVhc3Qgb25jZSBiZWZvcmUgZ2l2aW5nIHVwLgotCQkJICoKLQkJCSAqIEFsc28sIGlmIHRoZSByb290IHdpbGwgYmUgTkZTLW1vdW50ZWQsIHdlCi0JCQkgKiBoYXZlIG5vd2hlcmUgdG8gZ28gaWYgREhDUCBmYWlscy4gIFNvIHdlCi0JCQkgKiBqdXN0IGhhdmUgdG8ga2VlcCB0cnlpbmcgZm9yZXZlci4KLQkJCSAqCi0JCQkgKiAJCQkJLS0gQ2hpcAotCQkJICovCi0jaWZkZWYgQ09ORklHX1JPT1RfTkZTCi0JCQlpZiAoUk9PVF9ERVYgPT0gIFJvb3RfTkZTKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJJUC1Db25maWc6IFJldHJ5aW5nIGZvcmV2ZXIgKE5GUyByb290KS4uLlxuIik7Ci0JCQkJZ290byB0cnlfdHJ5X2FnYWluOwotCQkJfQotI2VuZGlmCi0KLQkJCWlmICgtLXJldHJpZXMpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgIklQLUNvbmZpZzogUmVvcGVuaW5nIG5ldHdvcmsgZGV2aWNlcy4uLlxuIik7Ci0JCQkJZ290byB0cnlfdHJ5X2FnYWluOwotCQkJfQotCi0JCQkvKiBPaCwgd2VsbC4gIEF0IGxlYXN0IHdlIHRyaWVkLiAqLwotCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IEF1dG8tY29uZmlndXJhdGlvbiBvZiBuZXR3b3JrIGZhaWxlZC5cbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0jZWxzZSAvKiAhRFlOQU1JQyAqLwotCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogSW5jb21wbGV0ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uXG4iKTsKLQkJaWNfY2xvc2VfZGV2cygpOwotCQlyZXR1cm4gLTE7Ci0jZW5kaWYgLyogSVBDT05GSUdfRFlOQU1JQyAqLwotCX0gZWxzZSB7Ci0JCS8qIERldmljZSBzZWxlY3RlZCBtYW51YWxseSBvciBvbmx5IG9uZSBkZXZpY2UgLT4gdXNlIGl0ICovCi0JCWljX2RldiA9IGljX2ZpcnN0X2Rldi0+ZGV2OwotCX0KLQotCWFkZHIgPSByb290X25mc19wYXJzZV9hZGRyKHJvb3Rfc2VydmVyX3BhdGgpOwotCWlmIChyb290X3NlcnZlcl9hZGRyID09IE5PTkUpCi0JCXJvb3Rfc2VydmVyX2FkZHIgPSBhZGRyOwotCi0JLyoKLQkgKiBVc2UgZGVmYXVsdHMgd2hlcmVldmVyIGFwcGxpY2FibGUuCi0JICovCi0JaWYgKGljX2RlZmF1bHRzKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIENsb3NlIGFsbCBuZXR3b3JrIGRldmljZXMgZXhjZXB0IHRoZSBkZXZpY2Ugd2UndmUKLQkgKiBhdXRvY29uZmlndXJlZCBhbmQgc2V0IHVwIHJvdXRlcy4KLQkgKi8KLQlpY19jbG9zZV9kZXZzKCk7Ci0JaWYgKGljX3NldHVwX2lmKCkgPCAwIHx8IGljX3NldHVwX3JvdXRlcygpIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JLyoKLQkgKiBSZWNvcmQgd2hpY2ggcHJvdG9jb2wgd2FzIGFjdHVhbGx5IHVzZWQuCi0JICovCi0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotCWljX3Byb3RvX3VzZWQgPSBpY19nb3RfcmVwbHkgfCAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKTsKLSNlbmRpZgotCi0jaWZuZGVmIElQQ09ORklHX1NJTEVOVAotCS8qCi0JICogQ2x1ZSBpbiB0aGUgb3BlcmF0b3IuCi0JICovCi0JcHJpbnRrKCJJUC1Db25maWc6IENvbXBsZXRlOiIpOwotCXByaW50aygiXG4gICAgICBkZXZpY2U9JXMiLCBpY19kZXYtPm5hbWUpOwotCXByaW50aygiLCBhZGRyPSV1LiV1LiV1LiV1IiwgTklQUVVBRChpY19teWFkZHIpKTsKLQlwcmludGsoIiwgbWFzaz0ldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfbmV0bWFzaykpOwotCXByaW50aygiLCBndz0ldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfZ2F0ZXdheSkpOwotCXByaW50aygiLFxuICAgICBob3N0PSVzLCBkb21haW49JXMsIG5pcy1kb21haW49JXMiLAotCSAgICAgICB1dHNuYW1lKCktPm5vZGVuYW1lLCBpY19kb21haW4sIHV0c25hbWUoKS0+ZG9tYWlubmFtZSk7Ci0JcHJpbnRrKCIsXG4gICAgIGJvb3RzZXJ2ZXI9JXUuJXUuJXUuJXUiLCBOSVBRVUFEKGljX3NlcnZhZGRyKSk7Ci0JcHJpbnRrKCIsIHJvb3RzZXJ2ZXI9JXUuJXUuJXUuJXUiLCBOSVBRVUFEKHJvb3Rfc2VydmVyX2FkZHIpKTsKLQlwcmludGsoIiwgcm9vdHBhdGg9JXMiLCByb290X3NlcnZlcl9wYXRoKTsKLQlwcmludGsoIlxuIik7Ci0jZW5kaWYgLyogIVNJTEVOVCAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLWxhdGVfaW5pdGNhbGwoaXBfYXV0b19jb25maWcpOwotCi0KLS8qCi0gKiAgRGVjb2RlIGFueSBJUCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhlICJpcD0iIG9yICJuZnNhZGRycz0iIGtlcm5lbAotICogIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuIEl0IGNvbnNpc3RzIG9mIG9wdGlvbiBmaWVsZHMgc2VwYXJhdGVkIGJ5IGNvbG9ucyBpbgotICogIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gKgotICogIDxjbGllbnQtaXA+OjxzZXJ2ZXItaXA+Ojxndy1pcD46PG5ldG1hc2s+Ojxob3N0IG5hbWU+OjxkZXZpY2U+OjxQUk9UTz4KLSAqCi0gKiAgQW55IG9mIHRoZSBmaWVsZHMgY2FuIGJlIGVtcHR5IHdoaWNoIG1lYW5zIHRvIHVzZSBhIGRlZmF1bHQgdmFsdWU6Ci0gKgk8Y2xpZW50LWlwPgktIGFkZHJlc3MgZ2l2ZW4gYnkgQk9PVFAgb3IgUkFSUAotICoJPHNlcnZlci1pcD4JLSBhZGRyZXNzIG9mIGhvc3QgcmV0dXJuaW5nIEJPT1RQIG9yIFJBUlAgcGFja2V0Ci0gKgk8Z3ctaXA+CQktIG5vbmUsIG9yIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5IEJPT1RQCi0gKgk8bmV0bWFzaz4JLSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgZnJvbSA8Y2xpZW50LWlwPiwgb3IgdGhlCi0gKgkJCSAgb25lIHJldHVybmVkIGJ5IEJPT1RQCi0gKgk8aG9zdCBuYW1lPgktIDxjbGllbnQtaXA+IGluIEFTQ0lJIG5vdGF0aW9uLCBvciB0aGUgbmFtZSByZXR1cm5lZAotICoJCQkgIGJ5IEJPT1RQCi0gKgk8ZGV2aWNlPgktIHVzZSBhbGwgYXZhaWxhYmxlIGRldmljZXMKLSAqCTxQUk9UTz46Ci0gKgkgICBvZmZ8bm9uZQkgICAgLSBkb24ndCBkbyBhdXRvY29uZmlnIGF0IGFsbCAoREVGQVVMVCkKLSAqCSAgIG9ufGFueSAgICAgICAgICAgLSB1c2UgYW55IGNvbmZpZ3VyZWQgcHJvdG9jb2wKLSAqCSAgIGRoY3B8Ym9vdHB8cmFycCAgLSB1c2Ugb25seSB0aGUgc3BlY2lmaWVkIHByb3RvY29sCi0gKgkgICBib3RoICAgICAgICAgICAgIC0gdXNlIGJvdGggQk9PVFAgYW5kIFJBUlAgKG5vdCBESENQKQotICovCi1zdGF0aWMgaW50IF9faW5pdCBpY19wcm90b19uYW1lKGNoYXIgKm5hbWUpCi17Ci0JaWYgKCFzdHJjbXAobmFtZSwgIm9uIikgfHwgIXN0cmNtcChuYW1lLCAiYW55IikpIHsKLQkJcmV0dXJuIDE7Ci0JfQotI2lmZGVmIENPTkZJR19JUF9QTlBfREhDUAotCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRoY3AiKSkgewotCQlpY19wcm90b19lbmFibGVkICY9IH5JQ19SQVJQOwotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSVBfUE5QX0JPT1RQCi0JZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYm9vdHAiKSkgewotCQlpY19wcm90b19lbmFibGVkICY9IH4oSUNfUkFSUCB8IElDX1VTRV9ESENQKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lQX1BOUF9SQVJQCi0JZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicmFycCIpKSB7Ci0JCWljX3Byb3RvX2VuYWJsZWQgJj0gfihJQ19CT09UUCB8IElDX1VTRV9ESENQKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImJvdGgiKSkgewotCQlpY19wcm90b19lbmFibGVkICY9IH5JQ19VU0VfREhDUDsgLyogYmFja3dhcmQgY29tcGF0IDotKCAqLwotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaXBfYXV0b19jb25maWdfc2V0dXAoY2hhciAqYWRkcnMpCi17Ci0JY2hhciAqY3AsICppcCwgKmRwOwotCWludCBudW0gPSAwOwotCi0JaWNfc2V0X21hbnVhbGx5ID0gMTsKLQotCWljX2VuYWJsZSA9ICgqYWRkcnMgJiYKLQkJKHN0cmNtcChhZGRycywgIm9mZiIpICE9IDApICYmCi0JCShzdHJjbXAoYWRkcnMsICJub25lIikgIT0gMCkpOwotCWlmICghaWNfZW5hYmxlKQotCQlyZXR1cm4gMTsKLQotCWlmIChpY19wcm90b19uYW1lKGFkZHJzKSkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBQYXJzZSB0aGUgd2hvbGUgc3RyaW5nICovCi0JaXAgPSBhZGRyczsKLQl3aGlsZSAoaXAgJiYgKmlwKSB7Ci0JCWlmICgoY3AgPSBzdHJjaHIoaXAsICc6JykpKQotCQkJKmNwKysgPSAnXDAnOwotCQlpZiAoc3RybGVuKGlwKSA+IDApIHsKLQkJCURCRygoIklQLUNvbmZpZzogUGFyYW1ldGVyICMlZDogYCVzJ1xuIiwgbnVtLCBpcCkpOwotCQkJc3dpdGNoIChudW0pIHsKLQkJCWNhc2UgMDoKLQkJCQlpZiAoKGljX215YWRkciA9IGluX2F0b24oaXApKSA9PSBJTkFERFJfQU5ZKQotCQkJCQlpY19teWFkZHIgPSBOT05FOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCWlmICgoaWNfc2VydmFkZHIgPSBpbl9hdG9uKGlwKSkgPT0gSU5BRERSX0FOWSkKLQkJCQkJaWNfc2VydmFkZHIgPSBOT05FOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWlmICgoaWNfZ2F0ZXdheSA9IGluX2F0b24oaXApKSA9PSBJTkFERFJfQU5ZKQotCQkJCQlpY19nYXRld2F5ID0gTk9ORTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlpZiAoKGljX25ldG1hc2sgPSBpbl9hdG9uKGlwKSkgPT0gSU5BRERSX0FOWSkKLQkJCQkJaWNfbmV0bWFzayA9IE5PTkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJaWYgKChkcCA9IHN0cmNocihpcCwgJy4nKSkpIHsKLQkJCQkJKmRwKysgPSAnXDAnOwotCQkJCQlzdHJsY3B5KHV0c25hbWUoKS0+ZG9tYWlubmFtZSwgZHAsCi0JCQkJCQlzaXplb2YodXRzbmFtZSgpLT5kb21haW5uYW1lKSk7Ci0JCQkJfQotCQkJCXN0cmxjcHkodXRzbmFtZSgpLT5ub2RlbmFtZSwgaXAsCi0JCQkJCXNpemVvZih1dHNuYW1lKCktPm5vZGVuYW1lKSk7Ci0JCQkJaWNfaG9zdF9uYW1lX3NldCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDU6Ci0JCQkJc3RybGNweSh1c2VyX2Rldl9uYW1lLCBpcCwgc2l6ZW9mKHVzZXJfZGV2X25hbWUpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQlpY19wcm90b19uYW1lKGlwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpcCA9IGNwOwotCQludW0rKzsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbmZzYWRkcnNfY29uZmlnX3NldHVwKGNoYXIgKmFkZHJzKQotewotCXJldHVybiBpcF9hdXRvX2NvbmZpZ19zZXR1cChhZGRycyk7Ci19Ci0KLV9fc2V0dXAoImlwPSIsIGlwX2F1dG9fY29uZmlnX3NldHVwKTsKLV9fc2V0dXAoIm5mc2FkZHJzPSIsIG5mc2FkZHJzX2NvbmZpZ19zZXR1cCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQppbmRleCAwNmMxYTM3Li5hZDU0M2E1IDEwMDY0NAotLS0gYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisrKyBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKQEAgLTEyMCw2ICsxMjAsMTEgQEAKICMgJChRKSQoTUFLRSkgJChidWlsZCk9ZGlyCiBidWlsZCA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmoKIAorIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIC1mIHNjcmlwdHMvS2J1aWxkLmtsaWJjIG9iaj0KKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoa2xpYmMpPWRpcgora2xpYmMgOj0gLWYgJChzcmN0cmVlKS9zY3JpcHRzL0tidWlsZC5rbGliYyBvYmoKKwogIyBQcmVmaXggLUkgd2l0aCAkKHNyY3RyZWUpIGlmIGl0IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLgogYWRkdHJlZSA9ICQoaWYgJChmaWx0ZXItb3V0IC1JLyUsJCgxKSksJChwYXRzdWJzdCAtSSUsLUkkKHNyY3RyZWUpLyUsJCgxKSkpICQoMSkKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9LYnVpbGQua2xpYmMgYi9zY3JpcHRzL0tidWlsZC5rbGliYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdiOWJkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9LYnVpbGQua2xpYmMKQEAgLTAsMCArMSw0MTggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgU3VwcG9ydCBmb3IgYnVpbGRpbmcga2xpYmMgcHJvZ3JhbXMgYW5kIGtsaWJjIGxpYnJhcnkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgVG8gY3JlYXRlIGEga2J1aWxkIGZpbGUgZm9yIGEgdXNlcnNwYWNlIHByb2dyYW0gZG8gdGhlIGZvbGxvd2luZzoKKyMKKyMgS2J1aWxkOgorIworIyBzdGF0aWMteSA6PSBjYXQKKyMgIyBUaGlzIHdpbGwgY29tcGlsZSBhIGZpbGUgbmFtZWQgY2F0LmMgLT4gdGhlIGV4ZWN1dGFibGUgJ2NhdCcKKyMgIyBUaGUgZXhlY3V0YWJsZSB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisjCisjIHNoYXJlZC15IDo9IGNhdHMKKyMgIyBUaGlzIHdpbGwgY29tcGlsZSBhIGZpbGUgbmFtZWQgY2F0cy5jIC0+IHRoZSBleGVjdXRhYmxlICdjYXRzJworIyAjIFRoZSBleGVjdXRhYmxlIHdpbGwgYmUgbGlua2VkIHNoYXJlZAorIworIyBJZiB0aGUgdXNlcnNwYWNlIHByb2dyYW0gY29uc2lzdCBvZiBjb21wb3NpdGUgZmlsZXMgZG8gdGhlIGZvbGxvd2luZzoKKyMgS2J1aWxkOgorIworIyBzdGF0aWMteSA6PSBraW5pdAorIyBraW5pdC15ICA6PSBtYWluLm8gbmV0ZGV2LmMKKyMgU28ga2luaXQgd2lsbCBiZSBsaW5rZWQgc3RhdGljYWxseSB1c2luZyB0aGUgdHdvIC5vIGZpbGVzCisjIHNwZWNpZmllZCB3aXRoIGtpbml0LXkuCisjCisjIEFyZSBwYXJ0IG9mIHRoZSBwcm9ncmFtIGxvY2F0ZWQgaW4gYSBzdWItZGlyZWN0b3J5IGRvIGxpa2UgdGhpczoKKyMga2luaXQteSArPSBpcGNvbmZpZy8KKyMKKyMgQW5kIGluIHRoZSBzdWJkaXJlY3Rvcnk6CisjIGlwY29uZmlnL0tidWlsZDoKKyMgbGliLXkgOj0gcGFja2V0Lm8gZGhjcF9wcm90by5vCisjICMgQWxsIC5vIGZpbGVzIGxpc3RlZCB3aXRoIGxpYi15IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBzaW5nbGUgLmEgZmlsZS4KKyMgIyBUaGUgLmEgZmlsZSBpcyBjcmVhdGVkIGJlZm9yZSBhbnkgc3ViZGlyZWN0b3JpZXMgYXJlIHZpc2l0ZWQgc28gaXQKKyMgIyBtYXkgYmUgdXNlZCBpbiB0aGUgc3ViLWRpcmVjdG9yeSBwcm9ncmFtcy4KKyMKKyMjIyMjCisjIEZvciBhIGtsaWJjIGxpYmFyeSBmaWxlIGRvIGxpa2UgdGhpcworIyBrbGliYy9LYnVpbGQKKyMga2xpYi15IDo9IGVycm9yLm8gcGlwZS5vIHpsaWIvCisjCisjIyMjIworIyBIYW5kbGluZyBvZiBjb21waWxlci9saW5rZXIgb3B0aW9ucworIworIyBUbyBzZXQgZGlyZWN0b3J5IHdpZGUgQ0ZMQUdTIHVzZToKKyMgRVhUUkFfS0xJQkNDRkxBR1MgOj0gLURERUJVRworIyBUbyBzZXQgZGlyZWN0b3J5IHdpZGUgQUZMQUdTIHVzZToKKyMgRVhUUkFfS0xJQkNBRkxBR1MgOj0gLURERUJVRworIworIyBUbyBzZXQgdGFyZ2V0IHNwZWNpZmljIENGTEFHUyAoZm9yIC5jIGZpbGVzKSB1c2UKKyMgS0xJQkNDRkxBR1MtbWFpbi5vIDo9IC1EREVCVUc9MworIyBUbyBzZXQgdGFyZ2V0IHNwZWNpZmljIEFGTEFHUyAoZm9yIC5zIGZpbGVzKSB1c2UKKyMgS0xJQkNBRkxBR1MtbWFpbi5vIDo9IC1EREVCVUc9MworCitzcmMgOj0gJChvYmopCisjIFByZXNldCB0YXJnZXQgYW5kIG1ha2Ugc3VyZSBpdCBpcyBhICc6PScgdmFyaWFibGUKK3RhcmdldHMgOj0KKworLnBob255OiBfX2J1aWxkCitfX2J1aWxkOgorCisjIFJlYWQgLmNvbmZpZyBpZiBpdCBleGlzdCwgb3RoZXJ3aXNlIGlnbm9yZQorLWluY2x1ZGUgLmNvbmZpZworCisjIEdlbmVyaWMgS2J1aWxkIHJvdXRpbmVzCitpbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorCisjIERlZmluZXMgdXNlZCB3aGVuIGNvbXBpbGluZyBlYXJseSB1c2Vyc3BhY2UgKGtsaWJjIHByb2dyYW1zKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworS0xJQkNSRVFGTEFHUyAgICAgOj0gJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IsICkKK0tMSUJDQVJDSFJFUUZMQUdTIDo9CitLTElCQ09QVEZMQUdTICAgICA6PQorS0xJQkNXQVJORkxBR1MgICAgOj0gLVcgLVdhbGwgLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtcGFyYW1ldGVyCitLTElCQ1NIQVJFREZMQUdTICA6PQorS0xJQkNCSVRTSVpFICAgICAgOj0KK0tMSUJDTERGTEFHUyAgICAgIDo9CitLTElCQ0NGTEFHUyAgICAgICA6PQorCisjIEFyY2ggc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIGtsaWJjCitpbmNsdWRlICQoS0xJQkNTUkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpL01DT05GSUcKKworIyBpbmNsdWRlL2FzbS0qIGFyY2hpdGVjdHVyZQorS0xJQkNBU01BUkNICSAgPz0gJChLTElCQ0FSQ0gpCisKKyMga2xpYmMgdmVyc2lvbgorS0xJQkNNQUpPUiAgICAgICAgOj0gJChzaGVsbCBjdXQgLWQuIC1mMSAkKHNyY3RyZWUpL3Vzci9rbGliYy92ZXJzaW9uKQorS0xJQkNNSU5PUiAgICAgICAgOj0gJChzaGVsbCBjdXQgLWQuIC1mMiAkKHNyY3RyZWUpL3Vzci9rbGliYy92ZXJzaW9uKQorCisjIGJpbnV0aWxzCitLTElCQ0xEICAgICAgICAgIDo9ICQoTEQpCitLTElCQ0NDICAgICAgICAgIDo9ICQoQ0MpCitLTElCQ0FSICAgICAgICAgIDo9ICQoQVIpCitLTElCQ1JBTkxJQiAgICAgIDo9ICQoUkFOTElCKQorS0xJQkNTVFJJUCAgICAgICA6PSAkKFNUUklQKQorS0xJQkNOTSAgICAgICAgICA6PSAkKE5NKQorS0xJQkNPQkpDT1BZCSA6PSAkKE9CSkNPUFkpCitLTElCQ09CSkRVTVAJIDo9ICQoT0JKRFVNUCkKKworIyBrbGliYyBpbmNsdWRlIHBhdGhzCitLTElCQ0NQUEZMQUdTICAgIDo9IC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggaW5jbHVkZSBcCisJCSAgICAtSSQoS0xJQkNJTkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpCVwKKyAgICAgICAgICAgICAgICAgICAgLUkkKEtMSUJDSU5DKS9iaXRzJChLTElCQ0JJVFNJWkUpCVwKKwkJICAgIC1JJChLTElCQ09CSikvLi4vaW5jbHVkZQkJXAorICAgICAgICAgICAgICAgICAgICAtSSQoS0xJQkNJTkMpCisjIGtlcm5lbCBpbmNsdWRlIHBhdGhzCitLTElCQ0tFUk5FTFNSQwkgPz0gJChzcmN0cmVlKS8KK0tMSUJDQ1BQRkxBR1MgICAgKz0gLUkkKEtMSUJDS0VSTkVMU1JDKWluY2x1ZGUJCVwKKyAgICAgICAgICAgICAgICAgICAgICQoaWYgJChLQlVJTERfU1JDKSwtSSQoS0xJQkNLRVJORUxPQkopaW5jbHVkZTIgLUkkKEtMSUJDS0VSTkVMT0JKKWluY2x1ZGUgLUkkKHNyY3RyZWUpL2luY2x1ZGUpICAgIFwKKwkJICAgICAkKEtMSUJDQVJDSElOQ0ZMQUdTKQorCisjIGtsaWJjIGRlZmluaXRpb25zCitLTElCQ0RFRlMgICAgICAgICs9IC1EX19LTElCQ19fPSQoS0xJQkNNQUpPUikgICAgICAgICAgXAorCQkgICAgLURfX0tMSUJDX01JTk9SX189JChLTElCQ01JTk9SKSAgICBcCisJCSAgICAtRF9CSVRTSVpFPSQoS0xJQkNCSVRTSVpFKQorS0xJQkNDUFBGTEFHUyAgICArPSAkKEtMSUJDREVGUykKK0tMSUJDQ0ZMQUdTICAgICAgKz0gJChLTElCQ0NQUEZMQUdTKSAkKEtMSUJDUkVRRkxBR1MpICQoS0xJQkNBUkNIUkVRRkxBR1MpICBcCisgICAgICAgICAgICAgICAgICAgICQoS0xJQkNPUFRGTEFHUykgJChLTElCQ1dBUk5GTEFHUykKK0tMSUJDQUZMQUdTICAgICAgKz0gLURfX0FTU0VNQkxZX18gJChLTElCQ0NGTEFHUykKK0tMSUJDU1RSSVBGTEFHUyAgKz0gLS1zdHJpcC1hbGwgLVIgLmNvbW1lbnQgLVIgLm5vdGUKKworS0xJQkNMSUJHQ0NfREVGICA6PSAkKHNoZWxsICQoS0xJQkNDQykgJChLTElCQ0NGTEFHUykgLS1wcmludC1saWJnY2MpCitLTElCQ0xJQkdDQwkgPz0gJChLTElCQ0xJQkdDQ19ERUYpCitLTElCQ0NSVDAgICAgICAgIDo9ICQoS0xJQkNPQkopL2FyY2gvJChLTElCQ0FSQ0hESVIpL2NydDAubworS0xJQkNMSUJDICAgICAgICA6PSAkKEtMSUJDT0JKKS9saWJjLmEKK0tMSUJDQ1JUU0hBUkVEICAgOj0gJChLTElCQ09CSikvaW50ZXJwLm8KK0tMSUJDTElCQ1NIQVJFRCAgOj0gJChLTElCQ09CSikvbGliYy5zbworIyBIb3cgdG8gdGVsbCB0aGUgbGlua2VyIG1haW4oKSBpcyB0aGUgZW50cnlwb2ludAorS0xJQkNFTUFJTgkgPz0gLWUgbWFpbgorCisjCisjIFRoaXMgaW5kaWNhdGVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmluYWwgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisjIFRISVMgTVVTVCBCRSBBTiBBQlNPTFVURSBQQVRIIFdJVEggTk8gRklOQUwgU0xBU0guCisjIExlYXZlIHRoaXMgZW1wdHkgdG8gbWFrZSBpdCB0aGUgcm9vdC4KKyMKK1NITElCRElSID0gL2xpYgorCitleHBvcnQgS0xJQkNMRCBLTElCQ0NDIEtMSUJDQVIgS0xJQkNTVFJJUCBLTElCQ05NCitleHBvcnQgS0xJQkNDRkxBR1MgS0xJQkNBRkxBR1MgS0xJQkNMSUJHQ0MgS0xJQkNTSEFSRURGTEFHUyBLTElCQ1NUUklQRkxBR1MKK2V4cG9ydCBLTElCQ0NSVDAgS0xJQkNMSUJDIFNITElCRElSCisKKyMga2VybmVsIGNvbmZpZ3VyYXRpb24KK2luY2x1ZGUgLmNvbmZpZworCisjIEFkZCAkKG9iaikvIGZvciBwYXRocyB0aGF0IGlzIG5vdCBhYnNvbHV0ZQorb2JqZWN0aWZ5ID0gJChmb3JlYWNoIG8sJCgxKSwkKGlmICQoZmlsdGVyIC8lLCQobykpLCQobyksJChvYmopLyQobykpKQorCisjIEtidWlsZCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBpcyBiZWluZyBidWlsZAoraW5jbHVkZSAkKG9iaikvS2J1aWxkCisKKyMjIyMjCisjIHN0YXRpYy15ICsgc2hhcmVkLXkgaGFuZGxpbmcKK2twcm9ncyA6PSAkKHN0YXRpYy15KSAkKHNoYXJlZC15KQorIyBrcHJvZ3MgYmFzZWQgb24gYSBzaW5nbGUgLm8gZmlsZSAod2l0aCBzYW1lIG5hbWUgKyAubykKK2twcm9nLW9ianMgOj0gJChmb3JlYWNoIHAsICQoa3Byb2dzKSwgJChpZiAkKCQocCkteSksLCQocCkpKQora3Byb2ctb2JqcyA6PSAkKGFkZHN1ZmZpeCAubywgJChrcHJvZy1vYmpzKSkKKyMga3Byb2dzIHdoaWNoIGlzIGJhc2VkIG9uIHNldmVyYWwgLm8gZmlsZXMKK2twcm9nLW11bHRpIDo9ICQoZm9yZWFjaCBwLCAkKGtwcm9ncyksICQoaWYgJCgkKHApLXkpLCQocCkpKQorIyBvYmplY3RzIHVzZWQgZm9yIGtwcm9ncyB3aXRoIG1vcmUgdGhlbiBvbmUgLm8gZmlsZQora3Byb2ctb2JqcyArPSAkKGZvcmVhY2ggcCwgJChrcHJvZy1tdWx0aSksICQoJChwKS15KSkKKyMgb2JqZWN0cyBidWlsZCBpbiB0aGlzIGRpcgora3Byb2ctcmVhbC1vYmpzIDo9ICQocGF0c3Vic3QgJS8sLCQoa3Byb2ctb2JqcykpCisjIERpcmVjdG9yaWVzIHdlIG5lZWQgdG8gdmlzaXQgYmVmb3JlIGtwcm9ncy1vYmpzIGFyZSB1cC10by1kYXRlCitrcHJvZy1kaXJzIDo9ICAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQoa3Byb2ctb2JqcykpKQorIyByZXBsYWNlIGFsbCBkaXIvIHdpdGggZGlyL2xpYi5hCitrcHJvZy1vYmpzIDo9ICQocGF0c3Vic3QgJS8sICUvbGliLmEsICQoa3Byb2ctb2JqcykpCisKK3RhcmdldHMgKz0gJChzdGF0aWMteSkgJChzaGFyZWQteSkKKworIyMjIyMKKyMga2xpYi15IGhhbmRsaW5nCisjIC5vIGZpbGVzIHRvIGJ1aWxkIGluIHRoaXMgZGlyCitrbGliLXJlYWwtb2JqcyA6PSAkKHBhdHN1YnN0ICUvLCwkKGtsaWIteSkpCisjIERpcmVjdG9yaWVzIHdlIG5lZWQgdG8gdmlzaXQgYmVmb3JlIGxpYnMgYXJlIHVwLXRvLWRhdGUKK2tsaWItZGlycyA6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQoa2xpYi15KSkpCisjIHJlcGxhY2UgYWxsIGRpci8gd2l0aCBkaXIva2xpYi5saXN0CitrbGliLW9ianMgOj0gJChwYXRzdWJzdCAlLywgJS9rbGliLmxpc3QsICQoa2xpYi15KSkKKworIyAkKG91dHB1dC1kaXJzKSBhcmUgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBvYmplY3QgZmlsZXMKK291dHB1dC1kaXJzIDo9ICQoZGlyICQoa3Byb2ctZGlycykgJChrcHJvZy1vYmpzKSkKK291dHB1dC1kaXJzICs9ICQoZm9yZWFjaCBmLCAkKGhvc3Rwcm9ncy15KSAkKHRhcmdldHMpLCBcCisgICAgICAgICAgICAgICAkKGlmICQoZGlyICQoZikpLCAkKGRpciAkKGYpKSkpCitvdXRwdXQtZGlycyArPSAkKGRpciAkKGtsaWItb2JqcykpCitvdXRwdXQtZGlycyA6PSAkKHN0cmlwICQoc29ydCAkKGZpbHRlci1vdXQgLi8sJChvdXRwdXQtZGlycykpKSkKKworIyBwcmVmaXggc28gd2UgZ2V0IGZ1bGwgZGlyCitzdGF0aWMteSAgICAgICAgOj0gJChhZGRwcmVmaXggJChvYmopLywkKHN0YXRpYy15KSkKK3NoYXJlZC15ICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc2hhcmVkLXkpKQora3Byb2ctb2JqcyAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrcHJvZy1vYmpzKSkKK2twcm9nLXJlYWwtb2JqcyA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoa3Byb2ctcmVhbC1vYmpzKSkKK291dHB1dC1kaXJzICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob3V0cHV0LWRpcnMpKQora3Byb2ctZGlycyAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrcHJvZy1kaXJzKSkKK3N1YmRpci15ICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXkpKQorYWx3YXlzICAgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChhbHdheXMpKQordGFyZ2V0cyAgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJCh0YXJnZXRzKSkKK2xpYi15ICAgICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQobGliLXkpKQora2xpYi15ICAgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrbGliLXkpKQora2xpYi1vYmpzICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrbGliLW9ianMpKQora2xpYi1yZWFsLW9ianMgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrbGliLXJlYWwtb2JqcykpCitrbGliLWRpcnMgICAgICAgOj0gJChhZGRwcmVmaXggJChvYmopLywkKGtsaWItZGlycykpCisKKyMjIyMjCisjIEhhbmRsZSBvcHRpb25zIHRvIGdjYy4gU3VwcG9ydCBidWlsZGluZyB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKKworX19rbGliY2NmbGFncyAgICA9ICQoS0xJQkNDRkxBR1MpICQoRVhUUkFfS0xJQkNDRkxBR1MpICQoS0xJQkNDRkxBR1NfJCgqRikubykKK19fa2xpYmNhZmxhZ3MgICAgPSAkKEtMSUJDQUZMQUdTKSAkKEVYVFJBX0tMSUJDQUZMQUdTKSAkKEtMSUJDQUZMQUdTXyQoKkYpLm8pCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorX2tsaWJjY2ZsYWdzICAgID0gJChfX2tsaWJjY2ZsYWdzKQorX2tsaWJjYWZsYWdzICAgID0gJChfX2tsaWJjYWZsYWdzKQorZWxzZQorX2tsaWJjY2ZsYWdzICAgID0gJChjYWxsIGZsYWdzLF9fa2xpYmNjZmxhZ3MpCitfa2xpYmNhZmxhZ3MgICAgPSAkKGNhbGwgZmxhZ3MsX19rbGliY2FmbGFncykKK2VuZGlmCisKK2tsaWJjY2ZsYWdzICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKF9rbGliY2NmbGFncykKK2tsaWJjYWZsYWdzICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKF9rbGliY2FmbGFncykKKworIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBpZiBub3QgYWxyZWFkeSBwcmVzZW50CitfZHVtbXkgOj0gJChzaGVsbCBbIC1kICQob2JqKSBdIHx8IG1rZGlyIC1wICQob2JqKSkKKworIyBDcmVhdGUgZGlyZWN0b3JpZXMgZm9yIG9iamVjdCBmaWxlcyBpZiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyMgTmVlZGVkIHdoZW4gbGliLXkgOj0gZGlyL2ZpbGUubyBzeW50YXggaXMgdXNlZAorX2R1bW15IDo9ICQoZm9yZWFjaCBkLCQob3V0cHV0LWRpcnMpLCAkKHNoZWxsIFsgLWQgJChkKSBdIHx8IG1rZGlyIC1wICQoZCkpKQorCisjIERvIHdlIGhhdmUgdG8gbWFrZSBhIGxpYi5hIGluIHRoaXMgZGlyPworaWZuZXEgKCQoc3RyaXAgJChsaWIteSkgJChsaWItbikgJChsaWItKSksKQorbGliLXRhcmdldCA6PSAkKG9iaikvbGliLmEKK2VuZGlmCisKK19fYnVpbGQ6ICQoc3ViZGlyLXkpICQobGliLXRhcmdldCkgJChhbHdheXMpCisJJChRKToKKworIyBDb21waWxlIEMgc291cmNlcyAoLmMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitxdWlldF9jbWRfY2Nfc19jID0gS0xJQkNDQyAkQAorICAgICAgY21kX2NjX3NfYyA9ICQoS0xJQkNDQykgJChrbGliY2NmbGFncykgLVMgLW8gJEAgJDwKKworJS5zOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfc19jKQorCitxdWlldF9jbWRfY2Nfb19jID0gS0xJQkNDQyAkQAorICAgICAgY21kX2NjX29fYyA9ICQoS0xJQkNDQykgJChrbGliY2NmbGFncykgLWMgLW8gJEAgJDwKKworJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfb19jKQorCitxdWlldF9jbWRfY2NfaV9jID0gQ1BQICAgICAkQAorICAgICAgY21kX2NjX2lfYyA9ICQoS0xJQkNDQykgLUUgJChrbGliY2NmbGFncykgLW8gJEAgJDwKKyUuaTogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX2lfYykKKworIyBDb21waWxlIGFzc2VtYmxlciBzb3VyY2VzICguUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3F1aWV0X2NtZF9hc19vX1MgPSBLTElCQ0FTICRACisgICAgICBjbWRfYXNfb19TID0gJChLTElCQ0NDKSAkKGtsaWJjYWZsYWdzKSAtYyAtbyAkQCAkPAorCislLm86ICUuUyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxhc19vX1MpCisKK3RhcmdldHMgKz0gJChyZWFsLW9ianMteSkKKworIworIyBSdWxlIHRvIGNvbXBpbGUgYSBzZXQgb2YgLm8gZmlsZXMgaW50byBvbmUgLm8gZmlsZQorIworaWZkZWYgbGliLXRhcmdldAorcXVpZXRfY21kX2xpbmtfb190YXJnZXQgPSBMRCAgICAgICRACisjIElmIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gbGluayBpcyBlbXB0eSwganVzdCBjcmVhdGUgYW4gZW1wdHkgbGliLmEKK2NtZF9saW5rX29fdGFyZ2V0ID0gJChpZiAkKHN0cmlwICQobGliLXkpKSxcCisgICAgICAgICAgICAgICAgICAgIHJtIC1mICRAOyAkKEtMSUJDQVIpIGNydSAkQCAkKGZpbHRlciAkKGxpYi15KSwgJF4pLFwKKyAgICAgICAgICAgICAgICAgICAgcm0gLWYgJEA7ICQoS0xJQkNBUikgY3JzICRAKQorCiskKGxpYi10YXJnZXQpOiAkKGxpYi15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfb190YXJnZXQpCit0YXJnZXRzICs9ICQobGliLXRhcmdldCkgJChsaWIteSkKK2VuZGlmICMgbGliLXRhcmdldAorCisjCisjIENyZWF0ZSBrbGliLmxpc3QKKyMKKyMgRG8gd2UgaGF2ZSB0byBjcmVhdGUgYSBrbGliYyBsaWJyYXJ5IGZpbGUgaW4gdGhpcyBkaXI/CitpZm5lcSAoJChzdHJpcCAkKGtsaWIteSkgJChrbGliLW4pICQoa2xpYi0pKSwpCitrbGliLXRhcmdldCA6PSAkKG9iaikva2xpYi5saXN0CitlbmRpZgorCitpZmRlZiBrbGliLXRhcmdldAorIyBpbmNsdWRlIHRoaXMgaW4gYnVpbGQKK19fYnVpbGQ6ICQoa2xpYi10YXJnZXQpICQoa2xpYi1kaXJzKQorCisjIGRlc2NlbmQgaWYgbmVlZGVkCiskKHNvcnQgJChhZGRzdWZmaXggL2tsaWIubGlzdCwkKGtsaWItZGlycykpKTogJChrbGliLWRpcnMpIDsKKworIyBjcmVhdGUga2xpYi5saXN0CitxdWlldF9jbWRfa2xpYi1saXN0ID0gTElTVCAgICAkQAorICAgICAgY21kX2tsaWItbGlzdCA9IGVjaG8gJChrbGliLXJlYWwtb2JqcykgPiAkQAorJChrbGliLXRhcmdldCk6ICQoa2xpYi1vYmpzKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGtsaWItbGlzdCkKK3RhcmdldHMgKz0gJChrbGliLXRhcmdldCkgJChrbGliLXJlYWwtb2JqcykKK2VuZGlmICMga2xpYi10YXJnZXQKKworaWZkZWYga3Byb2dzCisjIENvbXBpbGUga2xpYmMtcHJvZ3JhbXMgZm9yIHRoZSB0YXJnZXQKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK19fYnVpbGQgOiAkKGtwcm9nLWRpcnMpICQoc3RhdGljLXkpICQoc2hhcmVkLXkpCisKKyMgRGVzY2VuZCBpZiBuZWVkZWQKKyQoc29ydCAkKGFkZHN1ZmZpeCAvbGliLmEsJChrcHJvZy1kaXJzKSkpOiAkKGtwcm9nLWRpcnMpIDsKKworIyBEZWZpbmUgZGVwZW5kZW5jaWVzIGZvciBsaW5rIG9mIHByb2dzCisjIEZvciB0aGUgc2ltcGxlIHByb2dyYW06CisjCWZpbGUubyA9PiBmaWxlCisjIEEgcHJvZ3JhbSB3aXRoIG11bHRpcGxlIG9iamVjdHMKKyMJZmlsZWEubywgZmlsZWIubyA9PiBmaWxlCisjIEEgcHJvZ3JhbSB3aXRoIC5vIGZpbGVzIGluIGFub3RoZXIgZGlyCisjCWRpci9saWIuYSBmaWxlYS5vID0+IGZpbGUKKworc3RyaXBvYmogID0gJChzdWJzdCAkKG9iaikvLCwkQCkKK2FkZGxpYmEgICA9ICQoYWRkcHJlZml4ICQob2JqKS8sICQocGF0c3Vic3QgJS8sICUvbGliLmEsICQoMSkpKQorbGluay1kZXBzID0gJChpZiAkKCQoc3RyaXBvYmopLXkpLCAkKGNhbGwgYWRkbGliYSwgJCgkKHN0cmlwb2JqKS15KSksICRALm8pIFwKKwkgICAgJChjYWxsIG9iamVjdGlmeSwkKCQoc3RyaXBvYmopLWxpYikpCisKK3F1aWV0X2NtZF9sZC1zdGF0aWMgPSBLTElCQ0xEICRACisgICAgICBjbWRfbGQtc3RhdGljID0gJChLTElCQ0xEKSAkKEtMSUJDTERGTEFHUykgLW8gJEAJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgJChFWFRSQV9LTElCQ0xERkxBR1MpCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDQ1JUMCkJCQkJXAorCQkgICAgICAgLS1zdGFydC1ncm91cAkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICQobGluay1kZXBzKQkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNMSUJDKQkJCQlcCisJCSAgICAgICAkKEtMSUJDTElCR0NDKQkJCQlcCisJCSAgICAgICAtLWVuZC1ncm91cCA7CQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICBjcCAtZiAkQCAkQC5nIDsJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNTVFJJUCkgJChLTElCQ1NUUklQRkxBR1MpICRACisKKworJChzdGF0aWMteSk6ICQoa3Byb2ctb2JqcykgJChsaWItdGFyZ2V0KSAkKEtMSUJDQ1JUMCkgJChLTElCQ0xJQkMpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGQtc3RhdGljKQorCitxdWlldF9jbWRfbGQtc2hhcmVkID0gS0xJQkNMRCAkQAorICAgICAgY21kX2xkLXNoYXJlZCA9ICQoS0xJQkNMRCkgJChLTElCQ0xERkxBR1MpIC1vICRACQlcCisgICAgICAgICAgICAgICAgICAgICAgICQoRVhUUkFfS0xJQkNMREZMQUdTKQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ0VNQUlOKSAkKEtMSUJDQ1JUU0hBUkVEKQkJXAorICAgICAgICAgICAgICAgICAgICAgICAtLXN0YXJ0LWdyb3VwCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgJChsaW5rLWRlcHMpCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgLVIgJChLTElCQ0xJQkNTSEFSRUQpCQkJXAorCSAgICAgICAgICAgICAgICQoS0xJQkNMSUJHQ0MpCQkJCVwKKwkJICAgICAgIC0tZW5kLWdyb3VwIDsJCQkJXAorICAgICAgICAgICAgICAgICAgICAgIGNwIC1mICRAICRALmcgOwkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ1NUUklQKSAkKEtMSUJDU1RSSVBGTEFHUykgJEAKKworCiskKHNoYXJlZC15KTogJChrcHJvZy1vYmpzKSAkKGxpYi10YXJnZXQpICQoS0xJQkNDUlRTSEFSRUQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ0xJQkNTSEFSRUQpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGQtc2hhcmVkKQorCisjIERvIG5vdCB0cnkgdG8gYnVpbGQgS0xJQkMgbGliYXJpZXMgaWYgd2UgYXJlIGJ1aWxkaW5nIGtsaWJjCitpZmVxICgkKGtsaWJjLWJ1aWxkKSwpCiskKEtMSUJDQ1JUMCkgJChLTElCQ0xJQkMpOiA7CiskKEtMSUJDQ1JUU0hBUkVEKSAkKEtMSUJDTElCQ1NIQVJFRCk6IDsKK2VuZGlmCisKK3RhcmdldHMgKz0gJChrcHJvZy1yZWFsLW9ianMpCitlbmRpZgorCisjIENvbXBpbGUgcHJvZ3JhbXMgb24gdGhlIGhvc3QKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpZmRlZiBob3N0cHJvZ3MteQoraW5jbHVkZSAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUuaG9zdAorZW5kaWYKKworIyBEZXNjZW5kaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuUEhPTlk6ICQoc3ViZGlyLXkpICQoa3Byb2ctZGlycykgJChrbGliLWRpcnMpCiskKHNvcnQgJChzdWJkaXIteSkgJChrcHJvZy1kaXJzKSAkKGtsaWItZGlycykpOiAkKGxpYi10YXJnZXQpCisJJChRKSQoTUFLRSkgJChrbGliYyk9JEAKKworIyBBZGQgRk9SQ0UgdG8gdGhlIHByZXF1aXNpdGVzIG9mIGEgdGFyZ2V0IHRvIGZvcmNlIGl0IHRvIGJlIGFsd2F5cyByZWJ1aWx0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiBGT1JDRQorCitGT1JDRToKKworIyBMaW5raW5nCisjIENyZWF0ZSBhIHJlbG9jdGFibGUgY29tcG9zaXRlIG9iamVjdCBmaWxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcXVpZXRfY21kX2tsaWJjbGQgPSBLTElCQ0xEICRACisgICAgICBjbWRfa2xpYmNsZCA9ICQoS0xJQkNMRCkgLXIgJChLTElCQ0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChFWFRSQV9LTElCQ0xERkxBR1MpICQoS0xJQkNMREZMQUdTXyQoQEYpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyLW91dCBGT1JDRSwkXikgLW8gJEAKKworCisjIExpbmsgdGFyZ2V0IHRvIGEgbmV3IG5hbWUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitxdWlldF9jbWRfbG4gPSBMTiAgICAgICRACisgICAgICBjbWRfbG4gPSBybSAtZiAkQCAmJiBsbiAkPCAkQAorCisjIFN0cmlwIHRhcmdldCAocmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgaW5mbykKK3F1aWV0X2NtZF9zdHJpcCA9IFNUUklQICAgJEAKKyAgICAgIGNtZF9zdHJpcCA9ICQoS0xJQkNTVFJJUCkgJChLTElCQ1NUUklQRkxBR1MpICQ8IC1vICRACisKKworIyBSZWFkIGFsbCBzYXZlZCBjb21tYW5kIGxpbmVzIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSAkKHRhcmdldHMpIHdlCisjIG1heSBiZSBidWlsZGluZyBhYm92ZSwgdXNpbmcgJChpZl9jaGFuZ2VkeyxfZGVwfSkuIEFzIGFuCisjIG9wdGltaXphdGlvbiwgd2UgZG9uJ3QgbmVlZCB0byByZWFkIHRoZW0gaWYgdGhlIHRhcmdldCBkb2VzIG5vdAorIyBleGlzdCwgd2Ugd2lsbCByZWJ1aWxkIGFueXdheSBpbiB0aGF0IGNhc2UuCit0YXJnZXRzIDo9ICQod2lsZGNhcmQgJChzb3J0ICQodGFyZ2V0cykpKQorY21kX2ZpbGVzIDo9ICQod2lsZGNhcmQgJChmb3JlYWNoIGYsJCh0YXJnZXRzKSwkKGRpciAkKGYpKS4kKG5vdGRpciAkKGYpKS5jbWQpKQorCitpZm5lcSAoJChjbWRfZmlsZXMpLCkKKyAgaW5jbHVkZSAkKGNtZF9maWxlcykKK2VuZGlmCisKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSAtZiBzY3JpcHRzL0tidWlsZC5rbGliYyBvYmoKKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoa2xpYmMpPWRpcgora2xpYmMgOj0gLXJSIC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL0tidWlsZC5rbGliYyBvYmoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4gYi9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCmluZGV4IGNmZjMzNDkuLjJkODQyMjIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbgpAQCAtMTksMjMgKzE5LDE4IEBACiAjIEZpZ3VyZSBvdXQgd2hhdCB3ZSBuZWVkIHRvIGJ1aWxkIGZyb20gdGhlIHZhcmlvdXMgdmFyaWFibGVzCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLV9fc3ViZGlyLXkJOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai15KSkpCi1zdWJkaXIteQkrPSAkKF9fc3ViZGlyLXkpCi1fX3N1YmRpci1tCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbSkpKQotc3ViZGlyLW0JKz0gJChfX3N1YmRpci1tKQotX19zdWJkaXItbgk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLW4pKSkKLXN1YmRpci1uCSs9ICQoX19zdWJkaXItbikKLV9fc3ViZGlyLQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLSkpKQotc3ViZGlyLQkJKz0gJChfX3N1YmRpci0pCitzdWJkaXJzIDo9ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pICQoc3ViZGlyLW4pICQoc3ViZGlyLSkKK3N1YmRpcnMgKz0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai15KSkpCitzdWJkaXJzICs9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbSkpKQorc3ViZGlycyArPSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLW4pKSkKK3N1YmRpcnMgKz0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai0pKSkKKworc3ViZGlycyArPSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQoa2xpYi15KSkpCitzdWJkaXJzICs9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChrbGliLSkpKQogCiAjIFN1YmRpcmVjdG9yaWVzIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvCitzdWJkaXJzIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzb3J0ICQoc3ViZGlycykpKQogCi1zdWJkaXIteW0JOj0gJChzb3J0ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pKQotc3ViZGlyLXltbiAgICAgIDo9ICQoc29ydCAkKHN1YmRpci15bSkgJChzdWJkaXItbikgJChzdWJkaXItKSkKLQotIyBBZGQgc3ViZGlyIHBhdGgKLQotc3ViZGlyLXltbgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltbikpCiAKICMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxlYXRpdmUgdG8gdGhlIGN1cnJlbnQKICMgZGlyZWN0b3J5CkBAIC00Myw3ICszOCw4IEBACiBfX2NsZWFuLWZpbGVzCTo9ICQoZXh0cmEteSkgJChFWFRSQV9UQVJHRVRTKSAkKGFsd2F5cykgXAogCQkgICAkKHRhcmdldHMpICQoY2xlYW4tZmlsZXMpICAgICAgICAgICAgIFwKIAkJICAgJChob3N0LXByb2dzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICQoaG9zdHByb2dzLXkpICQoaG9zdHByb2dzLW0pICQoaG9zdHByb2dzLSkKKwkJICAgJChob3N0cHJvZ3MteSkgJChob3N0cHJvZ3MtbSkgJChob3N0cHJvZ3MtKSBcCisJCSAgIGtsaWIubGlzdAogCiAjIGFzIGNsZWFuLWZpbGVzIGlzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhpcyBhZGRzCiAjIGEgJChvYmopIHByZWZpeCwgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocwpAQCAtNjcsNyArNjMsNyBAQAogICAgICAgY21kX2NsZWFuZGlyID0gcm0gLXJmICQoX19jbGVhbi1kaXJzKQogCiAKLV9fY2xlYW46ICQoc3ViZGlyLXltbikKK19fY2xlYW46ICQoc3ViZGlycykKIGlmbmVxICgkKHN0cmlwICQoX19jbGVhbi1maWxlcykpLCkKIAkrJChjYWxsIGNtZCxjbGVhbikKIGVuZGlmCkBAIC04Nyw4ICs4Myw4IEBACiAjIERlc2NlbmRpbmcKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVBIT05ZICs9ICQoc3ViZGlyLXltbikKLSQoc3ViZGlyLXltbik6CisuUEhPTlk6ICQoc3ViZGlycykKKyQoc3ViZGlycyk6CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JEAKIAogIyBJZiBxdWlldCBpcyBzZXQsIG9ubHkgcHJpbnQgc2hvcnQgdmVyc2lvbiBvZiBjb21tYW5kCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaCBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCmluZGV4IDY4M2ViMTIuLmQyNWIzOGYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCisrKyBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCkBAIC0xNSw3ICsxNSw3IEBACiB1c2FnZSgpIHsKIGNhdCA8PCBFT0YKIFVzYWdlOgotJDAgWy1vIDxmaWxlPl0gWy11IDx1aWQ+XSBbLWcgPGdpZD5dIHstZCB8IDxjcGlvX3NvdXJjZT59IC4uLgorJDAgWy1vIDxmaWxlPl0gWy11IDx1aWQ+XSBbLWcgPGdpZD5dIDxjcGlvX3NvdXJjZT4gLi4uCiAJLW8gPGZpbGU+ICAgICAgQ3JlYXRlIGd6aXBwZWQgaW5pdHJhbWZzIGZpbGUgbmFtZWQgPGZpbGU+IHVzaW5nCiAJCSAgICAgICBnZW5faW5pdF9jcGlvIGFuZCBnemlwCiAJLXUgPHVpZD4gICAgICAgVXNlciBJRCB0byBtYXAgdG8gdXNlciBJRCAwIChyb290KS4KQEAgLTI3LDcgKzI3LDYgQEAKIAk8Y3Bpb19zb3VyY2U+ICBGaWxlIGxpc3Qgb3IgZGlyZWN0b3J5IGZvciBjcGlvIGFyY2hpdmUuCiAJCSAgICAgICBJZiA8Y3Bpb19zb3VyY2U+IGlzIGEgLmNwaW8gZmlsZSBpdCB3aWxsIGJlIHVzZWQKIAkJICAgICAgIGFzIGRpcmVjdCBpbnB1dCB0byBpbml0cmFtZnMuCi0JLWQgICAgICAgICAgICAgT3V0cHV0IHRoZSBkZWZhdWx0IGNwaW8gbGlzdC4KIAogQWxsIG9wdGlvbnMgZXhjZXB0IC1vIGFuZCAtbCBtYXkgYmUgcmVwZWF0ZWQgYW5kIGFyZSBpbnRlcnByZXRlZAogc2VxdWVudGlhbGx5IGFuZCBpbW1lZGlhdGVseS4gIC11IGFuZCAtZyBzdGF0ZXMgYXJlIHByZXNlcnZlZCBhY3Jvc3MKQEAgLTM2LDI5ICszNSw2IEBACiBFT0YKIH0KIAotIyBhd2sgc3R5bGUgZmllbGQgYWNjZXNzCi0jICQxIC0gZmllbGQgbnVtYmVyOyByZXN0IGlzIGFyZ3VtZW50IHN0cmluZwotZmllbGQoKSB7Ci0Jc2hpZnQgJDEgOyBlY2hvICQxCi19Ci0KLWxpc3RfZGVmYXVsdF9pbml0cmFtZnMoKSB7Ci0JIyBlY2hvIHVzci9raW5pdC9raW5pdAotCToKLX0KLQotZGVmYXVsdF9pbml0cmFtZnMoKSB7Ci0JY2F0IDw8LUVPRiA+PiAke291dHB1dH0KLQkJIyBUaGlzIGlzIGEgdmVyeSBzaW1wbGUsIGRlZmF1bHQgaW5pdHJhbWZzCi0KLQkJZGlyIC9kZXYgMDc1NSAwIDAKLQkJbm9kIC9kZXYvY29uc29sZSAwNjAwIDAgMCBjIDUgMQotCQlkaXIgL3Jvb3QgMDcwMCAwIDAKLQkJIyBmaWxlIC9raW5pdCB1c3Iva2luaXQva2luaXQgMDc1NSAwIDAKLQkJIyBzbGluayAvaW5pdCBraW5pdCAwNzU1IDAgMAotCUVPRgotfQotCiBmaWxldHlwZSgpIHsKIAlsb2NhbCBhcmd2MT0iJDEiCiAKQEAgLTE2OCw4ICsxNDQsNiBAQAogCiAjIHByb2Nlc3Mgb25lIGRpcmVjdG9yeSAoaW5jbCBzdWItZGlyZWN0b3JpZXMpCiBkaXJfZmlsZWxpc3QoKSB7Ci0JJHtkZXBfbGlzdH1oZWFkZXIgIiQxIgotCiAJc3JjZGlyPSQoZWNobyAiJDEiIHwgc2VkIC1lICdzOi8vKjovOmcnKQogCWRpcmxpc3Q9JChmaW5kICIke3NyY2Rpcn0iIC1wcmludGYgIiVwICVtICVVICVHXG4iKQogCkBAIC0xODgsNyArMTYyLDYgQEAKICMgaWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHRoZW4gYWRkIGFsbCBmaWxlcyBpbiBnaXZlbiBkaXJlY290cnkgdG8gZnMKICMgaWYgYSByZWd1bGFyIGZpbGUgaXMgc3BlY2lmaWVkIGFzc3VtZSBpdCBpcyBpbiBnZW5faW5pdHJhbWZzIGZvcm1hdAogaW5wdXRfZmlsZSgpIHsKLQlzb3VyY2U9IiQxIgogCWlmIFsgLWYgIiQxIiBdOyB0aGVuCiAJCSR7ZGVwX2xpc3R9aGVhZGVyICIkMSIKIAkJaXNfY3Bpbz0iJChlY2hvICIkMSIgfCBzZWQgJ3MvXi4qXC5jcGlvXChcLi4qXClcPy9jcGlvLycpIgpAQCAtMjE2LDYgKzE4OSwxNSBAQAogCWZpCiB9CiAKKyMgaW5wdXQgZmlsZS9kaXIgLSBwcm9jZXNzIGl0Citwcm9jZXNzX2ZpbGUoKSB7CisJaWYgWyAteiAke3ByaW50X2hlYWRlcn0gXTsgdGhlbgorCQkke2RlcF9saXN0fWhlYWRlciAiJDEiCisJZmkKKwlwcmludF9oZWFkZXI9eQorCWlucHV0X2ZpbGUgIiQxIiAiJDIiCit9CisKIHByb2c9JDAKIHJvb3RfdWlkPTAKIHJvb3RfZ2lkPTAKQEAgLTI1MywyNyArMjM1LDI5IEBACiAJCQlyb290X2dpZD0iJDEiCiAJCQlzaGlmdAogCQkJOzsKLQkJIi1kIikJIyBkaXNwbGF5IGRlZmF1bHQgaW5pdHJhbWZzIGxpc3QKLQkJCWRlZmF1bHRfbGlzdD0iJGFyZyIKLQkJCSR7ZGVwX2xpc3R9ZGVmYXVsdF9pbml0cmFtZnMKLQkJCTs7CiAJCSItaCIpCiAJCQl1c2FnZQogCQkJZXhpdCAwCiAJCQk7OwogCQkqKQogCQkJY2FzZSAiJGFyZyIgaW4KLQkJCQkiLSIqKQotCQkJCQl1bmtub3duX29wdGlvbgorCQkJCSItIiopCXVua25vd25fb3B0aW9uCiAJCQkJCTs7Ci0JCQkJKikJIyBpbnB1dCBmaWxlL2RpciAtIHByb2Nlc3MgaXQKLQkJCQkJaW5wdXRfZmlsZSAiJGFyZyIgIiQjIgorCQkJCSopCXByb2Nlc3NfZmlsZSAiJGFyZyIgIiQjIgogCQkJCQk7OwogCQkJZXNhYwogCQkJOzsKIAllc2FjCiBkb25lCiAKKyMgdHJhaWxlciBvZiBkZXBlbmRlbmN5IGxpc3QKK2lmIFsgISAteiAke2RlcF9saXN0fSBdOyB0aGVuCisJZWNobyAiIgorCWVjaG8gImluaXRyYW1mczogXCQoZGVwc19pbml0cmFtZnMpIgorCWVjaG8gIlwkKGRlcHNfaW5pdHJhbWZzKTogOyIKKwllY2hvICIiCitmaQorCiAjIElmIG91dHB1dF9maWxlIGlzIHNldCB3ZSB3aWxsIGdlbmVyYXRlIGNwaW8gYXJjaGl2ZSBhbmQgZ3ppcCBpdAogIyB3ZSBhcmUgY2FyZWZ1bGwgdG8gZGVsZXRlIHRtcCBmaWxlcwogaWYgWyAhIC16ICR7b3V0cHV0X2ZpbGV9IF07IHRoZW4KZGlmZiAtLWdpdCBhL3Vzci9LYnVpbGQgYi91c3IvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGEwNDcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvS2J1aWxkCkBAIC0wLDAgKzEsNzUgQEAKKyMKKyMga2J1aWxkIGZpbGUgZm9yIHVzci8gLSBpbmNsdWRpbmcgaW5pdHJhbWZzIGltYWdlIGFuZCBrbGliYworIworCitDT05GSUdfS0xJQkMgOj0gMQorCitpbmNsdWRlLXN1YmRpciA6PSBpbmNsdWRlCitrbGliYy1zdWJkaXIgOj0ga2xpYmMKK3Vzci1zdWJkaXJzICA6PSBraW5pdCB1dGlscyBkYXNoIGd6aXAKK3N1YmRpci0gICAgICA6PSAkKGluY2x1ZGUtc3ViZGlyKSAkKGtsaWJjLXN1YmRpcikgJCh1c3Itc3ViZGlycykKKwordXNyLXN1YmRpcnMgIDo9ICQoYWRkcHJlZml4IF91c3JfLCQodXNyLXN1YmRpcnMpKQora2xpYmMtc3ViZGlyIDo9ICQoYWRkcHJlZml4IF91c3JfLCQoa2xpYmMtc3ViZGlyKSkKKworIyBLbGliYyBiaW5hcmllcworaWZkZWYgQ09ORklHX0tMSUJDCisKKyMgLmluaXRyYW1mc19kYXRhLmNwaW8uZ3ouZCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFsbCBmaWxlcyBpbmNsdWRlZAorIyBpbiBpbml0cmFtZnMgYW5kIHRvIGRldGVjdCBpZiBhbnkgZmlsZXMgYXJlIGFkZGVkL3JlbW92ZWQuCisjIFJlbW92ZWQgZmlsZXMgYXJlIGlkZW50aWZpZWQgYnkgZGlyZWN0b3J5IHRpbWVzdGFtcCBiZWluZyB1cGRhdGVkCisjIFRoZSBkZXBlbmRlbmN5IGxpc3QgaXMgZ2VuZXJhdGVkIGJ5IGdlbl9pbml0cmFtZnMuc2ggLWwKK2lmbmVxICgkKHdpbGRjYXJkICQob2JqKS8uaW5pdHJhbWZzX2RhdGEuY3Bpby5nei5kKSwpCisJaW5jbHVkZSAkKG9iaikvLmluaXRyYW1mc19kYXRhLmNwaW8uZ3ouZAorZW5kaWYKKworIyBidWlsZCBrbGliYyBsaWJyYXJ5IGJlZm9yZSB0aGUga2xpYmMgcHJvZ3JhbXMKKyMgYnVpbGQga2xpYmMgcHJvZ3JhbXMgYmVmb3JlIGNwaW8uZ3oKKy5QSE9OWTogaW5pdHJhbWZzICQodXNyLXN1YmRpcnMpICQoa2xpYmMtc3ViZGlyKSAkKGluY2x1ZGUtc3ViZGlyKQoraW5pdHJhbWZzOiAgICAgICAgICQodXNyLXN1YmRpcnMpICQoa2xpYmMtc3ViZGlyKSAkKGluY2x1ZGUtc3ViZGlyKQorJChkZXBzX2luaXRyYW1mcyk6ICQodXNyLXN1YmRpcnMpICQoa2xpYmMtc3ViZGlyKSAkKGluY2x1ZGUtc3ViZGlyKQorCiskKHVzci1zdWJkaXJzKTogJChrbGliYy1zdWJkaXIpCisJJChRKSQoTUFLRSkgJChrbGliYyk9JChzcmMpLyQocGF0c3Vic3QgX3Vzcl8lLCUsJChAKSkKKworJChrbGliYy1zdWJkaXIpOiAkKGluY2x1ZGUtc3ViZGlyKQorCSQoUSkkKE1BS0UpICQoa2xpYmMpPSQoc3JjKS8kKHBhdHN1YnN0IF91c3JfJSwlLCQoQCkpCisKKyQoaW5jbHVkZS1zdWJkaXIpOgorCSQoUSkkKE1BS0UpICQoa2xpYmMpPSQoc3JjKS8kKHBhdHN1YnN0IF91c3JfJSwlLCQoQCkpCitlbmRpZgorCisKKyMgR2VuZXJhdGUgYnVpbHRpbi5vIGJhc2VkIG9uIGluaXRyYW1mc19kYXRhLm8KK29iai0kKENPTkZJR19CTEtfREVWX0lOSVRSRCkgOj0gaW5pdHJhbWZzX2RhdGEubworCisjIGluaXRyYW1mc19kYXRhLm8gY29udGFpbnMgdGhlIGluaXRyYW1mc19kYXRhLmNwaW8uZ3ogaW1hZ2UuCisjIFRoZSBpbWFnZSBpcyBpbmNsdWRlZCB1c2luZyAuaW5jYmluLCBhIGRlcGVuZGVuY3kgd2hpY2ggaXMgbm90CisjIHRyYWNrZWQgYXV0b21hdGljYWxseS4KKyQob2JqKS9pbml0cmFtZnNfZGF0YS5vOiAkKG9iaikvaW5pdHJhbWZzX2RhdGEuY3Bpby5neiBGT1JDRQorCisjIyMjIworIyBHZW5lcmF0ZSB0aGUgaW5pdHJhbWZzIGNwaW8gYXJjaGl2ZQorCitob3N0cHJvZ3MteSA6PSBnZW5faW5pdF9jcGlvCitnaW5pdHJhbWZzICA6PSAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaAorcmFtZnMtZGVmICAgOj0gJChzcmN0cmVlKS8kKHNyYykvaW5pdHJhbWZzLmRlZmF1bHQKK3JhbWZzLWlucHV0IDo9ICQoc2hlbGwgZWNobyAkKENPTkZJR19JTklUUkFNRlNfU09VUkNFKSkKK3JhbWZzLWlucHV0IDo9ICQoaWYgJChyYW1mcy1pbnB1dCksICQocmFtZnMtaW5wdXQpLCAkKHJhbWZzLWRlZikpCisKK3JhbWZzLWFyZ3MgIDo9IFwKKyAgICAgICAgJChpZiAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9VSUQpLCAtdSAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9VSUQpKSBcCisgICAgICAgICQoaWYgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfR0lEKSwgLWcgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfR0lEKSkKKworcXVpZXRfY21kX2luaXRmcyA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9pbml0ZnMgPSAkKGdpbml0cmFtZnMpIC1vICRAICQocmFtZnMtYXJncykgJChyYW1mcy1pbnB1dCkKKwordGFyZ2V0cyA6PSBpbml0cmFtZnNfZGF0YS5jcGlvLmd6CisjIFdlIHJlYnVpbGQgaW5pdHJhbWZzX2RhdGEuY3Bpby5neiBpZjoKKyMgMSkgQW55IGluY2x1ZGVkIGZpbGUgaXMgbmV3ZXIgdGhlbiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6CisjIDIpIFRoZXJlIGFyZSBjaGFuZ2VzIGluIHdoaWNoIGZpbGVzIGFyZSBpbmNsdWRlZCAoYWRkZWQgb3IgZGVsZXRlZCkKKyMgMykgSWYgZ2VuX2luaXRfY3BpbyBhcmUgbmV3ZXIgdGhhbiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6CisjIDQpIGFyZ3VtZW50cyB0byBnZW5faW5pdHJhbWZzLnNoIGNoYW5nZXMKKyQob2JqKS9pbml0cmFtZnNfZGF0YS5jcGlvLmd6OiAkKG9iaikvZ2VuX2luaXRfY3BpbyAkKGRlcHNfaW5pdHJhbWZzKSBpbml0cmFtZnMKKwkkKFEpJChnaW5pdHJhbWZzKSAtbCAkKHJhbWZzLWlucHV0KSA+ICQob2JqKS8uaW5pdHJhbWZzX2RhdGEuY3Bpby5nei5kCisJJChjYWxsIGlmX2NoYW5nZWQsaW5pdGZzKQpkaWZmIC0tZ2l0IGEvdXNyL0tjb25maWcgYi91c3IvS2NvbmZpZwppbmRleCA4NmNlY2I1Li43ZjU4NDdhIDEwMDY0NAotLS0gYS91c3IvS2NvbmZpZworKysgYi91c3IvS2NvbmZpZwpAQCAtNDQsMyArNDQsMjQgQEAKIAkgIG93bmVkIGJ5IGdyb3VwIHJvb3QgaW4gdGhlIGluaXRpYWwgcmFtZGlzayBpbWFnZS4KIAogCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgbGVhdmUgaXQgc2V0IHRvICIwIi4KKworY29uZmlnIEtMSUJDX0VSUkxJU1QKKwlib29sICJFYXJseSB1c2Vyc3BhY2UgcmVhbCBlcnJvciBtZXNzYWdlcyIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB0aGlzIGlzIHNldCwga2luaXQgKGFuZCBvdGhlciBrbGliYy1kZXJpdmVkIGJpbmFyaWVzKQorCSAgd2lsbCBoYXZlIHRoZSBzdGFuZGFyZCBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzIGJ1aWx0IGluLCBhbmQKKwkgIHRodXMgd2lsbCByZXBvcnQsIGZvciBleGFtcGxlLCAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIKKwkgIGluc3RlYWQgb2YgIkVycm9yIDEiLiAgTGVhdmluZyBpdCBvdXQgd2lsbCBzYXZlCisJICBhcHByb3hpbWF0ZWx5IDRLIGZyb20gZWFjaCBzdGF0aWMgYmluYXJ5IChvbmUsIHVubGVzcyB5b3UKKwkgIGhhdmUgYSBkaWZmZXJlbnQgaW5pdHJhbWZzX3NvdXJjZS50eHQpIG9yIHRoZSBzaGFyZWQKKwkgIGxpYnJhcnkuCisKKwkgIElmIHlvdSBhcmUgbm90IHN1cmUsICJZIiBpcyBoaWdobHkgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBLTElCQ19aTElCCisJYm9vbAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgYnVpbGRzIHRoZSB6bGliIHBvcnRpb24gb2Yga2xpYmMuICBUaGlzIGlzIGN1cnJlbnRseQorCSAgcmVxdWlyZWQuCmRpZmYgLS1naXQgYS91c3IvTWFrZWZpbGUgYi91c3IvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWYyN2YuLjAwMDAwMDAKLS0tIGEvdXNyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIwotIyBrYnVpbGQgZmlsZSBmb3IgdXNyLyAtIGluY2x1ZGluZyBpbml0cmFtZnMgaW1hZ2UKLSMKLQota2xpYmNkaXJzOjsKLVBIT05ZICs9IGtsaWJjZGlycwotCi0KLSMgR2VuZXJhdGUgYnVpbHRpbi5vIGJhc2VkIG9uIGluaXRyYW1mc19kYXRhLm8KLW9iai0kKENPTkZJR19CTEtfREVWX0lOSVRSRCkgOj0gaW5pdHJhbWZzX2RhdGEubwotCi0jIGluaXRyYW1mc19kYXRhLm8gY29udGFpbnMgdGhlIGluaXRyYW1mc19kYXRhLmNwaW8uZ3ogaW1hZ2UuCi0jIFRoZSBpbWFnZSBpcyBpbmNsdWRlZCB1c2luZyAuaW5jYmluLCBhIGRlcGVuZGVuY3kgd2hpY2ggaXMgbm90Ci0jIHRyYWNrZWQgYXV0b21hdGljYWxseS4KLSQob2JqKS9pbml0cmFtZnNfZGF0YS5vOiAkKG9iaikvaW5pdHJhbWZzX2RhdGEuY3Bpby5neiBGT1JDRQotCi0jIyMjIwotIyBHZW5lcmF0ZSB0aGUgaW5pdHJhbWZzIGNwaW8gYXJjaGl2ZQotCi1ob3N0cHJvZ3MteSA6PSBnZW5faW5pdF9jcGlvCi1pbml0cmFtZnMgICA6PSAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaAotcmFtZnMtaW5wdXQgOj0gJChpZiAkKGZpbHRlci1vdXQgIiIsJChDT05GSUdfSU5JVFJBTUZTX1NPVVJDRSkpLCBcCi0JCQkkKHNoZWxsIGVjaG8gJChDT05GSUdfSU5JVFJBTUZTX1NPVVJDRSkpLC1kKQotcmFtZnMtYXJncyAgOj0gXAotICAgICAgICAkKGlmICQoQ09ORklHX0lOSVRSQU1GU19ST09UX1VJRCksIC11ICQoQ09ORklHX0lOSVRSQU1GU19ST09UX1VJRCkpIFwKLSAgICAgICAgJChpZiAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9HSUQpLCAtZyAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9HSUQpKQotCi0jIC5pbml0cmFtZnNfZGF0YS5jcGlvLmd6LmQgaXMgdXNlZCB0byBpZGVudGlmeSBhbGwgZmlsZXMgaW5jbHVkZWQKLSMgaW4gaW5pdHJhbWZzIGFuZCB0byBkZXRlY3QgaWYgYW55IGZpbGVzIGFyZSBhZGRlZC9yZW1vdmVkLgotIyBSZW1vdmVkIGZpbGVzIGFyZSBpZGVudGlmaWVkIGJ5IGRpcmVjdG9yeSB0aW1lc3RhbXAgYmVpbmcgdXBkYXRlZAotIyBUaGUgZGVwZW5kZW5jeSBsaXN0IGlzIGdlbmVyYXRlZCBieSBnZW5faW5pdHJhbWZzLnNoIC1sCi1pZm5lcSAoJCh3aWxkY2FyZCAkKG9iaikvLmluaXRyYW1mc19kYXRhLmNwaW8uZ3ouZCksKQotCWluY2x1ZGUgJChvYmopLy5pbml0cmFtZnNfZGF0YS5jcGlvLmd6LmQKLWVuZGlmCi0KLXF1aWV0X2NtZF9pbml0ZnMgPSBHRU4gICAgICRACi0gICAgICBjbWRfaW5pdGZzID0gJChpbml0cmFtZnMpIC1vICRAICQocmFtZnMtYXJncykgJChyYW1mcy1pbnB1dCkKLQotdGFyZ2V0cyA6PSBpbml0cmFtZnNfZGF0YS5jcGlvLmd6Ci0jIGRvIG5vdCB0cnkgdG8gdXBkYXRlIGZpbGVzIGluY2x1ZGVkIGluIGluaXRyYW1mcwotJChkZXBzX2luaXRyYW1mcyk6IDsKLQotJChkZXBzX2luaXRyYW1mcyk6IGtsaWJjZGlycwotIyBXZSByZWJ1aWxkIGluaXRyYW1mc19kYXRhLmNwaW8uZ3ogaWY6Ci0jIDEpIEFueSBpbmNsdWRlZCBmaWxlIGlzIG5ld2VyIHRoZW4gaW5pdHJhbWZzX2RhdGEuY3Bpby5negotIyAyKSBUaGVyZSBhcmUgY2hhbmdlcyBpbiB3aGljaCBmaWxlcyBhcmUgaW5jbHVkZWQgKGFkZGVkIG9yIGRlbGV0ZWQpCi0jIDMpIElmIGdlbl9pbml0X2NwaW8gYXJlIG5ld2VyIHRoYW4gaW5pdHJhbWZzX2RhdGEuY3Bpby5negotIyA0KSBhcmd1bWVudHMgdG8gZ2VuX2luaXRyYW1mcy5zaCBjaGFuZ2VzCi0kKG9iaikvaW5pdHJhbWZzX2RhdGEuY3Bpby5nejogJChvYmopL2dlbl9pbml0X2NwaW8gJChkZXBzX2luaXRyYW1mcykga2xpYmNkaXJzCi0JJChRKSQoaW5pdHJhbWZzKSAtbCAkKHJhbWZzLWlucHV0KSA+ICQob2JqKS8uaW5pdHJhbWZzX2RhdGEuY3Bpby5nei5kCi0JJChjYWxsIGlmX2NoYW5nZWQsaW5pdGZzKQotCmRpZmYgLS1naXQgYS91c3IvZGFzaC9LYnVpbGQgYi91c3IvZGFzaC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhYTkzZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL0tidWlsZApAQCAtMCwwICsxLDExMSBAQAorIworIyBLYnVpbGQgZmlsZSBmb3IgZGFzaAorIworCitjb25maWctY3BwZmxhZ3MgOj0gLURCU0Q9MSAtRFNNQUxMIC1ESk9CUz0wIC1ESEFWRV9DT05GSUdfSCAtRFNIRUxMCitjb25maWctY3BwZmxhZ3MgKz0gLURHTE9CX0JST0tFTiAtRElGU19CUk9LRU4KKworRVhUUkFfS0xJQkNDRkxBR1MgOj0gLUkkKHNyY3RyZWUpLyQoc3JjKSAtSSQob2JqdHJlZSkvJChvYmopCitFWFRSQV9LTElCQ0NGTEFHUyArPSAtaW5jbHVkZSAkKHNyY3RyZWUpLyQoc3JjKS9jb25maWcuaAorRVhUUkFfS0xJQkNDRkxBR1MgKz0gJChjb25maWctY3BwZmxhZ3MpCisKK0hPU1RfRVhUUkFDRkxBR1MgIDo9ICQoY29uZmlnLWNwcGZsYWdzKQorCitpbml0LW8tZmlsZXMgOj0gYWxpYXMubyBhcml0aF95eWxleC5vIGNkLm8gZXJyb3IubyBldmFsLm8gZXhlYy5vIGV4cGFuZC5vIFwKKwkJaGlzdGVkaXQubyBpbnB1dC5vIGpvYnMubyBtYWlsLm8gbWFpbi5vIG1lbWFsbG9jLm8gbWlzY2JsdGluLm8gXAorCQlteXN0cmluZy5vIG9wdGlvbnMubyBwYXJzZXIubyByZWRpci5vIHNob3cubyB0cmFwLm8gb3V0cHV0Lm8gXAorCQlibHRpbi9wcmludGYubyBzeXN0ZW0ubyBibHRpbi90ZXN0Lm8gdmFyLm8KKworZ2VuLW8tZmlsZXMgOj0gYXJpdGgubyBidWlsdGlucy5vIGluaXQubyBub2Rlcy5vIHN5bnRheC5vCisKK3NoLXkgOj0gJChpbml0LW8tZmlsZXMpICQoZ2VuLW8tZmlsZXMpCisKK2hvc3Rwcm9ncy15IDo9IG1raW5pdCBta3N5bnRheCBta25vZGVzIG1rc2lnbmFtZXMKK2dlbi1oLWZpbGVzIDo9IGFyaXRoLmggYnVpbHRpbnMuaCBub2Rlcy5oIHN5bnRheC5oIHRva2VuLmgKKworc3RhdGljLXkgOj0gc2gKKworIyBUaGUgc2hhcmVkIGJpbmFyeQorc2hhcmVkLXkgICAgOj0gc2guc2hhcmVkCitzaC5zaGFyZWQteSA6PSAkKHNoLXkpCisKKyMgRm9yIGNsZWFuaW5nCit0YXJnZXRzIDo9IHNoIHNoLmcgc2guc2hhcmVkIHNoLnNoYXJlZC5nICQoZ2VuLW8tZmlsZXMpCisKKyMgZXhwbGljaXQgZGVwZW5kZW5jeSBmb3IgYWxsIGdlbmVyYXRlZCBmaWxlcworJChhZGRwcmVmaXggJChvYmopLywgJChzaC15KSk6ICQoYWRkcHJlZml4ICQob2JqKS8sICQoZ2VuLWgtZmlsZXMpKQorCisjIEdlbmVyYXRlIHRva2VuLmgKK3RhcmdldHMgKz0gdG9rZW4uaAorcXVpZXRfY21kX21rdG9rZW5zID0gR0VOICAgICAkQAorICAgICAgY21kX21rdG9rZW5zID0gc2ggJDwgPiAkQAorJChvYmopL3Rva2VuLmg6ICQoc3JjKS9ta3Rva2VucworCSQoY2FsbCBpZl9jaGFuZ2VkLG1rdG9rZW5zKQorCisjIEdlbmVyYXRlIGJ1aWx0aW5zLmRlZgordGFyZ2V0cyArPSBidWlsdGlucy5kZWYKK3F1aWV0X2NtZF9ta2J1aWx0aW5zX2RlZiA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9ta2J1aWx0aW5zX2RlZiA9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAteCBjIC1FIC1vICRAICQ8CiskKG9iaikvYnVpbHRpbnMuZGVmOiAkKHNyYykvYnVpbHRpbnMuZGVmLmluICQoc3JjKS9jb25maWcuaAorCSQoY2FsbCBpZl9jaGFuZ2VkLG1rYnVpbHRpbnNfZGVmKQorCisjIEdlbmVyYXRlIGJ1aWx0aW5zey5jICsgLmh9Cit0YXJnZXRzICs9IGJ1aWx0aW5zLmMgYnVpbHRpbnMuaAorcXVpZXRfY21kX21rYnVpbHRpbnMgPSBHRU4gICAgICRACisgICAgICBjbWRfbWtidWlsdGlucyA9IG1rZGlyIC1wICQob2JqKS9ibHRpbiAmJiBjZCAkKG9iaikgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICBzaCAkKHNyY3RyZWUpLyQoc3JjKS9ta2J1aWx0aW5zIGJ1aWx0aW5zLmRlZgorJChvYmopL2J1aWx0aW5zLmM6ICQoc3JjKS9ta2J1aWx0aW5zICQob2JqKS9idWlsdGlucy5kZWYKKwkkKGNhbGwgY21kLG1rYnVpbHRpbnMpCisKKyMgc2lkZSBlZmZlY3QuLgorJChvYmopL2J1aWx0aW5zLmg6ICQob2JqKS9idWlsdGlucy5jCisJJChRKToKKworIyBHZW5lcmF0ZSBpbml0LmMKK3RhcmdldHMgKz0gaW5pdC5jCitpbml0LWMtZmlsZXMgOj0gJChhZGRwcmVmaXggJChzcmN0cmVlKS8kKHNyYykvLCAkKGluaXQtby1maWxlczoubz0uYykpCitxdWlldF9jbWRfbWtpbml0ID0gR0VOICAgICAkQAorICAgICAgY21kX21raW5pdCA9IGNkICQob2JqKSAmJiAuL21raW5pdCAkKGluaXQtYy1maWxlcykKKyQob2JqKS9pbml0LmM6ICQob2JqKS9ta2luaXQgJChpbml0LWMtZmlsZXMpCisJJChjYWxsIGNtZCxta2luaXQpCisKKyMgR2VuZXJhdGUgbm9kZXN7LmMgKyAuaH0KK3RhcmdldHMgKz0gbm9kZXMuYyBub2Rlcy5oCitxdWlldF9jbWRfbWtub2RlcyA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9ta25vZGVzID0gY2QgJChvYmopICYmIC4vbWtub2RlcyAkKHNyY3RyZWUpLyQoc3JjKS9ub2RldHlwZXMgXAorCQkJICAgICAgICQoc3JjdHJlZSkvJChzcmMpL25vZGVzLmMucGF0CiskKG9iaikvbm9kZXMuYzogJChvYmopL21rbm9kZXMgJChzcmMpL25vZGV0eXBlcyAkKHNyYykvbm9kZXMuYy5wYXQKKwkkKGNhbGwgY21kLG1rbm9kZXMpCisKKyMgc2lkZSBlZmZlY3QuLgorJChvYmopL25vZGVzLmg6ICQob2JqKS9ub2Rlcy5jCisJJChRKToKKworIyBHZW5lcmF0ZSBzeW50YXh7LmMgKyAuaH0KK3RhcmdldHMgKz0gc3ludGF4LmMgc3ludGF4LmgKK3F1aWV0X2NtZF9ta3N5bnRheCA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9ta3N5bnRheCA9IGNkICQob2JqKSAmJiAuL21rc3ludGF4CiskKG9iaikvc3ludGF4LmM6ICQob2JqKS9ta3N5bnRheAorCSQoY2FsbCBjbWQsbWtzeW50YXgpCisKKyMgc2lkZSBlZmZlY3QuLgorJChvYmopL3N5bnRheC5oOiAkKG9iaikvc3ludGF4LmMKKwkkKFEpOgorCisjIEdlbmVyYXRlIGFyaXRoIHBhcnNlciAtIGFyaXRoey5jICsgLmh9Cit0YXJnZXRzICs9IGFyaXRoLmMgYXJpdGguaAorIyBQcmVmZXIgYmlzb24sIGJ1dCBCU0QgeWFjYyBzaG91bGQgd29yayBhcyB3ZWxsCitZQUNDID89IGJpc29uCisKK3F1aWV0X2NtZF95YWNjCT0gWUFDQyAgICAkQAorICAgICAgY21kX3lhY2MgPSAkKFlBQ0MpIC1kIC1vICQoQDouaD0uYykgJDwKKworJChvYmopL2FyaXRoLmg6ICQoc3JjKS9hcml0aC55CisJJChjYWxsIGlmX2NoYW5nZWQseWFjYykKKworIyBzaWRlIGVmZmVjdC4uCiskKG9iaikvYXJpdGguYzogJChvYmopL2FyaXRoLmgKKwkkKFEpOgorCisjIFRhcmdldHMgdG8gaW5zdGFsbAoraW5zdGFsbC15IDo9IHNoLnNoYXJlZApkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvUkVBRE1FLmtsaWJjIGIvdXNyL2Rhc2gvUkVBRE1FLmtsaWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTRmYjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9SRUFETUUua2xpYmMKQEAgLTAsMCArMSw3IEBACitUaGlzIHZlcnNpb24gb2YgZGFzaCB3YXMgb2J0YWluZWQgZnJvbQorCitodHRwOi8vZ29uZG9yLmFwYW5hLm9yZy5hdS9+aGVyYmVydC9kYXNoL2Rhc2guZ2l0LworCitJdCBjb3JyZXNwb25kcyB0byBjaGFuZ2VzZXQgM2M5ODM5OWNkZjhkMzc2YjJjMWViZDljZDMyY2E1ZDhjODRmM2FjOS4KKworVGhlIG9ubHkgY2hhbmdlcyBtYWRlIGFyZSB0aGUgYWRkaXRpb24gb2YgY29uZmlnLmggYW5kIGEgbmV3IE1ha2VmaWxlLgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvVE9VUiBiL3Vzci9kYXNoL1RPVVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2MGUyYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL1RPVVIKQEAgLTAsMCArMSwzNTYgQEAKKyMJQCgjKVRPVVIJOC4xIChCZXJrZWxleSkgNS8zMS85MworCitOT1RFIC0tIFRoaXMgaXMgdGhlIG9yaWdpbmFsIFRPVVIgcGFwZXIgZGlzdHJpYnV0ZWQgd2l0aCBhc2ggYW5kCitkb2VzIG5vdCByZXByZXNlbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNoZWxsLiAgSXQgaXMgcHJvdmlkZWQgYW55d2F5CitzaW5jZSBpdCBwcm92aWRlcyBoZWxwZnVsIGluZm9ybWF0aW9uIGZvciBob3cgdGhlIHNoZWxsIGlzIHN0cnVjdHVyZWQsCitidXQgYmUgd2FybmVkIHRoYXQgdGhpbmdzIGhhdmUgY2hhbmdlZCAtLSB0aGUgY3VycmVudCBzaGVsbCBpcworc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICAgICAgICAgICAgICAgICBBIFRvdXIgdGhyb3VnaCBBc2gKKworICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5ODkgYnkgS2VubmV0aCBBbG1xdWlzdC4KKworCitESVJFQ1RPUklFUzogIFRoZSBzdWJkaXJlY3RvcnkgYmx0aW4gY29udGFpbnMgY29tbWFuZHMgd2hpY2ggY2FuCitiZSBjb21waWxlZCBzdGFuZC1hbG9uZS4gIFRoZSByZXN0IG9mIHRoZSBzb3VyY2UgaXMgaW4gdGhlIG1haW4KK2FzaCBkaXJlY3RvcnkuCisKK1NPVVJDRSBDT0RFIEdFTkVSQVRPUlM6ICBGaWxlcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICJtayIgYXJlCitwcm9ncmFtcyB0aGF0IGdlbmVyYXRlIHNvdXJjZSBjb2RlLiAgQSBjb21wbGV0ZSBsaXN0IG9mIHRoZXNlCitwcm9ncmFtcyBpczoKKworICAgICAgICBwcm9ncmFtICAgICAgICAgaW50cHV0IGZpbGVzICAgICAgICBnZW5lcmF0ZXMKKyAgICAgICAgLS0tLS0tLSAgICAgICAgIC0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tCisgICAgICAgIG1rYnVpbHRpbnMgICAgICBidWlsdGlucyAgICAgICAgICAgIGJ1aWx0aW5zLmggYnVpbHRpbnMuYworICAgICAgICBta2luaXQgICAgICAgICAgKi5jICAgICAgICAgICAgICAgICBpbml0LmMKKyAgICAgICAgbWtub2RlcyAgICAgICAgIG5vZGV0eXBlcyAgICAgICAgICAgbm9kZXMuaCBub2Rlcy5jCisgICAgICAgIG1rc2lnbmFtZXMgICAgICAgICAgLSAgICAgICAgICAgICAgIHNpZ25hbWVzLmggc2lnbmFtZXMuYworICAgICAgICBta3N5bnRheCAgICAgICAgICAgIC0gICAgICAgICAgICAgICBzeW50YXguaCBzeW50YXguYworICAgICAgICBta3Rva2VucyAgICAgICAgICAgIC0gICAgICAgICAgICAgICB0b2tlbi5oCisgICAgICAgIGJsdGluL21rZXhwciAgICB1bmFyeV9vcCBiaW5hcnlfb3AgIG9wZXJhdG9ycy5oIG9wZXJhdG9ycy5jCisKK1RoZXJlIGFyZSB1bmRvdWJ0ZWRseSB0b28gbWFueSBvZiB0aGVzZS4gIE1raW5pdCBzZWFyY2hlcyBhbGwgdGhlCitDIHNvdXJjZSBmaWxlcyBmb3IgZW50cmllcyBsb29raW5nIGxpa2U6CisKKyAgICAgICAgSU5JVCB7CisgICAgICAgICAgICAgIHggPSAxOyAgICAvKiBleGVjdXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgfQorCisgICAgICAgIFJFU0VUIHsKKyAgICAgICAgICAgICAgeCA9IDI7ICAgIC8qIGV4ZWN1dGVkIHdoZW4gdGhlIHNoZWxsIGRvZXMgYSBsb25nam1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrIHRvIHRoZSBtYWluIGNvbW1hbmQgbG9vcCAqLworICAgICAgICB9CisKKyAgICAgICAgU0hFTExQUk9DIHsKKyAgICAgICAgICAgICAgeCA9IDM7ICAgIC8qIGV4ZWN1dGVkIHdoZW4gdGhlIHNoZWxsIHJ1bnMgYSBzaGVsbCBwcm9jZWR1cmUgKi8KKyAgICAgICAgfQorCitJdCBwdWxscyB0aGlzIGNvZGUgb3V0IGludG8gcm91dGluZXMgd2hpY2ggYXJlIHdoZW4gcGFydGljdWxhcgorZXZlbnRzIG9jY3VyLiAgVGhlIGludGVudCBpcyB0byBpbXByb3ZlIG1vZHVsYXJpdHkgYnkgaXNvbGF0aW5nCit0aGUgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggbW9kdWxlcyBuZWVkIHRvIGJlIGV4cGxpY2l0bHkKK2luaXRpYWxpemVkL3Jlc2V0IHdpdGhpbiB0aGUgbW9kdWxlcyB0aGVtc2VsdmVzLgorCitNa2luaXQgcmVjb2duaXplcyBzZXZlcmFsIGNvbnN0cnVjdHMgZm9yIHBsYWNpbmcgZGVjbGFyYXRpb25zIGluCit0aGUgaW5pdC5jIGZpbGUuCisgICAgICAgIElOQ0xVREUgImZpbGUuaCIKK2luY2x1ZGVzIGEgZmlsZS4gIFRoZSBzdG9yYWdlIGNsYXNzIE1LSU5JVCBtYWtlcyBhIGRlY2xhcmF0aW9uCithdmFpbGFibGUgaW4gdGhlIGluaXQuYyBmaWxlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgTUtJTklUIGludCBmdW5jbmVzdDsgICAgLyogZGVwdGggb2YgZnVuY3Rpb24gY2FsbHMgKi8KK01LSU5JVCBhbG9uZSBvbiBhIGxpbmUgaW50cm9kdWNlcyBhIHN0cnVjdHVyZSBvciB1bmlvbiBkZWNsYXJhLQordGlvbjoKKyAgICAgICAgTUtJTklUCisgICAgICAgIHN0cnVjdCByZWRpcnRhYiB7CisgICAgICAgICAgICAgIHNob3J0IHJlbmFtZWRbMTBdOworICAgICAgICB9OworUHJlcHJvY2Vzc29yICNkZWZpbmUgc3RhdGVtZW50cyBhcmUgY29waWVkIHRvIGluaXQuYyB3aXRob3V0IGFueQorc3BlY2lhbCBhY3Rpb24gdG8gcmVxdWVzdCB0aGlzLgorCitJTkRFTlRBVElPTjogIFRoZSBhc2ggc291cmNlIGlzIGluZGVudGVkIGluIG11bHRpcGxlcyBvZiBzaXgKK3NwYWNlcy4gIFRoZSBvbmx5IHN0dWR5IHRoYXQgSSBoYXZlIGhlYXJkIG9mIG9uIHRoZSBzdWJqZWN0IGNvbi0KK2NsdWRlZCB0aGF0IHRoZSBvcHRpbWFsIGFtb3VudCB0byBpbmRlbnQgaXMgaW4gdGhlIHJhbmdlIG9mIGZvdXIKK3RvIHNpeCBzcGFjZXMuICBJIHVzZSBzaXggc3BhY2VzIHNpbmNlIGl0IGlzIG5vdCB0b28gYmlnIGEganVtcAorZnJvbSB0aGUgd2lkZWx5IHVzZWQgZWlnaHQgc3BhY2VzLiAgSWYgeW91IHJlYWxseSBoYXRlIHNpeCBzcGFjZQoraW5kZW50YXRpb24sIHVzZSB0aGUgYWRqaW5kIChzb3VyY2UgaW5jbHVkZWQpIHByb2dyYW0gdG8gY2hhbmdlCitpdCB0byBzb21ldGhpbmcgZWxzZS4KKworRVhDRVBUSU9OUzogIENvZGUgZm9yIGRlYWxpbmcgd2l0aCBleGNlcHRpb25zIGFwcGVhcnMgaW4KK2V4Y2VwdGlvbnMuYy4gIFRoZSBDIGxhbmd1YWdlIGRvZXNuJ3QgaW5jbHVkZSBleGNlcHRpb24gaGFuZGxpbmcsCitzbyBJIGltcGxlbWVudCBpdCB1c2luZyBzZXRqbXAgYW5kIGxvbmdqbXAuICBUaGUgZ2xvYmFsIHZhcmlhYmxlCitleGNlcHRpb24gY29udGFpbnMgdGhlIHR5cGUgb2YgZXhjZXB0aW9uLiAgRVhFUlJPUiBpcyByYWlzZWQgYnkKK2NhbGxpbmcgZXJyb3IuICBFWElOVCBpcyBhbiBpbnRlcnJ1cHQuICBFWFNIRUxMUFJPQyBpcyBhbiBleGNlcC0KK3Rpb24gd2hpY2ggaXMgcmFpc2VkIHdoZW4gYSBzaGVsbCBwcm9jZWR1cmUgaXMgaW52b2tlZC4gIFRoZSBwdXItCitwb3NlIG9mIEVYU0hFTExQUk9DIGlzIHRvIHBlcmZvcm0gdGhlIGNsZWFudXAgYWN0aW9ucyBhc3NvY2lhdGVkCit3aXRoIG90aGVyIGV4Y2VwdGlvbnMuICBBZnRlciB0aGVzZSBjbGVhbnVwIGFjdGlvbnMsIHRoZSBzaGVsbAorY2FuIGludGVycHJldCBhIHNoZWxsIHByb2NlZHVyZSBpdHNlbGYgd2l0aG91dCBleGVjJ2luZyBhIG5ldworY29weSBvZiB0aGUgc2hlbGwuCisKK0lOVEVSUlVQVFM6ICBJbiBhbiBpbnRlcmFjdGl2ZSBzaGVsbCwgYW4gaW50ZXJydXB0IHdpbGwgY2F1c2UgYW4KK0VYSU5UIGV4Y2VwdGlvbiB0byByZXR1cm4gdG8gdGhlIG1haW4gY29tbWFuZCBsb29wLiAgKEV4Y2VwdGlvbjoKK0VYSU5UIGlzIG5vdCByYWlzZWQgaWYgdGhlIHVzZXIgdHJhcHMgaW50ZXJydXB0cyB1c2luZyB0aGUgdHJhcAorY29tbWFuZC4pICBUaGUgSU5UT0ZGIGFuZCBJTlRPTiBtYWNyb3MgKGRlZmluZWQgaW4gZXhjZXB0aW9uLmgpCitwcm92aWRlIHVuaW50ZXJydXB0YWJsZSBjcml0aWNhbCBzZWN0aW9ucy4gIEJldHdlZW4gdGhlIGV4ZWN1dGlvbgorb2YgSU5UT0ZGIGFuZCB0aGUgZXhlY3V0aW9uIG9mIElOVE9OLCBpbnRlcnJ1cHQgc2lnbmFscyB3aWxsIGJlCitoZWxkIGZvciBsYXRlciBkZWxpdmVyeS4gIElOVE9GRiBhbmQgSU5UT04gY2FuIGJlIG5lc3RlZC4KKworTUVNQUxMT0MuQzogIE1lbWFsbG9jLmMgZGVmaW5lcyB2ZXJzaW9ucyBvZiBtYWxsb2MgYW5kIHJlYWxsb2MKK3doaWNoIGNhbGwgZXJyb3Igd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkgbGVmdC4gIEl0IGFsc28gZGVmaW5lcyBhCitzdGFjayBvcmllbnRlZCBtZW1vcnkgYWxsb2NhdGlvbiBzY2hlbWUuICBBbGxvY2F0aW5nIG9mZiBhIHN0YWNrCitpcyBwcm9iYWJseSBtb3JlIGVmZmljaWVudCB0aGFuIGFsbG9jYXRpb24gdXNpbmcgbWFsbG9jLCBidXQgdGhlCitiaWcgYWR2YW50YWdlIGlzIHRoYXQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGFsbCB3ZSBoYXZlIHRvIGRvCit0byBmcmVlIHVwIHRoZSBtZW1vcnkgaW4gdXNlIGF0IHRoZSB0aW1lIG9mIHRoZSBleGNlcHRpb24gaXMgdG8KK3Jlc3RvcmUgdGhlIHN0YWNrIHBvaW50ZXIuICBUaGUgc3RhY2sgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYQorbGlua2VkIGxpc3Qgb2YgYmxvY2tzLgorCitTVFBVVEM6ICBJZiB0aGUgc3RhY2sgd2VyZSBjb250aWd1b3VzLCBpdCB3b3VsZCBiZSBlYXN5IHRvIHN0b3JlCitzdHJpbmdzIG9uIHRoZSBzdGFjayB3aXRob3V0IGtub3dpbmcgaW4gYWR2YW5jZSBob3cgbG9uZyB0aGUKK3N0cmluZyB3YXMgZ29pbmcgdG8gYmU6CisgICAgICAgIHAgPSBzdGFja3B0cjsKKyAgICAgICAgKnArKyA9IGM7ICAgICAgIC8qIHJlcGVhdGVkIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkICovCisgICAgICAgIHN0YWNrcHRyID0gcDsKK1RoZSBmb2xsb2luZyB0aHJlZSBtYWNyb3MgKGRlZmluZWQgaW4gbWVtYWxsb2MuaCkgcGVyZm9ybSB0aGVzZQorb3BlcmF0aW9ucywgYnV0IGdyb3cgdGhlIHN0YWNrIGlmIHlvdSBydW4gb2ZmIHRoZSBlbmQ6CisgICAgICAgIFNUQVJUU1RBQ0tTVFIocCk7CisgICAgICAgIFNUUFVUQyhjLCBwKTsgICAvKiByZXBlYXRlZCBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCAqLworICAgICAgICBncmFic3RhY2tzdHIocCk7CisKK1dlIG5vdyBzdGFydCBhIHRvcC1kb3duIGxvb2sgYXQgdGhlIGNvZGU6CisKK01BSU4uQzogIFRoZSBtYWluIHJvdXRpbmUgcGVyZm9ybXMgc29tZSBpbml0aWFsaXphdGlvbiwgZXhlY3V0ZXMKK3RoZSB1c2VyJ3MgcHJvZmlsZSBpZiBuZWNlc3NhcnksIGFuZCBjYWxscyBjbWRsb29wLiAgQ21kbG9vcCBpcworcmVwZWF0ZWRseSBwYXJzZXMgYW5kIGV4ZWN1dGVzIGNvbW1hbmRzLgorCitPUFRJT05TLkM6ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG9wdGlvbiBwcm9jZXNzaW5nIGNvZGUuICBJdCBpcworY2FsbGVkIGZyb20gbWFpbiB0byBwYXJzZSB0aGUgc2hlbGwgYXJndW1lbnRzIHdoZW4gdGhlIHNoZWxsIGlzCitpbnZva2VkLCBhbmQgaXQgYWxzbyBjb250YWlucyB0aGUgc2V0IGJ1aWx0aW4uICBUaGUgLWkgYW5kIC1qIG9wLQordGlvbnMgKHRoZSBsYXR0ZXIgdHVybnMgb24gam9iIGNvbnRyb2wpIHJlcXVpcmUgY2hhbmdlcyBpbiBzaWduYWwKK2hhbmRsaW5nLiAgVGhlIHJvdXRpbmVzIHNldGpvYmN0bCAoaW4gam9icy5jKSBhbmQgc2V0aW50ZXJhY3RpdmUKKyhpbiB0cmFwLmMpIGFyZSBjYWxsZWQgdG8gaGFuZGxlIGNoYW5nZXMgdG8gdGhlc2Ugb3B0aW9ucy4KKworUEFSU0lORzogIFRoZSBwYXJzZXIgY29kZSBpcyBhbGwgaW4gcGFyc2VyLmMuICBBIHJlY3Vyc2l2ZSBkZXMtCitjZW50IHBhcnNlciBpcyB1c2VkLiAgU3ludGF4IHRhYmxlcyAoZ2VuZXJhdGVkIGJ5IG1rc3ludGF4KSBhcmUKK3VzZWQgdG8gY2xhc3NpZnkgY2hhcmFjdGVycyBkdXJpbmcgbGV4aWNhbCBhbmFseXNpcy4gIFRoZXJlIGFyZQordGhyZWUgdGFibGVzOiAgb25lIGZvciBub3JtYWwgdXNlLCBvbmUgZm9yIHVzZSB3aGVuIGluc2lkZSBzaW5nbGUKK3F1b3RlcywgYW5kIG9uZSBmb3IgdXNlIHdoZW4gaW5zaWRlIGRvdWJsZSBxdW90ZXMuICBUaGUgdGFibGVzCithcmUgbWFjaGluZSBkZXBlbmRlbnQgYmVjYXVzZSB0aGV5IGFyZSBpbmRleGVkIGJ5IGNoYXJhY3RlciB2YXJpLQorYWJsZXMgYW5kIHRoZSByYW5nZSBvZiBhIGNoYXIgdmFyaWVzIGZyb20gbWFjaGluZSB0byBtYWNoaW5lLgorCitQQVJTRSBPVVRQVVQ6ICBUaGUgb3V0cHV0IG9mIHRoZSBwYXJzZXIgY29uc2lzdHMgb2YgYSB0cmVlIG9mCitub2Rlcy4gIFRoZSB2YXJpb3VzIHR5cGVzIG9mIG5vZGVzIGFyZSBkZWZpbmVkIGluIHRoZSBmaWxlIG5vZGUtCit0eXBlcy4KKworTm9kZXMgb2YgdHlwZSBOQVJHIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoIHdvcmRzIGFuZCB0aGUgY29uLQordGVudHMgb2YgaGVyZSBkb2N1bWVudHMuICBBbiBlYXJseSB2ZXJzaW9uIG9mIGFzaCBrZXB0IHRoZSBjb24tCit0ZW50cyBvZiBoZXJlIGRvY3VtZW50cyBpbiB0ZW1wb3JhcnkgZmlsZXMsIGJ1dCBrZWVwaW5nIGhlcmUgZG8tCitjdW1lbnRzIGluIG1lbW9yeSB0eXBpY2FsbHkgcmVzdWx0cyBpbiBzaWduaWZpY2FudGx5IGJldHRlciBwZXItCitmb3JtYW5jZS4gIEl0IHdvdWxkIGhhdmUgYmVlbiBuaWNlIHRvIG1ha2UgaXQgYW4gb3B0aW9uIHRvIHVzZQordGVtcG9yYXJ5IGZpbGVzIGZvciBoZXJlIGRvY3VtZW50cywgZm9yIHRoZSBiZW5lZml0IG9mIHNtYWxsCittYWNoaW5lcywgYnV0IHRoZSBjb2RlIHRvIGtlZXAgdHJhY2sgb2Ygd2hlbiB0byBkZWxldGUgdGhlIHRlbS0KK3BvcmFyeSBmaWxlcyB3YXMgY29tcGxleCBhbmQgSSBuZXZlciBmaXhlZCBhbGwgdGhlIGJ1Z3MgaW4gaXQuCisoQVQmVCBoYXMgYmVlbiBtYWludGFpbmluZyB0aGUgQm91cm5lIHNoZWxsIGZvciBtb3JlIHRoYW4gdGVuCit5ZWFycywgYW5kIHRvIHRoZSBiZXN0IG9mIG15IGtub3dsZWRnZSB0aGV5IHN0aWxsIGhhdmVuJ3QgZ290dGVuCitpdCB0byBoYW5kbGUgdGVtcG9yYXJ5IGZpbGVzIGNvcnJlY3RseSBpbiBvYnNjdXJlIGNhc2VzLikKKworVGhlIHRleHQgZmllbGQgb2YgYSBOQVJHIHN0cnVjdHVyZSBwb2ludHMgdG8gdGhlIHRleHQgb2YgdGhlCit3b3JkLiAgVGhlIHRleHQgY29uc2lzdHMgb2Ygb3JkaW5hcnkgY2hhcmFjdGVycyBhbmQgYSBudW1iZXIgb2YKK3NwZWNpYWwgY29kZXMgZGVmaW5lZCBpbiBwYXJzZXIuaC4gIFRoZSBzcGVjaWFsIGNvZGVzIGFyZToKKworICAgICAgICBDVExWQVIgICAgICAgICAgICAgIFZhcmlhYmxlIHN1YnN0aXR1dGlvbgorICAgICAgICBDVExFTkRWQVIgICAgICAgICAgIEVuZCBvZiB2YXJpYWJsZSBzdWJzdGl0dXRpb24KKyAgICAgICAgQ1RMQkFDS1EgICAgICAgICAgICBDb21tYW5kIHN1YnN0aXR1dGlvbgorICAgICAgICBDVExCQUNLUXxDVExRVU9URSAgIENvbW1hbmQgc3Vic3RpdHV0aW9uIGluc2lkZSBkb3VibGUgcXVvdGVzCisgICAgICAgIENUTEVTQyAgICAgICAgICAgICAgRXNjYXBlIG5leHQgY2hhcmFjdGVyCisKK0EgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CisKKyAgICAgICAgQ1RMVkFSIHR5cGUgbmFtZSAnPScgWyBhbHRlcm5hdGl2ZS10ZXh0IENUTEVORFZBUiBdCisKK1RoZSB0eXBlIGZpZWxkIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIHN1Yi0KK3N0aXR1dGlvbi4gIFRoZSBwb3NzaWJsZSB0eXBlcyBhcmU6CisKKyAgICAgICAgVlNOT1JNQUwgICAgICAgICAgICAkdmFyCisgICAgICAgIFZTTUlOVVMgICAgICAgICAgICAgJHt2YXItdGV4dH0KKyAgICAgICAgVlNNSU5VU3xWU05VTCAgICAgICAke3ZhcjotdGV4dH0KKyAgICAgICAgVlNQTFVTICAgICAgICAgICAgICAke3Zhcit0ZXh0fQorICAgICAgICBWU1BMVVN8VlNOVUwgICAgICAgICR7dmFyOit0ZXh0fQorICAgICAgICBWU1FVRVNUSU9OICAgICAgICAgICR7dmFyP3RleHR9CisgICAgICAgIFZTUVVFU1RJT058VlNOVUwgICAgJHt2YXI6P3RleHR9CisgICAgICAgIFZTQVNTSUdOICAgICAgICAgICAgJHt2YXI9dGV4dH0KKyAgICAgICAgVlNBU1NJR058VlNOVUwgICAgICAke3Zhcj10ZXh0fQorCitJbiBhZGRpdGlvbiwgdGhlIHR5cGUgZmllbGQgd2lsbCBoYXZlIHRoZSBWU1FVT1RFIGZsYWcgc2V0IGlmIHRoZQordmFyaWFibGUgaXMgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3Rlcy4gIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZQorY29tZXMgbmV4dCwgdGVybWluYXRlZCBieSBhbiBlcXVhbHMgc2lnbi4gIElmIHRoZSB0eXBlIGlzIG5vdAorVlNOT1JNQUwsIHRoZW4gdGhlIHRleHQgZmllbGQgaW4gdGhlIHN1YnN0aXR1dGlvbiBmb2xsb3dzLCB0ZXItCittaW5hdGVkIGJ5IGEgQ1RMRU5EVkFSIGJ5dGUuCisKK0NvbW1hbmRzIGluIGJhY2sgcXVvdGVzIGFyZSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0LgorVGhlIGxvY2F0aW9ucyBvZiB0aGVzZSBjb21tYW5kcyBpbiB0aGUgc3RyaW5nIGFyZSBpbmRpY2F0ZWQgYnkKK0NUTEJBQ0tRIGFuZCBDVExCQUNLUStDVExRVU9URSBjaGFyYWN0ZXJzLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyCit0aGUgYmFjayBxdW90ZXMgd2VyZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzLgorCitUaGUgY2hhcmFjdGVyIENUTEVTQyBlc2NhcGVzIHRoZSBuZXh0IGNoYXJhY3Rlciwgc28gdGhhdCBpbiBjYXNlCithbnkgb2YgdGhlIENUTCBjaGFyYWN0ZXJzIG1lbnRpb25lZCBhYm92ZSBhcHBlYXIgaW4gdGhlIGlucHV0LAordGhleSBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdHJhbnNwYXJlbnRseS4gIENUTEVTQyBpcyBhbHNvIHVzZWQgdG8KK2VzY2FwZSAnKicsICc/JywgJ1snLCBhbmQgJyEnIGNoYXJhY3RlcnMgd2hpY2ggd2VyZSBxdW90ZWQgYnkgdGhlCit1c2VyIGFuZCB0aHVzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZmlsZSBuYW1lIGdlbmVyYXRpb24uCisKK0NUTEVTQyBjaGFyYWN0ZXJzIGhhdmUgcHJvdmVkIHRvIGJlIHBhcnRpY3VsYXJseSB0cmlja3kgdG8gZ2V0CityaWdodC4gIEluIHRoZSBjYXNlIG9mIGhlcmUgZG9jdW1lbnRzIHdoaWNoIGFyZSBub3Qgc3ViamVjdCB0bwordmFyaWFibGUgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCB0aGUgcGFyc2VyIGRvZXNuJ3QgaW5zZXJ0IGFueQorQ1RMRVNDIGNoYXJhY3RlcnMgdG8gYmVnaW4gd2l0aCAoc28gdGhlIGNvbnRlbnRzIG9mIHRoZSB0ZXh0CitmaWVsZCBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGFueSBwcm9jZXNzaW5nKS4gIE90aGVyIGhlcmUgZG9jdS0KK21lbnRzLCBhbmQgd29yZHMgd2hpY2ggYXJlIG5vdCBzdWJqZWN0IHRvIHNwbGl0dGluZyBhbmQgZmlsZSBuYW1lCitnZW5lcmF0aW9uLCBoYXZlIHRoZSBDVExFU0MgY2hhcmFjdGVycyByZW1vdmVkIGR1cmluZyB0aGUgdmFyaS0KK2FibGUgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uIHBoYXNlLiAgV29yZHMgd2hpY2ggYXJlIHN1YmplY3QKK3NwbGl0dGluZyBhbmQgZmlsZSBuYW1lIGdlbmVyYXRpb24gaGF2ZSB0aGUgQ1RMRVNDIGNoYXJhY3RlcnMgcmUtCittb3ZlZCBhcyBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUgcGhhc2UuCisKK0VYRUNVVElPTjogIENvbW1hbmQgZXhlY3V0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgICAgZXZhbC5jICAgICBUaGUgdG9wIGxldmVsIHJvdXRpbmVzLgorICAgICAgICByZWRpci5jICAgIENvZGUgdG8gaGFuZGxlIHJlZGlyZWN0aW9uIG9mIGlucHV0IGFuZCBvdXRwdXQuCisgICAgICAgIGpvYnMuYyAgICAgQ29kZSB0byBoYW5kbGUgZm9ya2luZywgd2FpdGluZywgYW5kIGpvYiBjb250cm9sLgorICAgICAgICBleGVjLmMgICAgIENvZGUgdG8gdG8gcGF0aCBzZWFyY2hlcyBhbmQgdGhlIGFjdHVhbCBleGVjIHN5cyBjYWxsLgorICAgICAgICBleHBhbmQuYyAgIENvZGUgdG8gZXZhbHVhdGUgYXJndW1lbnRzLgorICAgICAgICB2YXIuYyAgICAgIE1haW50YWlucyB0aGUgdmFyaWFibGUgc3ltYm9sIHRhYmxlLiAgQ2FsbGVkIGZyb20gZXhwYW5kLmMuCisKK0VWQUwuQzogIEV2YWx0cmVlIHJlY3Vyc2l2ZWx5IGV4ZWN1dGVzIGEgcGFyc2UgdHJlZS4gIFRoZSBleGl0CitzdGF0dXMgaXMgcmV0dXJuZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBleGl0c3RhdHVzLiAgVGhlIGFsdGVyLQorbmF0aXZlIGVudHJ5IGV2YWxiYWNrY21kIGlzIGNhbGxlZCB0byBldmFsdWF0ZSBjb21tYW5kcyBpbiBiYWNrCitxdW90ZXMuICBJdCBzYXZlcyB0aGUgcmVzdWx0IGluIG1lbW9yeSBpZiB0aGUgY29tbWFuZCBpcyBhIGJ1aWwtCit0aW47IG90aGVyd2lzZSBpdCBmb3JrcyBvZmYgYSBjaGlsZCB0byBleGVjdXRlIHRoZSBjb21tYW5kIGFuZAorY29ubmVjdHMgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgY2hpbGQgdG8gYSBwaXBlLgorCitKT0JTLkM6ICBUbyBjcmVhdGUgYSBwcm9jZXNzLCB5b3UgY2FsbCBtYWtlam9iIHRvIHJldHVybiBhIGpvYgorc3RydWN0dXJlLCBhbmQgdGhlbiBjYWxsIGZvcmtzaGVsbCAocGFzc2luZyB0aGUgam9iIHN0cnVjdHVyZSBhcworYW4gYXJndW1lbnQpIHRvIGNyZWF0ZSB0aGUgcHJvY2Vzcy4gIFdhaXRmb3Jqb2Igd2FpdHMgZm9yIGEgam9iCit0byBjb21wbGV0ZS4gIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBwcm9jZXNzIGdyb3VwcyBpZiBqb2IKK2NvbnRyb2wgaXMgZGVmaW5lZC4KKworUkVESVIuQzogIEFzaCBhbGxvd3MgZmlsZSBkZXNjcmlwdG9ycyB0byBiZSByZWRpcmVjdGVkIGFuZCB0aGVuCityZXN0b3JlZCB3aXRob3V0IGZvcmtpbmcgb2ZmIGEgY2hpbGQgcHJvY2Vzcy4gIFRoaXMgaXMgYWNjb20tCitwbGlzaGVkIGJ5IGR1cGxpY2F0aW5nIHRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3JzLiAgVGhlIHJlZGlyLQordGFiIHN0cnVjdHVyZSByZWNvcmRzIHdoZXJlIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGhhdmUgYmUgZHVwbGktCitjYXRlZCB0by4KKworRVhFQy5DOiAgVGhlIHJvdXRpbmUgZmluZF9jb21tYW5kIGxvY2F0ZXMgYSBjb21tYW5kLCBhbmQgZW50ZXJzCit0aGUgY29tbWFuZCBpbiB0aGUgaGFzaCB0YWJsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gIFRoZQordGhpcmQgYXJndW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgaXQgaXMgdG8gcHJpbnQgYW4gZXJyb3IgbWVzc2FnZQoraWYgdGhlIGNvbW1hbmQgaXMgbm90IGZvdW5kLiAgKFdoZW4gYSBwaXBlbGluZSBpcyBzZXQgdXAsCitmaW5kX2NvbW1hbmQgaXMgY2FsbGVkIGZvciBhbGwgdGhlIGNvbW1hbmRzIGluIHRoZSBwaXBlbGluZSBiZS0KK2ZvcmUgYW55IGZvcmtpbmcgaXMgZG9uZSwgc28gdG8gZ2V0IHRoZSBjb21tYW5kcyBpbnRvIHRoZSBoYXNoCit0YWJsZSBvZiB0aGUgcGFyZW50IHByb2Nlc3MuICBCdXQgdG8gbWFrZSBjb21tYW5kIGhhc2hpbmcgYXMKK3RyYW5zcGFyZW50IGFzIHBvc3NpYmxlLCB3ZSBzaWxlbnRseSBpZ25vcmUgZXJyb3JzIGF0IHRoYXQgcG9pbnQKK2FuZCBvbmx5IHByaW50IGVycm9yIG1lc3NhZ2VzIGlmIHRoZSBjb21tYW5kIGNhbm5vdCBiZSBmb3VuZAorbGF0ZXIuKQorCitUaGUgcm91dGluZSBzaGVsbGV4ZWMgaXMgdGhlIGludGVyZmFjZSB0byB0aGUgZXhlYyBzeXN0ZW0gY2FsbC4KKworRVhQQU5ELkM6ICBBcmd1bWVudHMgYXJlIHByb2Nlc3NlZCBpbiB0aHJlZSBwYXNzZXMuICBUaGUgZmlyc3QKKyhwZXJmb3JtZWQgYnkgdGhlIHJvdXRpbmUgYXJnc3RyKSBwZXJmb3JtcyB2YXJpYWJsZSBhbmQgY29tbWFuZAorc3Vic3RpdHV0aW9uLiAgVGhlIHNlY29uZCAoaWZzYnJlYWt1cCkgcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcKK2FuZCB0aGUgdGhpcmQgKGV4cGFuZG1ldGEpIHBlcmZvcm1zIGZpbGUgbmFtZSBnZW5lcmF0aW9uLiAgSWYgdGhlCisiL3UiIGRpcmVjdG9yeSBpcyBzaW11bGF0ZWQsIHRoZW4gd2hlbiAiL3UvdXNlcm5hbWUiIGlzIHJlcGxhY2VkCitieSB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCB0aGUgZmxhZyAiZGlkdWRpciIgaXMgc2V0LiAgVGhpcwordGVsbHMgdGhlIGNkIGNvbW1hbmQgdGhhdCBpdCBzaG91bGQgcHJpbnQgb3V0IHRoZSBkaXJlY3RvcnkgbmFtZSwKK2p1c3QgYXMgaXQgd291bGQgaWYgdGhlICIvdSIgZGlyZWN0b3J5IHdlcmUgaW1wbGVtZW50ZWQgdXNpbmcKK3N5bWJvbGljIGxpbmtzLgorCitWQVIuQzogIFZhcmlhYmxlcyBhcmUgc3RvcmVkIGluIGEgaGFzaCB0YWJsZS4gIFByb2JhYmx5IHdlIHNob3VsZAorc3dpdGNoIHRvIGV4dGVuc2libGUgaGFzaGluZy4gIFRoZSB2YXJpYWJsZSBuYW1lIGlzIHN0b3JlZCBpbiB0aGUKK3NhbWUgc3RyaW5nIGFzIHRoZSB2YWx1ZSAodXNpbmcgdGhlIGZvcm1hdCAibmFtZT12YWx1ZSIpIHNvIHRoYXQKK25vIHN0cmluZyBjb3B5aW5nIGlzIG5lZWRlZCB0byBjcmVhdGUgdGhlIGVudmlyb25tZW50IG9mIGEgY29tLQorbWFuZC4gIFZhcmlhYmxlcyB3aGljaCB0aGUgc2hlbGwgcmVmZXJlbmNlcyBpbnRlcm5hbGx5IGFyZSBwcmVhbC0KK2xvY2F0ZWQgc28gdGhhdCB0aGUgc2hlbGwgY2FuIHJlZmVyZW5jZSB0aGUgdmFsdWVzIG9mIHRoZXNlIHZhcmktCithYmxlcyB3aXRob3V0IGRvaW5nIGEgbG9va3VwLgorCitXaGVuIGEgcHJvZ3JhbSBpcyBydW4sIHRoZSBjb2RlIGluIGV2YWwuYyBzdGlja3MgYW55IGVudmlyb25tZW50Cit2YXJpYWJsZXMgd2hpY2ggcHJlY2VkZSB0aGUgY29tbWFuZCAoYXMgaW4gIlBBVEg9eHh4IGNvbW1hbmQiKSBpbgordGhlIHZhcmlhYmxlIHRhYmxlIGFzIHRoZSBzaW1wbGVzdCB3YXkgdG8gc3RyaXAgZHVwbGljYXRlcywgYW5kCit0aGVuIGNhbGxzICJlbnZpcm9ubWVudCIgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQuCitUaGVyZSBhcmUgdHdvIGNvbnNlcXVlbmNlcyBvZiB0aGlzLiAgRmlyc3QsIGlmIGFuIGFzc2lnbm1lbnQgdG8KK1BBVEggcHJlY2VkZXMgdGhlIGNvbW1hbmQsIHRoZSB2YWx1ZSBvZiBQQVRIIGJlZm9yZSB0aGUgYXNzaWduLQorbWVudCBtdXN0IGJlIHJlbWVtYmVyZWQgYW5kIHBhc3NlZCB0byBzaGVsbGV4ZWMuICBTZWNvbmQsIGlmIHRoZQorcHJvZ3JhbSB0dXJucyBvdXQgdG8gYmUgYSBzaGVsbCBwcm9jZWR1cmUsIHRoZSBzdHJpbmdzIGZyb20gdGhlCitlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggcHJlY2VkZWQgdGhlIGNvbW1hbmQgbXVzdCBiZSBwdWxsZWQKK291dCBvZiB0aGUgdGFibGUgYW5kIHJlcGxhY2VkIHdpdGggc3RyaW5ncyBvYnRhaW5lZCBmcm9tIG1hbGxvYywKK3NpbmNlIHRoZSBmb3JtZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGZyZWVkIHdoZW4gdGhlIHN0YWNrIChzZWUKK3RoZSBlbnRyeSBvbiBtZW1hbGxvYy5jKSBpcyBlbXB0aWVkLgorCitCVUlMVElOIENPTU1BTkRTOiAgVGhlIHByb2NlZHVyZXMgZm9yIGhhbmRsaW5nIHRoZXNlIGFyZSBzY2F0LQordGVyZWQgdGhyb3VnaG91dCB0aGUgY29kZSwgZGVwZW5kaW5nIG9uIHdoaWNoIGxvY2F0aW9uIGFwcGVhcnMKK21vc3QgYXBwcm9wcmlhdGUuICBUaGV5IGNhbiBiZSByZWNvZ25pemVkIGJlY2F1c2UgdGhlaXIgbmFtZXMgYWwtCit3YXlzIGVuZCBpbiAiY21kIi4gIFRoZSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gcHJvY2VkdXJlcyBpcworc3BlY2lmaWVkIGluIHRoZSBmaWxlIGJ1aWx0aW5zLCB3aGljaCBpcyBwcm9jZXNzZWQgYnkgdGhlIG1rYnVpbC0KK3RpbnMgY29tbWFuZC4KKworQSBidWlsdGluIGNvbW1hbmQgaXMgaW52b2tlZCB3aXRoIGFyZ2MgYW5kIGFyZ3Ygc2V0IHVwIGxpa2UgYQorbm9ybWFsIHByb2dyYW0uICBBIGJ1aWx0aW4gY29tbWFuZCBpcyBhbGxvd2VkIHRvIG92ZXJ3cml0ZSBpdHMKK2FyZ3VtZW50cy4gIEJ1aWx0aW4gcm91dGluZXMgY2FuIGNhbGwgbmV4dG9wdCB0byBkbyBvcHRpb24gcGFycy0KK2luZy4gIFRoaXMgaXMga2luZCBvZiBsaWtlIGdldG9wdCwgYnV0IHlvdSBkb24ndCBwYXNzIGFyZ2MgYW5kCithcmd2IHRvIGl0LiAgQnVpbHRpbiByb3V0aW5lcyBjYW4gYWxzbyBjYWxsIGVycm9yLiAgVGhpcyByb3V0aW5lCitub3JtYWxseSB0ZXJtaW5hdGVzIHRoZSBzaGVsbCAob3IgcmV0dXJucyB0byB0aGUgbWFpbiBjb21tYW5kCitsb29wIGlmIHRoZSBzaGVsbCBpcyBpbnRlcmFjdGl2ZSksIGJ1dCB3aGVuIGNhbGxlZCBmcm9tIGEgYnVpbHRpbgorY29tbWFuZCBpdCBjYXVzZXMgdGhlIGJ1aWx0aW4gY29tbWFuZCB0byB0ZXJtaW5hdGUgd2l0aCBhbiBleGl0CitzdGF0dXMgb2YgMi4KKworVGhlIGRpcmVjdG9yeSBibHRpbnMgY29udGFpbnMgY29tbWFuZHMgd2hpY2ggY2FuIGJlIGNvbXBpbGVkIGluLQorZGVwZW5kZW50bHkgYnV0IGNhbiBhbHNvIGJlIGJ1aWx0IGludG8gdGhlIHNoZWxsIGZvciBlZmZpY2llbmN5CityZWFzb25zLiAgVGhlIG1ha2VmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGNvbXBpbGVzIHRoZXNlIHByb2dyYW1zCitpbiB0aGUgbm9ybWFsIGZhc2hpb24gKHNvIHRoYXQgdGhleSBjYW4gYmUgcnVuIHJlZ2FyZGxlc3Mgb2YKK3doZXRoZXIgdGhlIGludm9rZXIgaXMgYXNoKSwgYnV0IGFsc28gY3JlYXRlcyBhIGxpYnJhcnkgbmFtZWQKK2JsdGlubGliLmEgd2hpY2ggY2FuIGJlIGxpbmtlZCB3aXRoIGFzaC4gIFRoZSBoZWFkZXIgZmlsZSBibHRpbi5oCit0YWtlcyBjYXJlIG9mIG1vc3Qgb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGFzaCBhbmQgdGhlCitzdGFuZC1hbG9uZSBlbnZpcm9ubWVudC4gIFRoZSB1c2VyIHNob3VsZCBjYWxsIHRoZSBtYWluIHJvdXRpbmUKKyJtYWluIiwgYW5kICNkZWZpbmUgbWFpbiB0byBiZSB0aGUgbmFtZSBvZiB0aGUgcm91dGluZSB0byB1c2UKK3doZW4gdGhlIHByb2dyYW0gaXMgbGlua2VkIGludG8gYXNoLiAgVGhpcyAjZGVmaW5lIHNob3VsZCBhcHBlYXIKK2JlZm9yZSBibHRpbi5oIGlzIGluY2x1ZGVkOyBibHRpbi5oIHdpbGwgI3VuZGVmIG1haW4gaWYgdGhlIHByby0KK2dyYW0gaXMgdG8gYmUgY29tcGlsZWQgc3RhbmQtYWxvbmUuCisKK0NELkM6ICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY2QgYW5kIHB3ZCBidWlsdGlucy4gIFRoZSBwd2QgY29tLQorbWFuZCBydW5zIC9iaW4vcHdkIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGludm9rZWQgKHVubGVzcyB0aGUgdXNlcgoraGFzIGFscmVhZHkgZG9uZSBhIGNkIHRvIGFuIGFic29sdXRlIHBhdGhuYW1lKSwgYnV0IHRoZW4KK3JlbWVtYmVycyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHVwZGF0ZXMgaXQgd2hlbiB0aGUgY2QgY29tLQorbWFuZCBpcyBydW4sIHNvIHN1YnNlcXVlbnQgcHdkIGNvbW1hbmRzIHJ1biB2ZXJ5IGZhc3QuICBUaGUgbWFpbgorY29tcGxpY2F0aW9uIGluIHRoZSBjZCBjb21tYW5kIGlzIGluIHRoZSBkb2NkIGNvbW1hbmQsIHdoaWNoCityZXNvbHZlcyBzeW1ib2xpYyBsaW5rcyBpbnRvIGFjdHVhbCBuYW1lcyBhbmQgaW5mb3JtcyB0aGUgdXNlcgord2hlcmUgdGhlIHVzZXIgZW5kZWQgdXAgaWYgaGUgY3Jvc3NlZCBhIHN5bWJvbGljIGxpbmsuCisKK1NJR05BTFM6ICBUcmFwLmMgaW1wbGVtZW50cyB0aGUgdHJhcCBjb21tYW5kLiAgVGhlIHJvdXRpbmUgc2V0LQorc2lnbmFsIGZpZ3VyZXMgb3V0IHdoYXQgYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIGEgc2lnbmFsIGlzCityZWNlaXZlZCBhbmQgaW52b2tlcyB0aGUgc2lnbmFsIHN5c3RlbSBjYWxsIHRvIHNldCB0aGUgc2lnbmFsIGFjLQordGlvbiBhcHByb3ByaWF0ZWx5LiAgV2hlbiBhIHNpZ25hbCB0aGF0IGEgdXNlciBoYXMgc2V0IGEgdHJhcCBmb3IKK2lzIGNhdWdodCwgdGhlIHJvdXRpbmUgIm9uc2lnIiBzZXRzIGEgZmxhZy4gIFRoZSByb3V0aW5lIGRvdHJhcAoraXMgY2FsbGVkIGF0IGFwcHJvcHJpYXRlIHBvaW50cyB0byBhY3R1YWxseSBoYW5kbGUgdGhlIHNpZ25hbC4KK1doZW4gYW4gaW50ZXJydXB0IGlzIGNhdWdodCBhbmQgbm8gdHJhcCBoYXMgYmVlbiBzZXQgZm9yIHRoYXQKK3NpZ25hbCwgdGhlIHJvdXRpbmUgIm9uaW50IiBpbiBlcnJvci5jIGlzIGNhbGxlZC4KKworT1VUUFVUOiAgQXNoIHVzZXMgaXQncyBvd24gb3V0cHV0IHJvdXRpbmVzLiAgVGhlcmUgYXJlIHRocmVlIG91dC0KK3B1dCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZC4gICJPdXRwdXQiIHJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIG91dC0KK3B1dCwgImVycm91dCIgdGhlIHN0YW5kYXJkIGVycm9yLCBhbmQgIm1lbW91dCIgY29udGFpbnMgb3V0cHV0Cit3aGljaCBpcyB0byBiZSBzdG9yZWQgaW4gbWVtb3J5LiAgVGhpcyBsYXN0IGlzIHVzZWQgd2hlbiBhIGJ1aWwtCit0aW4gY29tbWFuZCBhcHBlYXJzIGluIGJhY2txdW90ZXMsIHRvIGFsbG93IGl0cyBvdXRwdXQgdG8gYmUgY29sLQorbGVjdGVkIHdpdGhvdXQgZG9pbmcgYW55IEkvTyB0aHJvdWdoIHRoZSBVTklYIG9wZXJhdGluZyBzeXN0ZW0uCitUaGUgdmFyaWFibGVzIG91dDEgYW5kIG91dDIgbm9ybWFsbHkgcG9pbnQgdG8gb3V0cHV0IGFuZCBlcnJvdXQsCityZXNwZWN0aXZlbHksIGJ1dCB0aGV5IGFyZSBzZXQgdG8gcG9pbnQgdG8gbWVtb3V0IHdoZW4gYXBwcm9wcmktCithdGUgaW5zaWRlIGJhY2txdW90ZXMuCisKK0lOUFVUOiAgVGhlIGJhc2ljIGlucHV0IHJvdXRpbmUgaXMgcGdldGMsIHdoaWNoIHJlYWRzIGZyb20gdGhlCitjdXJyZW50IGlucHV0IGZpbGUuICBUaGVyZSBpcyBhIHN0YWNrIG9mIGlucHV0IGZpbGVzOyB0aGUgY3VycmVudAoraW5wdXQgZmlsZSBpcyB0aGUgdG9wIGZpbGUgb24gdGhpcyBzdGFjay4gIFRoZSBjb2RlIGFsbG93cyB0aGUKK2lucHV0IHRvIGNvbWUgZnJvbSBhIHN0cmluZyByYXRoZXIgdGhhbiBhIGZpbGUuICAoVGhpcyBpcyBmb3IgdGhlCistYyBvcHRpb24gYW5kIHRoZSAiLiIgYW5kIGV2YWwgYnVpbHRpbiBjb21tYW5kcy4pICBUaGUgZ2xvYmFsCit2YXJpYWJsZSBwbGlubm8gaXMgc2F2ZWQgYW5kIHJlc3RvcmVkIHdoZW4gZmlsZXMgYXJlIHB1c2hlZCBhbmQKK3BvcHBlZCBmcm9tIHRoZSBzdGFjay4gIFRoZSBwYXJzZXIgcm91dGluZXMgc3RvcmUgdGhlIG51bWJlciBvZgordGhlIGN1cnJlbnQgbGluZSBpbiB0aGlzIHZhcmlhYmxlLgorCitERUJVR0dJTkc6ICBJZiBERUJVRyBpcyBkZWZpbmVkIGluIHNoZWxsLmgsIHRoZW4gdGhlIHNoZWxsIHdpbGwKK3dyaXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0aGUgZmlsZSAkSE9NRS90cmFjZS4gIE1vc3Qgb2YKK3RoaXMgaXMgZG9uZSB1c2luZyB0aGUgVFJBQ0UgbWFjcm8sIHdoaWNoIHRha2VzIGEgc2V0IG9mIHByaW50ZgorYXJndW1lbnRzIGluc2lkZSB0d28gc2V0cyBvZiBwYXJlbnRoZXNpcy4gIEV4YW1wbGU6CisiVFJBQ0UoKCJuPSVkMCwgbikpIi4gIFRoZSBkb3VibGUgcGFyZW50aGVzaXMgYXJlIG5lY2Vzc2FyeSBiZS0KK2NhdXNlIHRoZSBwcmVwcm9jZXNzb3IgY2FuJ3QgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIGEgdmFyaWFibGUKK251bWJlciBvZiBhcmd1bWVudHMuICBEZWZpbmluZyBERUJVRyBhbHNvIGNhdXNlcyB0aGUgc2hlbGwgdG8KK2dlbmVyYXRlIGEgY29yZSBkdW1wIGlmIGl0IGlzIHNlbnQgYSBxdWl0IHNpZ25hbC4gIFRoZSB0cmFjaW5nCitjb2RlIGlzIGluIHNob3cuYy4KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2FsaWFzLmMgYi91c3IvZGFzaC9hbGlhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWFjYmIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9hbGlhcy5jCkBAIC0wLDAgKzEsMjI3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAiaW5wdXQuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJhbGlhcy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIJLyogWFhYIGZvciBhcmdwdHIgKHNob3VsZCByZW1vdmU/KSAqLworCisjZGVmaW5lIEFUQUJTSVpFIDM5CisKK3N0cnVjdCBhbGlhcyAqYXRhYltBVEFCU0laRV07CisKK1NUQVRJQyB2b2lkIHNldGFsaWFzKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK1NUQVRJQyBzdHJ1Y3QgYWxpYXMgKmZyZWVhbGlhcyhzdHJ1Y3QgYWxpYXMgKik7CitTVEFUSUMgc3RydWN0IGFsaWFzICoqX19sb29rdXBhbGlhcyhjb25zdCBjaGFyICopOworCitTVEFUSUMKK3ZvaWQKK3NldGFsaWFzKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwlzdHJ1Y3QgYWxpYXMgKmFwLCAqKmFwcDsKKworCWFwcCA9IF9fbG9va3VwYWxpYXMobmFtZSk7CisJYXAgPSAqYXBwOworCUlOVE9GRjsKKwlpZiAoYXApIHsKKwkJaWYgKCEoYXAtPmZsYWcgJiBBTElBU0lOVVNFKSkgeworCQkJY2tmcmVlKGFwLT52YWwpOworCQl9CisJCWFwLT52YWwJPSBzYXZlc3RyKHZhbCk7CisJCWFwLT5mbGFnICY9IH5BTElBU0RFQUQ7CisJfSBlbHNlIHsKKwkJLyogbm90IGZvdW5kICovCisJCWFwID0gY2ttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgYWxpYXMpKTsKKwkJYXAtPm5hbWUgPSBzYXZlc3RyKG5hbWUpOworCQlhcC0+dmFsID0gc2F2ZXN0cih2YWwpOworCQlhcC0+ZmxhZyA9IDA7CisJCWFwLT5uZXh0ID0gMDsKKwkJKmFwcCA9IGFwOworCX0KKwlJTlRPTjsKK30KKworaW50Cit1bmFsaWFzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFsaWFzICoqYXBwOworCisJYXBwID0gX19sb29rdXBhbGlhcyhuYW1lKTsKKworCWlmICgqYXBwKSB7CisJCUlOVE9GRjsKKwkJKmFwcCA9IGZyZWVhbGlhcygqYXBwKTsKKwkJSU5UT047CisJCXJldHVybiAoMCk7CisJfQorCisJcmV0dXJuICgxKTsKK30KKwordm9pZAorcm1hbGlhc2VzKHZvaWQpCit7CisJc3RydWN0IGFsaWFzICphcCwgKiphcHA7CisJaW50IGk7CisKKwlJTlRPRkY7CisJZm9yIChpID0gMDsgaSA8IEFUQUJTSVpFOyBpKyspIHsKKwkJYXBwID0gJmF0YWJbaV07CisJCWZvciAoYXAgPSAqYXBwOyBhcDsgYXAgPSAqYXBwKSB7CisJCQkqYXBwID0gZnJlZWFsaWFzKCphcHApOworCQkJaWYgKGFwID09ICphcHApIHsKKwkJCQlhcHAgPSAmYXAtPm5leHQ7CisJCQl9CisJCX0KKwl9CisJSU5UT047Cit9CisKK3N0cnVjdCBhbGlhcyAqCitsb29rdXBhbGlhcyhjb25zdCBjaGFyICpuYW1lLCBpbnQgY2hlY2spCit7CisJc3RydWN0IGFsaWFzICphcCA9ICpfX2xvb2t1cGFsaWFzKG5hbWUpOworCisJaWYgKGNoZWNrICYmIGFwICYmIChhcC0+ZmxhZyAmIEFMSUFTSU5VU0UpKQorCQlyZXR1cm4gKE5VTEwpOworCXJldHVybiAoYXApOworfQorCisvKgorICogVE9ETyAtIHNvcnQgb3V0cHV0CisgKi8KK2ludAorYWxpYXNjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm4sICp2OworCWludCByZXQgPSAwOworCXN0cnVjdCBhbGlhcyAqYXA7CisKKwlpZiAoYXJnYyA9PSAxKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBBVEFCU0laRTsgaSsrKQorCQkJZm9yIChhcCA9IGF0YWJbaV07IGFwOyBhcCA9IGFwLT5uZXh0KSB7CisJCQkJcHJpbnRhbGlhcyhhcCk7CisJCQl9CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlICgobiA9ICorK2FyZ3YpICE9IE5VTEwpIHsKKwkJaWYgKCh2ID0gc3RyY2hyKG4rMSwgJz0nKSkgPT0gTlVMTCkgeyAvKiBuKzE6IGZ1bm55IGtzaCBzdHVmZiAqLworCQkJaWYgKChhcCA9ICpfX2xvb2t1cGFsaWFzKG4pKSA9PSBOVUxMKSB7CisJCQkJb3V0Zm10KG91dDIsICIlczogJXMgbm90IGZvdW5kXG4iLCAiYWxpYXMiLCBuKTsKKwkJCQlyZXQgPSAxOworCQkJfSBlbHNlCisJCQkJcHJpbnRhbGlhcyhhcCk7CisJCX0gZWxzZSB7CisJCQkqdisrID0gJ1wwJzsKKwkJCXNldGFsaWFzKG4sIHYpOworCQl9CisJfQorCisJcmV0dXJuIChyZXQpOworfQorCitpbnQKK3VuYWxpYXNjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJd2hpbGUgKChpID0gbmV4dG9wdCgiYSIpKSAhPSAnXDAnKSB7CisJCWlmIChpID09ICdhJykgeworCQkJcm1hbGlhc2VzKCk7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCWZvciAoaSA9IDA7ICphcmdwdHI7IGFyZ3B0cisrKSB7CisJCWlmICh1bmFsaWFzKCphcmdwdHIpKSB7CisJCQlvdXRmbXQob3V0MiwgIiVzOiAlcyBub3QgZm91bmRcbiIsICJ1bmFsaWFzIiwgKmFyZ3B0cik7CisJCQlpID0gMTsKKwkJfQorCX0KKworCXJldHVybiAoaSk7Cit9CisKK1NUQVRJQyBzdHJ1Y3QgYWxpYXMgKgorZnJlZWFsaWFzKHN0cnVjdCBhbGlhcyAqYXApIHsKKwlzdHJ1Y3QgYWxpYXMgKm5leHQ7CisKKwlpZiAoYXAtPmZsYWcgJiBBTElBU0lOVVNFKSB7CisJCWFwLT5mbGFnIHw9IEFMSUFTREVBRDsKKwkJcmV0dXJuIGFwOworCX0KKworCW5leHQgPSBhcC0+bmV4dDsKKwlja2ZyZWUoYXAtPm5hbWUpOworCWNrZnJlZShhcC0+dmFsKTsKKwlja2ZyZWUoYXApOworCXJldHVybiBuZXh0OworfQorCit2b2lkCitwcmludGFsaWFzKGNvbnN0IHN0cnVjdCBhbGlhcyAqYXApIHsKKwlvdXQxZm10KCIlcz0lc1xuIiwgYXAtPm5hbWUsIHNpbmdsZV9xdW90ZShhcC0+dmFsKSk7Cit9CisKK1NUQVRJQyBzdHJ1Y3QgYWxpYXMgKioKK19fbG9va3VwYWxpYXMoY29uc3QgY2hhciAqbmFtZSkgeworCXVuc2lnbmVkIGludCBoYXNodmFsOworCXN0cnVjdCBhbGlhcyAqKmFwcDsKKwljb25zdCBjaGFyICpwOworCXVuc2lnbmVkIGludCBjaDsKKworCXAgPSBuYW1lOworCisJY2ggPSAodW5zaWduZWQgY2hhcikqcDsKKwloYXNodmFsID0gY2ggPDwgNDsKKwl3aGlsZSAoY2gpIHsKKwkJaGFzaHZhbCArPSBjaDsKKwkJY2ggPSAodW5zaWduZWQgY2hhcikqKytwOworCX0KKwlhcHAgPSAmYXRhYltoYXNodmFsICUgQVRBQlNJWkVdOworCisJZm9yICg7ICphcHA7IGFwcCA9ICYoKmFwcCktPm5leHQpIHsKKwkJaWYgKGVxdWFsKG5hbWUsICgqYXBwKS0+bmFtZSkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGFwcDsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2FsaWFzLmggYi91c3IvZGFzaC9hbGlhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODQxZDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9hbGlhcy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpYWxpYXMuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjZGVmaW5lIEFMSUFTSU5VU0UJMQorI2RlZmluZSBBTElBU0RFQUQJMgorCitzdHJ1Y3QgYWxpYXMgeworCXN0cnVjdCBhbGlhcyAqbmV4dDsKKwljaGFyICpuYW1lOworCWNoYXIgKnZhbDsKKwlpbnQgZmxhZzsKK307CisKK3N0cnVjdCBhbGlhcyAqbG9va3VwYWxpYXMoY29uc3QgY2hhciAqLCBpbnQpOworaW50IGFsaWFzY21kKGludCwgY2hhciAqKik7CitpbnQgdW5hbGlhc2NtZChpbnQsIGNoYXIgKiopOwordm9pZCBybWFsaWFzZXModm9pZCk7CitpbnQgdW5hbGlhcyhjb25zdCBjaGFyICopOwordm9pZCBwcmludGFsaWFzKGNvbnN0IHN0cnVjdCBhbGlhcyAqKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2FyaXRoLnkgYi91c3IvZGFzaC9hcml0aC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjBiMzkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9hcml0aC55CkBAIC0wLDAgKzEsMTU1IEBACisleworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJleHBhbmQuaCIKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKworY29uc3QgY2hhciAqYXJpdGhfYnVmLCAqYXJpdGhfc3RhcnRidWY7CisKKyNpZm5kZWYgWVlCSVNPTgoraW50IHl5cGFyc2Uodm9pZCk7CisjZW5kaWYKK3ZvaWQgeXllcnJvcihjb25zdCBjaGFyICopOworI2lmZGVmIFRFU1RBUklUSAoraW50IG1haW4oaW50ICwgY2hhciAqW10pOworaW50IHNoX2Vycm9yKGNoYXIgKik7CisjZW5kaWYKKworJX0KKyV0b2tlbiBBUklUSF9OVU0gQVJJVEhfTFBBUkVOIEFSSVRIX1JQQVJFTgorCislbGVmdCBBUklUSF9PUgorJWxlZnQgQVJJVEhfQU5ECislbGVmdCBBUklUSF9CT1IKKyVsZWZ0IEFSSVRIX0JYT1IKKyVsZWZ0IEFSSVRIX0JBTkQKKyVsZWZ0IEFSSVRIX0VRIEFSSVRIX05FCislbGVmdCBBUklUSF9MVCBBUklUSF9HVCBBUklUSF9HRSBBUklUSF9MRQorJWxlZnQgQVJJVEhfTFNISUZUIEFSSVRIX1JTSElGVAorJWxlZnQgQVJJVEhfQUREIEFSSVRIX1NVQgorJWxlZnQgQVJJVEhfTVVMIEFSSVRIX0RJViBBUklUSF9SRU0KKyVsZWZ0IEFSSVRIX1VOQVJZTUlOVVMgQVJJVEhfVU5BUllQTFVTIEFSSVRIX05PVCBBUklUSF9CTk9UCislJQorCitleHA6CWV4cHIgeworCQkJcmV0dXJuICgkMSk7CisJfQorCTsKKworCitleHByOglBUklUSF9MUEFSRU4gZXhwciBBUklUSF9SUEFSRU4geyAkJCA9ICQyOyB9CisJfCBleHByIEFSSVRIX09SIGV4cHIJeyAkJCA9ICQxIHx8ICQzOyB9CisJfCBleHByIEFSSVRIX0FORCBleHByCXsgJCQgPSAkMSAmJiAkMzsgfQorCXwgZXhwciBBUklUSF9CT1IgZXhwcgl7ICQkID0gJDEgfCAkMzsgfQorCXwgZXhwciBBUklUSF9CWE9SIGV4cHIJeyAkJCA9ICQxIF4gJDM7IH0KKwl8IGV4cHIgQVJJVEhfQkFORCBleHByCXsgJCQgPSAkMSAmICQzOyB9CisJfCBleHByIEFSSVRIX0VRIGV4cHIJeyAkJCA9ICQxID09ICQzOyB9CisJfCBleHByIEFSSVRIX0dUIGV4cHIJeyAkJCA9ICQxID4gJDM7IH0KKwl8IGV4cHIgQVJJVEhfR0UgZXhwcgl7ICQkID0gJDEgPj0gJDM7IH0KKwl8IGV4cHIgQVJJVEhfTFQgZXhwcgl7ICQkID0gJDEgPCAkMzsgfQorCXwgZXhwciBBUklUSF9MRSBleHByCXsgJCQgPSAkMSA8PSAkMzsgfQorCXwgZXhwciBBUklUSF9ORSBleHByCXsgJCQgPSAkMSAhPSAkMzsgfQorCXwgZXhwciBBUklUSF9MU0hJRlQgZXhwciB7ICQkID0gJDEgPDwgJDM7IH0KKwl8IGV4cHIgQVJJVEhfUlNISUZUIGV4cHIgeyAkJCA9ICQxID4+ICQzOyB9CisJfCBleHByIEFSSVRIX0FERCBleHByCXsgJCQgPSAkMSArICQzOyB9CisJfCBleHByIEFSSVRIX1NVQiBleHByCXsgJCQgPSAkMSAtICQzOyB9CisJfCBleHByIEFSSVRIX01VTCBleHByCXsgJCQgPSAkMSAqICQzOyB9CisJfCBleHByIEFSSVRIX0RJViBleHByCXsKKwkJCWlmICgkMyA9PSAwKQorCQkJCXl5ZXJyb3IoImRpdmlzaW9uIGJ5IHplcm8iKTsKKwkJCSQkID0gJDEgLyAkMzsKKwkJfQorCXwgZXhwciBBUklUSF9SRU0gZXhwciAgIHsKKwkJCWlmICgkMyA9PSAwKQorCQkJCXl5ZXJyb3IoImRpdmlzaW9uIGJ5IHplcm8iKTsKKwkJCSQkID0gJDEgJSAkMzsKKwkJfQorCXwgQVJJVEhfTk9UIGV4cHIJeyAkJCA9ICEoJDIpOyB9CisJfCBBUklUSF9CTk9UIGV4cHIJeyAkJCA9IH4oJDIpOyB9CisJfCBBUklUSF9TVUIgZXhwciAlcHJlYyBBUklUSF9VTkFSWU1JTlVTIHsgJCQgPSAtKCQyKTsgfQorCXwgQVJJVEhfQUREIGV4cHIgJXByZWMgQVJJVEhfVU5BUllQTFVTIHsgJCQgPSAkMjsgfQorCXwgQVJJVEhfTlVNCisJOworJSUKK2ludAorYXJpdGgocykKKwljb25zdCBjaGFyICpzOworeworCWxvbmcgcmVzdWx0OworCisJYXJpdGhfYnVmID0gYXJpdGhfc3RhcnRidWYgPSBzOworCisJSU5UT0ZGOworCXJlc3VsdCA9IHl5cGFyc2UoKTsKKwlhcml0aF9sZXhfcmVzZXQoKTsJLyogcmVwcmltZSBsZXggKi8KKwlJTlRPTjsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBURVNUX0FSSVRICisjaW5jbHVkZSA8c3RkaW8uaD4KK21haW4oYXJnYywgYXJndikKKwljaGFyICphcmd2W107Cit7CisJcHJpbnRmKCIlZFxuIiwgZXhwKGFyZ3ZbMV0pKTsKK30KK3NoX2Vycm9yKHMpCisJY2hhciAqczsKK3sKKwlmcHJpbnRmKHN0ZGVyciwgImV4cDogJXNcbiIsIHMpOworCWV4aXQoMSk7Cit9CisjZW5kaWYKKwordm9pZAoreXllcnJvcihzKQorCWNvbnN0IGNoYXIgKnM7Cit7CisKKyNpZm5kZWYgWVlCSVNPTgorCXl5ZXJyb2s7CisjZW5kaWYKKwl5eWNsZWFyaW47CisJYXJpdGhfbGV4X3Jlc2V0KCk7CS8qIHJlcHJpbWUgbGV4ICovCisJc2hfZXJyb3IoImFyaXRobWV0aWMgZXhwcmVzc2lvbjogJXM6IFwiJXNcIiIsIHMsIGFyaXRoX3N0YXJ0YnVmKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9hcml0aF95eWxleC5jIGIvdXNyL2Rhc2gvYXJpdGhfeXlsZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmEyMDUxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvYXJpdGhfeXlsZXguYwpAQCAtMCwwICsxLDE2MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIKKyAqCUhlcmJlcnQgWHUuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJhcml0aC5oIgorI2luY2x1ZGUgImV4cGFuZC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisKK2V4dGVybiBpbnQgeXlsdmFsOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFyaXRoX2J1ZiwgKmFyaXRoX3N0YXJ0YnVmOworCitpbnQKK3l5bGV4KCkKK3sKKwlpbnQgdmFsdWU7CisJY29uc3QgY2hhciAqYnVmID0gYXJpdGhfYnVmOworCisJZm9yICg7OykgeworCQlzd2l0Y2ggKCpidWYpIHsKKwkJY2FzZSAnICc6CisJCWNhc2UgJ1x0JzoKKwkJY2FzZSAnXG4nOgorCQkJYnVmKys7CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKK2VycjoKKwkJCXNoX2Vycm9yKCJhcml0aDogc3ludGF4IGVycm9yOiBcIiVzXCIiLCBhcml0aF9zdGFydGJ1Zik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCWNhc2UgJzAnOgorCQljYXNlICcxJzoKKwkJY2FzZSAnMic6CisJCWNhc2UgJzMnOgorCQljYXNlICc0JzoKKwkJY2FzZSAnNSc6CisJCWNhc2UgJzYnOgorCQljYXNlICc3JzoKKwkJY2FzZSAnOCc6CisJCWNhc2UgJzknOgorCQkJeXlsdmFsID0gc3RydG9sbChidWYsIChjaGFyICoqKSAmYXJpdGhfYnVmLCAwKTsKKwkJCXJldHVybiBBUklUSF9OVU07CisJCWNhc2UgJz0nOgorCQkJaWYgKCorK2J1ZiAhPSAnPScpIHsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXZhbHVlID0gQVJJVEhfRVE7CisJCQlicmVhazsKKwkJY2FzZSAnPic6CisJCQlzd2l0Y2ggKCorK2J1ZikgeworCQkJY2FzZSAnPSc6CisJCQkJdmFsdWUgPSBBUklUSF9HRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJz4nOgorCQkJCXZhbHVlID0gQVJJVEhfUlNISUZUOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl2YWx1ZSA9IEFSSVRIX0dUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJzwnOgorCQkJc3dpdGNoICgqKytidWYpIHsKKwkJCWNhc2UgJz0nOgorCQkJCXZhbHVlID0gQVJJVEhfTEU7CisJCQkJYnJlYWs7CisJCQljYXNlICc8JzoKKwkJCQl2YWx1ZSA9IEFSSVRIX0xTSElGVDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdmFsdWUgPSBBUklUSF9MVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd8JzoKKwkJCWlmICgqKytidWYgIT0gJ3wnKSB7CisJCQkJdmFsdWUgPSBBUklUSF9CT1I7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl2YWx1ZSA9IEFSSVRIX09SOworCQkJYnJlYWs7CisJCWNhc2UgJyYnOgorCQkJaWYgKCorK2J1ZiAhPSAnJicpIHsKKwkJCQl2YWx1ZSA9IEFSSVRIX0JBTkQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl2YWx1ZSA9IEFSSVRIX0FORDsKKwkJCWJyZWFrOworCQljYXNlICchJzoKKwkJCWlmICgqKytidWYgIT0gJz0nKSB7CisJCQkJdmFsdWUgPSBBUklUSF9OT1Q7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl2YWx1ZSA9IEFSSVRIX05FOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCXZhbHVlID0gMDsKKwkJCWdvdG8gb3V0OworCQljYXNlICcoJzoKKwkJCXZhbHVlID0gQVJJVEhfTFBBUkVOOworCQkJYnJlYWs7CisJCWNhc2UgJyknOgorCQkJdmFsdWUgPSBBUklUSF9SUEFSRU47CisJCQlicmVhazsKKwkJY2FzZSAnKic6CisJCQl2YWx1ZSA9IEFSSVRIX01VTDsKKwkJCWJyZWFrOworCQljYXNlICcvJzoKKwkJCXZhbHVlID0gQVJJVEhfRElWOworCQkJYnJlYWs7CisJCWNhc2UgJyUnOgorCQkJdmFsdWUgPSBBUklUSF9SRU07CisJCQlicmVhazsKKwkJY2FzZSAnKyc6CisJCQl2YWx1ZSA9IEFSSVRIX0FERDsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCXZhbHVlID0gQVJJVEhfU1VCOworCQkJYnJlYWs7CisJCWNhc2UgJ34nOgorCQkJdmFsdWUgPSBBUklUSF9CTk9UOworCQkJYnJlYWs7CisJCWNhc2UgJ14nOgorCQkJdmFsdWUgPSBBUklUSF9CWE9SOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJYnVmKys7CitvdXQ6CisJYXJpdGhfYnVmID0gYnVmOworCXJldHVybiB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2JsdGluL2JsdGluLmggYi91c3IvZGFzaC9ibHRpbi9ibHRpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YWMwNmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ibHRpbi9ibHRpbi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpYmx0aW4uaAk4LjEgKEJlcmtlbGV5KSA1LzMxLzkzCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBwcm9ncmFtcyB3aGljaCBhcmUgb3B0aW9uYWxseSBidWlsdCBpbnRvIHRoZQorICogc2hlbGwuICBJZiBTSEVMTCBpcyBkZWZpbmVkLCB3ZSB0cnkgdG8gbWFwIHRoZSBzdGFuZGFyZCBVTklYIGxpYnJhcnkKKyAqIHJvdXRpbmVzIHRvIGFzaCByb3V0aW5lcyB1c2luZyBkZWZpbmVzLgorICovCisKKyNpbmNsdWRlICIuLi9zaGVsbC5oIgorI2luY2x1ZGUgIi4uL215c3RyaW5nLmgiCisjaW5jbHVkZSAiLi4vb3B0aW9ucy5oIgorI2lmZGVmIFNIRUxMCisjaW5jbHVkZSAiLi4vbWVtYWxsb2MuaCIKKyNpbmNsdWRlICIuLi9vdXRwdXQuaCIKKyNpbmNsdWRlICIuLi9lcnJvci5oIgorI2lmbmRlZiBVU0VfR0xJQkNfU1RESU8KKyN1bmRlZiBzdGRvdXQKKyN1bmRlZiBzdGRlcnIKKyN1bmRlZiBwdXRjCisjdW5kZWYgcHV0Y2hhcgorI3VuZGVmIGZpbGVubworI2RlZmluZSBzdGRvdXQgb3V0MQorI2RlZmluZSBzdGRlcnIgb3V0MgorI2RlZmluZSBwcmludGYgb3V0MWZtdAorI2RlZmluZSBwdXRjKGMsIGZpbGUpCW91dGMoYywgZmlsZSkKKyNkZWZpbmUgcHV0Y2hhcihjKQlvdXQxYyhjKQorI2RlZmluZSBGSUxFIHN0cnVjdCBvdXRwdXQKKyNkZWZpbmUgZnByaW50ZiBvdXRmbXQKKyNkZWZpbmUgZnB1dHMgb3V0c3RyCisjZGVmaW5lIGZmbHVzaCBmbHVzaG91dAorI2RlZmluZSBmaWxlbm8oZikgKChmKS0+ZmQpCisjZGVmaW5lIGZlcnJvciBvdXRlcnIKKyNlbmRpZgorI2RlZmluZSBJTklUQVJHUyhhcmd2KQorI2RlZmluZQllcnJvciBzaF9lcnJvcgorI2RlZmluZQl3YXJuIHNoX3dhcm4KKyNkZWZpbmUJd2Fybnggc2hfd2FybngKKyNkZWZpbmUgZXhpdCBzaF9leGl0CisjZGVmaW5lIHNldHByb2duYW1lKHMpCisjZGVmaW5lIGdldHByb2duYW1lKCkgY29tbWFuZG5hbWUKKyNkZWZpbmUgc2V0bG9jYXRlKGwscykgMAorCisjZGVmaW5lIGdldGVudihwKSBibHRpbmxvb2t1cCgocCksMCkKKworI2Vsc2UKKyN1bmRlZiBOVUxMCisjaW5jbHVkZSA8c3RkaW8uaD4KKyN1bmRlZiBtYWluCisjZGVmaW5lIElOSVRBUkdTKGFyZ3YpCWlmICgoY29tbWFuZG5hbWUgPSBhcmd2WzBdKSA9PSBOVUxMKSB7ZnB1dHMoIkFyZ2MgaXMgemVyb1xuIiwgc3RkZXJyKTsgZXhpdCgyKTt9IGVsc2UKKyNlbmRpZgorCitpbnQgZWNob2NtZChpbnQsIGNoYXIgKiopOworCisKK2V4dGVybiBjb25zdCBjaGFyICpjb21tYW5kbmFtZTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2JsdGluL2VjaG8uMSBiL3Vzci9kYXNoL2JsdGluL2VjaG8uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM3ZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvYmx0aW4vZWNoby4xCkBAIC0wLDAgKzEsMTA5IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKy5cIglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKy5cIiBLZW5uZXRoIEFsbXF1aXN0LgorLlwiIENvcHlyaWdodCAxOTg5IGJ5IEtlbm5ldGggQWxtcXVpc3QKKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIglAKCMpZWNoby4xCTguMSAoQmVya2VsZXkpIDUvMzEvOTMKKy5cIgorLkRkIE1heSAzMSwgMTk5MworLkR0IEVDSE8gMQorLk9zCisuU2ggTkFNRQorLk5tIGVjaG8KKy5OZCBwcm9kdWNlIG1lc3NhZ2UgaW4gYSBzaGVsbCBzY3JpcHQKKy5TaCBTWU5PUFNJUworLk5tCisuT3AgRmwgbiB8IEZsIGUKKy5BciBhcmdzIC4uLgorLlNoIERFU0NSSVBUSU9OCisuTm0KK3ByaW50cyBpdHMgYXJndW1lbnRzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIHNlcGFyYXRlZCBieSBzcGFjZXMuCitVbmxlc3MgdGhlCisuRmwgbgorb3B0aW9uIGlzIHByZXNlbnQsIGEgbmV3bGluZSBpcyBvdXRwdXQgZm9sbG93aW5nIHRoZSBhcmd1bWVudHMuCitUaGUKKy5GbCBlCitvcHRpb24gY2F1c2VzCisuTm0KK3RvIHRyZWF0IHRoZSBlc2NhcGUgc2VxdWVuY2VzIHNwZWNpYWxseSwgYXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcKK3BhcmFncmFwaC4KK1RoZQorLkZsIGUKK29wdGlvbiBpcyB0aGUgZGVmYXVsdCwgYW5kIGlzIHByb3ZpZGVkIHNvbGVseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCitvdGhlciBzeXN0ZW1zLgorT25seSBvbmUgb2YgdGhlIG9wdGlvbnMKKy5GbCBuCithbmQKKy5GbCBlCittYXkgYmUgZ2l2ZW4uCisuUHAKK0lmIGFueSBvZiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIGlzIGVuY291bnRlcmVkIGR1cmluZworb3V0cHV0LCB0aGUgc2VxdWVuY2UgaXMgbm90IG91dHB1dC4gIEluc3RlYWQsIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGlzCitwZXJmb3JtZWQ6CisuQmwgLXRhZyAtd2lkdGggaW5kZW50CisuSXQgTGkgXGViCitBIGJhY2tzcGFjZSBjaGFyYWN0ZXIgaXMgb3V0cHV0LgorLkl0IExpIFxlYworU3Vic2VxdWVudCBvdXRwdXQgaXMgc3VwcHJlc3NlZC4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZQorbGFzdCBhcmd1bWVudCB0byBzdXBwcmVzcyB0aGUgdHJhaWxpbmcgbmV3bGluZSB0aGF0CisuTm0KK3dvdWxkIG90aGVyd2lzZSBvdXRwdXQuCisuSXQgTGkgXGVmCitPdXRwdXQgYSBmb3JtIGZlZWQuCisuSXQgTGkgXGVuCitPdXRwdXQgYSBuZXdsaW5lIGNoYXJhY3Rlci4KKy5JdCBMaSBcZXIKK091dHB1dCBhIGNhcnJpYWdlIHJldHVybi4KKy5JdCBMaSBcZXQKK091dHB1dCBhIChob3Jpem9udGFsKSB0YWIgY2hhcmFjdGVyLgorLkl0IExpIFxldgorT3V0cHV0IGEgdmVydGljYWwgdGFiLgorLkl0IExpIFxlMCBOcyBBciBkaWdpdHMKK091dHB1dCB0aGUgY2hhcmFjdGVyIHdob3NlIHZhbHVlIGlzIGdpdmVuIGJ5IHplcm8gdG8gdGhyZWUgZGlnaXRzLgorSWYgdGhlcmUgYXJlIHplcm8gZGlnaXRzLCBhIG51bCBjaGFyYWN0ZXIgaXMgb3V0cHV0LgorLkl0IExpIFxlXGUKK091dHB1dCBhIGJhY2tzbGFzaC4KKy5FbAorLlNoIEhJTlRTCitSZW1lbWJlciB0aGF0IGJhY2tzbGFzaCBpcyBzcGVjaWFsIHRvIHRoZSBzaGVsbCBhbmQgbmVlZHMgdG8gYmUgZXNjYXBlZC4KK1RvIG91dHB1dCBhIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIHNheQorLlBwCisuRDEgIGVjaG8gbWVzc2FnZSBcKltHdF1cKltBbV0yCisuU2ggQlVHUworVGhlIG9jdGFsIGNoYXJhY3RlciBlc2NhcGUgbWVjaGFuaXNtCisuUHEgTGkgXGUwIE5zIEFyIGRpZ2l0cworZGlmZmVycyBmcm9tIHRoZQorQyBsYW5ndWFnZSBtZWNoYW5pc20uCisuUHAKK1RoZXJlIGlzIG5vIHdheSB0byBmb3JjZQorLk5tCit0byB0cmVhdCBpdHMgYXJndW1lbnRzIGxpdGVyYWxseSwgcmF0aGVyIHRoYW4gaW50ZXJwcmV0aW5nIHRoZW0gYXMKK29wdGlvbnMgYW5kIGVzY2FwZSBzZXF1ZW5jZXMuCmRpZmYgLS1naXQgYS91c3IvZGFzaC9ibHRpbi9wcmludGYuMSBiL3Vzci9kYXNoL2JsdGluL3ByaW50Zi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjY1YTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ibHRpbi9wcmludGYuMQpAQCAtMCwwICsxLDM1NCBAQAorLlwiIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MCwgMTk5MworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisuXCIJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisuXCIgdGhlIEluc3RpdHV0ZSBvZiBFbGVjdHJpY2FsIGFuZCBFbGVjdHJvbmljcyBFbmdpbmVlcnMsIEluYy4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIglmcm9tOiBAKCMpcHJpbnRmLjEJOC4xIChCZXJrZWxleSkgNi82LzkzCisuXCIKKy5EZCBOb3ZlbWJlciA1LCAxOTkzCisuRHQgUFJJTlRGIDEKKy5PcworLlNoIE5BTUUKKy5ObSBwcmludGYKKy5OZCBmb3JtYXR0ZWQgb3V0cHV0CisuU2ggU1lOT1BTSVMKKy5ObQorLkFyIGZvcm1hdAorLk9wIEFyIGFyZ3VtZW50cyAgLi4uCisuU2ggREVTQ1JJUFRJT04KKy5ObQorZm9ybWF0cyBhbmQgcHJpbnRzIGl0cyBhcmd1bWVudHMsIGFmdGVyIHRoZSBmaXJzdCwgdW5kZXIgY29udHJvbAorb2YgdGhlCisuQXIgZm9ybWF0ICAuCitUaGUKKy5BciBmb3JtYXQKK2lzIGEgY2hhcmFjdGVyIHN0cmluZyB3aGljaCBjb250YWlucyB0aHJlZSB0eXBlcyBvZiBvYmplY3RzOiBwbGFpbiBjaGFyYWN0ZXJzLAord2hpY2ggYXJlIHNpbXBseSBjb3BpZWQgdG8gc3RhbmRhcmQgb3V0cHV0LCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyB3aGljaAorYXJlIGNvbnZlcnRlZCBhbmQgY29waWVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFuZCBmb3JtYXQgc3BlY2lmaWNhdGlvbnMsCitlYWNoIG9mIHdoaWNoIGNhdXNlcyBwcmludGluZyBvZiB0aGUgbmV4dCBzdWNjZXNzaXZlCisuQXIgYXJndW1lbnQgIC4KKy5QcAorVGhlCisuQXIgYXJndW1lbnRzCithZnRlciB0aGUgZmlyc3QgYXJlIHRyZWF0ZWQgYXMgc3RyaW5ncyBpZiB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgaXMKK2VpdGhlcgorLkNtIGIgLAorLkNtIEIgLAorLkNtIGMKK29yCisuQ20gcyA7CitvdGhlcndpc2UgaXQgaXMgZXZhbHVhdGVkIGFzIGEgQyBjb25zdGFudCwgd2l0aCB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnM6CisuUHAKKy5CbCAtYnVsbGV0IC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CisuSXQKK0EgbGVhZGluZyBwbHVzIG9yIG1pbnVzIHNpZ24gaXMgYWxsb3dlZC4KKy5JdAorSWYgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGlzIGEgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZSwgdGhlIHZhbHVlIGlzIHRoZQorLlRuIEFTQ0lJCitjb2RlIG9mIHRoZSBuZXh0IGNoYXJhY3Rlci4KKy5FbAorLlBwCitUaGUgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgYXMgb2Z0ZW4gYXMgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgdGhlCisuQXIgYXJndW1lbnRzICAuCitBbnkgZXh0cmEgZm9ybWF0IHNwZWNpZmljYXRpb25zIGFyZSBldmFsdWF0ZWQgd2l0aCB6ZXJvIG9yIHRoZSBudWxsCitzdHJpbmcuCisuUHAKK0NoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpbiBiYWNrc2xhc2ggbm90YXRpb24gYXMgZGVmaW5lZCBpbgorLlN0IC1hbnNpQyAuCitUaGUgY2hhcmFjdGVycyBhbmQgdGhlaXIgbWVhbmluZ3MgYXJlIGFzIGZvbGxvd3M6CisuQmwgLXRhZyAtd2lkdGggRHMgLW9mZnNldCBpbmRlbnQKKy5JdCBDbSBcZWUKK1dyaXRlIGFuIFwqW0x0XWVzY2FwZVwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVhCitXcml0ZSBhIFwqW0x0XWJlbGxcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlYgorV3JpdGUgYSBcKltMdF1iYWNrc3BhY2VcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlZgorV3JpdGUgYSBcKltMdF1mb3JtLWZlZWRcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlbgorV3JpdGUgYSBcKltMdF1uZXctbGluZVwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVyCitXcml0ZSBhIFwqW0x0XWNhcnJpYWdlIHJldHVyblwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGV0CitXcml0ZSBhIFwqW0x0XXRhYlwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGV2CitXcml0ZSBhIFwqW0x0XXZlcnRpY2FsIHRhYlwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVcJworV3JpdGUgYSBcKltMdF1zaW5nbGUgcXVvdGVcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlIgorV3JpdGUgYSBcKltMdF1kb3VibGUgcXVvdGVcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlXGUKK1dyaXRlIGEgYmFja3NsYXNoIGNoYXJhY3Rlci4KKy5JdCBDbSBcZSBOcyBBciBudW0KK1dyaXRlIGFuIDhcLWJpdCBjaGFyYWN0ZXIgd2hvc2UKKy5UbiBBU0NJSQordmFsdWUgaXMgdGhlIDFcLSwgMlwtLCBvciAzXC1kaWdpdCBvY3RhbCBudW1iZXIKKy5BciBudW0gLgorLkl0IENtIFxleCBOcyBBciB4eAorV3JpdGUgYW4gOFwtYml0IGNoYXJhY3RlciB3aG9zZQorLlRuIEFTQ0lJCit2YWx1ZSBpcyB0aGUgMVwtIG9yIDJcLWRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcgorLkFyIHh4IC4KKy5FbAorLlBwCitFYWNoIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIGludHJvZHVjZWQgYnkgdGhlIHBlcmNlbnQgY2hhcmFjdGVyCisoYGAlJycpLgorVGhlIHJlbWFpbmRlciBvZiB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaW5jbHVkZXMsCitpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgIlplcm8gb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOiIKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IENtICMKK0EgYCMnIGNoYXJhY3Rlcgorc3BlY2lmeWluZyB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUgcHJpbnRlZCBpbiBhbiBgYGFsdGVybmF0aXZlIGZvcm0nJy4KK0ZvcgorLkNtIGIgLAorLkNtIGMgLAorLkNtIGQgLAorYW5kCisuQ20gcworZm9ybWF0cywgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4KK0ZvciB0aGUKKy5DbSBvCitmb3JtYXQgdGhlIHByZWNpc2lvbiBvZiB0aGUgbnVtYmVyIGlzIGluY3JlYXNlZCB0byBmb3JjZSB0aGUgZmlyc3QKK2NoYXJhY3RlciBvZiB0aGUgb3V0cHV0IHN0cmluZyB0byBhIHplcm8uCitGb3IgdGhlCisuQ20geAorLlBxIENtIFgKK2Zvcm1hdCwgYSBub24temVybyByZXN1bHQgaGFzIHRoZSBzdHJpbmcKKy5MaSAweAorLlBxIExpIDBYCitwcmVwZW5kZWQgdG8gaXQuCitGb3IKKy5DbSBlICAsCisuQ20gRSAsCisuQ20gZiAgLAorLkNtIGcgLAorYW5kCisuQ20gRworZm9ybWF0cywgdGhlIHJlc3VsdCB3aWxsIGFsd2F5cyBjb250YWluIGEgZGVjaW1hbCBwb2ludCwgZXZlbiBpZiBubworZGlnaXRzIGZvbGxvdyB0aGUgcG9pbnQgKG5vcm1hbGx5LCBhIGRlY2ltYWwgcG9pbnQgb25seSBhcHBlYXJzIGluIHRoZQorcmVzdWx0cyBvZiB0aG9zZSBmb3JtYXRzIGlmIGEgZGlnaXQgZm9sbG93cyB0aGUgZGVjaW1hbCBwb2ludCkuCitGb3IKKy5DbSBnCithbmQKKy5DbSBHCitmb3JtYXRzLCB0cmFpbGluZyB6ZXJvcyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgcmVzdWx0IGFzIHRoZXkKK3dvdWxkIG90aGVyd2lzZSBiZS4KKy5cIiBJIHR1cm5lZCB0aGlzIG9mZiAtIGRlY2lkZWQgaXQgaXNuJ3QgYSB2YWxpZCB1c2Ugb2YgJyMnCisuXCIgRm9yIHRoZQorLlwiIC5DbSBCCisuXCIgZm9ybWF0LCBiYWNrc2xhc2gtZXNjYXBlIHNlcXVlbmNlcyBhcmUgZXhwYW5kZWQgZmlyc3Q7CisuSXQgQ20gXCZcLQorQSBtaW51cyBzaWduIGBcLScgd2hpY2ggc3BlY2lmaWVzCisuRW0gbGVmdCBhZGp1c3RtZW50CitvZiB0aGUgb3V0cHV0IGluIHRoZSBpbmRpY2F0ZWQgZmllbGQ7CisuSXQgQ20gXCYrCitBIGArJyBjaGFyYWN0ZXIgc3BlY2lmeWluZyB0aGF0IHRoZXJlIHNob3VsZCBhbHdheXMgYmUKK2Egc2lnbiBwbGFjZWQgYmVmb3JlIHRoZSBudW1iZXIgd2hlbiB1c2luZyBzaWduZWQgZm9ybWF0cy4KKy5JdCBTcSBcJlwgXCYKK0Egc3BhY2Ugc3BlY2lmeWluZyB0aGF0IGEgYmxhbmsgc2hvdWxkIGJlIGxlZnQgYmVmb3JlIGEgcG9zaXRpdmUgbnVtYmVyCitmb3IgYSBzaWduZWQgZm9ybWF0LgorQSBgKycgb3ZlcnJpZGVzIGEgc3BhY2UgaWYgYm90aCBhcmUgdXNlZDsKKy5JdCBDbSBcJjAKK0EgemVybyBgMCcgY2hhcmFjdGVyIGluZGljYXRpbmcgdGhhdCB6ZXJvLXBhZGRpbmcgc2hvdWxkIGJlIHVzZWQKK3JhdGhlciB0aGFuIGJsYW5rLXBhZGRpbmcuCitBIGBcLScgb3ZlcnJpZGVzIGEgYDAnIGlmIGJvdGggYXJlIHVzZWQ7CisuRWwKKy5JdCAiRmllbGQgV2lkdGg6IgorQW4gb3B0aW9uYWwgZGlnaXQgc3RyaW5nIHNwZWNpZnlpbmcgYQorLkVtIGZpZWxkIHdpZHRoIDsKK2lmIHRoZSBvdXRwdXQgc3RyaW5nIGhhcyBmZXdlciBjaGFyYWN0ZXJzIHRoYW4gdGhlIGZpZWxkIHdpZHRoIGl0IHdpbGwKK2JlIGJsYW5rLXBhZGRlZCBvbiB0aGUgbGVmdCAob3IgcmlnaHQsIGlmIHRoZSBsZWZ0LWFkanVzdG1lbnQgaW5kaWNhdG9yCitoYXMgYmVlbiBnaXZlbikgdG8gbWFrZSB1cCB0aGUgZmllbGQgd2lkdGggKG5vdGUgdGhhdCBhIGxlYWRpbmcgemVybworaXMgYSBmbGFnLCBidXQgYW4gZW1iZWRkZWQgemVybyBpcyBwYXJ0IG9mIGEgZmllbGQgd2lkdGgpOworLkl0IFByZWNpc2lvbiA6CitBbiBvcHRpb25hbCBwZXJpb2QsCisuU3EgQ20gXCYuXCYgLAorZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgZGlnaXQgc3RyaW5nIGdpdmluZyBhCisuRW0gcHJlY2lzaW9uCit3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8gYXBwZWFyIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LAorZm9yCisuQ20gZQorYW5kCisuQ20gZgorZm9ybWF0cywgb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcHJpbnRlZAorZnJvbSBhIHN0cmluZworLlNtIG9mZgorLlBmICggQ20gYiBObyAsCisuU20gb24KKy5DbSBCCithbmQKKy5DbSBzCitmb3JtYXRzKTsgaWYgdGhlIGRpZ2l0IHN0cmluZyBpcyBtaXNzaW5nLCB0aGUgcHJlY2lzaW9uIGlzIHRyZWF0ZWQKK2FzIHplcm87CisuSXQgRm9ybWF0IDoKK0EgY2hhcmFjdGVyIHdoaWNoIGluZGljYXRlcyB0aGUgdHlwZSBvZiBmb3JtYXQgdG8gdXNlIChvbmUgb2YKKy5DbSBkaW91eFhmd0VnR2JCY3MgKSAuCisuRWwKKy5QcAorQSBmaWVsZCB3aWR0aCBvciBwcmVjaXNpb24gbWF5IGJlCisuU3EgQ20gXCYqCitpbnN0ZWFkIG9mIGEgZGlnaXQgc3RyaW5nLgorSW4gdGhpcyBjYXNlIGFuCisuQXIgYXJndW1lbnQKK3N1cHBsaWVzIHRoZSBmaWVsZCB3aWR0aCBvciBwcmVjaXNpb24uCisuUHAKK1RoZSBmb3JtYXQgY2hhcmFjdGVycyBhbmQgdGhlaXIgbWVhbmluZ3MgYXJlOgorLkJsIC10YWcgLXdpZHRoIEZsCisuSXQgQ20gZGlvdVh4CitUaGUKKy5BciBhcmd1bWVudAoraXMgcHJpbnRlZCBhcyBhIHNpZ25lZCBkZWNpbWFsIChkIG9yIGkpLCB1bnNpZ25lZCBvY3RhbCwgdW5zaWduZWQgZGVjaW1hbCwKK29yIHVuc2lnbmVkIGhleGFkZWNpbWFsIChYIG9yIHgpLCByZXNwZWN0aXZlbHkuCisuSXQgQ20gZgorVGhlCisuQXIgYXJndW1lbnQKK2lzIHByaW50ZWQgaW4gdGhlIHN0eWxlCisuU20gb2ZmCisuUGYgW1wtXWRkZCBDbSBcJi4gTm8gZGRkCisuU20gb24KK3doZXJlIHRoZSBudW1iZXIgb2YgZCdzCithZnRlciB0aGUgZGVjaW1hbCBwb2ludCBpcyBlcXVhbCB0byB0aGUgcHJlY2lzaW9uIHNwZWNpZmljYXRpb24gZm9yCit0aGUgYXJndW1lbnQuCitJZiB0aGUgcHJlY2lzaW9uIGlzIG1pc3NpbmcsIDYgZGlnaXRzIGFyZSBnaXZlbjsgaWYgdGhlIHByZWNpc2lvbgoraXMgZXhwbGljaXRseSAwLCBubyBkaWdpdHMgYW5kIG5vIGRlY2ltYWwgcG9pbnQgYXJlIHByaW50ZWQuCisuSXQgQ20gZUUKK1RoZQorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkIGluIHRoZSBzdHlsZQorLlNtIG9mZgorLlBmIFtcLV1kIENtIFwmLiBObyBkZGQgQ20gZSBObyBcXCooUG1kZAorLlNtIG9uCit3aGVyZSB0aGVyZQoraXMgb25lIGRpZ2l0IGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCBhbmQgdGhlIG51bWJlciBhZnRlciBpcyBlcXVhbCB0bwordGhlIHByZWNpc2lvbiBzcGVjaWZpY2F0aW9uIGZvciB0aGUgYXJndW1lbnQ7IHdoZW4gdGhlIHByZWNpc2lvbiBpcworbWlzc2luZywgNiBkaWdpdHMgYXJlIHByb2R1Y2VkLgorQW4gdXBwZXItY2FzZSBFIGlzIHVzZWQgZm9yIGFuIGBFJyBmb3JtYXQuCisuSXQgQ20gZ0cKK1RoZQorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkIGluIHN0eWxlCisuQ20gZgorb3IgaW4gc3R5bGUKKy5DbSBlCisuUHEgQ20gRQord2hpY2hldmVyIGdpdmVzIGZ1bGwgcHJlY2lzaW9uIGluIG1pbmltdW0gc3BhY2UuCisuSXQgQ20gYgorQ2hhcmFjdGVycyBmcm9tIHRoZSBzdHJpbmcKKy5BciBhcmd1bWVudAorYXJlIHByaW50ZWQgd2l0aCBiYWNrc2xhc2gtZXNjYXBlIHNlcXVlbmNlcyBleHBhbmRlZC4KKy5icgorVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGJhY2tzbGFzaC1lc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQ6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBDbSBcZWMKK0NhdXNlcworLk5tCit0byBpZ25vcmUgYW55IHJlbWFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgb3BlcmFuZCBjb250YWluaW5nIGl0LAorYW55IHJlbWFpbmluZyBzdHJpbmcgb3BlcmFuZHMsIGFuZCBhbnkgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGluCit0aGUgZm9ybWF0IG9wZXJhbmQuCisuSXQgQ20gXGUwIE5zIEFyIG51bQorV3JpdGUgYW4gOFwtYml0IGNoYXJhY3RlciB3aG9zZQorLlRuIEFTQ0lJCit2YWx1ZSBpcyB0aGUgMVwtLCAyXC0sIG9yIDNcLWRpZ2l0CitvY3RhbCBudW1iZXIKKy5BciBudW0gLgorLkl0IENtIFxlXiBOcyBBciBjCitXcml0ZSB0aGUgY29udHJvbCBjaGFyYWN0ZXIKKy5BciBjIC4KK0dlbmVyYXRlcyBjaGFyYWN0ZXJzIGBcZTAwMCcgdGhyb3VnaCBgXGUwMzdgLCBhbmQgYFxlMTc3JyAoZnJvbSBgXGVePycpLgorLkl0IENtIFxlTVwtIE5zIEFyIGMKK1dyaXRlIHRoZSBjaGFyYWN0ZXIKKy5BciBjCit3aXRoIHRoZSA4dGggYml0IHNldC4KK0dlbmVyYXRlcyBjaGFyYWN0ZXJzIGBcZTI0MScgdGhyb3VnaCBgXGUzNzZgLgorLkl0IENtIFxlTV4gTnMgQXIgYworV3JpdGUgdGhlIGNvbnRyb2wgY2hhcmFjdGVyCisuQXIgYword2l0aCB0aGUgOHRoIGJpdCBzZXQuCitHZW5lcmF0ZXMgY2hhcmFjdGVycyBgXGUwMDAnIHRocm91Z2ggYFxlMDM3YCwgYW5kIGBcZTE3NycgKGZyb20gYFxlTV4/JykuCisuRWwKKy5JdCBDbSBCCitDaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZworLkFyIGFyZ3VtZW50CithcmUgcHJpbnRlZCB3aXRoIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYmFja3NsYXNoLWVzY2FwZWQgdXNpbmcgdGhlCisuU20gb2ZmCisuUGYgYCBDbSBcZSBBciBjIE5vICcsCisuUGYgYCBDbSBcZV4gQXIgYyBObyAnLAorLlBmIGAgQ20gXGVNXC0gQXIgYyBObyAnCitvcgorLlBmIGAgQ20gXGVNXiBBciBjIE5vICcsCisuU20gb24KK2Zvcm1hdHMgZGVzY3JpYmVkIGFib3ZlLgorLkl0IENtIGMKK1RoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKy5BciBhcmd1bWVudAoraXMgcHJpbnRlZC4KKy5JdCBDbSBzCitDaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZworLkFyIGFyZ3VtZW50CithcmUgcHJpbnRlZCB1bnRpbCB0aGUgZW5kIGlzIHJlYWNoZWQgb3IgdW50aWwgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCitpbmRpY2F0ZWQgYnkgdGhlIHByZWNpc2lvbiBzcGVjaWZpY2F0aW9uIGlzIHJlYWNoZWQ7IGlmIHRoZQorcHJlY2lzaW9uIGlzIG9taXR0ZWQsIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHByaW50ZWQuCisuSXQgQ20gXCYlCitQcmludCBhIGAlJzsgbm8gYXJndW1lbnQgaXMgdXNlZC4KKy5FbAorLlBwCitJbiBubyBjYXNlIGRvZXMgYSBub24tZXhpc3RlbnQgb3Igc21hbGwgZmllbGQgd2lkdGggY2F1c2UgdHJ1bmNhdGlvbiBvZgorYSBmaWVsZDsgcGFkZGluZyB0YWtlcyBwbGFjZSBvbmx5IGlmIHRoZSBzcGVjaWZpZWQgZmllbGQgd2lkdGggZXhjZWVkcwordGhlIGFjdHVhbCB3aWR0aC4KKy5TaCBFWElUIFNUQVRVUworLk5tCitleGl0cyAwIG9uIHN1Y2Nlc3MsIDEgb24gZmFpbHVyZS4KKy5TaCBTRUUgQUxTTworLlhyIGVjaG8gMSAsCisuWHIgcHJpbnRmIDMgLAorLlhyIHByaW50ZiA5CisuWHIgdmlzIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLk5tCit1dGlsaXR5IGNvbmZvcm1zIHRvCisuU3QgLXAxMDAzLjEtMjAwMSAuCisuUHAKK1N1cHBvcnQgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBmb3JtYXRzIGFuZCBgKicgYXMgYSBmaWVsZCB3aWR0aCBhbmQgcHJlY2lzaW9uCithcmUgb3B0aW9uYWwgaW4gUE9TSVguCisuUHAKK1RoZSBiZWhhdmlvdXIgb2YgdGhlICVCIGZvcm1hdCBhbmQgdGhlIFxlJywgXGUiLCBcZXh4eCwgXGVlIGFuZAorXGVbTV1bXC18Xl1jIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHVuZGVmaW5lZCBpbiBQT1NJWC4KKy5TaCBCVUdTCitTaW5jZSB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgdHJhbnNsYXRlZCBmcm9tCisuVG4gQVNDSUkKK3RvIGZsb2F0aW5nLXBvaW50IGFuZAordGhlbiBiYWNrIGFnYWluLCBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gbWF5IGJlIGxvc3QuCisuUHAKK0hleGFkZWNpbWFsIGNoYXJhY3RlciBjb25zdGFudHMgYXJlIHJlc3RyaWN0ZWQgdG8sIGFuZCBzaG91bGQgYmUgc3BlY2lmaWVkCithcywgdHdvIGNoYXJhY3RlciBjb25zdGFudHMuICBUaGlzIGlzIGNvbnRyYXJ5IHRvIHRoZSBJU08gQyBzdGFuZGFyZCBidXQKK2RvZXMgZ3VhcmFudGVlIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBjb25zdGFudC4KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2JsdGluL3ByaW50Zi5jIGIvdXNyL2Rhc2gvYmx0aW4vcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViYTQwZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2JsdGluL3ByaW50Zi5jCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0YXRpYyBjaGFyCSpjb252X2VzY2FwZV9zdHIoY2hhciAqKTsKK3N0YXRpYyBjaGFyCSpjb252X2VzY2FwZShjaGFyICosIGludCAqKTsKK3N0YXRpYyBpbnQJIGdldGNocih2b2lkKTsKK3N0YXRpYyBpbnRtYXhfdAkgZ2V0aW50bWF4KHZvaWQpOworc3RhdGljIHVpbnRtYXhfdCBnZXR1aW50bWF4KHZvaWQpOworc3RhdGljIGNoYXIJKmdldHN0cih2b2lkKTsKK3N0YXRpYyBjaGFyCSpta2xvbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgICAgICBjaGVja19jb252ZXJzaW9uKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNpZmRlZiBIQVZFX1NUUlRPRAorc3RhdGljIGRvdWJsZQkgZ2V0ZG91YmxlKHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQJcnZhbDsKK3N0YXRpYyBjaGFyICAqKmdhcmd2OworCisjZGVmaW5lIGlzb2RpZ2l0KGMpCSgoYykgPj0gJzAnICYmIChjKSA8PSAnNycpCisjZGVmaW5lIG9jdHRvYmluKGMpCSgoYykgLSAnMCcpCisKKyNpbmNsdWRlICJibHRpbi5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisjZGVmaW5lIFBGKGYsIGZ1bmMpIHsgXAorCXN3aXRjaCAoKGNoYXIgKilwYXJhbSAtIChjaGFyICopYXJyYXkpIHsgXAorCWRlZmF1bHQ6IFwKKwkJKHZvaWQpcHJpbnRmKGYsIGFycmF5WzBdLCBhcnJheVsxXSwgZnVuYyk7IFwKKwkJYnJlYWs7IFwKKwljYXNlIHNpemVvZigqcGFyYW0pOiBcCisJCSh2b2lkKXByaW50ZihmLCBhcnJheVswXSwgZnVuYyk7IFwKKwkJYnJlYWs7IFwKKwljYXNlIDA6IFwKKwkJKHZvaWQpcHJpbnRmKGYsIGZ1bmMpOyBcCisJCWJyZWFrOyBcCisJfSBcCit9CisKK2ludCBwcmludGZjbWQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICpmbXQ7CisJY2hhciAqZm9ybWF0OworCWludCBjaDsKKworCXJ2YWwgPSAwOworCisJbmV4dG9wdChudWxsc3RyKTsKKworCWFyZ3YgPSBhcmdwdHI7CisJZm9ybWF0ID0gKmFyZ3Y7CisKKwlpZiAoIWZvcm1hdCkgeworCQl3YXJueCgidXNhZ2U6IHByaW50ZiBmb3JtYXQgW2FyZyAuLi5dIik7CisJCWdvdG8gZXJyOworCX0KKworCWdhcmd2ID0gKythcmd2OworCisjZGVmaW5lIFNLSVAxCSIjLSsgMCIKKyNkZWZpbmUgU0tJUDIJIiowMTIzNDU2Nzg5IgorCWRvIHsKKwkJLyoKKwkJICogQmFzaWMgYWxnb3JpdGhtIGlzIHRvIHNjYW4gdGhlIGZvcm1hdCBzdHJpbmcgZm9yIGNvbnZlcnNpb24KKwkJICogc3BlY2lmaWNhdGlvbnMgLS0gb25jZSBvbmUgaXMgZm91bmQsIGZpbmQgb3V0IGlmIHRoZSBmaWVsZAorCQkgKiB3aWR0aCBvciBwcmVjaXNpb24gaXMgYSAnKic7IGlmIGl0IGlzLCBnYXRoZXIgdXAgdmFsdWUuCisJCSAqIE5vdGUsIGZvcm1hdCBzdHJpbmdzIGFyZSByZXVzZWQgYXMgbmVjZXNzYXJ5IHRvIHVzZSB1cCB0aGUKKwkJICogcHJvdmlkZWQgYXJndW1lbnRzLCBhcmd1bWVudHMgb2YgemVyby9udWxsIHN0cmluZyBhcmUKKwkJICogcHJvdmlkZWQgdG8gdXNlIHVwIHRoZSBmb3JtYXQgc3RyaW5nLgorCQkgKi8KKworCQkvKiBmaW5kIG5leHQgZm9ybWF0IHNwZWNpZmljYXRpb24gKi8KKwkJZm9yIChmbXQgPSBmb3JtYXQ7IChjaCA9ICpmbXQrKykgOykgeworCQkJY2hhciAqc3RhcnQ7CisJCQljaGFyIG5leHRjaDsKKwkJCWludCBhcnJheVsyXTsKKwkJCWludCAqcGFyYW07CisKKwkJCWlmIChjaCA9PSAnXFwnKSB7CisJCQkJaW50IGNfY2g7CisJCQkJZm10ID0gY29udl9lc2NhcGUoZm10LCAmY19jaCk7CisJCQkJY2ggPSBjX2NoOworCQkJCWdvdG8gcGM7CisJCQl9CisJCQlpZiAoY2ggIT0gJyUnIHx8ICgqZm10ID09ICclJyAmJiAoKytmbXQgfHwgMSkpKSB7CitwYzoKKwkJCQlwdXRjaGFyKGNoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogT2sgLSB3ZSd2ZSBmb3VuZCBhIGZvcm1hdCBzcGVjaWZpY2F0aW9uLAorCQkJICAgU2F2ZSBpdHMgYWRkcmVzcyBmb3IgYSBsYXRlciBwcmludGYoKS4gKi8KKwkJCXN0YXJ0ID0gZm10IC0gMTsKKwkJCXBhcmFtID0gYXJyYXk7CisKKwkJCS8qIHNraXAgdG8gZmllbGQgd2lkdGggKi8KKwkJCWZtdCArPSBzdHJzcG4oZm10LCBTS0lQMSk7CisJCQlpZiAoKmZtdCA9PSAnKicpCisJCQkJKnBhcmFtKysgPSBnZXRpbnRtYXgoKTsKKworCQkJLyogc2tpcCB0byBwb3NzaWJsZSAnLicsIGdldCBmb2xsb3dpbmcgcHJlY2lzaW9uICovCisJCQlmbXQgKz0gc3Ryc3BuKGZtdCwgU0tJUDIpOworCQkJaWYgKCpmbXQgPT0gJy4nKQorCQkJCSsrZm10OworCQkJaWYgKCpmbXQgPT0gJyonKQorCQkJCSpwYXJhbSsrID0gZ2V0aW50bWF4KCk7CisKKwkJCWZtdCArPSBzdHJzcG4oZm10LCBTS0lQMik7CisKKwkJCWNoID0gKmZtdDsKKwkJCWlmICghY2gpIHsKKwkJCQl3YXJueCgibWlzc2luZyBmb3JtYXQgY2hhcmFjdGVyIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQkvKiBudWxsIHRlcm1pbmF0ZSBmb3JtYXQgc3RyaW5nIHRvIHdlIGNhbiB1c2UgaXQKKwkJCSAgIGFzIGFuIGFyZ3VtZW50IHRvIHByaW50Zi4gKi8KKwkJCW5leHRjaCA9IGZtdFsxXTsKKwkJCWZtdFsxXSA9IDA7CisJCQlzd2l0Y2ggKGNoKSB7CisKKwkJCWNhc2UgJ2InOiB7CisJCQkJY2hhciAqcCA9IGNvbnZfZXNjYXBlX3N0cihnZXRzdHIoKSk7CisJCQkJKmZtdCA9ICdzJzsKKwkJCQlQRihzdGFydCwgcCk7CisJCQkJLyogZXNjYXBlIGlmIGEgXGMgd2FzIGVuY291bnRlcmVkICovCisJCQkJaWYgKHJ2YWwgJiAweDEwMCkKKwkJCQkJZ290byBvdXQ7CisJCQkJKmZtdCA9ICdiJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ2MnOiB7CisJCQkJaW50IHAgPSBnZXRjaHIoKTsKKwkJCQlQRihzdGFydCwgcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICdzJzogeworCQkJCWNoYXIgKnAgPSBnZXRzdHIoKTsKKwkJCQlQRihzdGFydCwgcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICdkJzoKKwkJCWNhc2UgJ2knOiB7CisJCQkJaW50bWF4X3QgcCA9IGdldGludG1heCgpOworCQkJCWNoYXIgKmYgPSBta2xvbmcoc3RhcnQsIGZtdCk7CisJCQkJUEYoZiwgcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICdvJzoKKwkJCWNhc2UgJ3UnOgorCQkJY2FzZSAneCc6CisJCQljYXNlICdYJzogeworCQkJCXVpbnRtYXhfdCBwID0gZ2V0dWludG1heCgpOworCQkJCWNoYXIgKmYgPSBta2xvbmcoc3RhcnQsIGZtdCk7CisJCQkJUEYoZiwgcCk7CisJCQkJYnJlYWs7CisJCQl9CisjaWZkZWYgSEFWRV9TVFJUT0QKKwkJCWNhc2UgJ2UnOgorCQkJY2FzZSAnRSc6CisJCQljYXNlICdmJzoKKwkJCWNhc2UgJ2cnOgorCQkJY2FzZSAnRyc6IHsKKwkJCQlkb3VibGUgcCA9IGdldGRvdWJsZSgpOworCQkJCVBGKHN0YXJ0LCBwKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQl3YXJueCgiJXM6IGludmFsaWQgZGlyZWN0aXZlIiwgc3RhcnQpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJKisrZm10ID0gbmV4dGNoOworCQl9CisJfSB3aGlsZSAoZ2FyZ3YgIT0gYXJndiAmJiAqZ2FyZ3YpOworCitvdXQ6CisJcmV0dXJuIChydmFsICYgfjB4MTAwKTsKK2VycjoKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogUHJpbnQgU3lzViBlY2hvKDEpIHN0eWxlIGVzY2FwZSBzdHJpbmcKKyAqCUhhbHRzIHByb2Nlc3Npbmcgc3RyaW5nIGlmIGEgXGMgZXNjYXBlIGlzIGVuY291bnRlcmVkLgorICovCitzdGF0aWMgY2hhciAqCitjb252X2VzY2FwZV9zdHIoY2hhciAqc3RyKQoreworCWludCBjaDsKKwljaGFyICpjcDsKKworCS8qIGNvbnZlcnQgc3RyaW5nIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLi4uICovCisJU1RBUlRTVEFDS1NUUihjcCk7CisKKwlkbyB7CisJCWludCBjOworCisJCWNoID0gKnN0cisrOworCQlpZiAoY2ggIT0gJ1xcJykKKwkJCWNvbnRpbnVlOworCisJCWNoID0gKnN0cisrOworCQlpZiAoY2ggPT0gJ2MnKSB7CisJCQkvKiBcYyBhcyBpbiBTWVNWIGVjaG8gLSBhYm9ydCBhbGwgcHJvY2Vzc2luZy4uLi4gKi8KKwkJCXJ2YWwgfD0gMHgxMDA7CisJCQljaCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqICViIHN0cmluZyBvY3RhbCBjb25zdGFudHMgYXJlIG5vdCBsaWtlIHRob3NlIGluIEMuCisJCSAqIFRoZXkgc3RhcnQgd2l0aCBhIFwwLCBhbmQgYXJlIGZvbGxvd2VkIGJ5IDAsIDEsIDIsCisJCSAqIG9yIDMgb2N0YWwgZGlnaXRzLgorCQkgKi8KKwkJaWYgKGNoID09ICcwJykgeworCQkJdW5zaWduZWQgY2hhciBpOworCQkJaSA9IDM7CisJCQljaCA9IDA7CisJCQlkbyB7CisJCQkJdW5zaWduZWQgayA9IG9jdHRvYmluKCpzdHIpOworCQkJCWlmIChrID4gNykKKwkJCQkJYnJlYWs7CisJCQkJc3RyKys7CisJCQkJY2ggPDw9IDM7CisJCQkJY2ggKz0gazsKKwkJCX0gd2hpbGUgKC0taSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEZpbmFsbHkgdGVzdCBmb3Igc2VxdWVuY2VzIHZhbGlkIGluIHRoZSBmb3JtYXQgc3RyaW5nICovCisJCXN0ciA9IGNvbnZfZXNjYXBlKHN0ciAtIDEsICZjKTsKKwkJY2ggPSBjOworCX0gd2hpbGUgKFNUUFVUQyhjaCwgY3ApLCBjaCk7CisKKwlyZXR1cm4gc3RhY2tibG9jaygpOworfQorCisvKgorICogUHJpbnQgInN0YW5kYXJkIiBlc2NhcGUgY2hhcmFjdGVycworICovCitzdGF0aWMgY2hhciAqCitjb252X2VzY2FwZShjaGFyICpzdHIsIGludCAqY29udl9jaCkKK3sKKwlpbnQgdmFsdWU7CisJaW50IGNoOworCisJY2ggPSAqc3RyOworCisJc3dpdGNoIChjaCkgeworCWRlZmF1bHQ6CisJY2FzZSAwOgorCQl2YWx1ZSA9ICdcXCc7CisJCWdvdG8gb3V0OworCisJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6CisJY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6CisJCWNoID0gMzsKKwkJdmFsdWUgPSAwOworCQlkbyB7CisJCQl2YWx1ZSA8PD0gMzsKKwkJCXZhbHVlICs9IG9jdHRvYmluKCpzdHIrKyk7CisJCX0gd2hpbGUgKGlzb2RpZ2l0KCpzdHIpICYmIC0tY2gpOworCQlnb3RvIG91dDsKKworCWNhc2UgJ1xcJzoJdmFsdWUgPSAnXFwnOwlicmVhazsJLyogYmFja3NsYXNoICovCisJY2FzZSAnYSc6CXZhbHVlID0gJ1xhJzsJYnJlYWs7CS8qIGFsZXJ0ICovCisJY2FzZSAnYic6CXZhbHVlID0gJ1xiJzsJYnJlYWs7CS8qIGJhY2tzcGFjZSAqLworCWNhc2UgJ2YnOgl2YWx1ZSA9ICdcZic7CWJyZWFrOwkvKiBmb3JtLWZlZWQgKi8KKwljYXNlICduJzoJdmFsdWUgPSAnXG4nOwlicmVhazsJLyogbmV3bGluZSAqLworCWNhc2UgJ3InOgl2YWx1ZSA9ICdccic7CWJyZWFrOwkvKiBjYXJyaWFnZS1yZXR1cm4gKi8KKwljYXNlICd0JzoJdmFsdWUgPSAnXHQnOwlicmVhazsJLyogdGFiICovCisJY2FzZSAndic6CXZhbHVlID0gJ1x2JzsJYnJlYWs7CS8qIHZlcnRpY2FsLXRhYiAqLworCX0KKworCXN0cisrOworb3V0OgorCSpjb252X2NoID0gdmFsdWU7CisJcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGNoYXIgKgorbWtsb25nKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqY2gpCit7CisJY2hhciAqY29weTsKKwlzaXplX3QgbGVuOworCisJbGVuID0gY2ggLSBzdHIgKyAzOworCVNUQVJUU1RBQ0tTVFIoY29weSk7CisJY29weSA9IG1ha2VzdHJzcGFjZShsZW4sIGNvcHkpOworCW1lbWNweShjb3B5LCBzdHIsIGxlbiAtIDMpOworCWNvcHlbbGVuIC0gM10gPSAnaic7CisJY29weVtsZW4gLSAyXSA9ICpjaDsKKwljb3B5W2xlbiAtIDFdID0gJ1wwJzsKKwlyZXR1cm4gKGNvcHkpOworfQorCitzdGF0aWMgaW50CitnZXRjaHIodm9pZCkKK3sKKwlpbnQgdmFsID0gMDsKKworCWlmICgqZ2FyZ3YpCisJCXZhbCA9ICoqZ2FyZ3YrKzsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgY2hhciAqCitnZXRzdHIodm9pZCkKK3sKKwljaGFyICp2YWwgPSBudWxsc3RyOworCisJaWYgKCpnYXJndikKKwkJdmFsID0gKmdhcmd2Kys7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludG1heF90CitnZXRpbnRtYXgodm9pZCkKK3sKKwlpbnRtYXhfdCB2YWwgPSAwOworCWNoYXIgKmNwLCAqZXA7CisKKwljcCA9ICpnYXJndjsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJZ2FyZ3YrKzsKKworCXZhbCA9ICh1bnNpZ25lZCBjaGFyKSBjcFsxXTsKKwlpZiAoKmNwID09ICdcIicgfHwgKmNwID09ICdcJycpCisJCWdvdG8gb3V0OworCisJZXJybm8gPSAwOworCXZhbCA9IHN0cnRvaW1heChjcCwgJmVwLCAwKTsKKwljaGVja19jb252ZXJzaW9uKGNwLCBlcCk7CitvdXQ6CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVpbnRtYXhfdAorZ2V0dWludG1heCh2b2lkKQoreworCXVpbnRtYXhfdCB2YWwgPSAwOworCWNoYXIgKmNwLCAqZXA7CisKKwljcCA9ICpnYXJndjsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJZ2FyZ3YrKzsKKworCXZhbCA9ICh1bnNpZ25lZCBjaGFyKSBjcFsxXTsKKwlpZiAoKmNwID09ICdcIicgfHwgKmNwID09ICdcJycpCisJCWdvdG8gb3V0OworCisJZXJybm8gPSAwOworCXZhbCA9IHN0cnRvdW1heChjcCwgJmVwLCAwKTsKKwljaGVja19jb252ZXJzaW9uKGNwLCBlcCk7CitvdXQ6CisJcmV0dXJuIHZhbDsKK30KKworI2lmZGVmIEhBVkVfU1RSVE9ECitzdGF0aWMgZG91YmxlCitnZXRkb3VibGUodm9pZCkKK3sKKwlkb3VibGUgdmFsOworCWNoYXIgKmNwLCAqZXA7CisKKwljcCA9ICpnYXJndjsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZ2FyZ3YrKzsKKworCWlmICgqY3AgPT0gJ1wiJyB8fCAqY3AgPT0gJ1wnJykKKwkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSBjcFsxXTsKKworCWVycm5vID0gMDsKKwl2YWwgPSBzdHJ0b2QoY3AsICZlcCk7CisJY2hlY2tfY29udmVyc2lvbihjcCwgZXApOworCXJldHVybiB2YWw7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2NoZWNrX2NvbnZlcnNpb24oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZXApCit7CisJaWYgKCplcCkgeworCQlpZiAoZXAgPT0gcykKKwkJCXdhcm54KCIlczogZXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZSIsIHMpOworCQllbHNlCisJCQl3YXJueCgiJXM6IG5vdCBjb21wbGV0ZWx5IGNvbnZlcnRlZCIsIHMpOworCQlydmFsID0gMTsKKwl9IGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgeworCQl3YXJueCgiJXM6ICVzIiwgcywgc3RyZXJyb3IoRVJBTkdFKSk7CisJCXJ2YWwgPSAxOworCX0KK30KKworaW50CitlY2hvY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbm9ubCA9IDA7CisJc3RydWN0IG91dHB1dCAqb3V0cyA9IG91dDE7CisKKwlpZiAoISorK2FyZ3YpCisJCWdvdG8gZW5kOworCWlmIChlcXVhbCgqYXJndiwgIi1uIikpIHsKKwkJbm9ubCA9IH5ub25sOworCQlpZiAoISorK2FyZ3YpCisJCQlnb3RvIGVuZDsKKwl9CisKKwlkbyB7CisJCWNoYXIgYzsKKworCQljID0gKigqYXJndikrKzsKKwkJaWYgKCFjKQorCQkJZ290byBuZXh0OworCQlpZiAoYyAhPSAnXFwnKQorCQkJZ290byBwcmludDsKKworCQlvdXRzdHIoY29udl9lc2NhcGVfc3RyKCphcmd2IC0gMSksIG91dHMpOworCQlpZiAocnZhbCAmIDB4MTAwKQorCQkJYnJlYWs7CituZXh0OgorCQljID0gJyAnOworCQlpZiAoISorK2FyZ3YpIHsKK2VuZDoKKwkJCWlmIChub25sKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQljID0gJ1xuJzsKKwkJfQorcHJpbnQ6CisJCW91dGMoYywgb3V0cyk7CisJfSB3aGlsZSAoKmFyZ3YpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYmx0aW4vdGVzdC4xIGIvdXNyL2Rhc2gvYmx0aW4vdGVzdC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDM1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ibHRpbi90ZXN0LjEKQEAgLTAsMCArMSwzMDkgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorLlwiCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorLlwiIHRoZSBJbnN0aXR1dGUgb2YgRWxlY3RyaWNhbCBhbmQgRWxlY3Ryb25pY3MgRW5naW5lZXJzLCBJbmMuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIEAoIyl0ZXN0LjEJOC4xIChCZXJrZWxleSkgNS8zMS85MworLlwiCisuRGQgTWF5IDMxLCAxOTkzCisuRHQgVEVTVCAxCisuT3MKKy5TaCBOQU1FCisuTm0gdGVzdCAsCisuTm0gXCZbCisuTmQgY29uZGl0aW9uIGV2YWx1YXRpb24gdXRpbGl0eQorLlNoIFNZTk9QU0lTCisuTm0gdGVzdAorLkFyIGV4cHJlc3Npb24KKy5ObSBcJlsKKy5BciBleHByZXNzaW9uIENtIF0KKy5TaCBERVNDUklQVElPTgorVGhlCisuTm0gdGVzdAordXRpbGl0eSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBldmFsdWF0ZXMKK3RvIHRydWUsIHJldHVybnMgYSB6ZXJvICh0cnVlKSBleGl0IHN0YXR1czsgb3RoZXJ3aXNlCitpdCByZXR1cm5zIDEgKGZhbHNlKS4KK0lmIHRoZXJlIGlzIG5vIGV4cHJlc3Npb24sIHRlc3QgYWxzbworcmV0dXJucyAxIChmYWxzZSkuCisuUHAKK0FsbCBvcGVyYXRvcnMgYW5kIGZsYWdzIGFyZSBzZXBhcmF0ZSBhcmd1bWVudHMgdG8gdGhlCisuTm0gdGVzdAordXRpbGl0eS4KKy5QcAorVGhlIGZvbGxvd2luZyBwcmltYXJpZXMgYXJlIHVzZWQgdG8gY29uc3RydWN0IGV4cHJlc3Npb246CisuQmwgLXRhZyAtd2lkdGggQXIKKy5JdCBGbCBiIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgYmxvY2sgc3BlY2lhbAorZmlsZS4KKy5JdCBGbCBjIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgY2hhcmFjdGVyCitzcGVjaWFsIGZpbGUuCisuSXQgRmwgZCBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeS4KKy5JdCBGbCBlIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgKHJlZ2FyZGxlc3Mgb2YgdHlwZSkuCisuSXQgRmwgZiBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZS4KKy5JdCBGbCBnIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBzZXQgZ3JvdXAgSUQgZmxhZworaXMgc2V0LgorLkl0IEZsIGggQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSBzeW1ib2xpYyBsaW5rLgorLkl0IEZsIGsgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXRzIHN0aWNreSBiaXQgaXMgc2V0LgorLkl0IEZsIG4gQXIgc3RyaW5nCitUcnVlIGlmIHRoZSBsZW5ndGggb2YKKy5BciBzdHJpbmcKK2lzIG5vbnplcm8uCisuSXQgRmwgcCBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQoraXMgYSBuYW1lZCBwaXBlCisuUG8gVG4gRklGTyBQYyAuCisuSXQgRmwgciBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyByZWFkYWJsZS4KKy5JdCBGbCBzIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGhhcyBhIHNpemUgZ3JlYXRlcgordGhhbiB6ZXJvLgorLkl0IEZsIHQgQXIgZmlsZV9kZXNjcmlwdG9yCitUcnVlIGlmIHRoZSBmaWxlIHdob3NlIGZpbGUgZGVzY3JpcHRvciBudW1iZXIKK2lzCisuQXIgZmlsZV9kZXNjcmlwdG9yCitpcyBvcGVuIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0ZXJtaW5hbC4KKy5JdCBGbCB1IEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBzZXQgdXNlciBJRCBmbGFnCitpcyBzZXQuCisuSXQgRmwgdyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyB3cml0YWJsZS4KK1RydWUKK2luZGljYXRlcyBvbmx5IHRoYXQgdGhlIHdyaXRlIGZsYWcgaXMgb24uCitUaGUgZmlsZSBpcyBub3Qgd3JpdGFibGUgb24gYSByZWFkLW9ubHkgZmlsZQorc3lzdGVtIGV2ZW4gaWYgdGhpcyB0ZXN0IGluZGljYXRlcyB0cnVlLgorLkl0IEZsIHggQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZS4KK1RydWUKK2luZGljYXRlcyBvbmx5IHRoYXQgdGhlIGV4ZWN1dGUgZmxhZyBpcyBvbi4KK0lmCisuQXIgZmlsZQoraXMgYSBkaXJlY3RvcnksIHRydWUgaW5kaWNhdGVzIHRoYXQKKy5BciBmaWxlCitjYW4gYmUgc2VhcmNoZWQuCisuSXQgRmwgeiBBciBzdHJpbmcKK1RydWUgaWYgdGhlIGxlbmd0aCBvZgorLkFyIHN0cmluZworaXMgemVyby4KKy5JdCBGbCBMIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgc3ltYm9saWMgbGluay4KK1RoaXMgb3BlcmF0b3IgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZgordGhpcyBwcm9ncmFtLgorRG8gbm90IHJlbHkgb24gaXRzIGV4aXN0ZW5jZTsgdXNlCisuRmwgaAoraW5zdGVhZC4KKy5JdCBGbCBPIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBvd25lciBtYXRjaGVzIHRoZSBlZmZlY3RpdmUgdXNlciBpZCBvZiB0aGlzIHByb2Nlc3MuCisuSXQgRmwgRyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpdHMgZ3JvdXAgbWF0Y2hlcyB0aGUgZWZmZWN0aXZlIGdyb3VwIGlkIG9mIHRoaXMgcHJvY2Vzcy4KKy5JdCBGbCBTIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgc29ja2V0LgorLkl0IEFyIGZpbGUxIEZsIG50IEFyIGZpbGUyCitUcnVlIGlmCisuQXIgZmlsZTEKK2V4aXN0cyBhbmQgaXMgbmV3ZXIgdGhhbgorLkFyIGZpbGUyIC4KKy5JdCBBciBmaWxlMSBGbCBvdCBBciBmaWxlMgorVHJ1ZSBpZgorLkFyIGZpbGUxCitleGlzdHMgYW5kIGlzIG9sZGVyIHRoYW4KKy5BciBmaWxlMiAuCisuSXQgQXIgZmlsZTEgRmwgZWYgQXIgZmlsZTIKK1RydWUgaWYKKy5BciBmaWxlMQorYW5kCisuQXIgZmlsZTIKK2V4aXN0IGFuZCByZWZlciB0byB0aGUgc2FtZSBmaWxlLgorLkl0IEFyIHN0cmluZworVHJ1ZSBpZgorLkFyIHN0cmluZworaXMgbm90IHRoZSBudWxsCitzdHJpbmcuCisuSXQgQXIgXCZzXCYxIENtIFwmPSBBciBcJnNcJjIKK1RydWUgaWYgdGhlIHN0cmluZ3MKKy5BciBcJnNcJjEKK2FuZAorLkFyIFwmc1wmMgorYXJlIGlkZW50aWNhbC4KKy5JdCBBciBcJnNcJjEgQ20gXCYhPSBBciBcJnNcJjIKK1RydWUgaWYgdGhlIHN0cmluZ3MKKy5BciBcJnNcJjEKK2FuZAorLkFyIFwmc1wmMgorYXJlIG5vdCBpZGVudGljYWwuCisuSXQgQXIgXCZzXCYxIENtIFwmXCpbTHRdIEFyIFwmc1wmMgorVHJ1ZSBpZiBzdHJpbmcKKy5BciBcJnNcJjEKK2NvbWVzIGJlZm9yZQorLkFyIFwmc1wmMgorYmFzZWQgb24gdGhlIEFTQ0lJIHZhbHVlIG9mIHRoZWlyIGNoYXJhY3RlcnMuCisuSXQgQXIgXCZzXCYxIENtIFwmXCpbR3RdIEFyIFwmc1wmMgorVHJ1ZSBpZiBzdHJpbmcKKy5BciBcJnNcJjEKK2NvbWVzIGFmdGVyCisuQXIgXCZzXCYyCitiYXNlZCBvbiB0aGUgQVNDSUkgdmFsdWUgb2YgdGhlaXIgY2hhcmFjdGVycy4KKy5JdCBBciBcJm5cJjEgRmwgXCZlcSBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXJzCisuQXIgXCZuXCYxCithbmQKKy5BciBcJm5cJjIKK2FyZSBhbGdlYnJhaWNhbGx5CitlcXVhbC4KKy5JdCBBciBcJm5cJjEgRmwgXCZuZSBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXJzCisuQXIgXCZuXCYxCithbmQKKy5BciBcJm5cJjIKK2FyZSBub3QKK2FsZ2VicmFpY2FsbHkgZXF1YWwuCisuSXQgQXIgXCZuXCYxIEZsIFwmZ3QgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYxCitpcyBhbGdlYnJhaWNhbGx5CitncmVhdGVyIHRoYW4gdGhlIGludGVnZXIKKy5BciBcJm5cJjIgLgorLkl0IEFyIFwmblwmMSBGbCBcJmdlIEFyIFwmblwmMgorVHJ1ZSBpZiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMQoraXMgYWxnZWJyYWljYWxseQorZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYyIC4KKy5JdCBBciBcJm5cJjEgRmwgXCZsdCBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXIKKy5BciBcJm5cJjEKK2lzIGFsZ2VicmFpY2FsbHkgbGVzcwordGhhbiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMiAuCisuSXQgQXIgXCZuXCYxIEZsIFwmbGUgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYxCitpcyBhbGdlYnJhaWNhbGx5IGxlc3MKK3RoYW4gb3IgZXF1YWwgdG8gdGhlIGludGVnZXIKKy5BciBcJm5cJjIgLgorLkVsCisuUHAKK1RoZXNlIHByaW1hcmllcyBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIG9wZXJhdG9yczoKKy5CbCAtdGFnIC13aWR0aCBBcgorLkl0IENtIFwmISBBciBleHByZXNzaW9uCitUcnVlIGlmCisuQXIgZXhwcmVzc2lvbgoraXMgZmFsc2UuCisuSXQgQXIgZXhwcmVzc2lvbjEgRmwgYSBBciBleHByZXNzaW9uMgorVHJ1ZSBpZiBib3RoCisuQXIgZXhwcmVzc2lvbjEKK2FuZAorLkFyIGV4cHJlc3Npb24yCithcmUgdHJ1ZS4KKy5JdCBBciBleHByZXNzaW9uMSBGbCBvIEFyIGV4cHJlc3Npb24yCitUcnVlIGlmIGVpdGhlcgorLkFyIGV4cHJlc3Npb24xCitvcgorLkFyIGV4cHJlc3Npb24yCithcmUgdHJ1ZS4KKy5JdCBDbSBcJiggTnMgQXIgZXhwcmVzc2lvbiBOcyBDbSBcJikKK1RydWUgaWYgZXhwcmVzc2lvbiBpcyB0cnVlLgorLkVsCisuUHAKK1RoZQorLkZsIGEKK29wZXJhdG9yIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHRoZQorLkZsIG8KK29wZXJhdG9yLgorLlNoIEdSQU1NQVIgQU1CSUdVSVRZCitUaGUKKy5ObSB0ZXN0CitncmFtbWFyIGlzIGluaGVyZW50bHkgYW1iaWd1b3VzLgorSW4gb3JkZXIgdG8gYXNzdXJlIGEgZGVncmVlIG9mIGNvbnNpc3RlbmN5LCB0aGUgY2FzZXMgZGVzY3JpYmVkIGluCisuU3QgLXAxMDAzLjIKK3NlY3Rpb24gNC42Mi40LAorYXJlIGV2YWx1YXRlZCBjb25zaXN0ZW50bHkgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gdGhlCitzdGFuZGFyZHMgZG9jdW1lbnQuCitBbGwgb3RoZXIgY2FzZXMgYXJlIHN1YmplY3QgdG8gdGhlIGFtYmlndWl0eSBpbiB0aGUgY29tbWFuZCBzZW1hbnRpY3MuCisuU2ggRVhJVCBTVEFUVVMKK1RoZQorLk5tIHRlc3QKK3V0aWxpdHkgZXhpdHMgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCAwCitleHByZXNzaW9uIGV2YWx1YXRlZCB0byB0cnVlLgorLkl0IDEKK2V4cHJlc3Npb24gZXZhbHVhdGVkIHRvIGZhbHNlIG9yIGV4cHJlc3Npb24gd2FzCittaXNzaW5nLgorLkl0IFwqW0d0XTEKK0FuIGVycm9yIG9jY3VycmVkLgorLkVsCisuU2ggU1RBTkRBUkRTCitUaGUKKy5ObSB0ZXN0Cit1dGlsaXR5IGltcGxlbWVudHMgYSBzdXBlcnNldCBvZiB0aGUKKy5TdCAtcDEwMDMuMgorc3BlY2lmaWNhdGlvbi4KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2JsdGluL3Rlc3QuYyBiL3Vzci9kYXNoL2JsdGluL3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk0OWRlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvYmx0aW4vdGVzdC5jCkBAIC0wLDAgKzEsNTAwIEBACisvKgorICogdGVzdCgxKTsgdmVyc2lvbiA3LWxpa2UgIC0tICBhdXRob3IgRXJpayBCYWFsYmVyZ2VuCisgKiBtb2RpZmllZCBieSBFcmljIEdpc2luIHRvIGJlIHVzZWQgYXMgYnVpbHQtaW4uCisgKiBtb2RpZmllZCBieSBBcm5vbGQgUm9iYmlucyB0byBhZGQgU1ZSMyBjb21wYXRpYmlsaXR5CisgKiAoLXggLWMgLWIgLXAgLXUgLWcgLWspIHBsdXMgS29ybidzIC1MIC1udCAtb3QgLWVmIGFuZCBuZXcgLVMgKHNvY2tldCkuCisgKiBtb2RpZmllZCBieSBKLlQuIENvbmtsaW4gZm9yIE5ldEJTRC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgaW4gdGhlIFB1YmxpYyBEb21haW4uCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiYmx0aW4uaCIKKworLyogdGVzdCgxKSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKwlvZXhwcgk6Oj0gYWV4cHIgfCBhZXhwciAiLW8iIG9leHByIDsKKwlhZXhwcgk6Oj0gbmV4cHIgfCBuZXhwciAiLWEiIGFleHByIDsKKwluZXhwcgk6Oj0gcHJpbWFyeSB8ICIhIiBwcmltYXJ5CisJcHJpbWFyeQk6Oj0gdW5hcnktb3BlcmF0b3Igb3BlcmFuZAorCQl8IG9wZXJhbmQgYmluYXJ5LW9wZXJhdG9yIG9wZXJhbmQKKwkJfCBvcGVyYW5kCisJCXwgIigiIG9leHByICIpIgorCQk7CisJdW5hcnktb3BlcmF0b3IgOjo9ICItciJ8Ii13InwiLXgifCItZiJ8Ii1kInwiLWMifCItYiJ8Ii1wInwKKwkJIi11InwiLWcifCItayJ8Ii1zInwiLXQifCIteiJ8Ii1uInwiLW8ifCItTyJ8Ii1HInwiLUwifCItUyI7CisKKwliaW5hcnktb3BlcmF0b3IgOjo9ICI9InwiIT0ifCItZXEifCItbmUifCItZ2UifCItZ3QifCItbGUifCItbHQifAorCQkJIi1udCJ8Ii1vdCJ8Ii1lZiI7CisJb3BlcmFuZCA6Oj0gPGFueSBsZWdhbCBVTklYIGZpbGUgbmFtZT4KKyovCisKK2VudW0gdG9rZW4geworCUVPSSwKKwlGSUxSRCwKKwlGSUxXUiwKKwlGSUxFWCwKKwlGSUxFWElTVCwKKwlGSUxSRUcsCisJRklMRElSLAorCUZJTENERVYsCisJRklMQkRFViwKKwlGSUxGSUZPLAorCUZJTFNPQ0ssCisJRklMU1lNLAorCUZJTEdaLAorCUZJTFRULAorCUZJTFNVSUQsCisJRklMU0dJRCwKKwlGSUxTVENLLAorCUZJTE5ULAorCUZJTE9ULAorCUZJTEVRLAorCUZJTFVJRCwKKwlGSUxHSUQsCisJU1RSRVosCisJU1RSTlosCisJU1RSRVEsCisJU1RSTkUsCisJU1RSTFQsCisJU1RSR1QsCisJSU5URVEsCisJSU5UTkUsCisJSU5UR0UsCisJSU5UR1QsCisJSU5UTEUsCisJSU5UTFQsCisJVU5PVCwKKwlCQU5ELAorCUJPUiwKKwlMUEFSRU4sCisJUlBBUkVOLAorCU9QRVJBTkQKK307CisKK2VudW0gdG9rZW5fdHlwZXMgeworCVVOT1AsCisJQklOT1AsCisJQlVOT1AsCisJQkJJTk9QLAorCVBBUkVOCit9OworCitzdGF0aWMgc3RydWN0IHRfb3AgeworCWNvbnN0IGNoYXIgKm9wX3RleHQ7CisJc2hvcnQgb3BfbnVtLCBvcF90eXBlOworfSBjb25zdCBvcHMgW10gPSB7CisJeyItciIsCUZJTFJELAlVTk9QfSwKKwl7Ii13IiwJRklMV1IsCVVOT1B9LAorCXsiLXgiLAlGSUxFWCwJVU5PUH0sCisJeyItZSIsCUZJTEVYSVNULFVOT1B9LAorCXsiLWYiLAlGSUxSRUcsCVVOT1B9LAorCXsiLWQiLAlGSUxESVIsCVVOT1B9LAorCXsiLWMiLAlGSUxDREVWLFVOT1B9LAorCXsiLWIiLAlGSUxCREVWLFVOT1B9LAorCXsiLXAiLAlGSUxGSUZPLFVOT1B9LAorCXsiLXUiLAlGSUxTVUlELFVOT1B9LAorCXsiLWciLAlGSUxTR0lELFVOT1B9LAorCXsiLWsiLAlGSUxTVENLLFVOT1B9LAorCXsiLXMiLAlGSUxHWiwJVU5PUH0sCisJeyItdCIsCUZJTFRULAlVTk9QfSwKKwl7Ii16IiwJU1RSRVosCVVOT1B9LAorCXsiLW4iLAlTVFJOWiwJVU5PUH0sCisJeyItaCIsCUZJTFNZTSwJVU5PUH0sCQkvKiBmb3IgYmFja3dhcmRzIGNvbXBhdCAqLworCXsiLU8iLAlGSUxVSUQsCVVOT1B9LAorCXsiLUciLAlGSUxHSUQsCVVOT1B9LAorCXsiLUwiLAlGSUxTWU0sCVVOT1B9LAorCXsiLVMiLAlGSUxTT0NLLFVOT1B9LAorCXsiPSIsCVNUUkVRLAlCSU5PUH0sCisJeyIhPSIsCVNUUk5FLAlCSU5PUH0sCisJeyI8IiwJU1RSTFQsCUJJTk9QfSwKKwl7Ij4iLAlTVFJHVCwJQklOT1B9LAorCXsiLWVxIiwJSU5URVEsCUJJTk9QfSwKKwl7Ii1uZSIsCUlOVE5FLAlCSU5PUH0sCisJeyItZ2UiLAlJTlRHRSwJQklOT1B9LAorCXsiLWd0IiwJSU5UR1QsCUJJTk9QfSwKKwl7Ii1sZSIsCUlOVExFLAlCSU5PUH0sCisJeyItbHQiLAlJTlRMVCwJQklOT1B9LAorCXsiLW50IiwJRklMTlQsCUJJTk9QfSwKKwl7Ii1vdCIsCUZJTE9ULAlCSU5PUH0sCisJeyItZWYiLAlGSUxFUSwJQklOT1B9LAorCXsiISIsCVVOT1QsCUJVTk9QfSwKKwl7Ii1hIiwJQkFORCwJQkJJTk9QfSwKKwl7Ii1vIiwJQk9SLAlCQklOT1B9LAorCXsiKCIsCUxQQVJFTiwJUEFSRU59LAorCXsiKSIsCVJQQVJFTiwJUEFSRU59LAorCXswLAkwLAkwfQorfTsKKworc3RhdGljIGNoYXIgKip0X3dwOworc3RhdGljIHN0cnVjdCB0X29wIGNvbnN0ICp0X3dwX29wOworCitzdGF0aWMgdm9pZCBzeW50YXgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGludCBvZXhwcihlbnVtIHRva2VuKTsKK3N0YXRpYyBpbnQgYWV4cHIoZW51bSB0b2tlbik7CitzdGF0aWMgaW50IG5leHByKGVudW0gdG9rZW4pOworc3RhdGljIGludCBwcmltYXJ5KGVudW0gdG9rZW4pOworc3RhdGljIGludCBiaW5vcCh2b2lkKTsKK3N0YXRpYyBpbnQgZmlsc3RhdChjaGFyICosIGVudW0gdG9rZW4pOworc3RhdGljIGVudW0gdG9rZW4gdF9sZXgoY2hhciAqKTsKK3N0YXRpYyBpbnQgaXNvcGVyYW5kKHZvaWQpOworc3RhdGljIGludCBnZXRuKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IG5ld2VyZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IG9sZGVyZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGVxdWFsZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IHRlc3Rfc3RfbW9kZShjb25zdCBzdHJ1Y3Qgc3RhdDY0ICosIGludCk7CitzdGF0aWMgaW50IGJhc2hfZ3JvdXBfbWVtYmVyKGdpZF90KTsKKworaW50Cit0ZXN0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmVzOworCisJaWYgKHN0cmNtcChhcmd2WzBdLCAiWyIpID09IDApIHsKKwkJaWYgKHN0cmNtcChhcmd2Wy0tYXJnY10sICJdIikpCisJCQllcnJvcigibWlzc2luZyBdIik7CisJCWFyZ3ZbYXJnY10gPSBOVUxMOworCX0KKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIDE7CisKKwl0X3dwID0gJmFyZ3ZbMV07CisJcmVzID0gIW9leHByKHRfbGV4KCp0X3dwKSk7CisKKwlpZiAoKnRfd3AgIT0gTlVMTCAmJiAqKyt0X3dwICE9IE5VTEwpCisJCXN5bnRheCgqdF93cCwgInVuZXhwZWN0ZWQgb3BlcmF0b3IiKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitzeW50YXgoY29uc3QgY2hhciAqb3AsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpZiAob3AgJiYgKm9wKQorCQllcnJvcigiJXM6ICVzIiwgb3AsIG1zZyk7CisJZWxzZQorCQllcnJvcigiJXMiLCBtc2cpOworfQorCitzdGF0aWMgaW50CitvZXhwcihlbnVtIHRva2VuIG4pCit7CisJaW50IHJlczsKKworCXJlcyA9IGFleHByKG4pOworCWlmICh0X2xleCgqKyt0X3dwKSA9PSBCT1IpCisJCXJldHVybiBvZXhwcih0X2xleCgqKyt0X3dwKSkgfHwgcmVzOworCXRfd3AtLTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CithZXhwcihlbnVtIHRva2VuIG4pCit7CisJaW50IHJlczsKKworCXJlcyA9IG5leHByKG4pOworCWlmICh0X2xleCgqKyt0X3dwKSA9PSBCQU5EKQorCQlyZXR1cm4gYWV4cHIodF9sZXgoKisrdF93cCkpICYmIHJlczsKKwl0X3dwLS07CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorbmV4cHIoZW51bSB0b2tlbiBuKQoreworCWlmIChuID09IFVOT1QpCisJCXJldHVybiAhbmV4cHIodF9sZXgoKisrdF93cCkpOworCXJldHVybiBwcmltYXJ5KG4pOworfQorCitzdGF0aWMgaW50CitwcmltYXJ5KGVudW0gdG9rZW4gbikKK3sKKwllbnVtIHRva2VuIG5uOworCWludCByZXM7CisKKwlpZiAobiA9PSBFT0kpCisJCXJldHVybiAwOwkJLyogbWlzc2luZyBleHByZXNzaW9uICovCisJaWYgKG4gPT0gTFBBUkVOKSB7CisJCWlmICgobm4gPSB0X2xleCgqKyt0X3dwKSkgPT0gUlBBUkVOKQorCQkJcmV0dXJuIDA7CS8qIG1pc3NpbmcgZXhwcmVzc2lvbiAqLworCQlyZXMgPSBvZXhwcihubik7CisJCWlmICh0X2xleCgqKyt0X3dwKSAhPSBSUEFSRU4pCisJCQlzeW50YXgoTlVMTCwgImNsb3NpbmcgcGFyZW4gZXhwZWN0ZWQiKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJaWYgKHRfd3Bfb3AgJiYgdF93cF9vcC0+b3BfdHlwZSA9PSBVTk9QKSB7CisJCS8qIHVuYXJ5IGV4cHJlc3Npb24gKi8KKwkJaWYgKCorK3Rfd3AgPT0gTlVMTCkKKwkJCXN5bnRheCh0X3dwX29wLT5vcF90ZXh0LCAiYXJndW1lbnQgZXhwZWN0ZWQiKTsKKwkJc3dpdGNoIChuKSB7CisJCWNhc2UgU1RSRVo6CisJCQlyZXR1cm4gc3RybGVuKCp0X3dwKSA9PSAwOworCQljYXNlIFNUUk5aOgorCQkJcmV0dXJuIHN0cmxlbigqdF93cCkgIT0gMDsKKwkJY2FzZSBGSUxUVDoKKwkJCXJldHVybiBpc2F0dHkoZ2V0bigqdF93cCkpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZpbHN0YXQoKnRfd3AsIG4pOworCQl9CisJfQorCisJaWYgKHRfbGV4KHRfd3BbMV0pLCB0X3dwX29wICYmIHRfd3Bfb3AtPm9wX3R5cGUgPT0gQklOT1ApIHsKKwkJcmV0dXJuIGJpbm9wKCk7CisJfQorCisJcmV0dXJuIHN0cmxlbigqdF93cCkgPiAwOworfQorCitzdGF0aWMgaW50CitiaW5vcCh2b2lkKQoreworCWNvbnN0IGNoYXIgKm9wbmQxLCAqb3BuZDI7CisJc3RydWN0IHRfb3AgY29uc3QgKm9wOworCisJb3BuZDEgPSAqdF93cDsKKwkodm9pZCkgdF9sZXgoKisrdF93cCk7CisJb3AgPSB0X3dwX29wOworCisJaWYgKChvcG5kMiA9ICorK3Rfd3ApID09IChjaGFyICopMCkKKwkJc3ludGF4KG9wLT5vcF90ZXh0LCAiYXJndW1lbnQgZXhwZWN0ZWQiKTsKKworCXN3aXRjaCAob3AtPm9wX251bSkgeworCWRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKwkJYWJvcnQoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworI2VuZGlmCisJY2FzZSBTVFJFUToKKwkJcmV0dXJuIHN0cmNtcChvcG5kMSwgb3BuZDIpID09IDA7CisJY2FzZSBTVFJORToKKwkJcmV0dXJuIHN0cmNtcChvcG5kMSwgb3BuZDIpICE9IDA7CisJY2FzZSBTVFJMVDoKKwkJcmV0dXJuIHN0cmNtcChvcG5kMSwgb3BuZDIpIDwgMDsKKwljYXNlIFNUUkdUOgorCQlyZXR1cm4gc3RyY21wKG9wbmQxLCBvcG5kMikgPiAwOworCWNhc2UgSU5URVE6CisJCXJldHVybiBnZXRuKG9wbmQxKSA9PSBnZXRuKG9wbmQyKTsKKwljYXNlIElOVE5FOgorCQlyZXR1cm4gZ2V0bihvcG5kMSkgIT0gZ2V0bihvcG5kMik7CisJY2FzZSBJTlRHRToKKwkJcmV0dXJuIGdldG4ob3BuZDEpID49IGdldG4ob3BuZDIpOworCWNhc2UgSU5UR1Q6CisJCXJldHVybiBnZXRuKG9wbmQxKSA+IGdldG4ob3BuZDIpOworCWNhc2UgSU5UTEU6CisJCXJldHVybiBnZXRuKG9wbmQxKSA8PSBnZXRuKG9wbmQyKTsKKwljYXNlIElOVExUOgorCQlyZXR1cm4gZ2V0bihvcG5kMSkgPCBnZXRuKG9wbmQyKTsKKwljYXNlIEZJTE5UOgorCQlyZXR1cm4gbmV3ZXJmIChvcG5kMSwgb3BuZDIpOworCWNhc2UgRklMT1Q6CisJCXJldHVybiBvbGRlcmYgKG9wbmQxLCBvcG5kMik7CisJY2FzZSBGSUxFUToKKwkJcmV0dXJuIGVxdWFsZiAob3BuZDEsIG9wbmQyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2ZpbHN0YXQoY2hhciAqbm0sIGVudW0gdG9rZW4gbW9kZSkKK3sKKwlzdHJ1Y3Qgc3RhdDY0IHM7CisKKwlpZiAobW9kZSA9PSBGSUxTWU0gPyBsc3RhdDY0KG5tLCAmcykgOiBzdGF0NjQobm0sICZzKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEZJTFJEOgorCQlyZXR1cm4gdGVzdF9zdF9tb2RlKCZzLCBSX09LKTsKKwljYXNlIEZJTFdSOgorCQlyZXR1cm4gdGVzdF9zdF9tb2RlKCZzLCBXX09LKTsKKwljYXNlIEZJTEVYOgorCQlyZXR1cm4gdGVzdF9zdF9tb2RlKCZzLCBYX09LKTsKKwljYXNlIEZJTEVYSVNUOgorCQlyZXR1cm4gMTsKKwljYXNlIEZJTFJFRzoKKwkJcmV0dXJuIFNfSVNSRUcocy5zdF9tb2RlKTsKKwljYXNlIEZJTERJUjoKKwkJcmV0dXJuIFNfSVNESVIocy5zdF9tb2RlKTsKKwljYXNlIEZJTENERVY6CisJCXJldHVybiBTX0lTQ0hSKHMuc3RfbW9kZSk7CisJY2FzZSBGSUxCREVWOgorCQlyZXR1cm4gU19JU0JMSyhzLnN0X21vZGUpOworCWNhc2UgRklMRklGTzoKKwkJcmV0dXJuIFNfSVNGSUZPKHMuc3RfbW9kZSk7CisJY2FzZSBGSUxTT0NLOgorCQlyZXR1cm4gU19JU1NPQ0socy5zdF9tb2RlKTsKKwljYXNlIEZJTFNZTToKKwkJcmV0dXJuIFNfSVNMTksocy5zdF9tb2RlKTsKKwljYXNlIEZJTFNVSUQ6CisJCXJldHVybiAocy5zdF9tb2RlICYgU19JU1VJRCkgIT0gMDsKKwljYXNlIEZJTFNHSUQ6CisJCXJldHVybiAocy5zdF9tb2RlICYgU19JU0dJRCkgIT0gMDsKKwljYXNlIEZJTFNUQ0s6CisJCXJldHVybiAocy5zdF9tb2RlICYgU19JU1ZUWCkgIT0gMDsKKwljYXNlIEZJTEdaOgorCQlyZXR1cm4gISFzLnN0X3NpemU7CisJY2FzZSBGSUxVSUQ6CisJCXJldHVybiBzLnN0X3VpZCA9PSBnZXRldWlkKCk7CisJY2FzZSBGSUxHSUQ6CisJCXJldHVybiBzLnN0X2dpZCA9PSBnZXRlZ2lkKCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgZW51bSB0b2tlbgordF9sZXgoY2hhciAqcykKK3sKKwlzdHJ1Y3QgdF9vcCBjb25zdCAqb3A7CisKKwlvcCA9IG9wczsKKworCWlmIChzID09IDApIHsKKwkJdF93cF9vcCA9IChzdHJ1Y3QgdF9vcCAqKTA7CisJCXJldHVybiBFT0k7CisJfQorCXdoaWxlIChvcC0+b3BfdGV4dCkgeworCQlpZiAoc3RyY21wKHMsIG9wLT5vcF90ZXh0KSA9PSAwKSB7CisJCQlpZiAoKG9wLT5vcF90eXBlID09IFVOT1AgJiYgaXNvcGVyYW5kKCkpIHx8CisJCQkgICAgKG9wLT5vcF9udW0gPT0gTFBBUkVOICYmICoodF93cCsxKSA9PSAwKSkKKwkJCQlicmVhazsKKwkJCXRfd3Bfb3AgPSBvcDsKKwkJCXJldHVybiBvcC0+b3BfbnVtOworCQl9CisJCW9wKys7CisJfQorCXRfd3Bfb3AgPSAoc3RydWN0IHRfb3AgKikwOworCXJldHVybiBPUEVSQU5EOworfQorCitzdGF0aWMgaW50Citpc29wZXJhbmQodm9pZCkKK3sKKwlzdHJ1Y3QgdF9vcCBjb25zdCAqb3A7CisJY2hhciAqcywgKnQ7CisKKwlvcCA9IG9wczsKKwlpZiAoKHMgID0gKih0X3dwKzEpKSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZiAoKHQgPSAqKHRfd3ArMikpID09IDApCisJCXJldHVybiAwOworCXdoaWxlIChvcC0+b3BfdGV4dCkgeworCQlpZiAoc3RyY21wKHMsIG9wLT5vcF90ZXh0KSA9PSAwKQorCSAgICAJCXJldHVybiBvcC0+b3BfdHlwZSA9PSBCSU5PUCAmJgorCSAgICAJCSAgICAodFswXSAhPSAnKScgfHwgdFsxXSAhPSAnXDAnKTsKKwkJb3ArKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGF0b2kgd2l0aCBlcnJvciBkZXRlY3Rpb24gKi8KK3N0YXRpYyBpbnQKK2dldG4oY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpwOworCWxvbmcgcjsKKworCWVycm5vID0gMDsKKwlyID0gc3RydG9sKHMsICZwLCAxMCk7CisKKwlpZiAoZXJybm8gIT0gMCkKKwkgICAgICBlcnJvcigiJXM6IG91dCBvZiByYW5nZSIsIHMpOworCisJd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnApKQorCSAgICAgIHArKzsKKworCWlmICgqcCkKKwkgICAgICBlcnJvcigiJXM6IGJhZCBudW1iZXIiLCBzKTsKKworCXJldHVybiAoaW50KSByOworfQorCitzdGF0aWMgaW50CituZXdlcmYgKGNvbnN0IGNoYXIgKmYxLCBjb25zdCBjaGFyICpmMikKK3sKKwlzdHJ1Y3Qgc3RhdCBiMSwgYjI7CisKKwlyZXR1cm4gKHN0YXQgKGYxLCAmYjEpID09IDAgJiYKKwkJc3RhdCAoZjIsICZiMikgPT0gMCAmJgorCQliMS5zdF9tdGltZSA+IGIyLnN0X210aW1lKTsKK30KKworc3RhdGljIGludAorb2xkZXJmIChjb25zdCBjaGFyICpmMSwgY29uc3QgY2hhciAqZjIpCit7CisJc3RydWN0IHN0YXQgYjEsIGIyOworCisJcmV0dXJuIChzdGF0IChmMSwgJmIxKSA9PSAwICYmCisJCXN0YXQgKGYyLCAmYjIpID09IDAgJiYKKwkJYjEuc3RfbXRpbWUgPCBiMi5zdF9tdGltZSk7Cit9CisKK3N0YXRpYyBpbnQKK2VxdWFsZiAoY29uc3QgY2hhciAqZjEsIGNvbnN0IGNoYXIgKmYyKQoreworCXN0cnVjdCBzdGF0IGIxLCBiMjsKKworCXJldHVybiAoc3RhdCAoZjEsICZiMSkgPT0gMCAmJgorCQlzdGF0IChmMiwgJmIyKSA9PSAwICYmCisJCWIxLnN0X2RldiA9PSBiMi5zdF9kZXYgJiYKKwkJYjEuc3RfaW5vID09IGIyLnN0X2lubyk7Cit9CisKKy8qCisgKiBTaW1pbGFyIHRvIHdoYXQgYWNjZXNzKDIpIGRvZXMsIGJ1dCB1c2VzIHRoZSBlZmZlY3RpdmUgdWlkIGFuZCBnaWQuCisgKiBEb2Vzbid0IG1ha2UgdGhlIG1pc3Rha2Ugb2YgdGVsbGluZyByb290IHRoYXQgYW55IGZpbGUgaXMgZXhlY3V0YWJsZS4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIGZpbGUgaXMgYWNjZXNzaWJsZS4KKyAqLworc3RhdGljIGludAordGVzdF9zdF9tb2RlKGNvbnN0IHN0cnVjdCBzdGF0NjQgKnN0LCBpbnQgbW9kZSkKK3sKKwlpbnQgZXVpZCA9IGdldGV1aWQoKTsKKworCWlmIChldWlkID09IDApIHsKKwkJLyogUm9vdCBjYW4gcmVhZCBvciB3cml0ZSBhbnkgZmlsZS4gKi8KKwkJaWYgKG1vZGUgIT0gWF9PSykKKwkJCXJldHVybiAxOworCisJCS8qIFJvb3QgY2FuIGV4ZWN1dGUgYW55IGZpbGUgdGhhdCBoYXMgYW55IG9uZSBvZiB0aGUgZXhlY3V0ZQorCQkgICBiaXRzIHNldC4gKi8KKwkJbW9kZSA9IFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USDsKKwl9IGVsc2UgaWYgKHN0LT5zdF91aWQgPT0gZXVpZCkKKwkJbW9kZSA8PD0gNjsKKwllbHNlIGlmIChiYXNoX2dyb3VwX21lbWJlcihzdC0+c3RfZ2lkKSkKKwkJbW9kZSA8PD0gMzsKKworCXJldHVybiBzdC0+c3RfbW9kZSAmIG1vZGU7Cit9CisKKy8qIFJldHVybiBub24temVybyBpZiBHSUQgaXMgb25lIHRoYXQgd2UgaGF2ZSBpbiBvdXIgZ3JvdXBzIGxpc3QuICovCitzdGF0aWMgaW50CitiYXNoX2dyb3VwX21lbWJlcihnaWRfdCBnaWQpCit7CisJcmVnaXN0ZXIgaW50IGk7CisJZ2lkX3QgKmdyb3VwX2FycmF5OworCWludCBuZ3JvdXBzOworCisJLyogU2hvcnQtY2lyY3VpdCBpZiBwb3NzaWJsZSwgbWF5YmUgc2F2aW5nIGEgY2FsbCB0byBnZXRncm91cHMoKS4gKi8KKwlpZiAoZ2lkID09IGdldGdpZCgpIHx8IGdpZCA9PSBnZXRlZ2lkKCkpCisJCXJldHVybiAoMSk7CisKKwluZ3JvdXBzID0gZ2V0Z3JvdXBzKDAsIE5VTEwpOworCWdyb3VwX2FycmF5ID0gc3RhbGxvYyhuZ3JvdXBzICogc2l6ZW9mKGdpZF90KSk7CisJZ2V0Z3JvdXBzKG5ncm91cHMsIGdyb3VwX2FycmF5KTsKKworCS8qIFNlYXJjaCB0aHJvdWdoIHRoZSBsaXN0IGxvb2tpbmcgZm9yIEdJRC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKQorCQlpZiAoZ2lkID09IGdyb3VwX2FycmF5W2ldKQorCQkJcmV0dXJuICgxKTsKKworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9idWlsdGlucy5kZWYuaW4gYi91c3IvZGFzaC9idWlsdGlucy5kZWYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiNjlkNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2J1aWx0aW5zLmRlZi5pbgpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpYnVpbHRpbnMuZGVmCTguNCAoQmVya2VsZXkpIDUvNC85NQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgbGlzdHMgYWxsIHRoZSBidWlsdGluIGNvbW1hbmRzLiAgVGhlIGZpcnN0IGNvbHVtbiBpcyB0aGUgbmFtZQorICogb2YgYSBDIHJvdXRpbmUuCisgKiBUaGUgLWEgZmxhZyBzcGVjaWZpZXMgdGhhdCB0aGlzIGlzIGEgcG9zaXggJ2Fzc2lnbm1lbnQgYnVpbHRpbicgY29tbWFuZC4KKyAqIFRoZSAtcyBmbGFnIHNwZWNpZmllcyB0aGF0IHRoaXMgaXMgYSBwb3NpeCAnc3BlY2lhbCBidWlsdGluJyBjb21tYW5kLgorICogVGhlIC11IGZsYWcgc3BlY2lmaWVzIHRoYXQgdGhpcyBpcyBhIHBvc2l4ICdzdGFuZGFyZCB1dGlsaXR5Jy4KKyAqIFRoZSByZXN0IG9mIHRoZSBsaW5lIHNwZWNpZmllcyB0aGUgY29tbWFuZCBuYW1lIG9yIG5hbWVzIHVzZWQgdG8gcnVuCisgKiB0aGUgY29tbWFuZC4KKyAqLworCisjaWZuZGVmIEpPQlMKKyNkZWZpbmUgSk9CUyAxCisjZW5kaWYKKworI2lmIEpPQlMKK2JnY21kCQktdSBiZworZmdjbWQJCS11IGZnCisjZW5kaWYKKworI2lmbmRlZiBTTUFMTAoraGlzdGNtZAkJLXUgZmMKKyNlbmRpZgorCiticmVha2NtZAktcyBicmVhayAtcyBjb250aW51ZQorY2RjbWQJCS11IGNkIGNoZGlyCitjb21tYW5kY21kCS11IGNvbW1hbmQKK2RvdGNtZAkJLXMgLgorZWNob2NtZAkJZWNobworZXZhbGNtZAkJLXMgZXZhbAorZXhlY2NtZAkJLXMgZXhlYworZXhpdGNtZAkJLXMgZXhpdAorZXhwb3J0Y21kCS1hcyBleHBvcnQgLWFzIHJlYWRvbmx5CitmYWxzZWNtZAktdSBmYWxzZQorZ2V0b3B0c2NtZAktdSBnZXRvcHRzCitoYXNoY21kCQloYXNoCitqb2JzY21kCQktdSBqb2JzCitsb2NhbGNtZAktYSBsb2NhbAorcHJpbnRmY21kCXByaW50ZgorcHdkY21kCQlwd2QKK3JlYWRjbWQJCS11IHJlYWQKK3JldHVybmNtZAktcyByZXR1cm4KK3NldGNtZAkJLXMgc2V0CitzaGlmdGNtZAktcyBzaGlmdAordHJhcGNtZAkJLXMgdHJhcAordHJ1ZWNtZAkJLXMgOiAtdSB0cnVlCit0eXBlY21kCQl0eXBlCit1bWFza2NtZAktdSB1bWFzawordW5hbGlhc2NtZAktdSB1bmFsaWFzCit1bnNldGNtZAktcyB1bnNldAord2FpdGNtZAkJLXUgd2FpdAorYWxpYXNjbWQJLWF1IGFsaWFzCisjaWZkZWYgSEFWRV9HRVRSTElNSVQKK3VsaW1pdGNtZAl1bGltaXQKKyNlbmRpZgordGVzdGNtZAkJdGVzdCBbCitraWxsY21kCQktdSBraWxsCmRpZmYgLS1naXQgYS91c3IvZGFzaC9jZC5jIGIvdXNyL2Rhc2gvY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjczOTNmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvY2QuYwpAQCAtMCwwICsxLDMwNCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKgorICogVGhlIGNkIGFuZCBwd2QgY29tbWFuZHMuCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAidmFyLmgiCisjaW5jbHVkZSAibm9kZXMuaCIJLyogZm9yIGpvYnMuaCAqLworI2luY2x1ZGUgImpvYnMuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgImV4ZWMuaCIKKyNpbmNsdWRlICJyZWRpci5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAic2hvdy5oIgorI2luY2x1ZGUgImNkLmgiCisKKyNkZWZpbmUgQ0RfUEhZU0lDQUwgMQorI2RlZmluZSBDRF9QUklOVCAyCisKK1NUQVRJQyBpbnQgZG9jZChjb25zdCBjaGFyICosIGludCk7CitTVEFUSUMgY29uc3QgY2hhciAqdXBkYXRlcHdkKGNvbnN0IGNoYXIgKik7CitTVEFUSUMgY2hhciAqZ2V0cHdkKHZvaWQpOworU1RBVElDIGludCBjZG9wdCh2b2lkKTsKKworU1RBVElDIGNoYXIgKmN1cmRpciA9IG51bGxzdHI7CQkvKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICovCitTVEFUSUMgY2hhciAqcGh5c2RpciA9IG51bGxzdHI7CQkvKiBwaHlzaWNhbCB3b3JraW5nIGRpcmVjdG9yeSAqLworCitTVEFUSUMgaW50CitjZG9wdCgpCit7CisJaW50IGZsYWdzID0gMDsKKwlpbnQgaSwgajsKKworCWogPSAnTCc7CisJd2hpbGUgKChpID0gbmV4dG9wdCgiTFAiKSkpIHsKKwkJaWYgKGkgIT0gaikgeworCQkJZmxhZ3MgXj0gQ0RfUEhZU0lDQUw7CisJCQlqID0gaTsKKwkJfQorCX0KKworCXJldHVybiBmbGFnczsKK30KKworaW50CitjZGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqZGVzdDsKKwljb25zdCBjaGFyICpwYXRoOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciBjOworCXN0cnVjdCBzdGF0IHN0YXRiOworCWludCBmbGFnczsKKworCWZsYWdzID0gY2RvcHQoKTsKKwlkZXN0ID0gKmFyZ3B0cjsKKwlpZiAoIWRlc3QpCisJCWRlc3QgPSBibHRpbmxvb2t1cChob21lc3RyKTsKKwllbHNlIGlmIChkZXN0WzBdID09ICctJyAmJiBkZXN0WzFdID09ICdcMCcpIHsKKwkJZGVzdCA9IGJsdGlubG9va3VwKCJPTERQV0QiKTsKKwkJZmxhZ3MgfD0gQ0RfUFJJTlQ7CisJfQorCWlmICghZGVzdCkKKwkJZGVzdCA9IG51bGxzdHI7CisJaWYgKCpkZXN0ID09ICcvJykKKwkJZ290byBzdGVwNzsKKwlpZiAoKmRlc3QgPT0gJy4nKSB7CisJCWMgPSBkZXN0WzFdOworZG90ZG90OgorCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXDAnOgorCQljYXNlICcvJzoKKwkJCWdvdG8gc3RlcDY7CisJCWNhc2UgJy4nOgorCQkJYyA9IGRlc3RbMl07CisJCQlpZiAoYyAhPSAnLicpCisJCQkJZ290byBkb3Rkb3Q7CisJCX0KKwl9CisJaWYgKCEqZGVzdCkKKwkJZGVzdCA9ICIuIjsKKwlpZiAoIShwYXRoID0gYmx0aW5sb29rdXAoIkNEUEFUSCIpKSkgeworc3RlcDY6CitzdGVwNzoKKwkJcCA9IGRlc3Q7CisJCWdvdG8gZG9jZDsKKwl9CisJZG8geworCQljID0gKnBhdGg7CisJCXAgPSBwYWR2YW5jZSgmcGF0aCwgZGVzdCk7CisJCWlmIChzdGF0KHAsICZzdGF0YikgPj0gMCAmJiBTX0lTRElSKHN0YXRiLnN0X21vZGUpKSB7CisJCQlpZiAoYyAmJiBjICE9ICc6JykKKwkJCQlmbGFncyB8PSBDRF9QUklOVDsKK2RvY2Q6CisJCQlpZiAoIWRvY2QocCwgZmxhZ3MpKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChwYXRoKTsKKwlzaF9lcnJvcigiY2FuJ3QgY2QgdG8gJXMiLCBkZXN0KTsKKwkvKiBOT1RSRUFDSEVEICovCitvdXQ6CisJaWYgKGZsYWdzICYgQ0RfUFJJTlQpCisJCW91dDFmbXQoc25sZm10LCBjdXJkaXIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBBY3R1YWxseSBkbyB0aGUgY2hkaXIuICBXZSBhbHNvIGNhbGwgaGFzaGNkIHRvIGxldCB0aGUgcm91dGluZXMgaW4gZXhlYy5jCisgKiBrbm93IHRoYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkLgorICovCisKK1NUQVRJQyBpbnQKK2RvY2QoY29uc3QgY2hhciAqZGVzdCwgaW50IGZsYWdzKQoreworCWNvbnN0IGNoYXIgKmRpciA9IDA7CisJaW50IGVycjsKKworCVRSQUNFKCgiZG9jZChcIiVzXCIsICVkKSBjYWxsZWRcbiIsIGRlc3QsIGZsYWdzKSk7CisKKwlJTlRPRkY7CisJaWYgKCEoZmxhZ3MgJiBDRF9QSFlTSUNBTCkpIHsKKwkJZGlyID0gdXBkYXRlcHdkKGRlc3QpOworCQlpZiAoZGlyKQorCQkJZGVzdCA9IGRpcjsKKwl9CisJZXJyID0gY2hkaXIoZGVzdCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJc2V0cHdkKGRpciwgMSk7CisJaGFzaGNkKCk7CitvdXQ6CisJSU5UT047CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICogVXBkYXRlIGN1cmRpciAodGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KSBpbiByZXNwb25zZSB0byBhCisgKiBjZCBjb21tYW5kLgorICovCisKK1NUQVRJQyBjb25zdCBjaGFyICoKK3VwZGF0ZXB3ZChjb25zdCBjaGFyICpkaXIpCit7CisJY2hhciAqbmV3OworCWNoYXIgKnA7CisJY2hhciAqY2Rjb21wcGF0aDsKKwljb25zdCBjaGFyICpsaW07CisKKwljZGNvbXBwYXRoID0gc3N0cmR1cChkaXIpOworCVNUQVJUU1RBQ0tTVFIobmV3KTsKKwlpZiAoKmRpciAhPSAnLycpIHsKKwkJaWYgKGN1cmRpciA9PSBudWxsc3RyKQorCQkJcmV0dXJuIDA7CisJCW5ldyA9IHN0cHV0cyhjdXJkaXIsIG5ldyk7CisJfQorCW5ldyA9IG1ha2VzdHJzcGFjZShzdHJsZW4oZGlyKSArIDIsIG5ldyk7CisJbGltID0gc3RhY2tibG9jaygpICsgMTsKKwlpZiAoKmRpciAhPSAnLycpIHsKKwkJaWYgKG5ld1stMV0gIT0gJy8nKQorCQkJVVNUUFVUQygnLycsIG5ldyk7CisJCWlmIChuZXcgPiBsaW0gJiYgKmxpbSA9PSAnLycpCisJCQlsaW0rKzsKKwl9IGVsc2UgeworCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJY2Rjb21wcGF0aCsrOworCQlpZiAoZGlyWzFdID09ICcvJyAmJiBkaXJbMl0gIT0gJy8nKSB7CisJCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJCWNkY29tcHBhdGgrKzsKKwkJCWxpbSsrOworCQl9CisJfQorCXAgPSBzdHJ0b2soY2Rjb21wcGF0aCwgIi8iKTsKKwl3aGlsZSAocCkgeworCQlzd2l0Y2goKnApIHsKKwkJY2FzZSAnLic6CisJCQlpZiAocFsxXSA9PSAnLicgJiYgcFsyXSA9PSAnXDAnKSB7CisJCQkJd2hpbGUgKG5ldyA+IGxpbSkgeworCQkJCQlTVFVOUFVUQyhuZXcpOworCQkJCQlpZiAobmV3Wy0xXSA9PSAnLycpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHBbMV0gPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJbmV3ID0gc3RwdXRzKHAsIG5ldyk7CisJCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJfQorCQlwID0gc3RydG9rKDAsICIvIik7CisJfQorCWlmIChuZXcgPiBsaW0pCisJCVNUVU5QVVRDKG5ldyk7CisJKm5ldyA9IDA7CisJcmV0dXJuIHN0YWNrYmxvY2soKTsKK30KKworCisjZGVmaW5lIE1BWFBXRCAyNTYKKworLyoKKyAqIEZpbmQgb3V0IHdoYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzLiBJZiB3ZSBhbHJlYWR5IGtub3cgdGhlIGN1cnJlbnQKKyAqIGRpcmVjdG9yeSwgdGhpcyByb3V0aW5lIHJldHVybnMgaW1tZWRpYXRlbHkuCisgKi8KK2lubGluZQorU1RBVElDIGNoYXIgKgorZ2V0cHdkKCkKK3sKKwljaGFyIGJ1ZltQQVRIX01BWF07CisJY2hhciAqZGlyID0gZ2V0Y3dkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXJldHVybiBkaXIgPyBzYXZlc3RyKGRpcikgOiBudWxsc3RyOworfQorCitpbnQKK3B3ZGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZsYWdzOworCWNvbnN0IGNoYXIgKmRpciA9IGN1cmRpcjsKKworCWZsYWdzID0gY2RvcHQoKTsKKwlpZiAoZmxhZ3MpIHsKKwkJaWYgKHBoeXNkaXIgPT0gbnVsbHN0cikKKwkJCXNldHB3ZChkaXIsIDApOworCQlkaXIgPSBwaHlzZGlyOworCX0KKwlvdXQxZm10KHNubGZtdCwgZGlyKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorc2V0cHdkKGNvbnN0IGNoYXIgKnZhbCwgaW50IHNldG9sZCkKK3sKKwljaGFyICpvbGRjdXIsICpkaXI7CisKKwlvbGRjdXIgPSBkaXIgPSBjdXJkaXI7CisKKwlpZiAoc2V0b2xkKSB7CisJCXNldHZhcigiT0xEUFdEIiwgb2xkY3VyLCBWRVhQT1JUKTsKKwl9CisJSU5UT0ZGOworCWlmIChwaHlzZGlyICE9IG51bGxzdHIpIHsKKwkJaWYgKHBoeXNkaXIgIT0gb2xkY3VyKQorCQkJZnJlZShwaHlzZGlyKTsKKwkJcGh5c2RpciA9IG51bGxzdHI7CisJfQorCWlmIChvbGRjdXIgPT0gdmFsIHx8ICF2YWwpIHsKKwkJY2hhciAqcyA9IGdldHB3ZCgpOworCQlwaHlzZGlyID0gczsKKwkJaWYgKCF2YWwpCisJCQlkaXIgPSBzOworCX0gZWxzZQorCQlkaXIgPSBzYXZlc3RyKHZhbCk7CisJaWYgKG9sZGN1ciAhPSBkaXIgJiYgb2xkY3VyICE9IG51bGxzdHIpIHsKKwkJZnJlZShvbGRjdXIpOworCX0KKwljdXJkaXIgPSBkaXI7CisJSU5UT047CisJc2V0dmFyKCJQV0QiLCBkaXIsIFZFWFBPUlQpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvY2QuaCBiL3Vzci9kYXNoL2NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2MzE2MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2NkLmgKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworaW50CWNkY21kKGludCwgY2hhciAqKik7CitpbnQJcHdkY21kKGludCwgY2hhciAqKik7Cit2b2lkCXNldHB3ZChjb25zdCBjaGFyICosIGludCk7CmRpZmYgLS1naXQgYS91c3IvZGFzaC9jb25maWcuaCBiL3Vzci9kYXNoL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNTg3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9jb25maWcuaApAQCAtMCwwICsxLDg1IEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLworLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYnNlYXJjaCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQlNFQVJDSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cHduYW0nIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfR0VUUFdOQU0gKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRybGltaXQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfR0VUUkxJTUlUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNhbHBoYScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfSVNBTFBIQSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBga2lsbHBnJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0tJTExQRyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbXBjcHknIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTUVNUENQWSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ3NldG1hc2snIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfU0lHU0VUTUFTSyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cGNweScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFBDUFkgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjaHJudWwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfU1RSQ0hSTlVMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc2lnbmFsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJTSUdOQUwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvZCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJUT0QgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2ltYXgnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUlRPSU1BWCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG91bWF4JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJUT1VNQVggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2NvbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfU1lTQ09ORiAqLworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSAiZGFzaCIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9OQU1FICJkYXNoIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJkYXNoIDAuNS4yIgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiZGFzaCIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjUuMiIKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIwLjUuMiIKKworLyogRW5hYmxlIEdOVSBleHRlbnNpb25zIG9uIHN5c3RlbXMgdGhhdCBoYXZlIHRoZW0uICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UgMQorI2VuZGlmCisKKy8qIDY0LWJpdCBvcGVyYXRpb25zIGFyZSB0aGUgc2FtZSBhcyAzMi1iaXQgKi8KKyNkZWZpbmUgZnN0YXQ2NCBmc3RhdAorCisvKiA2NC1iaXQgb3BlcmF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgMzItYml0ICovCisjZGVmaW5lIGxzdGF0NjQgbHN0YXQKKworLyogNjQtYml0IG9wZXJhdGlvbnMgYXJlIHRoZSBzYW1lIGFzIDMyLWJpdCAqLworI2RlZmluZSBvcGVuNjQgb3BlbgorCisvKiBrbGliYyBoYXMgYnNkX3NpZ25hbCBpbnN0ZWFkIG9mIHNpZ25hbCAqLworI2RlZmluZSBzaWduYWwgYnNkX3NpZ25hbAorCisvKiA2NC1iaXQgb3BlcmF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgMzItYml0ICovCisjZGVmaW5lIHN0YXQ2NCBzdGF0CmRpZmYgLS1naXQgYS91c3IvZGFzaC9lcnJvci5jIGIvdXNyL2Rhc2gvZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzgyNDNkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZXJyb3IuYwpAQCAtMCwwICsxLDIzMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBFcnJvcnMgYW5kIGV4Y2VwdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAiZXZhbC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInRyYXAuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworCisvKgorICogQ29kZSB0byBoYW5kbGUgZXhjZXB0aW9ucyBpbiBDLgorICovCisKK3N0cnVjdCBqbXBsb2MgKmhhbmRsZXI7CitpbnQgZXhjZXB0aW9uOworaW50IHN1cHByZXNzaW50Owordm9sYXRpbGUgc2lnX2F0b21pY190IGludHBlbmRpbmc7CisKKworc3RhdGljIHZvaWQgZXh2ZXJyb3IoaW50LCBjb25zdCBjaGFyICosIHZhX2xpc3QpCisgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKy8qCisgKiBDYWxsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLiAgU2luY2UgQyBkb2Vzbid0IGluY2x1ZGUgZXhjZXB0aW9ucywgd2UKKyAqIGp1c3QgZG8gYSBsb25nam1wIHRvIHRoZSBleGNlcHRpb24gaGFuZGxlci4gIFRoZSB0eXBlIG9mIGV4Y2VwdGlvbiBpcworICogc3RvcmVkIGluIHRoZSBnbG9iYWwgdmFyaWFibGUgImV4Y2VwdGlvbiIuCisgKi8KKwordm9pZAorZXhyYWlzZShpbnQgZSkKK3sKKyNpZmRlZiBERUJVRworCWlmIChoYW5kbGVyID09IE5VTEwpCisJCWFib3J0KCk7CisjZW5kaWYKKwlJTlRPRkY7CisKKwlleGNlcHRpb24gPSBlOworCWxvbmdqbXAoaGFuZGxlci0+bG9jLCAxKTsKK30KKworCisvKgorICogQ2FsbGVkIGZyb20gdHJhcC5jIHdoZW4gYSBTSUdJTlQgaXMgcmVjZWl2ZWQuICAoSWYgdGhlIHVzZXIgc3BlY2lmaWVzCisgKiB0aGF0IFNJR0lOVCBpcyB0byBiZSB0cmFwcGVkIG9yIGlnbm9yZWQgdXNpbmcgdGhlIHRyYXAgYnVpbHRpbiwgdGhlbgorICogdGhpcyByb3V0aW5lIGlzIG5vdCBjYWxsZWQuKSAgU3VwcHJlc3NpbnQgaXMgbm9uemVybyB3aGVuIGludGVycnVwdHMKKyAqIGFyZSBoZWxkIHVzaW5nIHRoZSBJTlRPRkYgbWFjcm8uICAoVGhlIHRlc3QgZm9yIGlmbGFnIGlzIGp1c3QKKyAqIGRlZmVuc2l2ZSBwcm9ncmFtbWluZy4pCisgKi8KKwordm9pZAorb25pbnQodm9pZCkgeworCWludCBpOworCisJaW50cGVuZGluZyA9IDA7CisJc2lnY2xlYXJtYXNrKCk7CisJaSA9IEVYU0lHOworCWlmIChnb3RzaWdbU0lHSU5UIC0gMV0gJiYgIXRyYXBbU0lHSU5UXSkgeworCQlpZiAoIShyb290c2hlbGwgJiYgaWZsYWcpKSB7CisJCQlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKwkJCXJhaXNlKFNJR0lOVCk7CisJCX0KKwkJaSA9IEVYSU5UOworCX0KKwlleHJhaXNlKGkpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQKK2V4dndhcm5pbmcyKGNvbnN0IGNoYXIgKm1zZywgdmFfbGlzdCBhcCkKK3sKKwlzdHJ1Y3Qgb3V0cHV0ICplcnJzOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZm10OworCisJZXJycyA9IG91dDI7CisJbmFtZSA9IGFyZzA7CisJZm10ID0gIiVzOiAiOworCWlmIChjb21tYW5kbmFtZSkgeworCQluYW1lID0gY29tbWFuZG5hbWU7CisJCWZtdCA9ICIlczogJWQ6ICI7CisJfQorCW91dGZtdChlcnJzLCBmbXQsIG5hbWUsIHN0YXJ0bGlubm8pOworCWRvZm9ybWF0KGVycnMsIG1zZywgYXApOworI2lmIEZMVVNIRVJSCisJb3V0YygnXG4nLCBlcnJzKTsKKyNlbHNlCisJb3V0Y3Nsb3coJ1xuJywgZXJycyk7CisjZW5kaWYKK30KKworI2RlZmluZSBleHZ3YXJuaW5nKGEsIGIsIGMpIGV4dndhcm5pbmcyKGIsIGMpCisKKy8qCisgKiBFeHZlcnJvciBpcyBjYWxsZWQgdG8gcmFpc2UgdGhlIGVycm9yIGV4Y2VwdGlvbi4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAqIGlzIG5vdCBOVUxMIHRoZW4gZXJyb3IgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdXNpbmcgcHJpbnRmIHN0eWxlCisgKiBmb3JtYXR0aW5nLiAgSXQgdGhlbiByYWlzZXMgdGhlIGVycm9yIGV4Y2VwdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2V4dmVycm9yKGludCBjb25kLCBjb25zdCBjaGFyICptc2csIHZhX2xpc3QgYXApCit7CisjaWZkZWYgREVCVUcKKwlpZiAobXNnKSB7CisJCVRSQUNFKCgiZXh2ZXJyb3IoJWQsIFwiIiwgY29uZCkpOworCQlUUkFDRVYoKG1zZywgYXApKTsKKwkJVFJBQ0UoKCJcIikgcGlkPSVkXG4iLCBnZXRwaWQoKSkpOworCX0gZWxzZQorCQlUUkFDRSgoImV4dmVycm9yKCVkLCBOVUxMKSBwaWQ9JWRcbiIsIGNvbmQsIGdldHBpZCgpKSk7CisJaWYgKG1zZykKKyNlbmRpZgorCQlleHZ3YXJuaW5nKC0xLCBtc2csIGFwKTsKKworCWZsdXNoYWxsKCk7CisJZXhyYWlzZShjb25kKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKwordm9pZAorc2hfZXJyb3IoY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBtc2cpOworCWV4dmVycm9yKEVYRVJST1IsIG1zZywgYXApOworCS8qIE5PVFJFQUNIRUQgKi8KKwl2YV9lbmQoYXApOworfQorCisKK3ZvaWQKK2V4ZXJyb3IoaW50IGNvbmQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgbXNnKTsKKwlleHZlcnJvcihjb25kLCBtc2csIGFwKTsKKwkvKiBOT1RSRUFDSEVEICovCisJdmFfZW5kKGFwKTsKK30KKworLyoKKyAqIGVycm9yL3dhcm5pbmcgcm91dGluZXMgZm9yIGV4dGVybmFsIGJ1aWx0aW5zCisgKi8KKwordm9pZAorc2hfd2FybngoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWV4dndhcm5pbmcoLTEsIGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKKworLyoKKyAqIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGVycm9yLiAgVGhlIHJldHVybmVkIHN0cmluZyBtYXkgYmUgYQorICogcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgdGhhdCB3aWxsIGJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IGNhbGwuCisgKiBBY3Rpb24gZGVzY3JpYmVzIHRoZSBvcGVyYXRpb24gdGhhdCBnb3QgdGhlIGVycm9yLgorICovCisKK2NvbnN0IGNoYXIgKgorZXJybXNnKGludCBlLCBpbnQgYWN0aW9uKQoreworCWlmIChlICE9IEVOT0VOVCAmJiBlICE9IEVOT1RESVIpCisJCXJldHVybiBzdHJlcnJvcihlKTsKKworCWlmIChhY3Rpb24gJiBFX09QRU4pCisJCXJldHVybiAiTm8gc3VjaCBmaWxlIjsKKwllbHNlIGlmIChhY3Rpb24gJiBFX0NSRUFUKQorCQlyZXR1cm4gIkRpcmVjdG9yeSBub25leGlzdGVudCI7CisJZWxzZQorCQlyZXR1cm4gIm5vdCBmb3VuZCI7Cit9CisKKworI2lmZGVmIFJFQUxMWV9TTUFMTAordm9pZAorX19pbnRvbigpIHsKKwlpZiAoLS1zdXBwcmVzc2ludCA9PSAwICYmIGludHBlbmRpbmcpIHsKKwkJb25pbnQoKTsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Vycm9yLmggYi91c3IvZGFzaC9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjYwMGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9lcnJvci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWVycm9yLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2lmbmRlZiBEQVNIX0VSUk9SX0gKKyNkZWZpbmUgREFTSF9FUlJPUl9ICisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworLyoKKyAqIFR5cGVzIG9mIG9wZXJhdGlvbnMgKHBhc3NlZCB0byB0aGUgZXJybXNnIHJvdXRpbmUpLgorICovCisKKyNkZWZpbmUgRV9PUEVOIDAxCS8qIG9wZW5pbmcgYSBmaWxlICovCisjZGVmaW5lIEVfQ1JFQVQgMDIJLyogY3JlYXRpbmcgYSBmaWxlICovCisjZGVmaW5lIEVfRVhFQyAwNAkvKiBleGVjdXRpbmcgYSBwcm9ncmFtICovCisKKworLyoKKyAqIFdlIGVuY2xvc2Ugam1wX2J1ZiBpbiBhIHN0cnVjdHVyZSBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHBvaW50ZXJzIHRvCisgKiBqdW1wIGxvY2F0aW9ucy4gIFRoZSBnbG9iYWwgdmFyaWFibGUgaGFuZGxlciBjb250YWlucyB0aGUgbG9jYXRpb24gdG8KKyAqIGp1bXAgdG8gd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBleGNlcHRpb24KKyAqIGNvbnRhaW5zIGEgY29kZSBpZGVudGlmeWluZyB0aGUgZXhlY2VwdGlvbi4gIFRvIGltcGxlbWVudCBuZXN0ZWQKKyAqIGV4Y2VwdGlvbiBoYW5kbGVycywgdGhlIHVzZXIgc2hvdWxkIHNhdmUgdGhlIHZhbHVlIG9mIGhhbmRsZXIgb24gZW50cnkKKyAqIHRvIGFuIGlubmVyIHNjb3BlLCBzZXQgaGFuZGxlciB0byBwb2ludCB0byBhIGptcGxvYyBzdHJ1Y3R1cmUgZm9yIHRoZQorICogaW5uZXIgc2NvcGUsIGFuZCByZXN0b3JlIGhhbmRsZXIgb24gZXhpdCBmcm9tIHRoZSBzY29wZS4KKyAqLworCitzdHJ1Y3Qgam1wbG9jIHsKKwlqbXBfYnVmIGxvYzsKK307CisKK2V4dGVybiBzdHJ1Y3Qgam1wbG9jICpoYW5kbGVyOworZXh0ZXJuIGludCBleGNlcHRpb247CisKKy8qIGV4Y2VwdGlvbnMgKi8KKyNkZWZpbmUgRVhJTlQgMAkJLyogU0lHSU5UIHJlY2VpdmVkICovCisjZGVmaW5lIEVYRVJST1IgMQkvKiBhIGdlbmVyaWMgZXJyb3IgKi8KKyNkZWZpbmUgRVhTSEVMTFBST0MgMgkvKiBleGVjdXRlIGEgc2hlbGwgcHJvY2VkdXJlICovCisjZGVmaW5lIEVYRVhFQyAzCS8qIGNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZCAqLworI2RlZmluZSBFWEVYSVQgNAkvKiBleGl0IHRoZSBzaGVsbCAqLworI2RlZmluZSBFWFNJRyA1CQkvKiB0cmFwcGVkIHNpZ25hbCBpbiB3YWl0KDEpICovCisKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBhbGxvdyB0aGUgdXNlciB0byBzdXNwZW5kIHRoZSBoYW5kbGluZyBvZiBpbnRlcnJ1cHQgc2lnbmFscworICogb3ZlciBhIHBlcmlvZCBvZiB0aW1lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIFNJR0hPTEQgdG8gb3Igc2lnYmxvY2ssIGJ1dAorICogbXVjaCBtb3JlIGVmZmljaWVudCBhbmQgcG9ydGFibGUuICAoQnV0IGhhY2tpbmcgdGhlIGtlcm5lbCBpcyBzbyBtdWNoCisgKiBtb3JlIGZ1biB0aGFuIHdvcnJ5aW5nIGFib3V0IGVmZmljaWVuY3kgYW5kIHBvcnRhYmlsaXR5LiA6LSkpCisgKi8KKworZXh0ZXJuIGludCBzdXBwcmVzc2ludDsKK2V4dGVybiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgaW50cGVuZGluZzsKK2V4dGVybiBpbnQgZXhzaWc7CisKKyNkZWZpbmUgYmFycmllcigpICh7IF9fYXNtX18gX192b2xhdGlsZV9fICgiIjogOiA6Im1lbW9yeSIpOyB9KQorI2RlZmluZSBJTlRPRkYgXAorCSh7IFwKKwkJc3VwcHJlc3NpbnQrKzsgXAorCQliYXJyaWVyKCk7IFwKKwkJMDsgXAorCX0pCisjaWZkZWYgUkVBTExZX1NNQUxMCit2b2lkIF9faW50b24odm9pZCk7CisjZGVmaW5lIElOVE9OIF9faW50b24oKQorI2Vsc2UKKyNkZWZpbmUgSU5UT04gXAorCSh7IFwKKwkJYmFycmllcigpOyBcCisJCWlmICgtLXN1cHByZXNzaW50ID09IDAgJiYgaW50cGVuZGluZykgb25pbnQoKTsgXAorCQkwOyBcCisJfSkKKyNlbmRpZgorI2RlZmluZSBGT1JDRUlOVE9OIFwKKwkoeyBcCisJCWJhcnJpZXIoKTsgXAorCQlzdXBwcmVzc2ludCA9IDA7IFwKKwkJaWYgKGludHBlbmRpbmcpIG9uaW50KCk7IFwKKwkJMDsgXAorCX0pCisjZGVmaW5lIFNBVkVJTlQodikgKCh2KSA9IHN1cHByZXNzaW50KQorI2RlZmluZSBSRVNUT1JFSU5UKHYpIFwKKwkoeyBcCisJCWJhcnJpZXIoKTsgXAorCQlpZiAoKHN1cHByZXNzaW50ID0gKHYpKSA9PSAwICYmIGludHBlbmRpbmcpIG9uaW50KCk7IFwKKwkJMDsgXAorCX0pCisjZGVmaW5lIENMRUFSX1BFTkRJTkdfSU5UIGludHBlbmRpbmcgPSAwCisjZGVmaW5lIGludF9wZW5kaW5nKCkgaW50cGVuZGluZworI2RlZmluZSBFWFNJR09OKCkgXAorCSh7IFwKKwkJZXhzaWcrKzsgXAorCQliYXJyaWVyKCk7IFwKKwkJaWYgKHBlbmRpbmdzaWdzKSBcCisJCQlleHJhaXNlKEVYU0lHKTsgXAorCQkwOyBcCisJfSkKKy8qIEVYU0lHIGlzIHR1cm5lZCBvZmYgYnkgZXZhbGJsdGluKCkuICovCisKK3ZvaWQgZXhyYWlzZShpbnQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworI2lmZGVmIFVTRV9OT1JFVFVSTgordm9pZCBvbmludCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKyNlbHNlCit2b2lkIG9uaW50KHZvaWQpOworI2VuZGlmCit2b2lkIHNoX2Vycm9yKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKK3ZvaWQgZXhlcnJvcihpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKK2NvbnN0IGNoYXIgKmVycm1zZyhpbnQsIGludCk7CisKK3ZvaWQgc2hfd2FybngoY29uc3QgY2hhciAqLCAuLi4pOworCisjZW5kaWYJCS8qIERBU0hfRVJST1JfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZXZhbC5jIGIvdXNyL2Rhc2gvZXZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmE4NTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ldmFsLmMKQEAgLTAsMCArMSwxMTAwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKgorICogRXZhbHVhdGUgYSBjb21tYW5kLgorICovCisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAic3ludGF4LmgiCisjaW5jbHVkZSAiZXhwYW5kLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAiam9icy5oIgorI2luY2x1ZGUgImV2YWwuaCIKKyNpbmNsdWRlICJidWlsdGlucy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJleGVjLmgiCisjaW5jbHVkZSAicmVkaXIuaCIKKyNpbmNsdWRlICJpbnB1dC5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgInRyYXAuaCIKKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAic2hvdy5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaWZuZGVmIFNNQUxMCisjaW5jbHVkZSAibXloaXN0ZWRpdC5oIgorI2VuZGlmCisKKworLyogZmxhZ3MgaW4gYXJndW1lbnQgdG8gZXZhbHRyZWUgKi8KKyNkZWZpbmUgRVZfRVhJVCAwMQkJLyogZXhpdCBhZnRlciBldmFsdWF0aW5nIHRyZWUgKi8KKyNkZWZpbmUgRVZfVEVTVEVEIDAyCQkvKiBleGl0IHN0YXR1cyBpcyBjaGVja2VkOyBpZ25vcmUgLWUgZmxhZyAqLworI2RlZmluZSBFVl9CQUNLQ01EIDA0CQkvKiBjb21tYW5kIGV4ZWN1dGluZyB3aXRoaW4gYmFjayBxdW90ZXMgKi8KKworaW50IGV2YWxza2lwOwkJCS8qIHNldCBpZiB3ZSBhcmUgc2tpcHBpbmcgY29tbWFuZHMgKi8KK1NUQVRJQyBpbnQgc2tpcGNvdW50OwkJLyogbnVtYmVyIG9mIGxldmVscyB0byBza2lwICovCitNS0lOSVQgaW50IGxvb3BuZXN0OwkJLyogY3VycmVudCBsb29wIG5lc3RpbmcgbGV2ZWwgKi8KK3N0YXRpYyBpbnQgZnVuY25lc3Q7CQkvKiBkZXB0aCBvZiBmdW5jdGlvbiBjYWxscyAqLworCisKK2NoYXIgKmNvbW1hbmRuYW1lOworc3RydWN0IHN0cmxpc3QgKmNtZGVudmlyb247CitpbnQgZXhpdHN0YXR1czsJCQkvKiBleGl0IHN0YXR1cyBvZiBsYXN0IGNvbW1hbmQgKi8KK2ludCBiYWNrX2V4aXRzdGF0dXM7CQkvKiBleGl0IHN0YXR1cyBvZiBiYWNrcXVvdGVkIGNvbW1hbmQgKi8KKworCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMykKK1NUQVRJQworI2VuZGlmCit2b2lkIGV2YWx0cmVlbnIodW5pb24gbm9kZSAqLCBpbnQpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKK1NUQVRJQyB2b2lkIGV2YWxsb29wKHVuaW9uIG5vZGUgKiwgaW50KTsKK1NUQVRJQyB2b2lkIGV2YWxmb3IodW5pb24gbm9kZSAqLCBpbnQpOworU1RBVElDIHZvaWQgZXZhbGNhc2UodW5pb24gbm9kZSAqLCBpbnQpOworU1RBVElDIHZvaWQgZXZhbHN1YnNoZWxsKHVuaW9uIG5vZGUgKiwgaW50KTsKK1NUQVRJQyB2b2lkIGV4cHJlZGlyKHVuaW9uIG5vZGUgKik7CitTVEFUSUMgdm9pZCBldmFscGlwZSh1bmlvbiBub2RlICosIGludCk7CisjaWZkZWYgbm90eWV0CitTVEFUSUMgdm9pZCBldmFsY29tbWFuZCh1bmlvbiBub2RlICosIGludCwgc3RydWN0IGJhY2tjbWQgKik7CisjZWxzZQorU1RBVElDIHZvaWQgZXZhbGNvbW1hbmQodW5pb24gbm9kZSAqLCBpbnQpOworI2VuZGlmCitTVEFUSUMgaW50IGV2YWxibHRpbihjb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCAqLCBpbnQsIGNoYXIgKiopOworU1RBVElDIGludCBldmFsZnVuKHN0cnVjdCBmdW5jbm9kZSAqLCBpbnQsIGNoYXIgKiosIGludCk7CitTVEFUSUMgdm9pZCBwcmVoYXNoKHVuaW9uIG5vZGUgKik7CitTVEFUSUMgaW50IGVwcmludGxpc3Qoc3RydWN0IG91dHB1dCAqLCBzdHJ1Y3Qgc3RybGlzdCAqLCBpbnQpOworU1RBVElDIGludCBibHRpbmNtZChpbnQsIGNoYXIgKiopOworCisKK1NUQVRJQyBjb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCBibHRpbiA9IHsKKwluYW1lOiBudWxsc3RyLAorCWJ1aWx0aW46IGJsdGluY21kCit9OworCisKKy8qCisgKiBDYWxsZWQgdG8gcmVzZXQgdGhpbmdzIGFmdGVyIGFuIGV4Y2VwdGlvbi4KKyAqLworCisjaWZkZWYgbWtpbml0CitJTkNMVURFICJldmFsLmgiCisKK1JFU0VUIHsKKwlldmFsc2tpcCA9IDA7CisJbG9vcG5lc3QgPSAwOworfQorI2VuZGlmCisKKworCisvKgorICogVGhlIGV2YWwgY29tbW1hbmQuCisgKi8KKworaW50CitldmFsY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICAgICAgY2hhciAqcDsKKyAgICAgICAgY2hhciAqY29uY2F0OworICAgICAgICBjaGFyICoqYXA7CisKKyAgICAgICAgaWYgKGFyZ2MgPiAxKSB7CisgICAgICAgICAgICAgICAgcCA9IGFyZ3ZbMV07CisgICAgICAgICAgICAgICAgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVFNUQUNLU1RSKGNvbmNhdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IGFyZ3YgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICAgICAgCWNvbmNhdCA9IHN0cHV0cyhwLCBjb25jYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHAgPSAqYXArKykgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RQVVRDKCcgJywgY29uY2F0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNUUFVUQygnXDAnLCBjb25jYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGdyYWJzdGFja3N0cihjb25jYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBldmFsc3RyaW5nKHAsIH5TS0lQRVZBTCk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhpdHN0YXR1czsKK30KKworCisvKgorICogRXhlY3V0ZSBhIGNvbW1hbmQgb3IgY29tbWFuZHMgY29udGFpbmVkIGluIGEgc3RyaW5nLgorICovCisKK2ludAorZXZhbHN0cmluZyhjaGFyICpzLCBpbnQgbWFzaykKK3sKKwl1bmlvbiBub2RlICpuOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJaW50IHNraXA7CisKKwlzZXRpbnB1dHN0cmluZyhzKTsKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKworCXNraXAgPSAwOworCXdoaWxlICgobiA9IHBhcnNlY21kKDApKSAhPSBORU9GKSB7CisJCWV2YWx0cmVlKG4sIDApOworCQlwb3BzdGFja21hcmsoJnNtYXJrKTsKKwkJc2tpcCA9IGV2YWxza2lwOworCQlpZiAoc2tpcCkKKwkJCWJyZWFrOworCX0KKwlwb3BmaWxlKCk7CisKKwlza2lwICY9IG1hc2s7CisJZXZhbHNraXAgPSBza2lwOworCXJldHVybiBza2lwOworfQorCisKKworLyoKKyAqIEV2YWx1YXRlIGEgcGFyc2UgdHJlZS4gIFRoZSB2YWx1ZSBpcyBsZWZ0IGluIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAqIGV4aXRzdGF0dXMuCisgKi8KKwordm9pZAorZXZhbHRyZWUodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCWludCBjaGVja2V4aXQgPSAwOworCXZvaWQgKCpldmFsZm4pKHVuaW9uIG5vZGUgKiwgaW50KTsKKwl1bnNpZ25lZCBpc29yOworCWludCBzdGF0dXM7CisJaWYgKG4gPT0gTlVMTCkgeworCQlUUkFDRSgoImV2YWx0cmVlKE5VTEwpIGNhbGxlZFxuIikpOworCQlnb3RvIG91dDsKKwl9CisjaWZuZGVmIFNNQUxMCisJZGlzcGxheWhpc3QgPSAxOwkvKiBzaG93IGhpc3Rvcnkgc3Vic3RpdHV0aW9ucyBkb25lIHdpdGggZmMgKi8KKyNlbmRpZgorCVRSQUNFKCgicGlkICVkLCBldmFsdHJlZSglcDogJWQsICVkKSBjYWxsZWRcbiIsCisJICAgIGdldHBpZCgpLCBuLCBuLT50eXBlLCBmbGFncykpOworCXN3aXRjaCAobi0+dHlwZSkgeworCWRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKwkJb3V0MWZtdCgiTm9kZSB0eXBlID0gJWRcbiIsIG4tPnR5cGUpOworI2lmbmRlZiBVU0VfR0xJQkNfU1RESU8KKwkJZmx1c2hvdXQob3V0MSk7CisjZW5kaWYKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIE5OT1Q6CisJCWV2YWx0cmVlKG4tPm5ub3QuY29tLCBFVl9URVNURUQpOworCQlzdGF0dXMgPSAhZXhpdHN0YXR1czsKKwkJZ290byBzZXRzdGF0dXM7CisJY2FzZSBOUkVESVI6CisJCWV4cHJlZGlyKG4tPm5yZWRpci5yZWRpcmVjdCk7CisJCXN0YXR1cyA9IHJlZGlyZWN0c2FmZShuLT5ucmVkaXIucmVkaXJlY3QsIFJFRElSX1BVU0gpOworCQlpZiAoIXN0YXR1cykgeworCQkJZXZhbHRyZWUobi0+bnJlZGlyLm4sIGZsYWdzICYgRVZfVEVTVEVEKTsKKwkJCXN0YXR1cyA9IGV4aXRzdGF0dXM7CisJCX0KKwkJcG9wcmVkaXIoMCk7CisJCWdvdG8gc2V0c3RhdHVzOworCWNhc2UgTkNNRDoKKyNpZmRlZiBub3R5ZXQKKwkJaWYgKGVmbGFnICYmICEoZmxhZ3MgJiBFVl9URVNURUQpKQorCQkJY2hlY2tleGl0ID0gfjA7CisJCWV2YWxjb21tYW5kKG4sIGZsYWdzLCAoc3RydWN0IGJhY2tjbWQgKilOVUxMKTsKKwkJYnJlYWs7CisjZWxzZQorCQlldmFsZm4gPSBldmFsY29tbWFuZDsKK2NoZWNrZXhpdDoKKwkJaWYgKGVmbGFnICYmICEoZmxhZ3MgJiBFVl9URVNURUQpKQorCQkJY2hlY2tleGl0ID0gfjA7CisJCWdvdG8gY2FsbGV2YWw7CisjZW5kaWYKKwljYXNlIE5GT1I6CisJCWV2YWxmbiA9IGV2YWxmb3I7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOV0hJTEU6CisJY2FzZSBOVU5USUw6CisJCWV2YWxmbiA9IGV2YWxsb29wOworCQlnb3RvIGNhbGxldmFsOworCWNhc2UgTlNVQlNIRUxMOgorCWNhc2UgTkJBQ0tHTkQ6CisJCWV2YWxmbiA9IGV2YWxzdWJzaGVsbDsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5QSVBFOgorCQlldmFsZm4gPSBldmFscGlwZTsKKyNpZmRlZiBub3R5ZXQKKwkJaWYgKGVmbGFnICYmICEoZmxhZ3MgJiBFVl9URVNURUQpKQorCQkJY2hlY2tleGl0ID0gfjA7CisJCWdvdG8gY2FsbGV2YWw7CisjZWxzZQorCQlnb3RvIGNoZWNrZXhpdDsKKyNlbmRpZgorCWNhc2UgTkNBU0U6CisJCWV2YWxmbiA9IGV2YWxjYXNlOworCQlnb3RvIGNhbGxldmFsOworCWNhc2UgTkFORDoKKwljYXNlIE5PUjoKKwljYXNlIE5TRU1JOgorI2lmIE5BTkQgKyAxICE9IE5PUgorI2Vycm9yIE5BTkQgKyAxICE9IE5PUgorI2VuZGlmCisjaWYgTk9SICsgMSAhPSBOU0VNSQorI2Vycm9yIE5PUiArIDEgIT0gTlNFTUkKKyNlbmRpZgorCQlpc29yID0gbi0+dHlwZSAtIE5BTkQ7CisJCWV2YWx0cmVlKAorCQkJbi0+bmJpbmFyeS5jaDEsCisJCQkoZmxhZ3MgfCAoKGlzb3IgPj4gMSkgLSAxKSkgJiBFVl9URVNURUQKKwkJKTsKKwkJaWYgKCFleGl0c3RhdHVzID09IGlzb3IpCisJCQlicmVhazsKKwkJaWYgKCFldmFsc2tpcCkgeworCQkJbiA9IG4tPm5iaW5hcnkuY2gyOworZXZhbG46CisJCQlldmFsZm4gPSBldmFsdHJlZTsKK2NhbGxldmFsOgorCQkJZXZhbGZuKG4sIGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgTklGOgorCQlldmFsdHJlZShuLT5uaWYudGVzdCwgRVZfVEVTVEVEKTsKKwkJaWYgKGV2YWxza2lwKQorCQkJYnJlYWs7CisJCWlmIChleGl0c3RhdHVzID09IDApIHsKKwkJCW4gPSBuLT5uaWYuaWZwYXJ0OworCQkJZ290byBldmFsbjsKKwkJfSBlbHNlIGlmIChuLT5uaWYuZWxzZXBhcnQpIHsKKwkJCW4gPSBuLT5uaWYuZWxzZXBhcnQ7CisJCQlnb3RvIGV2YWxuOworCQl9CisJCWdvdG8gc3VjY2VzczsKKwljYXNlIE5ERUZVTjoKKwkJZGVmdW4obi0+bmFyZy50ZXh0LCBuLT5uYXJnLm5leHQpOworc3VjY2VzczoKKwkJc3RhdHVzID0gMDsKK3NldHN0YXR1czoKKwkJZXhpdHN0YXR1cyA9IHN0YXR1czsKKwkJYnJlYWs7CisJfQorb3V0OgorCWlmICgoY2hlY2tleGl0ICYgZXhpdHN0YXR1cykpCisJCWV2YWxza2lwIHw9IFNLSVBFVkFMOworCWVsc2UgaWYgKHBlbmRpbmdzaWdzICYmIGRvdHJhcCgpKQorCQlnb3RvIGV4ZXhpdDsKKworCWlmIChmbGFncyAmIEVWX0VYSVQpIHsKK2V4ZXhpdDoKKwkJZXhyYWlzZShFWEVYSVQpOworCX0KK30KKworCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMykKK1NUQVRJQworI2VuZGlmCit2b2lkIGV2YWx0cmVlbnIodW5pb24gbm9kZSAqLCBpbnQpIF9fYXR0cmlidXRlX18gKChhbGlhcygiZXZhbHRyZWUiKSkpOworCisKK1NUQVRJQyB2b2lkCitldmFsbG9vcCh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJaW50IHN0YXR1czsKKworCWxvb3BuZXN0Kys7CisJc3RhdHVzID0gMDsKKwlmbGFncyAmPSBFVl9URVNURUQ7CisJZm9yICg7OykgeworCQlpbnQgaTsKKworCQlldmFsdHJlZShuLT5uYmluYXJ5LmNoMSwgRVZfVEVTVEVEKTsKKwkJaWYgKGV2YWxza2lwKSB7Citza2lwcGluZzoJICBpZiAoZXZhbHNraXAgPT0gU0tJUENPTlQgJiYgLS1za2lwY291bnQgPD0gMCkgeworCQkJCWV2YWxza2lwID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChldmFsc2tpcCA9PSBTS0lQQlJFQUsgJiYgLS1za2lwY291bnQgPD0gMCkKKwkJCQlldmFsc2tpcCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpID0gZXhpdHN0YXR1czsKKwkJaWYgKG4tPnR5cGUgIT0gTldISUxFKQorCQkJaSA9ICFpOworCQlpZiAoaSAhPSAwKQorCQkJYnJlYWs7CisJCWV2YWx0cmVlKG4tPm5iaW5hcnkuY2gyLCBmbGFncyk7CisJCXN0YXR1cyA9IGV4aXRzdGF0dXM7CisJCWlmIChldmFsc2tpcCkKKwkJCWdvdG8gc2tpcHBpbmc7CisJfQorCWxvb3BuZXN0LS07CisJZXhpdHN0YXR1cyA9IHN0YXR1czsKK30KKworCisKK1NUQVRJQyB2b2lkCitldmFsZm9yKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgYXJnbGlzdCBhcmdsaXN0OworCXVuaW9uIG5vZGUgKmFyZ3A7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlhcmdsaXN0Lmxhc3RwID0gJmFyZ2xpc3QubGlzdDsKKwlmb3IgKGFyZ3AgPSBuLT5uZm9yLmFyZ3MgOyBhcmdwIDsgYXJncCA9IGFyZ3AtPm5hcmcubmV4dCkgeworCQlleHBhbmRhcmcoYXJncCwgJmFyZ2xpc3QsIEVYUF9GVUxMIHwgRVhQX1RJTERFIHwgRVhQX1JFQ09SRCk7CisJCS8qIFhYWCAqLworCQlpZiAoZXZhbHNraXApCisJCQlnb3RvIG91dDsKKwl9CisJKmFyZ2xpc3QubGFzdHAgPSBOVUxMOworCisJZXhpdHN0YXR1cyA9IDA7CisJbG9vcG5lc3QrKzsKKwlmbGFncyAmPSBFVl9URVNURUQ7CisJZm9yIChzcCA9IGFyZ2xpc3QubGlzdCA7IHNwIDsgc3AgPSBzcC0+bmV4dCkgeworCQlzZXR2YXIobi0+bmZvci52YXIsIHNwLT50ZXh0LCAwKTsKKwkJZXZhbHRyZWUobi0+bmZvci5ib2R5LCBmbGFncyk7CisJCWlmIChldmFsc2tpcCkgeworCQkJaWYgKGV2YWxza2lwID09IFNLSVBDT05UICYmIC0tc2tpcGNvdW50IDw9IDApIHsKKwkJCQlldmFsc2tpcCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZXZhbHNraXAgPT0gU0tJUEJSRUFLICYmIC0tc2tpcGNvdW50IDw9IDApCisJCQkJZXZhbHNraXAgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJbG9vcG5lc3QtLTsKK291dDoKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKK30KKworCisKK1NUQVRJQyB2b2lkCitldmFsY2FzZSh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJdW5pb24gbm9kZSAqY3A7CisJdW5pb24gbm9kZSAqcGF0cDsKKwlzdHJ1Y3QgYXJnbGlzdCBhcmdsaXN0OworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlhcmdsaXN0Lmxhc3RwID0gJmFyZ2xpc3QubGlzdDsKKwlleHBhbmRhcmcobi0+bmNhc2UuZXhwciwgJmFyZ2xpc3QsIEVYUF9USUxERSk7CisJZXhpdHN0YXR1cyA9IDA7CisJZm9yIChjcCA9IG4tPm5jYXNlLmNhc2VzIDsgY3AgJiYgZXZhbHNraXAgPT0gMCA7IGNwID0gY3AtPm5jbGlzdC5uZXh0KSB7CisJCWZvciAocGF0cCA9IGNwLT5uY2xpc3QucGF0dGVybiA7IHBhdHAgOyBwYXRwID0gcGF0cC0+bmFyZy5uZXh0KSB7CisJCQlpZiAoY2FzZW1hdGNoKHBhdHAsIGFyZ2xpc3QubGlzdC0+dGV4dCkpIHsKKwkJCQlpZiAoZXZhbHNraXAgPT0gMCkgeworCQkJCQlldmFsdHJlZShjcC0+bmNsaXN0LmJvZHksIGZsYWdzKTsKKwkJCQl9CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7Cit9CisKKworCisvKgorICogS2ljayBvZmYgYSBzdWJzaGVsbCB0byBldmFsdWF0ZSBhIHRyZWUuCisgKi8KKworU1RBVElDIHZvaWQKK2V2YWxzdWJzaGVsbCh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGpvYiAqanA7CisJaW50IGJhY2tnbmQgPSAobi0+dHlwZSA9PSBOQkFDS0dORCk7CisJaW50IHN0YXR1czsKKworCWV4cHJlZGlyKG4tPm5yZWRpci5yZWRpcmVjdCk7CisJaWYgKCFiYWNrZ25kICYmIGZsYWdzICYgRVZfRVhJVCAmJiAhdHJhcFswXSkKKwkJZ290byBub2Zvcms7CisJSU5UT0ZGOworCWpwID0gbWFrZWpvYihuLCAxKTsKKwlpZiAoZm9ya3NoZWxsKGpwLCBuLCBiYWNrZ25kKSA9PSAwKSB7CisJCUlOVE9OOworCQlmbGFncyB8PSBFVl9FWElUOworCQlpZiAoYmFja2duZCkKKwkJCWZsYWdzICY9fiBFVl9URVNURUQ7Citub2Zvcms6CisJCXJlZGlyZWN0KG4tPm5yZWRpci5yZWRpcmVjdCwgMCk7CisJCWV2YWx0cmVlbnIobi0+bnJlZGlyLm4sIGZsYWdzKTsKKwkJLyogbmV2ZXIgcmV0dXJucyAqLworCX0KKwlzdGF0dXMgPSAwOworCWlmICghIGJhY2tnbmQpCisJCXN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCWV4aXRzdGF0dXMgPSBzdGF0dXM7CisJSU5UT047Cit9CisKKworCisvKgorICogQ29tcHV0ZSB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIGluIGEgcmVkaXJlY3Rpb24gbGlzdC4KKyAqLworCitTVEFUSUMgdm9pZAorZXhwcmVkaXIodW5pb24gbm9kZSAqbikKK3sKKwl1bmlvbiBub2RlICpyZWRpcjsKKworCWZvciAocmVkaXIgPSBuIDsgcmVkaXIgOyByZWRpciA9IHJlZGlyLT5uZmlsZS5uZXh0KSB7CisJCXN0cnVjdCBhcmdsaXN0IGZuOworCQlmbi5sYXN0cCA9ICZmbi5saXN0OworCQlzd2l0Y2ggKHJlZGlyLT50eXBlKSB7CisJCWNhc2UgTkZST01UTzoKKwkJY2FzZSBORlJPTToKKwkJY2FzZSBOVE86CisJCWNhc2UgTkNMT0JCRVI6CisJCWNhc2UgTkFQUEVORDoKKwkJCWV4cGFuZGFyZyhyZWRpci0+bmZpbGUuZm5hbWUsICZmbiwgRVhQX1RJTERFIHwgRVhQX1JFRElSKTsKKwkJCXJlZGlyLT5uZmlsZS5leHBmbmFtZSA9IGZuLmxpc3QtPnRleHQ7CisJCQlicmVhazsKKwkJY2FzZSBORlJPTUZEOgorCQljYXNlIE5UT0ZEOgorCQkJaWYgKHJlZGlyLT5uZHVwLnZuYW1lKSB7CisJCQkJZXhwYW5kYXJnKHJlZGlyLT5uZHVwLnZuYW1lLCAmZm4sIEVYUF9GVUxMIHwgRVhQX1RJTERFKTsKKwkJCQlmaXhyZWRpcihyZWRpciwgZm4ubGlzdC0+dGV4dCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisKKy8qCisgKiBFdmFsdWF0ZSBhIHBpcGVsaW5lLiAgQWxsIHRoZSBwcm9jZXNzZXMgaW4gdGhlIHBpcGVsaW5lIGFyZSBjaGlsZHJlbgorICogb2YgdGhlIHByb2Nlc3MgY3JlYXRpbmcgdGhlIHBpcGVsaW5lLiAgKFRoaXMgZGlmZmVycyBmcm9tIHNvbWUgdmVyc2lvbnMKKyAqIG9mIHRoZSBzaGVsbCwgd2hpY2ggbWFrZSB0aGUgbGFzdCBwcm9jZXNzIGluIGEgcGlwZWxpbmUgdGhlIHBhcmVudAorICogb2YgYWxsIHRoZSByZXN0LikKKyAqLworCitTVEFUSUMgdm9pZAorZXZhbHBpcGUodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBqb2IgKmpwOworCXN0cnVjdCBub2RlbGlzdCAqbHA7CisJaW50IHBpcGVsZW47CisJaW50IHByZXZmZDsKKwlpbnQgcGlwWzJdOworCisJVFJBQ0UoKCJldmFscGlwZSgweCVseCkgY2FsbGVkXG4iLCAobG9uZyluKSk7CisJcGlwZWxlbiA9IDA7CisJZm9yIChscCA9IG4tPm5waXBlLmNtZGxpc3QgOyBscCA7IGxwID0gbHAtPm5leHQpCisJCXBpcGVsZW4rKzsKKwlmbGFncyB8PSBFVl9FWElUOworCUlOVE9GRjsKKwlqcCA9IG1ha2Vqb2IobiwgcGlwZWxlbik7CisJcHJldmZkID0gLTE7CisJZm9yIChscCA9IG4tPm5waXBlLmNtZGxpc3QgOyBscCA7IGxwID0gbHAtPm5leHQpIHsKKwkJcHJlaGFzaChscC0+bik7CisJCXBpcFsxXSA9IC0xOworCQlpZiAobHAtPm5leHQpIHsKKwkJCWlmIChwaXBlKHBpcCkgPCAwKSB7CisJCQkJY2xvc2UocHJldmZkKTsKKwkJCQlzaF9lcnJvcigiUGlwZSBjYWxsIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmIChmb3Jrc2hlbGwoanAsIGxwLT5uLCBuLT5ucGlwZS5iYWNrZ25kKSA9PSAwKSB7CisJCQlJTlRPTjsKKwkJCWlmIChwaXBbMV0gPj0gMCkgeworCQkJCWNsb3NlKHBpcFswXSk7CisJCQl9CisJCQlpZiAocHJldmZkID4gMCkgeworCQkJCWR1cDIocHJldmZkLCAwKTsKKwkJCQljbG9zZShwcmV2ZmQpOworCQkJfQorCQkJaWYgKHBpcFsxXSA+IDEpIHsKKwkJCQlkdXAyKHBpcFsxXSwgMSk7CisJCQkJY2xvc2UocGlwWzFdKTsKKwkJCX0KKwkJCWV2YWx0cmVlbnIobHAtPm4sIGZsYWdzKTsKKwkJCS8qIG5ldmVyIHJldHVybnMgKi8KKwkJfQorCQlpZiAocHJldmZkID49IDApCisJCQljbG9zZShwcmV2ZmQpOworCQlwcmV2ZmQgPSBwaXBbMF07CisJCWNsb3NlKHBpcFsxXSk7CisJfQorCWlmIChuLT5ucGlwZS5iYWNrZ25kID09IDApIHsKKwkJZXhpdHN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCQlUUkFDRSgoImV2YWxwaXBlOiAgam9iIGRvbmUgZXhpdCBzdGF0dXMgJWRcbiIsIGV4aXRzdGF0dXMpKTsKKwl9CisJSU5UT047Cit9CisKKworCisvKgorICogRXhlY3V0ZSBhIGNvbW1hbmQgaW5zaWRlIGJhY2sgcXVvdGVzLiAgSWYgaXQncyBhIGJ1aWx0aW4gY29tbWFuZCwgd2UKKyAqIHdhbnQgdG8gc2F2ZSBpdHMgb3V0cHV0IGluIGEgYmxvY2sgb2J0YWluZWQgZnJvbSBtYWxsb2MuICBPdGhlcndpc2UKKyAqIHdlIGZvcmsgb2ZmIGEgc3VicHJvY2VzcyBhbmQgZ2V0IHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgdmlhIGEgcGlwZS4KKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworCit2b2lkCitldmFsYmFja2NtZCh1bmlvbiBub2RlICpuLCBzdHJ1Y3QgYmFja2NtZCAqcmVzdWx0KQoreworCWludCBzYXZlaGVyZWZkOworCisJcmVzdWx0LT5mZCA9IC0xOworCXJlc3VsdC0+YnVmID0gTlVMTDsKKwlyZXN1bHQtPm5sZWZ0ID0gMDsKKwlyZXN1bHQtPmpwID0gTlVMTDsKKwlpZiAobiA9PSBOVUxMKSB7CisJCWdvdG8gb3V0OworCX0KKworCXNhdmVoZXJlZmQgPSBoZXJlZmQ7CisJaGVyZWZkID0gLTE7CisKKyNpZmRlZiBub3R5ZXQKKwkvKgorCSAqIEZvciBub3cgd2UgZGlzYWJsZSBleGVjdXRpbmcgYnVpbHRpbnMgaW4gdGhlIHNhbWUKKwkgKiBjb250ZXh0IGFzIHRoZSBzaGVsbCwgYmVjYXVzZSB3ZSBhcmUgbm90IGtlZXBpbmcKKwkgKiBlbm91Z2ggc3RhdGUgdG8gcmVjb3ZlciBmcm9tIGNoYW5nZXMgdGhhdCBhcmUKKwkgKiBzdXBwb3NlZCBvbmx5IHRvIGFmZmVjdCBzdWJzaGVsbHMuIGVnLiBlY2hvICJgY2QgL2AiCisJICovCisJaWYgKG4tPnR5cGUgPT0gTkNNRCkgeworCQlzdHJ1Y3QgaWZzcmVnaW9uIHNhdmVpZnM7CisJCXN0cnVjdCBpZnNyZWdpb24gKnNhdmVsYXN0cDsKKwkJc3RydWN0IG5vZGVsaXN0ICpzYXZlYXJnYmFja3E7CisKKwkJc2F2ZWlmcyA9IGlmc2ZpcnN0OworCQlzYXZlbGFzdHAgPSBpZnNsYXN0cDsKKwkJc2F2ZWFyZ2JhY2txID0gYXJnYmFja3E7CisKKwkJZXhpdHN0YXR1cyA9IG9leGl0c3RhdHVzOworCQlldmFsY29tbWFuZChuLCBFVl9CQUNLQ01ELCByZXN1bHQpOworCisJCWlmc2ZpcnN0ID0gc2F2ZWlmczsKKwkJaWZzbGFzdHAgPSBzYXZlbGFzdHA7CisJCWFyZ2JhY2txID0gc2F2ZWFyZ2JhY2txOworCX0gZWxzZQorI2VuZGlmCisJeworCQlpbnQgcGlwWzJdOworCQlzdHJ1Y3Qgam9iICpqcDsKKworCQlpZiAocGlwZShwaXApIDwgMCkKKwkJCXNoX2Vycm9yKCJQaXBlIGNhbGwgZmFpbGVkIik7CisJCWpwID0gbWFrZWpvYihuLCAxKTsKKwkJaWYgKGZvcmtzaGVsbChqcCwgbiwgRk9SS19OT0pPQikgPT0gMCkgeworCQkJRk9SQ0VJTlRPTjsKKwkJCWNsb3NlKHBpcFswXSk7CisJCQlpZiAocGlwWzFdICE9IDEpIHsKKwkJCQljbG9zZSgxKTsKKwkJCQljb3B5ZmQocGlwWzFdLCAxKTsKKwkJCQljbG9zZShwaXBbMV0pOworCQkJfQorCQkJZWZsYWcgPSAwOworCQkJZXZhbHRyZWVucihuLCBFVl9FWElUKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQljbG9zZShwaXBbMV0pOworCQlyZXN1bHQtPmZkID0gcGlwWzBdOworCQlyZXN1bHQtPmpwID0ganA7CisJfQorCWhlcmVmZCA9IHNhdmVoZXJlZmQ7CitvdXQ6CisJVFJBQ0UoKCJldmFsYmFja2NtZCBkb25lOiBmZD0lZCBidWY9MHgleCBubGVmdD0lZCBqcD0weCV4XG4iLAorCQlyZXN1bHQtPmZkLCByZXN1bHQtPmJ1ZiwgcmVzdWx0LT5ubGVmdCwgcmVzdWx0LT5qcCkpOworfQorCitzdGF0aWMgY2hhciAqKgorcGFyc2VfY29tbWFuZF9hcmdzKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICoqcGF0aCkKK3sKKwljaGFyICpjcCwgYzsKKworCWZvciAoOzspIHsKKwkJY3AgPSAqKythcmd2OworCQlpZiAoIWNwKQorCQkJcmV0dXJuIDA7CisJCWlmICgqY3ArKyAhPSAnLScpCisJCQlicmVhazsKKwkJaWYgKCEoYyA9ICpjcCsrKSkKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnLScgJiYgISpjcCkgeworCQkJYXJndisrOworCQkJYnJlYWs7CisJCX0KKwkJZG8geworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdwJzoKKwkJCQkqcGF0aCA9IGRlZnBhdGg7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIHJ1biAndHlwZWNtZCcgZm9yIG90aGVyIG9wdGlvbnMgKi8KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSB3aGlsZSAoKGMgPSAqY3ArKykpOworCX0KKwlyZXR1cm4gYXJndjsKK30KKworCisKKy8qCisgKiBFeGVjdXRlIGEgc2ltcGxlIGNvbW1hbmQuCisgKi8KKworU1RBVElDIHZvaWQKKyNpZmRlZiBub3R5ZXQKK2V2YWxjb21tYW5kKHVuaW9uIG5vZGUgKmNtZCwgaW50IGZsYWdzLCBzdHJ1Y3QgYmFja2NtZCAqYmFja2NtZCkKKyNlbHNlCitldmFsY29tbWFuZCh1bmlvbiBub2RlICpjbWQsIGludCBmbGFncykKKyNlbmRpZgoreworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJdW5pb24gbm9kZSAqYXJncDsKKwlzdHJ1Y3QgYXJnbGlzdCBhcmdsaXN0OworCXN0cnVjdCBhcmdsaXN0IHZhcmxpc3Q7CisJY2hhciAqKmFyZ3Y7CisJaW50IGFyZ2M7CisJc3RydWN0IHN0cmxpc3QgKnNwOworI2lmZGVmIG5vdHlldAorCWludCBwaXBbMl07CisjZW5kaWYKKwlzdHJ1Y3QgY21kZW50cnkgY21kZW50cnk7CisJc3RydWN0IGpvYiAqanA7CisJY2hhciAqbGFzdGFyZzsKKwljb25zdCBjaGFyICpwYXRoOworCWludCBzcGNsYmx0aW47CisJaW50IGV4ZWNjbWQ7CisJaW50IHN0YXR1czsKKwljaGFyICoqbmFyZ3Y7CisKKwkvKiBGaXJzdCBleHBhbmQgdGhlIGFyZ3VtZW50cy4gKi8KKwlUUkFDRSgoImV2YWxjb21tYW5kKDB4JWx4LCAlZCkgY2FsbGVkXG4iLCAobG9uZyljbWQsIGZsYWdzKSk7CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJYmFja19leGl0c3RhdHVzID0gMDsKKworCWNtZGVudHJ5LmNtZHR5cGUgPSBDTURCVUlMVElOOworCWNtZGVudHJ5LnUuY21kID0gJmJsdGluOworCXZhcmxpc3QubGFzdHAgPSAmdmFybGlzdC5saXN0OworCSp2YXJsaXN0Lmxhc3RwID0gTlVMTDsKKwlhcmdsaXN0Lmxhc3RwID0gJmFyZ2xpc3QubGlzdDsKKwkqYXJnbGlzdC5sYXN0cCA9IE5VTEw7CisKKwlhcmdjID0gMDsKKwlmb3IgKGFyZ3AgPSBjbWQtPm5jbWQuYXJnczsgYXJncDsgYXJncCA9IGFyZ3AtPm5hcmcubmV4dCkgeworCQlzdHJ1Y3Qgc3RybGlzdCAqKnNwcDsKKworCQlzcHAgPSBhcmdsaXN0Lmxhc3RwOworCQlleHBhbmRhcmcoYXJncCwgJmFyZ2xpc3QsIEVYUF9GVUxMIHwgRVhQX1RJTERFKTsKKwkJZm9yIChzcCA9ICpzcHA7IHNwOyBzcCA9IHNwLT5uZXh0KQorCQkJYXJnYysrOworCX0KKworCWFyZ3YgPSBuYXJndiA9IHN0YWxsb2Moc2l6ZW9mIChjaGFyICopICogKGFyZ2MgKyAxKSk7CisJZm9yIChzcCA9IGFyZ2xpc3QubGlzdCA7IHNwIDsgc3AgPSBzcC0+bmV4dCkgeworCQlUUkFDRSgoImV2YWxjb21tYW5kIGFyZzogJXNcbiIsIHNwLT50ZXh0KSk7CisJCSpuYXJndisrID0gc3AtPnRleHQ7CisJfQorCSpuYXJndiA9IE5VTEw7CisKKwlsYXN0YXJnID0gTlVMTDsKKwlpZiAoaWZsYWcgJiYgZnVuY25lc3QgPT0gMCAmJiBhcmdjID4gMCkKKwkJbGFzdGFyZyA9IG5hcmd2Wy0xXTsKKworCXByZXZlcnJvdXQuZmQgPSAyOworCWV4cHJlZGlyKGNtZC0+bmNtZC5yZWRpcmVjdCk7CisJc3RhdHVzID0gcmVkaXJlY3RzYWZlKGNtZC0+bmNtZC5yZWRpcmVjdCwgUkVESVJfUFVTSHxSRURJUl9TQVZFRkQyKTsKKworCXBhdGggPSB2cGF0aC50ZXh0OworCWZvciAoYXJncCA9IGNtZC0+bmNtZC5hc3NpZ247IGFyZ3A7IGFyZ3AgPSBhcmdwLT5uYXJnLm5leHQpIHsKKwkJc3RydWN0IHN0cmxpc3QgKipzcHA7CisJCWNoYXIgKnA7CisKKwkJc3BwID0gdmFybGlzdC5sYXN0cDsKKwkJZXhwYW5kYXJnKGFyZ3AsICZ2YXJsaXN0LCBFWFBfVkFSVElMREUpOworCisJCS8qCisJCSAqIE1vZGlmeSB0aGUgY29tbWFuZCBsb29rdXAgcGF0aCwgaWYgYSBQQVRIPSBhc3NpZ25tZW50CisJCSAqIGlzIHByZXNlbnQKKwkJICovCisJCXAgPSAoKnNwcCktPnRleHQ7CisJCWlmICh2YXJlcXVhbChwLCBwYXRoKSkKKwkJCXBhdGggPSBwOworCX0KKworCS8qIFByaW50IHRoZSBjb21tYW5kIGlmIHhmbGFnIGlzIHNldC4gKi8KKwlpZiAoeGZsYWcpIHsKKwkJc3RydWN0IG91dHB1dCAqb3V0OworCQlpbnQgc2VwOworCisJCW91dCA9ICZwcmV2ZXJyb3V0OworCQlvdXRzdHIoZXhwYW5kc3RyKHBzNHZhbCgpKSwgb3V0KTsKKwkJc2VwID0gMDsKKwkJc2VwID0gZXByaW50bGlzdChvdXQsIHZhcmxpc3QubGlzdCwgc2VwKTsKKwkJZXByaW50bGlzdChvdXQsIGFyZ2xpc3QubGlzdCwgc2VwKTsKKwkJb3V0Y3Nsb3coJ1xuJywgb3V0KTsKKyNpZmRlZiBGTFVTSEVSUgorCQlmbHVzaG91dChvdXQpOworI2VuZGlmCisJfQorCisJZXhlY2NtZCA9IDA7CisJc3BjbGJsdGluID0gLTE7CisKKwkvKiBOb3cgbG9jYXRlIHRoZSBjb21tYW5kLiAqLworCWlmIChhcmdjKSB7CisJCWNvbnN0IGNoYXIgKm9sZHBhdGg7CisJCWludCBjbWRfZmxhZyA9IERPX0VSUjsKKworCQlwYXRoICs9IDU7CisJCW9sZHBhdGggPSBwYXRoOworCQlmb3IgKDs7KSB7CisJCQlmaW5kX2NvbW1hbmQoYXJndlswXSwgJmNtZGVudHJ5LCBjbWRfZmxhZywgcGF0aCk7CisJCQlpZiAoY21kZW50cnkuY21kdHlwZSA9PSBDTURVTktOT1dOKSB7CisJCQkJc3RhdHVzID0gMTI3OworI2lmZGVmIEZMVVNIRVJSCisJCQkJZmx1c2hvdXQoJmVycm91dCk7CisjZW5kaWYKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisKKwkJCS8qIGltcGxlbWVudCBibHRpbiBhbmQgY29tbWFuZCBoZXJlICovCisJCQlpZiAoY21kZW50cnkuY21kdHlwZSAhPSBDTURCVUlMVElOKQorCQkJCWJyZWFrOworCQkJaWYgKHNwY2xibHRpbiA8IDApCisJCQkJc3BjbGJsdGluID0KKwkJCQkJY21kZW50cnkudS5jbWQtPmZsYWdzICYKKwkJCQkJQlVJTFRJTl9TUEVDSUFMCisJCQkJOworCQkJaWYgKGNtZGVudHJ5LnUuY21kID09IEVYRUNDTUQpCisJCQkJZXhlY2NtZCsrOworCQkJaWYgKGNtZGVudHJ5LnUuY21kICE9IENPTU1BTkRDTUQpCisJCQkJYnJlYWs7CisKKwkJCXBhdGggPSBvbGRwYXRoOworCQkJbmFyZ3YgPSBwYXJzZV9jb21tYW5kX2FyZ3MoYXJndiwgJnBhdGgpOworCQkJaWYgKCFuYXJndikKKwkJCQlicmVhazsKKwkJCWFyZ2MgLT0gbmFyZ3YgLSBhcmd2OworCQkJYXJndiA9IG5hcmd2OworCQkJY21kX2ZsYWcgfD0gRE9fTk9GVU5DOworCQl9CisJfQorCisJaWYgKHN0YXR1cykgeworCQkvKiBXZSBoYXZlIGEgcmVkaXJlY3Rpb24gZXJyb3IuICovCisJCWlmIChzcGNsYmx0aW4gPiAwKQorCQkJZXhyYWlzZShFWEVSUk9SKTsKK2JhaWw6CisJCWV4aXRzdGF0dXMgPSBzdGF0dXM7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEV4ZWN1dGUgdGhlIGNvbW1hbmQuICovCisJc3dpdGNoIChjbWRlbnRyeS5jbWR0eXBlKSB7CisJZGVmYXVsdDoKKwkJLyogRm9yayBvZmYgYSBjaGlsZCBwcm9jZXNzIGlmIG5lY2Vzc2FyeS4gKi8KKwkJaWYgKCEoZmxhZ3MgJiBFVl9FWElUKSB8fCB0cmFwWzBdKSB7CisJCQlJTlRPRkY7CisJCQlqcCA9IG1ha2Vqb2IoY21kLCAxKTsKKwkJCWlmIChmb3Jrc2hlbGwoanAsIGNtZCwgRk9SS19GRykgIT0gMCkgeworCQkJCWV4aXRzdGF0dXMgPSB3YWl0Zm9yam9iKGpwKTsKKwkJCQlJTlRPTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCUZPUkNFSU5UT047CisJCX0KKwkJbGlzdHNldHZhcih2YXJsaXN0Lmxpc3QsIFZFWFBPUlR8VlNUQUNLKTsKKwkJc2hlbGxleGVjKGFyZ3YsIHBhdGgsIGNtZGVudHJ5LnUuaW5kZXgpOworCQkvKiBOT1RSRUFDSEVEICovCisKKwljYXNlIENNREJVSUxUSU46CisJCWNtZGVudmlyb24gPSB2YXJsaXN0Lmxpc3Q7CisJCWlmIChjbWRlbnZpcm9uKSB7CisJCQlzdHJ1Y3Qgc3RybGlzdCAqbGlzdCA9IGNtZGVudmlyb247CisJCQlpbnQgaSA9IFZOT1NFVDsKKwkJCWlmIChzcGNsYmx0aW4gPiAwIHx8IGFyZ2MgPT0gMCkgeworCQkJCWkgPSAwOworCQkJCWlmIChleGVjY21kICYmIGFyZ2MgPiAxKQorCQkJCQlpID0gVkVYUE9SVDsKKwkJCX0KKwkJCWxpc3RzZXR2YXIobGlzdCwgaSk7CisJCX0KKwkJaWYgKGV2YWxibHRpbihjbWRlbnRyeS51LmNtZCwgYXJnYywgYXJndikpIHsKKwkJCWludCBzdGF0dXM7CisJCQlpbnQgaSwgajsKKworCQkJaSA9IGV4Y2VwdGlvbjsKKwkJCWlmIChpID09IEVYRVhJVCkKKwkJCQlnb3RvIHJhaXNlOworCisJCQlzdGF0dXMgPSAyOworCQkJaiA9IDA7CisJCQlpZiAoaSA9PSBFWElOVCkKKwkJCQlqID0gU0lHSU5UOworCQkJaWYgKGkgPT0gRVhTSUcpCisJCQkJaiA9IHBlbmRpbmdzaWdzOworCQkJaWYgKGopCisJCQkJc3RhdHVzID0gaiArIDEyODsKKwkJCWV4aXRzdGF0dXMgPSBzdGF0dXM7CisKKwkJCWlmIChpID09IEVYSU5UIHx8IHNwY2xibHRpbiA+IDApIHsKK3JhaXNlOgorCQkJCWxvbmdqbXAoaGFuZGxlci0+bG9jLCAxKTsKKwkJCX0KKwkJCUZPUkNFSU5UT047CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENNREZVTkNUSU9OOgorCQlsaXN0c2V0dmFyKHZhcmxpc3QubGlzdCwgMCk7CisJCWlmIChldmFsZnVuKGNtZGVudHJ5LnUuZnVuYywgYXJnYywgYXJndiwgZmxhZ3MpKQorCQkJZ290byByYWlzZTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJcG9wcmVkaXIoZXhlY2NtZCk7CisJaWYgKGxhc3RhcmcpCisJCS8qIGRzbDogSSB0aGluayB0aGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gc3VwcG9ydAorCQkgKiAnXycgaW4gJ3ZpJyBjb21tYW5kIG1vZGUgZHVyaW5nIGxpbmUgZWRpdGluZy4uLgorCQkgKiBIb3dldmVyIEkgaW1wbGVtZW50ZWQgdGhhdCB3aXRoaW4gbGliZWRpdCBpdHNlbGYuCisJCSAqLworCQlzZXR2YXIoIl8iLCBsYXN0YXJnLCAwKTsKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKK30KKworU1RBVElDIGludAorZXZhbGJsdGluKGNvbnN0IHN0cnVjdCBidWlsdGluY21kICpjbWQsIGludCBhcmdjLCBjaGFyICoqYXJndikgeworCWNoYXIgKnZvbGF0aWxlIHNhdmVjbWRuYW1lOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCWludCBpOworCisJc2F2ZWNtZG5hbWUgPSBjb21tYW5kbmFtZTsKKwlpZiAoKGkgPSBzZXRqbXAoam1wbG9jLmxvYykpKQorCQlnb3RvIGNtZGRvbmU7CisJc2F2ZWhhbmRsZXIgPSBoYW5kbGVyOworCWhhbmRsZXIgPSAmam1wbG9jOworCWNvbW1hbmRuYW1lID0gYXJndlswXTsKKwlhcmdwdHIgPSBhcmd2ICsgMTsKKwlvcHRwdHIgPSBOVUxMOwkJCS8qIGluaXRpYWxpemUgbmV4dG9wdCAqLworCWV4aXRzdGF0dXMgPSAoKmNtZC0+YnVpbHRpbikoYXJnYywgYXJndik7CisJZmx1c2hhbGwoKTsKK2NtZGRvbmU6CisJZXhpdHN0YXR1cyB8PSBvdXRlcnIob3V0MSk7CisJZnJlZXN0ZG91dCgpOworCWNvbW1hbmRuYW1lID0gc2F2ZWNtZG5hbWU7CisJZXhzaWcgPSAwOworCWhhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKworCXJldHVybiBpOworfQorCitTVEFUSUMgaW50CitldmFsZnVuKHN0cnVjdCBmdW5jbm9kZSAqZnVuYywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgZmxhZ3MpCit7CisJdm9sYXRpbGUgc3RydWN0IHNocGFyYW0gc2F2ZXBhcmFtOworCXN0cnVjdCBsb2NhbHZhciAqdm9sYXRpbGUgc2F2ZWxvY2FsdmFyczsKKwlzdHJ1Y3Qgam1wbG9jICp2b2xhdGlsZSBzYXZlaGFuZGxlcjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKwlpbnQgZTsKKworCXNhdmVwYXJhbSA9IHNoZWxscGFyYW07CisJc2F2ZWxvY2FsdmFycyA9IGxvY2FsdmFyczsKKwlpZiAoKGUgPSBzZXRqbXAoam1wbG9jLmxvYykpKSB7CisJCWdvdG8gZnVuY2RvbmU7CisJfQorCUlOVE9GRjsKKwlzYXZlaGFuZGxlciA9IGhhbmRsZXI7CisJaGFuZGxlciA9ICZqbXBsb2M7CisJbG9jYWx2YXJzID0gTlVMTDsKKwlzaGVsbHBhcmFtLm1hbGxvYyA9IDA7CisJZnVuYy0+Y291bnQrKzsKKwlmdW5jbmVzdCsrOworCUlOVE9OOworCXNoZWxscGFyYW0ubnBhcmFtID0gYXJnYyAtIDE7CisJc2hlbGxwYXJhbS5wID0gYXJndiArIDE7CisJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisJZXZhbHRyZWUoJmZ1bmMtPm4sIGZsYWdzICYgRVZfVEVTVEVEKTsKK2Z1bmNkb25lOgorCUlOVE9GRjsKKwlmdW5jbmVzdC0tOworCWZyZWVmdW5jKGZ1bmMpOworCXBvcGxvY2FsdmFycygpOworCWxvY2FsdmFycyA9IHNhdmVsb2NhbHZhcnM7CisJZnJlZXBhcmFtKCZzaGVsbHBhcmFtKTsKKwlzaGVsbHBhcmFtID0gc2F2ZXBhcmFtOworCWhhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwlJTlRPTjsKKwlldmFsc2tpcCAmPSB+U0tJUEZVTkM7CisJcmV0dXJuIGU7Cit9CisKKworLyoKKyAqIFNlYXJjaCBmb3IgYSBjb21tYW5kLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHdlIGZvcmsgc28gdGhhdCB0aGUKKyAqIGxvY2F0aW9uIG9mIHRoZSBjb21tYW5kIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBwYXJlbnQgYXMgd2VsbCBhcworICogdGhlIGNoaWxkLiAgVGhlIGNoZWNrIGZvciAiZ29vZG5hbWUiIGlzIGFuIG92ZXJseSBjb25zZXJ2YXRpdmUKKyAqIGNoZWNrIHRoYXQgdGhlIG5hbWUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBleHBhbnNpb24uCisgKi8KKworU1RBVElDIHZvaWQKK3ByZWhhc2godW5pb24gbm9kZSAqbikKK3sKKwlzdHJ1Y3QgY21kZW50cnkgZW50cnk7CisKKwlpZiAobi0+dHlwZSA9PSBOQ01EICYmIG4tPm5jbWQuYXJncykKKwkJaWYgKGdvb2RuYW1lKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0KSkKKwkJCWZpbmRfY29tbWFuZChuLT5uY21kLmFyZ3MtPm5hcmcudGV4dCwgJmVudHJ5LCAwLAorCQkJCSAgICAgcGF0aHZhbCgpKTsKK30KKworCisKKy8qCisgKiBCdWlsdGluIGNvbW1hbmRzLiAgQnVpbHRpbiBjb21tYW5kcyB3aG9zZSBmdW5jdGlvbnMgYXJlIGNsb3NlbHkKKyAqIHRpZWQgdG8gZXZhbHVhdGlvbiBhcmUgaW1wbGVtZW50ZWQgaGVyZS4KKyAqLworCisvKgorICogTm8gY29tbWFuZCBnaXZlbi4KKyAqLworCitTVEFUSUMgaW50CitibHRpbmNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyoKKwkgKiBQcmVzZXJ2ZSBleGl0c3RhdHVzIG9mIGEgcHJldmlvdXMgcG9zc2libGUgcmVkaXJlY3Rpb24KKwkgKiBhcyBQT1NJWCBtYW5kYXRlcworCSAqLworCXJldHVybiBiYWNrX2V4aXRzdGF0dXM7Cit9CisKKworLyoKKyAqIEhhbmRsZSBicmVhayBhbmQgY29udGludWUgY29tbWFuZHMuICBCcmVhaywgY29udGludWUsIGFuZCByZXR1cm4gYXJlCisgKiBhbGwgaGFuZGxlZCBieSBzZXR0aW5nIHRoZSBldmFsc2tpcCBmbGFnLiAgVGhlIGV2YWx1YXRpb24gcm91dGluZXMKKyAqIGFib3ZlIGFsbCBjaGVjayB0aGlzIGZsYWcsIGFuZCBpZiBpdCBpcyBzZXQgdGhleSBzdGFydCBza2lwcGluZworICogY29tbWFuZHMgcmF0aGVyIHRoYW4gZXhlY3V0aW5nIHRoZW0uICBUaGUgdmFyaWFibGUgc2tpcGNvdW50IGlzCisgKiB0aGUgbnVtYmVyIG9mIGxvb3BzIHRvIGJyZWFrL2NvbnRpbnVlLCBvciB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9uCisgKiBsZXZlbHMgdG8gcmV0dXJuLiAgKFRoZSBsYXR0ZXIgaXMgYWx3YXlzIDEuKSAgSXQgc2hvdWxkIHByb2JhYmx5CisgKiBiZSBhbiBlcnJvciB0byBicmVhayBvdXQgb2YgbW9yZSBsb29wcyB0aGFuIGV4aXN0LCBidXQgaXQgaXNuJ3QKKyAqIGluIHRoZSBzdGFuZGFyZCBzaGVsbCBzbyB3ZSBkb24ndCBtYWtlIGl0IG9uZSBoZXJlLgorICovCisKK2ludAorYnJlYWtjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBuID0gYXJnYyA+IDEgPyBudW1iZXIoYXJndlsxXSkgOiAxOworCisJaWYgKG4gPD0gMCkKKwkJc2hfZXJyb3IoaWxsbnVtLCBhcmd2WzFdKTsKKwlpZiAobiA+IGxvb3BuZXN0KQorCQluID0gbG9vcG5lc3Q7CisJaWYgKG4gPiAwKSB7CisJCWV2YWxza2lwID0gKCoqYXJndiA9PSAnYycpPyBTS0lQQ09OVCA6IFNLSVBCUkVBSzsKKwkJc2tpcGNvdW50ID0gbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRoZSByZXR1cm4gY29tbWFuZC4KKyAqLworCitpbnQKK3JldHVybmNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyoKKwkgKiBJZiBjYWxsZWQgb3V0c2lkZSBhIGZ1bmN0aW9uLCBkbyB3aGF0IGtzaCBkb2VzOworCSAqIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGZpbGUuCisJICovCisJZXZhbHNraXAgPSBmdW5jbmVzdCA/IFNLSVBGVU5DIDogU0tJUEZJTEU7CisJcmV0dXJuIGFyZ3ZbMV0gPyBudW1iZXIoYXJndlsxXSkgOiBleGl0c3RhdHVzOworfQorCisKK2ludAorZmFsc2VjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJldHVybiAxOworfQorCisKK2ludAordHJ1ZWNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIDA7Cit9CisKKworaW50CitleGVjY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYyA+IDEpIHsKKwkJaWZsYWcgPSAwOwkJLyogZXhpdCBvbiBlcnJvciAqLworCQltZmxhZyA9IDA7CisJCW9wdHNjaGFuZ2VkKCk7CisJCXNoZWxsZXhlYyhhcmd2ICsgMSwgcGF0aHZhbCgpLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworU1RBVElDIGludAorZXByaW50bGlzdChzdHJ1Y3Qgb3V0cHV0ICpvdXQsIHN0cnVjdCBzdHJsaXN0ICpzcCwgaW50IHNlcCkKK3sKKwl3aGlsZSAoc3ApIHsKKwkJY29uc3QgY2hhciAqcDsKKworCQlwID0gIiAlcyIgKyAoMSAtIHNlcCk7CisJCXNlcCB8PSAxOworCQlvdXRmbXQob3V0LCBwLCBzcC0+dGV4dCk7CisJCXNwID0gc3AtPm5leHQ7CisJfQorCisJcmV0dXJuIHNlcDsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2V2YWwuaCBiL3Vzci9kYXNoL2V2YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU2MjBkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZXZhbC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZXZhbC5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKK2V4dGVybiBjaGFyICpjb21tYW5kbmFtZTsJLyogY3VycmVudGx5IGV4ZWN1dGluZyBjb21tYW5kICovCitleHRlcm4gaW50IGV4aXRzdGF0dXM7CQkvKiBleGl0IHN0YXR1cyBvZiBsYXN0IGNvbW1hbmQgKi8KK2V4dGVybiBpbnQgYmFja19leGl0c3RhdHVzOwkvKiBleGl0IHN0YXR1cyBvZiBiYWNrcXVvdGVkIGNvbW1hbmQgKi8KK2V4dGVybiBzdHJ1Y3Qgc3RybGlzdCAqY21kZW52aXJvbjsgIC8qIGVudmlyb25tZW50IGZvciBidWlsdGluIGNvbW1hbmQgKi8KKworCitzdHJ1Y3QgYmFja2NtZCB7CQkvKiByZXN1bHQgb2YgZXZhbGJhY2tjbWQgKi8KKwlpbnQgZmQ7CQkJLyogZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgZnJvbSAqLworCWNoYXIgKmJ1ZjsJCS8qIGJ1ZmZlciAqLworCWludCBubGVmdDsJCS8qIG51bWJlciBvZiBjaGFycyBpbiBidWZmZXIgKi8KKwlzdHJ1Y3Qgam9iICpqcDsJCS8qIGpvYiBzdHJ1Y3R1cmUgZm9yIGNvbW1hbmQgKi8KK307CisKK2ludCBldmFsc3RyaW5nKGNoYXIgKiwgaW50KTsKK3VuaW9uIG5vZGU7CS8qIEJMRVRDSCBmb3IgYW5zaSBDICovCit2b2lkIGV2YWx0cmVlKHVuaW9uIG5vZGUgKiwgaW50KTsKK3ZvaWQgZXZhbGJhY2tjbWQodW5pb24gbm9kZSAqLCBzdHJ1Y3QgYmFja2NtZCAqKTsKKworZXh0ZXJuIGludCBldmFsc2tpcDsKKworLyogcmVhc29ucyBmb3Igc2tpcHBpbmcgY29tbWFuZHMgKHNlZSBjb21tZW50IG9uIGJyZWFrY21kIHJvdXRpbmUpICovCisjZGVmaW5lIFNLSVBCUkVBSwkoMSA8PCAwKQorI2RlZmluZSBTS0lQQ09OVAkoMSA8PCAxKQorI2RlZmluZSBTS0lQRlVOQwkoMSA8PCAyKQorI2RlZmluZSBTS0lQRklMRQkoMSA8PCAzKQorI2RlZmluZSBTS0lQRVZBTAkoMSA8PCA0KQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZXhlYy5jIGIvdXNyL2Rhc2gvZXhlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2JhOGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9leGVjLmMKQEAgLTAsMCArMSw4NjkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHBhdGhzLmg+CisKKy8qCisgKiBXaGVuIGNvbW1hbmRzIGFyZSBmaXJzdCBlbmNvdW50ZXJlZCwgdGhleSBhcmUgZW50ZXJlZCBpbiBhIGhhc2ggdGFibGUuCisgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGZ1bGwgcGF0aCBzZWFyY2ggd2lsbCBub3QgaGF2ZSB0byBiZSBkb25lIGZvciB0aGVtCisgKiBvbiBlYWNoIGludm9jYXRpb24uCisgKgorICogV2Ugc2hvdWxkIGludmVzdGlnYXRlIGNvbnZlcnRpbmcgdG8gYSBsaW5lYXIgc2VhcmNoLCBldmVuIHRob3VnaCB0aGF0CisgKiB3b3VsZCBtYWtlIHRoZSBjb21tYW5kIG5hbWUgImhhc2giIGEgbWlzbm9tZXIuCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAicmVkaXIuaCIKKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAiZXhlYy5oIgorI2luY2x1ZGUgImJ1aWx0aW5zLmgiCisjaW5jbHVkZSAidmFyLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgInN5bnRheC5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJpbml0LmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAiam9icy5oIgorI2luY2x1ZGUgImFsaWFzLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisKKworI2RlZmluZSBDTURUQUJMRVNJWkUgMzEJCS8qIHNob3VsZCBiZSBwcmltZSAqLworI2RlZmluZSBBUkIgMQkJCS8qIGFjdHVhbCBzaXplIGRldGVybWluZWQgYXQgcnVuIHRpbWUgKi8KKworCisKK3N0cnVjdCB0YmxlbnRyeSB7CisJc3RydWN0IHRibGVudHJ5ICpuZXh0OwkvKiBuZXh0IGVudHJ5IGluIGhhc2ggY2hhaW4gKi8KKwl1bmlvbiBwYXJhbSBwYXJhbTsJLyogZGVmaW5pdGlvbiBvZiBidWlsdGluIGZ1bmN0aW9uICovCisJc2hvcnQgY21kdHlwZTsJCS8qIGluZGV4IGlkZW50aWZ5aW5nIGNvbW1hbmQgKi8KKwljaGFyIHJlaGFzaDsJCS8qIGlmIHNldCwgY2QgZG9uZSBzaW5jZSBlbnRyeSBjcmVhdGVkICovCisJY2hhciBjbWRuYW1lW0FSQl07CS8qIG5hbWUgb2YgY29tbWFuZCAqLworfTsKKworCitTVEFUSUMgc3RydWN0IHRibGVudHJ5ICpjbWR0YWJsZVtDTURUQUJMRVNJWkVdOworU1RBVElDIGludCBidWlsdGlubG9jID0gLTE7CQkvKiBpbmRleCBpbiBwYXRoIG9mICVidWlsdGluLCBvciAtMSAqLworCisKK1NUQVRJQyB2b2lkIHRyeWV4ZWMoY2hhciAqLCBjaGFyICoqLCBjaGFyICoqKTsKK1NUQVRJQyB2b2lkIHByaW50ZW50cnkoc3RydWN0IHRibGVudHJ5ICopOworU1RBVElDIHZvaWQgY2xlYXJjbWRlbnRyeShpbnQpOworU1RBVElDIHN0cnVjdCB0YmxlbnRyeSAqY21kbG9va3VwKGNvbnN0IGNoYXIgKiwgaW50KTsKK1NUQVRJQyB2b2lkIGRlbGV0ZV9jbWRfZW50cnkodm9pZCk7CitTVEFUSUMgdm9pZCBhZGRjbWRlbnRyeShjaGFyICosIHN0cnVjdCBjbWRlbnRyeSAqKTsKK1NUQVRJQyBpbnQgZGVzY3JpYmVfY29tbWFuZChzdHJ1Y3Qgb3V0cHV0ICosIGNoYXIgKiwgaW50KTsKKworCisvKgorICogRXhlYyBhIHByb2dyYW0uICBOZXZlciByZXR1cm5zLiAgSWYgeW91IGNoYW5nZSB0aGlzIHJvdXRpbmUsIHlvdSBtYXkKKyAqIGhhdmUgdG8gY2hhbmdlIHRoZSBmaW5kX2NvbW1hbmQgcm91dGluZSBhcyB3ZWxsLgorICovCisKK3ZvaWQKK3NoZWxsZXhlYyhjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcGF0aCwgaW50IGlkeCkKK3sKKwljaGFyICpjbWRuYW1lOworCWludCBlOworCWNoYXIgKiplbnZwOworCWludCBleGVycm5vOworCisJY2xlYXJyZWRpcigxKTsKKwllbnZwID0gZW52aXJvbm1lbnQoKTsKKwlpZiAoc3RyY2hyKGFyZ3ZbMF0sICcvJykgIT0gTlVMTCkgeworCQl0cnlleGVjKGFyZ3ZbMF0sIGFyZ3YsIGVudnApOworCQllID0gZXJybm87CisJfSBlbHNlIHsKKwkJZSA9IEVOT0VOVDsKKwkJd2hpbGUgKChjbWRuYW1lID0gcGFkdmFuY2UoJnBhdGgsIGFyZ3ZbMF0pKSAhPSBOVUxMKSB7CisJCQlpZiAoLS1pZHggPCAwICYmIHBhdGhvcHQgPT0gTlVMTCkgeworCQkJCXRyeWV4ZWMoY21kbmFtZSwgYXJndiwgZW52cCk7CisJCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKQorCQkJCQllID0gZXJybm87CisJCQl9CisJCQlzdHVuYWxsb2MoY21kbmFtZSk7CisJCX0KKwl9CisKKwkvKiBNYXAgdG8gUE9TSVggZXJyb3JzICovCisJc3dpdGNoIChlKSB7CisJY2FzZSBFQUNDRVM6CisJCWV4ZXJybm8gPSAxMjY7CisJCWJyZWFrOworCWNhc2UgRU5PRU5UOgorCQlleGVycm5vID0gMTI3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlleGVycm5vID0gMjsKKwkJYnJlYWs7CisJfQorCWV4aXRzdGF0dXMgPSBleGVycm5vOworCVRSQUNFKCgic2hlbGxleGVjIGZhaWxlZCBmb3IgJXMsIGVycm5vICVkLCBzdXBwcmVzc2ludCAlZFxuIiwKKwkJYXJndlswXSwgZSwgc3VwcHJlc3NpbnQgKSk7CisJZXhlcnJvcihFWEVYRUMsICIlczogJXMiLCBhcmd2WzBdLCBlcnJtc2coZSwgRV9FWEVDKSk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisKK1NUQVRJQyB2b2lkCit0cnlleGVjKGNoYXIgKmNtZCwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWludCByZXBlYXRlZCA9IDA7CisjaWYgIWRlZmluZWQoQlNEKSAmJiAhZGVmaW5lZChsaW51eCkKKwljaGFyICpwOworI2VuZGlmCisKK3JlcGVhdDoKKyNpZmRlZiBTWVNWCisJZG8geworCQlleGVjdmUoY21kLCBhcmd2LCBlbnZwKTsKKwl9IHdoaWxlIChlcnJubyA9PSBFSU5UUik7CisjZWxzZQorCWV4ZWN2ZShjbWQsIGFyZ3YsIGVudnApOworI2VuZGlmCisJaWYgKHJlcGVhdGVkKyspIHsKKwkJY2tmcmVlKGFyZ3YpOworCX0gZWxzZSBpZiAoZXJybm8gPT0gRU5PRVhFQykgeworCQljaGFyICoqYXA7CisJCWNoYXIgKipuZXc7CisKKwkJZm9yIChhcCA9IGFyZ3Y7ICphcDsgYXArKykKKwkJCTsKKwkJYXAgPSBuZXcgPSBja21hbGxvYygoYXAgLSBhcmd2ICsgMikgKiBzaXplb2YoY2hhciAqKSk7CisJCSphcCsrID0gY21kID0gX1BBVEhfQlNIRUxMOworCQl3aGlsZSAoKCphcCsrID0gKmFyZ3YrKykpCisJCQk7CisJCWFyZ3YgPSBuZXc7CisJCWdvdG8gcmVwZWF0OworCX0KK30KKworCisKKy8qCisgKiBEbyBhIHBhdGggc2VhcmNoLiAgVGhlIHZhcmlhYmxlIHBhdGggKHBhc3NlZCBieSByZWZlcmVuY2UpIHNob3VsZCBiZQorICogc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgcGF0aCBiZWZvcmUgdGhlIGZpcnN0IGNhbGw7IHBhZHZhbmNlIHdpbGwgdXBkYXRlCisgKiB0aGlzIHZhbHVlIGFzIGl0IHByb2NlZWRzLiAgU3VjY2Vzc2l2ZSBjYWxscyB0byBwYWR2YW5jZSB3aWxsIHJldHVybgorICogdGhlIHBvc3NpYmxlIHBhdGggZXhwYW5zaW9ucyBpbiBzZXF1ZW5jZS4gIElmIGFuIG9wdGlvbiAoaW5kaWNhdGVkIGJ5CisgKiBhIHBlcmNlbnQgc2lnbikgYXBwZWFycyBpbiB0aGUgcGF0aCBlbnRyeSB0aGVuIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAqIHBhdGhvcHQgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8gaXQ7IG90aGVyd2lzZSBwYXRob3B0IHdpbGwgYmUgc2V0IHRvCisgKiBOVUxMLgorICovCisKK2NvbnN0IGNoYXIgKnBhdGhvcHQ7CisKK2NoYXIgKgorcGFkdmFuY2UoY29uc3QgY2hhciAqKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICpxOworCWNvbnN0IGNoYXIgKnN0YXJ0OworCXNpemVfdCBsZW47CisKKwlpZiAoKnBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc3RhcnQgPSAqcGF0aDsKKwlmb3IgKHAgPSBzdGFydCA7ICpwICYmICpwICE9ICc6JyAmJiAqcCAhPSAnJScgOyBwKyspOworCWxlbiA9IHAgLSBzdGFydCArIHN0cmxlbihuYW1lKSArIDI7CS8qICIyIiBpcyBmb3IgJy8nIGFuZCAnXDAnICovCisJd2hpbGUgKHN0YWNrYmxvY2tzaXplKCkgPCBsZW4pCisJCWdyb3dzdGFja2Jsb2NrKCk7CisJcSA9IHN0YWNrYmxvY2soKTsKKwlpZiAocCAhPSBzdGFydCkgeworCQltZW1jcHkocSwgc3RhcnQsIHAgLSBzdGFydCk7CisJCXEgKz0gcCAtIHN0YXJ0OworCQkqcSsrID0gJy8nOworCX0KKwlzdHJjcHkocSwgbmFtZSk7CisJcGF0aG9wdCA9IE5VTEw7CisJaWYgKCpwID09ICclJykgeworCQlwYXRob3B0ID0gKytwOworCQl3aGlsZSAoKnAgJiYgKnAgIT0gJzonKSAgcCsrOworCX0KKwlpZiAoKnAgPT0gJzonKQorCQkqcGF0aCA9IHAgKyAxOworCWVsc2UKKwkJKnBhdGggPSBOVUxMOworCXJldHVybiBzdGFsbG9jKGxlbik7Cit9CisKKworCisvKioqIENvbW1hbmQgaGFzaGluZyBjb2RlICoqKi8KKworCitpbnQKK2hhc2hjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnBwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKwlpbnQgYzsKKwlzdHJ1Y3QgY21kZW50cnkgZW50cnk7CisJY2hhciAqbmFtZTsKKworCXdoaWxlICgoYyA9IG5leHRvcHQoInIiKSkgIT0gJ1wwJykgeworCQljbGVhcmNtZGVudHJ5KDApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCphcmdwdHIgPT0gTlVMTCkgeworCQlmb3IgKHBwID0gY21kdGFibGUgOyBwcCA8ICZjbWR0YWJsZVtDTURUQUJMRVNJWkVdIDsgcHArKykgeworCQkJZm9yIChjbWRwID0gKnBwIDsgY21kcCA7IGNtZHAgPSBjbWRwLT5uZXh0KSB7CisJCQkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMKQorCQkJCQlwcmludGVudHJ5KGNtZHApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKwljID0gMDsKKwl3aGlsZSAoKG5hbWUgPSAqYXJncHRyKSAhPSBOVUxMKSB7CisJCWlmICgoY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKSkgIT0gTlVMTAorCQkgJiYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMCisJCSAgICAgfHwgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTiAmJiBidWlsdGlubG9jID49IDApKSkKKwkJCWRlbGV0ZV9jbWRfZW50cnkoKTsKKwkJZmluZF9jb21tYW5kKG5hbWUsICZlbnRyeSwgRE9fRVJSLCBwYXRodmFsKCkpOworCQlpZiAoZW50cnkuY21kdHlwZSA9PSBDTURVTktOT1dOKQorCQkJYyA9IDE7CisJCWFyZ3B0cisrOworCX0KKwlyZXR1cm4gYzsKK30KKworCitTVEFUSUMgdm9pZAorcHJpbnRlbnRyeShzdHJ1Y3QgdGJsZW50cnkgKmNtZHApCit7CisJaW50IGlkeDsKKwljb25zdCBjaGFyICpwYXRoOworCWNoYXIgKm5hbWU7CisKKwlpZHggPSBjbWRwLT5wYXJhbS5pbmRleDsKKwlwYXRoID0gcGF0aHZhbCgpOworCWRvIHsKKwkJbmFtZSA9IHBhZHZhbmNlKCZwYXRoLCBjbWRwLT5jbWRuYW1lKTsKKwkJc3R1bmFsbG9jKG5hbWUpOworCX0gd2hpbGUgKC0taWR4ID49IDApOworCW91dDFzdHIobmFtZSk7CisJb3V0MWZtdChzbmxmbXQsIGNtZHAtPnJlaGFzaCA/ICIqIiA6IG51bGxzdHIpOworfQorCisKKworLyoKKyAqIFJlc29sdmUgYSBjb21tYW5kIG5hbWUuICBJZiB5b3UgY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IG1heSBoYXZlIHRvCisgKiBjaGFuZ2UgdGhlIHNoZWxsZXhlYyByb3V0aW5lIGFzIHdlbGwuCisgKi8KKwordm9pZAorZmluZF9jb21tYW5kKGNoYXIgKm5hbWUsIHN0cnVjdCBjbWRlbnRyeSAqZW50cnksIGludCBhY3QsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCWludCBpZHg7CisJaW50IHByZXY7CisJY2hhciAqZnVsbG5hbWU7CisJc3RydWN0IHN0YXQ2NCBzdGF0YjsKKwlpbnQgZTsKKwlpbnQgdXBkYXRldGJsOworCXN0cnVjdCBidWlsdGluY21kICpiY21kOworCisJLyogSWYgbmFtZSBjb250YWlucyBhIHNsYXNoLCBkb24ndCB1c2UgUEFUSCBvciBoYXNoIHRhYmxlICovCisJaWYgKHN0cmNocihuYW1lLCAnLycpICE9IE5VTEwpIHsKKwkJZW50cnktPnUuaW5kZXggPSAtMTsKKwkJaWYgKGFjdCAmIERPX0FCUykgeworCQkJd2hpbGUgKHN0YXQ2NChuYW1lLCAmc3RhdGIpIDwgMCkgeworI2lmZGVmIFNZU1YKKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQkJZW50cnktPmNtZHR5cGUgPSBDTURVTktOT1dOOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbnRyeS0+Y21kdHlwZSA9IENNRE5PUk1BTDsKKwkJcmV0dXJuOworCX0KKworCXVwZGF0ZXRibCA9IChwYXRoID09IHBhdGh2YWwoKSk7CisJaWYgKCF1cGRhdGV0YmwpIHsKKwkJYWN0IHw9IERPX0FMVFBBVEg7CisJCWlmIChzdHJzdHIocGF0aCwgIiVidWlsdGluIikgIT0gTlVMTCkKKwkJCWFjdCB8PSBET19BTFRCTFRJTjsKKwl9CisKKwkvKiBJZiBuYW1lIGlzIGluIHRoZSB0YWJsZSwgY2hlY2sgYW5zd2VyIHdpbGwgYmUgb2sgKi8KKwlpZiAoKGNtZHAgPSBjbWRsb29rdXAobmFtZSwgMCkpICE9IE5VTEwpIHsKKwkJaW50IGJpdDsKKworCQlzd2l0Y2ggKGNtZHAtPmNtZHR5cGUpIHsKKwkJZGVmYXVsdDoKKyNpZiBERUJVRworCQkJYWJvcnQoKTsKKyNlbmRpZgorCQljYXNlIENNRE5PUk1BTDoKKwkJCWJpdCA9IERPX0FMVFBBVEg7CisJCQlicmVhazsKKwkJY2FzZSBDTURGVU5DVElPTjoKKwkJCWJpdCA9IERPX05PRlVOQzsKKwkJCWJyZWFrOworCQljYXNlIENNREJVSUxUSU46CisJCQliaXQgPSBET19BTFRCTFRJTjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhY3QgJiBiaXQpIHsKKwkJCXVwZGF0ZXRibCA9IDA7CisJCQljbWRwID0gTlVMTDsKKwkJfSBlbHNlIGlmIChjbWRwLT5yZWhhc2ggPT0gMCkKKwkJCS8qIGlmIG5vdCBpbnZhbGlkYXRlZCBieSBjZCwgd2UncmUgZG9uZSAqLworCQkJZ290byBzdWNjZXNzOworCX0KKworCS8qIElmICVidWlsdGluIG5vdCBpbiBwYXRoLCBjaGVjayBmb3IgYnVpbHRpbiBuZXh0ICovCisJYmNtZCA9IGZpbmRfYnVpbHRpbihuYW1lKTsKKwlpZiAoYmNtZCAmJiAoYmNtZC0+ZmxhZ3MgJiBCVUlMVElOX1JFR1VMQVIgfHwgKAorCQlhY3QgJiBET19BTFRQQVRIID8gIShhY3QgJiBET19BTFRCTFRJTikgOiBidWlsdGlubG9jIDw9IDAKKwkpKSkKKwkJZ290byBidWlsdGluX3N1Y2Nlc3M7CisKKwkvKiBXZSBoYXZlIHRvIHNlYXJjaCBwYXRoLiAqLworCXByZXYgPSAtMTsJCS8qIHdoZXJlIHRvIHN0YXJ0ICovCisJaWYgKGNtZHAgJiYgY21kcC0+cmVoYXNoKSB7CS8qIGRvaW5nIGEgcmVoYXNoICovCisJCWlmIChjbWRwLT5jbWR0eXBlID09IENNREJVSUxUSU4pCisJCQlwcmV2ID0gYnVpbHRpbmxvYzsKKwkJZWxzZQorCQkJcHJldiA9IGNtZHAtPnBhcmFtLmluZGV4OworCX0KKworCWUgPSBFTk9FTlQ7CisJaWR4ID0gLTE7Citsb29wOgorCXdoaWxlICgoZnVsbG5hbWUgPSBwYWR2YW5jZSgmcGF0aCwgbmFtZSkpICE9IE5VTEwpIHsKKwkJc3R1bmFsbG9jKGZ1bGxuYW1lKTsKKwkJaWR4Kys7CisJCWlmIChwYXRob3B0KSB7CisJCQlpZiAocHJlZml4KHBhdGhvcHQsICJidWlsdGluIikpIHsKKwkJCQlpZiAoYmNtZCkKKwkJCQkJZ290byBidWlsdGluX3N1Y2Nlc3M7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCEoYWN0ICYgRE9fTk9GVU5DKSAmJgorCQkJCSAgIHByZWZpeChwYXRob3B0LCAiZnVuYyIpKSB7CisJCQkJLyogaGFuZGxlZCBiZWxvdyAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBpZ25vcmUgdW5pbXBsZW1lbnRlZCBvcHRpb25zICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogaWYgcmVoYXNoLCBkb24ndCByZWRvIGFic29sdXRlIHBhdGggbmFtZXMgKi8KKwkJaWYgKGZ1bGxuYW1lWzBdID09ICcvJyAmJiBpZHggPD0gcHJldikgeworCQkJaWYgKGlkeCA8IHByZXYpCisJCQkJY29udGludWU7CisJCQlUUkFDRSgoInNlYXJjaGV4ZWMgXCIlc1wiOiBubyBjaGFuZ2VcbiIsIG5hbWUpKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCQl3aGlsZSAoc3RhdDY0KGZ1bGxuYW1lLCAmc3RhdGIpIDwgMCkgeworI2lmZGVmIFNZU1YKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKyNlbmRpZgorCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKQorCQkJCWUgPSBlcnJubzsKKwkJCWdvdG8gbG9vcDsKKwkJfQorCQllID0gRUFDQ0VTOwkvKiBpZiB3ZSBmYWlsLCB0aGlzIHdpbGwgYmUgdGhlIGVycm9yICovCisJCWlmICghU19JU1JFRyhzdGF0Yi5zdF9tb2RlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGF0aG9wdCkgewkJLyogdGhpcyBpcyBhICVmdW5jIGRpcmVjdG9yeSAqLworCQkJc3RhbGxvYyhzdHJsZW4oZnVsbG5hbWUpICsgMSk7CisJCQlyZWFkY21kZmlsZShmdWxsbmFtZSk7CisJCQlpZiAoKGNtZHAgPSBjbWRsb29rdXAobmFtZSwgMCkpID09IE5VTEwgfHwKKwkJCSAgICBjbWRwLT5jbWR0eXBlICE9IENNREZVTkNUSU9OKQorCQkJCXNoX2Vycm9yKCIlcyBub3QgZGVmaW5lZCBpbiAlcyIsIG5hbWUsCisJCQkJCSBmdWxsbmFtZSk7CisJCQlzdHVuYWxsb2MoZnVsbG5hbWUpOworCQkJZ290byBzdWNjZXNzOworCQl9CisjaWZkZWYgbm90ZGVmCisJCS8qIFhYWCB0aGlzIGNvZGUgc3RvcHMgcm9vdCBleGVjdXRpbmcgc3R1ZmYsIGFuZCBpcyBidWdneQorCQkgICBpZiB5b3UgbmVlZCBhIGdyb3VwIGZyb20gdGhlIGdyb3VwIGxpc3QuICovCisJCWlmIChzdGF0Yi5zdF91aWQgPT0gZ2V0ZXVpZCgpKSB7CisJCQlpZiAoKHN0YXRiLnN0X21vZGUgJiAwMTAwKSA9PSAwKQorCQkJCWdvdG8gbG9vcDsKKwkJfSBlbHNlIGlmIChzdGF0Yi5zdF9naWQgPT0gZ2V0ZWdpZCgpKSB7CisJCQlpZiAoKHN0YXRiLnN0X21vZGUgJiAwMTApID09IDApCisJCQkJZ290byBsb29wOworCQl9IGVsc2UgeworCQkJaWYgKChzdGF0Yi5zdF9tb2RlICYgMDEpID09IDApCisJCQkJZ290byBsb29wOworCQl9CisjZW5kaWYKKwkJVFJBQ0UoKCJzZWFyY2hleGVjIFwiJXNcIiByZXR1cm5zIFwiJXNcIlxuIiwgbmFtZSwgZnVsbG5hbWUpKTsKKwkJaWYgKCF1cGRhdGV0YmwpIHsKKwkJCWVudHJ5LT5jbWR0eXBlID0gQ01ETk9STUFMOworCQkJZW50cnktPnUuaW5kZXggPSBpZHg7CisJCQlyZXR1cm47CisJCX0KKwkJSU5UT0ZGOworCQljbWRwID0gY21kbG9va3VwKG5hbWUsIDEpOworCQljbWRwLT5jbWR0eXBlID0gQ01ETk9STUFMOworCQljbWRwLT5wYXJhbS5pbmRleCA9IGlkeDsKKwkJSU5UT047CisJCWdvdG8gc3VjY2VzczsKKwl9CisKKwkvKiBXZSBmYWlsZWQuICBJZiB0aGVyZSB3YXMgYW4gZW50cnkgZm9yIHRoaXMgY29tbWFuZCwgZGVsZXRlIGl0ICovCisJaWYgKGNtZHAgJiYgdXBkYXRldGJsKQorCQlkZWxldGVfY21kX2VudHJ5KCk7CisJaWYgKGFjdCAmIERPX0VSUikKKwkJc2hfd2FybngoIiVzOiAlcyIsIG5hbWUsIGVycm1zZyhlLCBFX0VYRUMpKTsKKwllbnRyeS0+Y21kdHlwZSA9IENNRFVOS05PV047CisJcmV0dXJuOworCitidWlsdGluX3N1Y2Nlc3M6CisJaWYgKCF1cGRhdGV0YmwpIHsKKwkJZW50cnktPmNtZHR5cGUgPSBDTURCVUlMVElOOworCQllbnRyeS0+dS5jbWQgPSBiY21kOworCQlyZXR1cm47CisJfQorCUlOVE9GRjsKKwljbWRwID0gY21kbG9va3VwKG5hbWUsIDEpOworCWNtZHAtPmNtZHR5cGUgPSBDTURCVUlMVElOOworCWNtZHAtPnBhcmFtLmNtZCA9IGJjbWQ7CisJSU5UT047CitzdWNjZXNzOgorCWNtZHAtPnJlaGFzaCA9IDA7CisJZW50cnktPmNtZHR5cGUgPSBjbWRwLT5jbWR0eXBlOworCWVudHJ5LT51ID0gY21kcC0+cGFyYW07Cit9CisKKworCisvKgorICogU2VhcmNoIHRoZSB0YWJsZSBvZiBidWlsdGluIGNvbW1hbmRzLgorICovCisKK3N0cnVjdCBidWlsdGluY21kICoKK2ZpbmRfYnVpbHRpbihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBidWlsdGluY21kICpicDsKKworCWJwID0gYnNlYXJjaCgKKwkJJm5hbWUsIGJ1aWx0aW5jbWQsIE5VTUJVSUxUSU5TLCBzaXplb2Yoc3RydWN0IGJ1aWx0aW5jbWQpLAorCQlwc3RyY21wCisJKTsKKwlyZXR1cm4gYnA7Cit9CisKKworCisvKgorICogQ2FsbGVkIHdoZW4gYSBjZCBpcyBkb25lLiAgTWFya3MgYWxsIGNvbW1hbmRzIHNvIHRoZSBuZXh0IHRpbWUgdGhleQorICogYXJlIGV4ZWN1dGVkIHRoZXkgd2lsbCBiZSByZWhhc2hlZC4KKyAqLworCit2b2lkCitoYXNoY2Qodm9pZCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKipwcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwlmb3IgKHBwID0gY21kdGFibGUgOyBwcCA8ICZjbWR0YWJsZVtDTURUQUJMRVNJWkVdIDsgcHArKykgeworCQlmb3IgKGNtZHAgPSAqcHAgOyBjbWRwIDsgY21kcCA9IGNtZHAtPm5leHQpIHsKKwkJCWlmIChjbWRwLT5jbWR0eXBlID09IENNRE5PUk1BTCB8fCAoCisJCQkJY21kcC0+Y21kdHlwZSA9PSBDTURCVUlMVElOICYmCisJCQkJIShjbWRwLT5wYXJhbS5jbWQtPmZsYWdzICYgQlVJTFRJTl9SRUdVTEFSKSAmJgorCQkJCWJ1aWx0aW5sb2MgPiAwCisJCQkpKQorCQkJCWNtZHAtPnJlaGFzaCA9IDE7CisJCX0KKwl9Cit9CisKKworCisvKgorICogRml4IGNvbW1hbmQgaGFzaCB0YWJsZSB3aGVuIFBBVEggY2hhbmdlZC4KKyAqIENhbGxlZCBiZWZvcmUgUEFUSCBpcyBjaGFuZ2VkLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuZXcgdmFsdWUgb2YgUEFUSDsKKyAqIHBhdGh2YWwoKSBzdGlsbCByZXR1cm5zIHRoZSBvbGQgdmFsdWUgYXQgdGhpcyBwb2ludC4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCisKK3ZvaWQKK2NoYW5nZXBhdGgoY29uc3QgY2hhciAqbmV3dmFsKQoreworCWNvbnN0IGNoYXIgKm9sZCwgKm5ldzsKKwlpbnQgaWR4OworCWludCBmaXJzdGNoYW5nZTsKKwlpbnQgYmx0aW47CisKKwlvbGQgPSBwYXRodmFsKCk7CisJbmV3ID0gbmV3dmFsOworCWZpcnN0Y2hhbmdlID0gOTk5OTsJLyogYXNzdW1lIG5vIGNoYW5nZSAqLworCWlkeCA9IDA7CisJYmx0aW4gPSAtMTsKKwlmb3IgKDs7KSB7CisJCWlmICgqb2xkICE9ICpuZXcpIHsKKwkJCWZpcnN0Y2hhbmdlID0gaWR4OworCQkJaWYgKCgqb2xkID09ICdcMCcgJiYgKm5ldyA9PSAnOicpCisJCQkgfHwgKCpvbGQgPT0gJzonICYmICpuZXcgPT0gJ1wwJykpCisJCQkJZmlyc3RjaGFuZ2UrKzsKKwkJCW9sZCA9IG5ldzsJLyogaWdub3JlIHN1YnNlcXVlbnQgZGlmZmVyZW5jZXMgKi8KKwkJfQorCQlpZiAoKm5ldyA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWlmICgqbmV3ID09ICclJyAmJiBibHRpbiA8IDAgJiYgcHJlZml4KG5ldyArIDEsICJidWlsdGluIikpCisJCQlibHRpbiA9IGlkeDsKKwkJaWYgKCpuZXcgPT0gJzonKSB7CisJCQlpZHgrKzsKKwkJfQorCQluZXcrKywgb2xkKys7CisJfQorCWlmIChidWlsdGlubG9jIDwgMCAmJiBibHRpbiA+PSAwKQorCQlidWlsdGlubG9jID0gYmx0aW47CQkvKiB6YXAgYnVpbHRpbnMgKi8KKwlpZiAoYnVpbHRpbmxvYyA+PSAwICYmIGJsdGluIDwgMCkKKwkJZmlyc3RjaGFuZ2UgPSAwOworCWNsZWFyY21kZW50cnkoZmlyc3RjaGFuZ2UpOworCWJ1aWx0aW5sb2MgPSBibHRpbjsKK30KKworCisvKgorICogQ2xlYXIgb3V0IGNvbW1hbmQgZW50cmllcy4gIFRoZSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGZpcnN0IGVudHJ5IGluCisgKiBQQVRIIHdoaWNoIGhhcyBjaGFuZ2VkLgorICovCisKK1NUQVRJQyB2b2lkCitjbGVhcmNtZGVudHJ5KGludCBmaXJzdGNoYW5nZSkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKip0YmxwOworCXN0cnVjdCB0YmxlbnRyeSAqKnBwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCUlOVE9GRjsKKwlmb3IgKHRibHAgPSBjbWR0YWJsZSA7IHRibHAgPCAmY21kdGFibGVbQ01EVEFCTEVTSVpFXSA7IHRibHArKykgeworCQlwcCA9IHRibHA7CisJCXdoaWxlICgoY21kcCA9ICpwcCkgIT0gTlVMTCkgeworCQkJaWYgKChjbWRwLT5jbWR0eXBlID09IENNRE5PUk1BTCAmJgorCQkJICAgICBjbWRwLT5wYXJhbS5pbmRleCA+PSBmaXJzdGNoYW5nZSkKKwkJCSB8fCAoY21kcC0+Y21kdHlwZSA9PSBDTURCVUlMVElOICYmCisJCQkgICAgIGJ1aWx0aW5sb2MgPj0gZmlyc3RjaGFuZ2UpKSB7CisJCQkJKnBwID0gY21kcC0+bmV4dDsKKwkJCQlja2ZyZWUoY21kcCk7CisJCQl9IGVsc2UgeworCQkJCXBwID0gJmNtZHAtPm5leHQ7CisJCQl9CisJCX0KKwl9CisJSU5UT047Cit9CisKKworCisvKgorICogTG9jYXRlIGEgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBoYXNoIHRhYmxlLiAgSWYgImFkZCIgaXMgbm9uemVybywKKyAqIGFkZCB0aGUgY29tbWFuZCB0byB0aGUgdGFibGUgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC4gIFRoZQorICogdmFyaWFibGUgImxhc3RjbWRlbnRyeSIgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsaW5rCisgKiBwb2ludGluZyB0byB0aGUgZW50cnksIHNvIHRoYXQgZGVsZXRlX2NtZF9lbnRyeSBjYW4gZGVsZXRlIHRoZQorICogZW50cnkuCisgKgorICogSW50ZXJydXB0cyBtdXN0IGJlIG9mZiBpZiBjYWxsZWQgd2l0aCBhZGQgIT0gMC4KKyAqLworCitzdHJ1Y3QgdGJsZW50cnkgKipsYXN0Y21kZW50cnk7CisKKworU1RBVElDIHN0cnVjdCB0YmxlbnRyeSAqCitjbWRsb29rdXAoY29uc3QgY2hhciAqbmFtZSwgaW50IGFkZCkKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaHZhbDsKKwljb25zdCBjaGFyICpwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKipwcDsKKworCXAgPSBuYW1lOworCWhhc2h2YWwgPSAodW5zaWduZWQgY2hhcikqcCA8PCA0OworCXdoaWxlICgqcCkKKwkJaGFzaHZhbCArPSAodW5zaWduZWQgY2hhcikqcCsrOworCWhhc2h2YWwgJj0gMHg3RkZGOworCXBwID0gJmNtZHRhYmxlW2hhc2h2YWwgJSBDTURUQUJMRVNJWkVdOworCWZvciAoY21kcCA9ICpwcCA7IGNtZHAgOyBjbWRwID0gY21kcC0+bmV4dCkgeworCQlpZiAoZXF1YWwoY21kcC0+Y21kbmFtZSwgbmFtZSkpCisJCQlicmVhazsKKwkJcHAgPSAmY21kcC0+bmV4dDsKKwl9CisJaWYgKGFkZCAmJiBjbWRwID09IE5VTEwpIHsKKwkJY21kcCA9ICpwcCA9IGNrbWFsbG9jKHNpemVvZiAoc3RydWN0IHRibGVudHJ5KSAtIEFSQgorCQkJCQkrIHN0cmxlbihuYW1lKSArIDEpOworCQljbWRwLT5uZXh0ID0gTlVMTDsKKwkJY21kcC0+Y21kdHlwZSA9IENNRFVOS05PV047CisJCXN0cmNweShjbWRwLT5jbWRuYW1lLCBuYW1lKTsKKwl9CisJbGFzdGNtZGVudHJ5ID0gcHA7CisJcmV0dXJuIGNtZHA7Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGNvbW1hbmQgZW50cnkgcmV0dXJuZWQgb24gdGhlIGxhc3QgbG9va3VwLgorICovCisKK1NUQVRJQyB2b2lkCitkZWxldGVfY21kX2VudHJ5KHZvaWQpCit7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJSU5UT0ZGOworCWNtZHAgPSAqbGFzdGNtZGVudHJ5OworCSpsYXN0Y21kZW50cnkgPSBjbWRwLT5uZXh0OworCWlmIChjbWRwLT5jbWR0eXBlID09IENNREZVTkNUSU9OKQorCQlmcmVlZnVuYyhjbWRwLT5wYXJhbS5mdW5jKTsKKwlja2ZyZWUoY21kcCk7CisJSU5UT047Cit9CisKKworCisjaWZkZWYgbm90ZGVmCit2b2lkCitnZXRjbWRlbnRyeShjaGFyICpuYW1lLCBzdHJ1Y3QgY21kZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKTsKKworCWlmIChjbWRwKSB7CisJCWVudHJ5LT51ID0gY21kcC0+cGFyYW07CisJCWVudHJ5LT5jbWR0eXBlID0gY21kcC0+Y21kdHlwZTsKKwl9IGVsc2UgeworCQllbnRyeS0+Y21kdHlwZSA9IENNRFVOS05PV047CisJCWVudHJ5LT51LmluZGV4ID0gMDsKKwl9Cit9CisjZW5kaWYKKworCisvKgorICogQWRkIGEgbmV3IGNvbW1hbmQgZW50cnksIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgY29tbWFuZCBlbnRyeSBmb3IKKyAqIHRoZSBzYW1lIG5hbWUgLSBleGNlcHQgc3BlY2lhbCBidWlsdGlucy4KKyAqLworCitTVEFUSUMgdm9pZAorYWRkY21kZW50cnkoY2hhciAqbmFtZSwgc3RydWN0IGNtZGVudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwljbWRwID0gY21kbG9va3VwKG5hbWUsIDEpOworCWlmIChjbWRwLT5jbWR0eXBlID09IENNREZVTkNUSU9OKSB7CisJCWZyZWVmdW5jKGNtZHAtPnBhcmFtLmZ1bmMpOworCX0KKwljbWRwLT5jbWR0eXBlID0gZW50cnktPmNtZHR5cGU7CisJY21kcC0+cGFyYW0gPSBlbnRyeS0+dTsKKwljbWRwLT5yZWhhc2ggPSAwOworfQorCisKKy8qCisgKiBEZWZpbmUgYSBzaGVsbCBmdW5jdGlvbi4KKyAqLworCit2b2lkCitkZWZ1bihjaGFyICpuYW1lLCB1bmlvbiBub2RlICpmdW5jKQoreworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKworCUlOVE9GRjsKKwllbnRyeS5jbWR0eXBlID0gQ01ERlVOQ1RJT047CisJZW50cnkudS5mdW5jID0gY29weWZ1bmMoZnVuYyk7CisJYWRkY21kZW50cnkobmFtZSwgJmVudHJ5KTsKKwlJTlRPTjsKK30KKworCisvKgorICogRGVsZXRlIGEgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgorICovCisKK3ZvaWQKK3Vuc2V0ZnVuYyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCWlmICgoY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKSkgIT0gTlVMTCAmJgorCSAgICBjbWRwLT5jbWR0eXBlID09IENNREZVTkNUSU9OKQorCQlkZWxldGVfY21kX2VudHJ5KCk7Cit9CisKKy8qCisgKiBMb2NhdGUgYW5kIHByaW50IHdoYXQgYSB3b3JkIGlzLi4uCisgKi8KKworaW50Cit0eXBlY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJZXJyIHw9IGRlc2NyaWJlX2NvbW1hbmQob3V0MSwgYXJndltpXSwgMSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK1NUQVRJQyBpbnQKK2Rlc2NyaWJlX2NvbW1hbmQob3V0LCBjb21tYW5kLCB2ZXJib3NlKQorCXN0cnVjdCBvdXRwdXQgKm91dDsKKwljaGFyICpjb21tYW5kOworCWludCB2ZXJib3NlOworeworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisJY29uc3Qgc3RydWN0IGFsaWFzICphcDsKKwljb25zdCBjaGFyICpwYXRoID0gcGF0aHZhbCgpOworCisJaWYgKHZlcmJvc2UpIHsKKwkJb3V0c3RyKGNvbW1hbmQsIG91dCk7CisJfQorCisJLyogRmlyc3QgbG9vayBhdCB0aGUga2V5d29yZHMgKi8KKwlpZiAoZmluZGt3ZChjb21tYW5kKSkgeworCQlvdXRzdHIodmVyYm9zZSA/ICIgaXMgYSBzaGVsbCBrZXl3b3JkIiA6IGNvbW1hbmQsIG91dCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRoZW4gbG9vayBhdCB0aGUgYWxpYXNlcyAqLworCWlmICgoYXAgPSBsb29rdXBhbGlhcyhjb21tYW5kLCAwKSkgIT0gTlVMTCkgeworCQlpZiAodmVyYm9zZSkgeworCQkJb3V0Zm10KG91dCwgIiBpcyBhbiBhbGlhcyBmb3IgJXMiLCBhcC0+dmFsKTsKKwkJfSBlbHNlIHsKKwkJCW91dHN0cigiYWxpYXMgIiwgb3V0KTsKKwkJCXByaW50YWxpYXMoYXApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogVGhlbiBjaGVjayBpZiBpdCBpcyBhIHRyYWNrZWQgYWxpYXMgKi8KKwlpZiAoKGNtZHAgPSBjbWRsb29rdXAoY29tbWFuZCwgMCkpICE9IE5VTEwpIHsKKwkJZW50cnkuY21kdHlwZSA9IGNtZHAtPmNtZHR5cGU7CisJCWVudHJ5LnUgPSBjbWRwLT5wYXJhbTsKKwl9IGVsc2UgeworCQkvKiBGaW5hbGx5IHVzZSBicnV0ZSBmb3JjZSAqLworCQlmaW5kX2NvbW1hbmQoY29tbWFuZCwgJmVudHJ5LCBET19BQlMsIHBhdGgpOworCX0KKworCXN3aXRjaCAoZW50cnkuY21kdHlwZSkgeworCWNhc2UgQ01ETk9STUFMOiB7CisJCWludCBqID0gZW50cnkudS5pbmRleDsKKwkJY2hhciAqcDsKKwkJaWYgKGogPT0gLTEpIHsKKwkJCXAgPSBjb21tYW5kOworCQl9IGVsc2UgeworCQkJZG8geworCQkJCXAgPSBwYWR2YW5jZSgmcGF0aCwgY29tbWFuZCk7CisJCQkJc3R1bmFsbG9jKHApOworCQkJfSB3aGlsZSAoLS1qID49IDApOworCQl9CisJCWlmICh2ZXJib3NlKSB7CisJCQlvdXRmbXQoCisJCQkJb3V0LCAiIGlzJXMgJXMiLAorCQkJCWNtZHAgPyAiIGEgdHJhY2tlZCBhbGlhcyBmb3IiIDogbnVsbHN0ciwgcAorCQkJKTsKKwkJfSBlbHNlIHsKKwkJCW91dHN0cihwLCBvdXQpOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgQ01ERlVOQ1RJT046CisJCWlmICh2ZXJib3NlKSB7CisJCQlvdXRzdHIoIiBpcyBhIHNoZWxsIGZ1bmN0aW9uIiwgb3V0KTsKKwkJfSBlbHNlIHsKKwkJCW91dHN0cihjb21tYW5kLCBvdXQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDTURCVUlMVElOOgorCQlpZiAodmVyYm9zZSkgeworCQkJb3V0Zm10KAorCQkJCW91dCwgIiBpcyBhICVzc2hlbGwgYnVpbHRpbiIsCisJCQkJZW50cnkudS5jbWQtPmZsYWdzICYgQlVJTFRJTl9TUEVDSUFMID8KKwkJCQkJInNwZWNpYWwgIiA6IG51bGxzdHIKKwkJCSk7CisJCX0gZWxzZSB7CisJCQlvdXRzdHIoY29tbWFuZCwgb3V0KTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmICh2ZXJib3NlKSB7CisJCQlvdXRzdHIoIjogbm90IGZvdW5kXG4iLCBvdXQpOworCQl9CisJCXJldHVybiAxMjc7CisJfQorCitvdXQ6CisJb3V0YygnXG4nLCBvdXQpOworCXJldHVybiAwOworfQorCitpbnQKK2NvbW1hbmRjbWQoYXJnYywgYXJndikKKwlpbnQgYXJnYzsKKwljaGFyICoqYXJndjsKK3sKKwlpbnQgYzsKKwllbnVtIHsKKwkJVkVSSUZZX0JSSUVGID0gMSwKKwkJVkVSSUZZX1ZFUkJPU0UgPSAyLAorCX0gdmVyaWZ5ID0gMDsKKworCXdoaWxlICgoYyA9IG5leHRvcHQoInB2ViIpKSAhPSAnXDAnKQorCQlpZiAoYyA9PSAnVicpCisJCQl2ZXJpZnkgfD0gVkVSSUZZX1ZFUkJPU0U7CisJCWVsc2UgaWYgKGMgPT0gJ3YnKQorCQkJdmVyaWZ5IHw9IFZFUklGWV9CUklFRjsKKyNpZmRlZiBERUJVRworCQllbHNlIGlmIChjICE9ICdwJykKKwkJCWFib3J0KCk7CisjZW5kaWYKKworCWlmICh2ZXJpZnkpCisJCXJldHVybiBkZXNjcmliZV9jb21tYW5kKG91dDEsICphcmdwdHIsIHZlcmlmeSAtIFZFUklGWV9CUklFRik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2V4ZWMuaCBiL3Vzci9kYXNoL2V4ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE2ZjEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZXhlYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZXhlYy5oCTguMyAoQmVya2VsZXkpIDYvOC85NQorICovCisKKy8qIHZhbHVlcyBvZiBjbWR0eXBlICovCisjZGVmaW5lIENNRFVOS05PV04JLTEJLyogbm8gZW50cnkgaW4gdGFibGUgZm9yIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01ETk9STUFMCTAJLyogY29tbWFuZCBpcyBhbiBleGVjdXRhYmxlIHByb2dyYW0gKi8KKyNkZWZpbmUgQ01ERlVOQ1RJT04JMQkvKiBjb21tYW5kIGlzIGEgc2hlbGwgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ01EQlVJTFRJTgkyCS8qIGNvbW1hbmQgaXMgYSBzaGVsbCBidWlsdGluICovCisKKworc3RydWN0IGNtZGVudHJ5IHsKKwlpbnQgY21kdHlwZTsKKwl1bmlvbiBwYXJhbSB7CisJCWludCBpbmRleDsKKwkJY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgKmNtZDsKKwkJc3RydWN0IGZ1bmNub2RlICpmdW5jOworCX0gdTsKK307CisKKworLyogYWN0aW9uIHRvIGZpbmRfY29tbWFuZCgpICovCisjZGVmaW5lIERPX0VSUgkJMHgwMQkvKiBwcmludHMgZXJyb3JzICovCisjZGVmaW5lIERPX0FCUwkJMHgwMgkvKiBjaGVja3MgYWJzb2x1dGUgcGF0aHMgKi8KKyNkZWZpbmUgRE9fTk9GVU5DCTB4MDQJLyogZG9uJ3QgcmV0dXJuIHNoZWxsIGZ1bmN0aW9ucywgZm9yIGNvbW1hbmQgKi8KKyNkZWZpbmUgRE9fQUxUUEFUSAkweDA4CS8qIHVzaW5nIGFsdGVybmF0ZSBwYXRoICovCisjZGVmaW5lIERPX0FMVEJMVElOCTB4MjAJLyogJWJ1aWx0aW4gaW4gYWx0LiBwYXRoICovCisKK2V4dGVybiBjb25zdCBjaGFyICpwYXRob3B0OwkvKiBzZXQgYnkgcGFkdmFuY2UgKi8KKwordm9pZCBzaGVsbGV4ZWMoY2hhciAqKiwgY29uc3QgY2hhciAqLCBpbnQpCisgICAgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CitjaGFyICpwYWR2YW5jZShjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICopOworaW50IGhhc2hjbWQoaW50LCBjaGFyICoqKTsKK3ZvaWQgZmluZF9jb21tYW5kKGNoYXIgKiwgc3RydWN0IGNtZGVudHJ5ICosIGludCwgY29uc3QgY2hhciAqKTsKK3N0cnVjdCBidWlsdGluY21kICpmaW5kX2J1aWx0aW4oY29uc3QgY2hhciAqKTsKK3ZvaWQgaGFzaGNkKHZvaWQpOwordm9pZCBjaGFuZ2VwYXRoKGNvbnN0IGNoYXIgKik7CisjaWZkZWYgbm90ZGVmCit2b2lkIGdldGNtZGVudHJ5KGNoYXIgKiwgc3RydWN0IGNtZGVudHJ5ICopOworI2VuZGlmCit2b2lkIGRlZnVuKGNoYXIgKiwgdW5pb24gbm9kZSAqKTsKK3ZvaWQgdW5zZXRmdW5jKGNvbnN0IGNoYXIgKik7CitpbnQgdHlwZWNtZChpbnQsIGNoYXIgKiopOworaW50IGNvbW1hbmRjbWQoaW50LCBjaGFyICoqKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2V4cGFuZC5jIGIvdXNyL2Rhc2gvZXhwYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViNzI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2V4cGFuZC5jCkBAIC0wLDAgKzEsMTc0NCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9HRVRQV05BTQorI2luY2x1ZGUgPHB3ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKyNpZiAhZGVmaW5lZChGTk1BVENIX0JST0tFTikKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaWYgIWRlZmluZWQoR0xPQl9CUk9LRU4pCisjaW5jbHVkZSA8Z2xvYi5oPgorI2VuZGlmCisjZWxzZQorI2luY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogUm91dGluZXMgdG8gZXhwYW5kIGFyZ3VtZW50cyB0byBjb21tYW5kcy4gIFdlIGhhdmUgdG8gZGVhbCB3aXRoCisgKiBiYWNrcXVvdGVzLCBzaGVsbCB2YXJpYWJsZXMsIGFuZCBmaWxlIG1ldGFjaGFyYWN0ZXJzLgorICovCisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJub2Rlcy5oIgorI2luY2x1ZGUgImV2YWwuaCIKKyNpbmNsdWRlICJleHBhbmQuaCIKKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJqb2JzLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInZhci5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgInNob3cuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworLyoKKyAqIF9ybWVzY2FwZSgpIGZsYWdzCisgKi8KKyNkZWZpbmUgUk1FU0NBUEVfQUxMT0MJMHgxCS8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyAqLworI2RlZmluZSBSTUVTQ0FQRV9HTE9CCTB4MgkvKiBBZGQgYmFja3NsYXNoZXMgZm9yIGdsb2IgKi8KKyNkZWZpbmUgUk1FU0NBUEVfUVVPVEVECTB4NAkvKiBSZW1vdmUgQ1RMRVNDIHVubGVzcyBpbiBxdW90ZXMgKi8KKyNkZWZpbmUgUk1FU0NBUEVfR1JPVwkweDgJLyogR3JvdyBzdHJpbmdzIGluc3RlYWQgb2Ygc3RhbGxvYyAqLworI2RlZmluZSBSTUVTQ0FQRV9IRUFQCTB4MTAJLyogTWFsbG9jIHN0cmluZ3MgaW5zdGVhZCBvZiBzdGFsbG9jICovCisKKy8qIEFkZCBDVExFU0Mgd2hlbiBuZWNlc3NhcnkuICovCisjZGVmaW5lIFFVT1RFU19FU0MJKEVYUF9GVUxMIHwgRVhQX0NBU0UpCisvKiBEbyBub3Qgc2tpcCBOVUwgY2hhcmFjdGVycy4gKi8KKyNkZWZpbmUgUVVPVEVTX0tFRVBOVUwJRVhQX1RJTERFCisKKy8qCisgKiBTdHJ1Y3R1cmUgc3BlY2lmeWluZyB3aGljaCBwYXJ0cyBvZiB0aGUgc3RyaW5nIHNob3VsZCBiZSBzZWFyY2hlZAorICogZm9yIElGUyBjaGFyYWN0ZXJzLgorICovCisKK3N0cnVjdCBpZnNyZWdpb24geworCXN0cnVjdCBpZnNyZWdpb24gKm5leHQ7CS8qIG5leHQgcmVnaW9uIGluIGxpc3QgKi8KKwlpbnQgYmVnb2ZmOwkJLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIHJlZ2lvbiAqLworCWludCBlbmRvZmY7CQkvKiBvZmZzZXQgb2YgZW5kIG9mIHJlZ2lvbiAqLworCWludCBudWxvbmx5OwkJLyogc2VhcmNoIGZvciBudWwgYnl0ZXMgb25seSAqLworfTsKKworLyogb3V0cHV0IG9mIGN1cnJlbnQgc3RyaW5nICovCitzdGF0aWMgY2hhciAqZXhwZGVzdDsKKy8qIGxpc3Qgb2YgYmFjayBxdW90ZSBleHByZXNzaW9ucyAqLworc3RhdGljIHN0cnVjdCBub2RlbGlzdCAqYXJnYmFja3E7CisvKiBmaXJzdCBzdHJ1Y3QgaW4gbGlzdCBvZiBpZnMgcmVnaW9ucyAqLworc3RhdGljIHN0cnVjdCBpZnNyZWdpb24gaWZzZmlyc3Q7CisvKiBsYXN0IHN0cnVjdCBpbiBsaXN0ICovCitzdGF0aWMgc3RydWN0IGlmc3JlZ2lvbiAqaWZzbGFzdHA7CisvKiBob2xkcyBleHBhbmRlZCBhcmcgbGlzdCAqLworc3RhdGljIHN0cnVjdCBhcmdsaXN0IGV4cGFyZzsKKworU1RBVElDIHZvaWQgYXJnc3RyKGNoYXIgKiwgaW50KTsKK1NUQVRJQyBjaGFyICpleHB0aWxkZShjaGFyICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyB2b2lkIGV4cGJhY2txKHVuaW9uIG5vZGUgKiwgaW50LCBpbnQpOworU1RBVElDIGNvbnN0IGNoYXIgKnN1YmV2YWx2YXIoY2hhciAqLCBjaGFyICosIGludCwgaW50LCBpbnQsIGludCwgaW50KTsKK1NUQVRJQyBjaGFyICpldmFsdmFyKGNoYXIgKiwgaW50KTsKK1NUQVRJQyBzaXplX3Qgc3RydG9kZXN0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworU1RBVElDIHZvaWQgbWVtdG9kZXN0KGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIGludCk7CitTVEFUSUMgc3NpemVfdCB2YXJ2YWx1ZShjaGFyICosIGludCwgaW50KTsKK1NUQVRJQyB2b2lkIHJlY29yZHJlZ2lvbihpbnQsIGludCwgaW50KTsKK1NUQVRJQyB2b2lkIHJlbW92ZXJlY29yZHJlZ2lvbnMoaW50KTsKK1NUQVRJQyB2b2lkIGlmc2JyZWFrdXAoY2hhciAqLCBzdHJ1Y3QgYXJnbGlzdCAqKTsKK1NUQVRJQyB2b2lkIGlmc2ZyZWUodm9pZCk7CitTVEFUSUMgdm9pZCBleHBhbmRtZXRhKHN0cnVjdCBzdHJsaXN0ICosIGludCk7CisjaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKSAmJiAhZGVmaW5lZChHTE9CX0JST0tFTikKK1NUQVRJQyB2b2lkIGFkZGdsb2IoY29uc3QgZ2xvYl90ICopOworI2Vsc2UKK1NUQVRJQyB2b2lkIGV4cG1ldGEoY2hhciAqLCBjaGFyICopOworI2VuZGlmCitTVEFUSUMgdm9pZCBhZGRmbmFtZShjaGFyICopOworI2lmICEoZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKSAmJiAhZGVmaW5lZChHTE9CX0JST0tFTikpCitTVEFUSUMgc3RydWN0IHN0cmxpc3QgKmV4cHNvcnQoc3RydWN0IHN0cmxpc3QgKik7CitTVEFUSUMgc3RydWN0IHN0cmxpc3QgKm1zb3J0KHN0cnVjdCBzdHJsaXN0ICosIGludCk7CisjZW5kaWYKK1NUQVRJQyBpbnQgcGF0bWF0Y2goY2hhciAqLCBjb25zdCBjaGFyICopOworI2lmICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChGTk1BVENIX0JST0tFTikKK1NUQVRJQyBpbnQgcG1hdGNoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNlbHNlCisjZGVmaW5lIHBtYXRjaChhLCBiKSAhZm5tYXRjaCgoYSksIChiKSwgMCkKKyNlbmRpZgorU1RBVElDIGludCBjdnRudW0obG9uZyk7CitTVEFUSUMgc2l6ZV90IGVzY2xlbihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitTVEFUSUMgY2hhciAqc2NhbmxlZnQoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCk7CitTVEFUSUMgY2hhciAqc2NhbnJpZ2h0KGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgdmFydW5zZXQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KQorCV9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisKKy8qCisgKiBQcmVwYXJlIGEgcGF0dGVybiBmb3IgYSBnbG9iKDMpIGNhbGwuCisgKgorICogUmV0dXJucyBhbiBzdGFsbG9jZWQgc3RyaW5nLgorICovCisKK1NUQVRJQyBpbmxpbmUgY2hhciAqCitwcmVnbG9iKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBxdW90ZWQsIGludCBmbGFnKSB7CisJZmxhZyB8PSBSTUVTQ0FQRV9HTE9COworCWlmIChxdW90ZWQpIHsKKwkJZmxhZyB8PSBSTUVTQ0FQRV9RVU9URUQ7CisJfQorCXJldHVybiBfcm1lc2NhcGVzKChjaGFyICopcGF0dGVybiwgZmxhZyk7Cit9CisKKworU1RBVElDIHNpemVfdAorZXNjbGVuKGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICpwKSB7CisJc2l6ZV90IGVzYyA9IDA7CisKKwl3aGlsZSAocCA+IHN0YXJ0ICYmICotLXAgPT0gKGNoYXIpQ1RMRVNDKSB7CisJCWVzYysrOworCX0KKwlyZXR1cm4gZXNjOworfQorCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZ2V0cHdob21lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisjaWZkZWYgSEFWRV9HRVRQV05BTQorCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHduYW0obmFtZSk7CisJcmV0dXJuIHB3ID8gcHctPnB3X2RpciA6IDA7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKworLyoKKyAqIEV4cGFuZCBzaGVsbCB2YXJpYWJsZXMgYW5kIGJhY2txdW90ZXMgaW5zaWRlIGEgaGVyZSBkb2N1bWVudC4KKyAqLworCit2b2lkCitleHBhbmRoZXJlKHVuaW9uIG5vZGUgKmFyZywgaW50IGZkKQoreworCWhlcmVmZCA9IGZkOworCWV4cGFuZGFyZyhhcmcsIChzdHJ1Y3QgYXJnbGlzdCAqKU5VTEwsIDApOworCXh3cml0ZShmZCwgc3RhY2tibG9jaygpLCBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCkpOworfQorCisKKy8qCisgKiBQZXJmb3JtIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gb24gYW4gYXJndW1lbnQsCisgKiBwbGFjaW5nIHRoZSByZXN1bHRpbmcgbGlzdCBvZiBhcmd1bWVudHMgaW4gYXJnbGlzdC4gIElmIEVYUF9GVUxMIGlzIHRydWUsCisgKiBwZXJmb3JtIHNwbGl0dGluZyBhbmQgZmlsZSBuYW1lIGV4cGFuc2lvbi4gIFdoZW4gYXJnbGlzdCBpcyBOVUxMLCBwZXJmb3JtCisgKiBoZXJlIGRvY3VtZW50IGV4cGFuc2lvbi4KKyAqLworCit2b2lkCitleHBhbmRhcmcodW5pb24gbm9kZSAqYXJnLCBzdHJ1Y3QgYXJnbGlzdCAqYXJnbGlzdCwgaW50IGZsYWcpCit7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCWNoYXIgKnA7CisKKwlhcmdiYWNrcSA9IGFyZy0+bmFyZy5iYWNrcXVvdGU7CisJU1RBUlRTVEFDS1NUUihleHBkZXN0KTsKKwlpZnNmaXJzdC5uZXh0ID0gTlVMTDsKKwlpZnNsYXN0cCA9IE5VTEw7CisJYXJnc3RyKGFyZy0+bmFyZy50ZXh0LCBmbGFnKTsKKwlwID0gX1NUUFVUQygnXDAnLCBleHBkZXN0KTsKKwlleHBkZXN0ID0gcCAtIDE7CisJaWYgKGFyZ2xpc3QgPT0gTlVMTCkgeworCQlyZXR1cm47CQkJLyogaGVyZSBkb2N1bWVudCBleHBhbmRlZCAqLworCX0KKwlwID0gZ3JhYnN0YWNrc3RyKHApOworCWV4cGFyZy5sYXN0cCA9ICZleHBhcmcubGlzdDsKKwkvKgorCSAqIFRPRE8gLSBFWFBfUkVESVIKKwkgKi8KKwlpZiAoZmxhZyAmIEVYUF9GVUxMKSB7CisJCWlmc2JyZWFrdXAocCwgJmV4cGFyZyk7CisJCSpleHBhcmcubGFzdHAgPSBOVUxMOworCQlleHBhcmcubGFzdHAgPSAmZXhwYXJnLmxpc3Q7CisJCWV4cGFuZG1ldGEoZXhwYXJnLmxpc3QsIGZsYWcpOworCX0gZWxzZSB7CisJCWlmIChmbGFnICYgRVhQX1JFRElSKSAvKlhYWCAtIGZvciBub3csIGp1c3QgcmVtb3ZlIGVzY2FwZXMgKi8KKwkJCXJtZXNjYXBlcyhwKTsKKwkJc3AgPSAoc3RydWN0IHN0cmxpc3QgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IHN0cmxpc3QpKTsKKwkJc3AtPnRleHQgPSBwOworCQkqZXhwYXJnLmxhc3RwID0gc3A7CisJCWV4cGFyZy5sYXN0cCA9ICZzcC0+bmV4dDsKKwl9CisJaWYgKGlmc2ZpcnN0Lm5leHQpCisJCWlmc2ZyZWUoKTsKKwkqZXhwYXJnLmxhc3RwID0gTlVMTDsKKwlpZiAoZXhwYXJnLmxpc3QpIHsKKwkJKmFyZ2xpc3QtPmxhc3RwID0gZXhwYXJnLmxpc3Q7CisJCWFyZ2xpc3QtPmxhc3RwID0gZXhwYXJnLmxhc3RwOworCX0KK30KKworCisKKy8qCisgKiBQZXJmb3JtIHZhcmlhYmxlIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbi4gIElmIEVYUF9GVUxMIGlzIHNldCwgb3V0cHV0IENUTEVTQworICogY2hhcmFjdGVycyB0byBhbGxvdyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAgT3RoZXJ3aXNlIHRyZWF0CisgKiAkQCBsaWtlICQqIHNpbmNlIG5vIHNwbGl0dGluZyB3aWxsIGJlIHBlcmZvcm1lZC4KKyAqLworCitTVEFUSUMgdm9pZAorYXJnc3RyKGNoYXIgKnAsIGludCBmbGFnKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHNwY2xjaGFyc1tdID0geworCQknPScsCisJCSc6JywKKwkJQ1RMUVVPVEVNQVJLLAorCQlDVExFTkRWQVIsCisJCUNUTEVTQywKKwkJQ1RMVkFSLAorCQlDVExCQUNLUSwKKwkJQ1RMQkFDS1EgfCBDVExRVU9URSwKKwkJQ1RMRU5EQVJJLAorCQkwCisJfTsKKwljb25zdCBjaGFyICpyZWplY3QgPSBzcGNsY2hhcnM7CisJaW50IGM7CisJaW50IHF1b3RlcyA9IGZsYWcgJiBRVU9URVNfRVNDOworCWludCBicmVha2FsbCA9IGZsYWcgJiBFWFBfV09SRDsKKwlpbnQgaW5xdW90ZXM7CisJc2l6ZV90IGxlbmd0aDsKKwlpbnQgc3RhcnRsb2M7CisKKwlpZiAoIShmbGFnICYgRVhQX1ZBUlRJTERFKSkgeworCQlyZWplY3QgKz0gMjsKKwl9IGVsc2UgaWYgKGZsYWcgJiBFWFBfVkFSVElMREUyKSB7CisJCXJlamVjdCsrOworCX0KKwlpbnF1b3RlcyA9IDA7CisJbGVuZ3RoID0gMDsKKwlpZiAoZmxhZyAmIEVYUF9USUxERSkgeworCQljaGFyICpxOworCisJCWZsYWcgJj0gfkVYUF9USUxERTsKK3RpbGRlOgorCQlxID0gcDsKKwkJaWYgKCpxID09IChjaGFyKUNUTEVTQyAmJiAoZmxhZyAmIEVYUF9RV09SRCkpCisJCQlxKys7CisJCWlmICgqcSA9PSAnficpCisJCQlwID0gZXhwdGlsZGUocCwgcSwgZmxhZyk7CisJfQorc3RhcnQ6CisJc3RhcnRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJZm9yICg7OykgeworCQlsZW5ndGggKz0gc3RyY3NwbihwICsgbGVuZ3RoLCByZWplY3QpOworCQljID0gKHNpZ25lZCBjaGFyKXBbbGVuZ3RoXTsKKwkJaWYgKGMgJiYgKCEoYyAmIDB4ODApIHx8IGMgPT0gQ1RMRU5EQVJJKSkgeworCQkJLyogYyA9PSAnPScgfHwgYyA9PSAnOicgfHwgYyA9PSBDVExFTkRBUkkgKi8KKwkJCWxlbmd0aCsrOworCQl9CisJCWlmIChsZW5ndGggPiAwKSB7CisJCQlpbnQgbmV3bG9jOworCQkJZXhwZGVzdCA9IHN0bnB1dHMocCwgbGVuZ3RoLCBleHBkZXN0KTsKKwkJCW5ld2xvYyA9IGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwkJCWlmIChicmVha2FsbCAmJiAhaW5xdW90ZXMgJiYgbmV3bG9jID4gc3RhcnRsb2MpIHsKKwkJCQlyZWNvcmRyZWdpb24oc3RhcnRsb2MsIG5ld2xvYywgMCk7CisJCQl9CisJCQlzdGFydGxvYyA9IG5ld2xvYzsKKwkJfQorCQlwICs9IGxlbmd0aCArIDE7CisJCWxlbmd0aCA9IDA7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1wwJzoKKwkJCWdvdG8gYnJlYWtsb29wOworCQljYXNlICc9JzoKKwkJCWlmIChmbGFnICYgRVhQX1ZBUlRJTERFMikgeworCQkJCXAtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZsYWcgfD0gRVhQX1ZBUlRJTERFMjsKKwkJCXJlamVjdCsrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJzonOgorCQkJLyoKKwkJCSAqIHNvcnQgb2YgYSBoYWNrIC0gZXhwYW5kIHRpbGRlcyBpbiB2YXJpYWJsZQorCQkJICogYXNzaWdubWVudHMgKGFmdGVyIHRoZSBmaXJzdCAnPScgYW5kIGFmdGVyICc6J3MpLgorCQkJICovCisJCQlpZiAoKi0tcCA9PSAnficpIHsKKwkJCQlnb3RvIHRpbGRlOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSBDVExFTkRWQVI6IC8qID8/PyAqLworCQkJZ290byBicmVha2xvb3A7CisJCWNhc2UgQ1RMUVVPVEVNQVJLOgorCQkJLyogIiRAIiBzeW50YXggYWRoZXJlbmNlIGhhY2sgKi8KKwkJCWlmICgKKwkJCQkhaW5xdW90ZXMgJiYKKwkJCQkhbWVtY21wKHAsIGRvbGF0c3RyLCBET0xBVFNUUkxFTikgJiYKKwkJCQkocFs0XSA9PSAoY2hhcilDVExRVU9URU1BUksgfHwgKAorCQkJCQlwWzRdID09IChjaGFyKUNUTEVORFZBUiAmJgorCQkJCQlwWzVdID09IChjaGFyKUNUTFFVT1RFTUFSSworCQkJCSkpCisJCQkpIHsKKwkJCQlwID0gZXZhbHZhcihwICsgMSwgZmxhZykgKyAxOworCQkJCWdvdG8gc3RhcnQ7CisJCQl9CisJCQlpbnF1b3RlcyA9ICFpbnF1b3RlczsKK2FkZHF1b3RlOgorCQkJaWYgKHF1b3RlcykgeworCQkJCXAtLTsKKwkJCQlsZW5ndGgrKzsKKwkJCQlzdGFydGxvYysrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ1RMRVNDOgorCQkJc3RhcnRsb2MrKzsKKwkJCWxlbmd0aCsrOworCQkJZ290byBhZGRxdW90ZTsKKwkJY2FzZSBDVExWQVI6CisJCQlwID0gZXZhbHZhcihwLCBmbGFnKTsKKwkJCWdvdG8gc3RhcnQ7CisJCWNhc2UgQ1RMQkFDS1E6CisJCQljID0gMDsKKwkJY2FzZSBDVExCQUNLUXxDVExRVU9URToKKwkJCWV4cGJhY2txKGFyZ2JhY2txLT5uLCBjLCBxdW90ZXMpOworCQkJYXJnYmFja3EgPSBhcmdiYWNrcS0+bmV4dDsKKwkJCWdvdG8gc3RhcnQ7CisJCWNhc2UgQ1RMRU5EQVJJOgorCQkJcC0tOworCQkJZXhwYXJpKHF1b3Rlcyk7CisJCQlnb3RvIHN0YXJ0OworCQl9CisJfQorYnJlYWtsb29wOgorCTsKK30KKworU1RBVElDIGNoYXIgKgorZXhwdGlsZGUoY2hhciAqc3RhcnRwLCBjaGFyICpwLCBpbnQgZmxhZykKK3sKKwlzaWduZWQgY2hhciBjOworCWNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqaG9tZTsKKwlpbnQgcXVvdGVzID0gZmxhZyAmIFFVT1RFU19FU0M7CisJaW50IHN0YXJ0bG9jOworCisJbmFtZSA9IHAgKyAxOworCisJd2hpbGUgKChjID0gKisrcCkgIT0gJ1wwJykgeworCQlzd2l0Y2goYykgeworCQljYXNlIENUTEVTQzoKKwkJCXJldHVybiAoc3RhcnRwKTsKKwkJY2FzZSBDVExRVU9URU1BUks6CisJCQlyZXR1cm4gKHN0YXJ0cCk7CisJCWNhc2UgJzonOgorCQkJaWYgKGZsYWcgJiBFWFBfVkFSVElMREUpCisJCQkJZ290byBkb25lOworCQkJYnJlYWs7CisJCWNhc2UgJy8nOgorCQljYXNlIENUTEVORFZBUjoKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KK2RvbmU6CisJKnAgPSAnXDAnOworCWlmICgqbmFtZSA9PSAnXDAnKSB7CisJCWhvbWUgPSBsb29rdXB2YXIoaG9tZXN0cik7CisJfSBlbHNlIHsKKwkJaG9tZSA9IGdldHB3aG9tZShuYW1lKTsKKwl9CisJaWYgKCFob21lIHx8ICEqaG9tZSkKKwkJZ290byBsb3NlOworCSpwID0gYzsKKwlzdGFydGxvYyA9IGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlzdHJ0b2Rlc3QoaG9tZSwgU1FTWU5UQVgsIHF1b3Rlcyk7CisJcmVjb3JkcmVnaW9uKHN0YXJ0bG9jLCBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCksIDApOworCXJldHVybiAocCk7Citsb3NlOgorCSpwID0gYzsKKwlyZXR1cm4gKHN0YXJ0cCk7Cit9CisKKworU1RBVElDIHZvaWQKK3JlbW92ZXJlY29yZHJlZ2lvbnMoaW50IGVuZG9mZikKK3sKKwlpZiAoaWZzbGFzdHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGlmc2ZpcnN0LmVuZG9mZiA+IGVuZG9mZikgeworCQl3aGlsZSAoaWZzZmlyc3QubmV4dCAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCQkJSU5UT0ZGOworCQkJaWZzcCA9IGlmc2ZpcnN0Lm5leHQtPm5leHQ7CisJCQlja2ZyZWUoaWZzZmlyc3QubmV4dCk7CisJCQlpZnNmaXJzdC5uZXh0ID0gaWZzcDsKKwkJCUlOVE9OOworCQl9CisJCWlmIChpZnNmaXJzdC5iZWdvZmYgPiBlbmRvZmYpCisJCQlpZnNsYXN0cCA9IE5VTEw7CisJCWVsc2UgeworCQkJaWZzbGFzdHAgPSAmaWZzZmlyc3Q7CisJCQlpZnNmaXJzdC5lbmRvZmYgPSBlbmRvZmY7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmc2xhc3RwID0gJmlmc2ZpcnN0OworCXdoaWxlIChpZnNsYXN0cC0+bmV4dCAmJiBpZnNsYXN0cC0+bmV4dC0+YmVnb2ZmIDwgZW5kb2ZmKQorCQlpZnNsYXN0cD1pZnNsYXN0cC0+bmV4dDsKKwl3aGlsZSAoaWZzbGFzdHAtPm5leHQgIT0gTlVMTCkgeworCQlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCQlJTlRPRkY7CisJCWlmc3AgPSBpZnNsYXN0cC0+bmV4dC0+bmV4dDsKKwkJY2tmcmVlKGlmc2xhc3RwLT5uZXh0KTsKKwkJaWZzbGFzdHAtPm5leHQgPSBpZnNwOworCQlJTlRPTjsKKwl9CisJaWYgKGlmc2xhc3RwLT5lbmRvZmYgPiBlbmRvZmYpCisJCWlmc2xhc3RwLT5lbmRvZmYgPSBlbmRvZmY7Cit9CisKKworLyoKKyAqIEV4cGFuZCBhcml0aG1ldGljIGV4cHJlc3Npb24uICBCYWNrdXAgdG8gc3RhcnQgb2YgZXhwcmVzc2lvbiwKKyAqIGV2YWx1YXRlLCBwbGFjZSByZXN1bHQgaW4gKGJhY2tlZCB1cCkgcmVzdWx0LCBhZGp1c3Qgc3RyaW5nIHBvc2l0aW9uLgorICovCit2b2lkCitleHBhcmkoaW50IHF1b3RlcykKK3sKKwljaGFyICpwLCAqc3RhcnQ7CisJaW50IGJlZ29mZjsKKwlpbnQgZmxhZzsKKwlpbnQgbGVuOworCisJLyoJaWZzZnJlZSgpOyAqLworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgaXMgc2xpZ2h0bHkgb3Zlci1jb21wbGljYXRlZCBmb3IKKwkgKiBlZmZpY2llbmN5LiAgTmV4dCB3ZSBzY2FuIGJhY2t3YXJkcyBsb29raW5nIGZvciB0aGUKKwkgKiBzdGFydCBvZiBhcml0aG1ldGljLgorCSAqLworCXN0YXJ0ID0gc3RhY2tibG9jaygpOworCXAgPSBleHBkZXN0IC0gMTsKKwkqcCA9ICdcMCc7CisJcC0tOworCWRvIHsKKwkJaW50IGVzYzsKKworCQl3aGlsZSAoKnAgIT0gKGNoYXIpQ1RMQVJJKSB7CisJCQlwLS07CisjaWZkZWYgREVCVUcKKwkJCWlmIChwIDwgc3RhcnQpIHsKKwkJCQlzaF9lcnJvcigibWlzc2luZyBDVExBUkkgKHNob3VsZG4ndCBoYXBwZW4pIik7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWVzYyA9IGVzY2xlbihzdGFydCwgcCk7CisJCWlmICghKGVzYyAlIDIpKSB7CisJCQlicmVhazsKKwkJfQorCisJCXAgLT0gZXNjICsgMTsKKwl9IHdoaWxlICgxKTsKKworCWJlZ29mZiA9IHAgLSBzdGFydDsKKworCXJlbW92ZXJlY29yZHJlZ2lvbnMoYmVnb2ZmKTsKKworCWZsYWcgPSBwWzFdOworCisJZXhwZGVzdCA9IHA7CisKKwlpZiAocXVvdGVzKQorCQlybWVzY2FwZXMocCArIDIpOworCisJbGVuID0gY3Z0bnVtKGFyaXRoKHAgKyAyKSk7CisKKwlpZiAoZmxhZyAhPSAnIicpCisJCXJlY29yZHJlZ2lvbihiZWdvZmYsIGJlZ29mZiArIGxlbiwgMCk7Cit9CisKKworLyoKKyAqIEV4cGFuZCBzdHVmZiBpbiBiYWNrd2FyZHMgcXVvdGVzLgorICovCisKK1NUQVRJQyB2b2lkCitleHBiYWNrcSh1bmlvbiBub2RlICpjbWQsIGludCBxdW90ZWQsIGludCBxdW90ZXMpCit7CisJc3RydWN0IGJhY2tjbWQgaW47CisJaW50IGk7CisJY2hhciBidWZbMTI4XTsKKwljaGFyICpwOworCWNoYXIgKmRlc3Q7CisJaW50IHN0YXJ0bG9jOworCWNoYXIgY29uc3QgKnN5bnRheCA9IHF1b3RlZD8gRFFTWU5UQVggOiBCQVNFU1lOVEFYOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwlJTlRPRkY7CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJZGVzdCA9IGV4cGRlc3Q7CisJc3RhcnRsb2MgPSBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJZ3JhYnN0YWNrc3RyKGRlc3QpOworCWV2YWxiYWNrY21kKGNtZCwgKHN0cnVjdCBiYWNrY21kICopICZpbik7CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisKKwlwID0gaW4uYnVmOworCWkgPSBpbi5ubGVmdDsKKwlpZiAoaSA9PSAwKQorCQlnb3RvIHJlYWQ7CisJZm9yICg7OykgeworCQltZW10b2Rlc3QocCwgaSwgc3ludGF4LCBxdW90ZXMpOworcmVhZDoKKwkJaWYgKGluLmZkIDwgMCkKKwkJCWJyZWFrOworCQlkbyB7CisJCQlpID0gcmVhZChpbi5mZCwgYnVmLCBzaXplb2YgYnVmKTsKKwkJfSB3aGlsZSAoaSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCQlUUkFDRSgoImV4cGJhY2txOiByZWFkIHJldHVybnMgJWRcbiIsIGkpKTsKKwkJaWYgKGkgPD0gMCkKKwkJCWJyZWFrOworCQlwID0gYnVmOworCX0KKworCWlmIChpbi5idWYpCisJCWNrZnJlZShpbi5idWYpOworCWlmIChpbi5mZCA+PSAwKSB7CisJCWNsb3NlKGluLmZkKTsKKwkJYmFja19leGl0c3RhdHVzID0gd2FpdGZvcmpvYihpbi5qcCk7CisJfQorCUlOVE9OOworCisJLyogRWF0IGFsbCB0cmFpbGluZyBuZXdsaW5lcyAqLworCWRlc3QgPSBleHBkZXN0OworCWZvciAoOyBkZXN0ID4gKGNoYXIgKilzdGFja2Jsb2NrKCkgJiYgZGVzdFstMV0gPT0gJ1xuJzspCisJCVNUVU5QVVRDKGRlc3QpOworCWV4cGRlc3QgPSBkZXN0OworCisJaWYgKHF1b3RlZCA9PSAwKQorCQlyZWNvcmRyZWdpb24oc3RhcnRsb2MsIGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSwgMCk7CisJVFJBQ0UoKCJldmFsYmFja3E6IHNpemU9JWQ6IFwiJS4qc1wiXG4iLAorCQkoZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpKSAtIHN0YXJ0bG9jLAorCQkoZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpKSAtIHN0YXJ0bG9jLAorCQlzdGFja2Jsb2NrKCkgKyBzdGFydGxvYykpOworfQorCisKK1NUQVRJQyBjaGFyICoKK3NjYW5sZWZ0KAorCWNoYXIgKnN0YXJ0cCwgY2hhciAqcm1lc2MsIGNoYXIgKnJtZXNjZW5kLCBjaGFyICpzdHIsIGludCBxdW90ZXMsCisJaW50IHplcm8KKykgeworCWNoYXIgKmxvYzsKKwljaGFyICpsb2MyOworCWNoYXIgYzsKKworCWxvYyA9IHN0YXJ0cDsKKwlsb2MyID0gcm1lc2M7CisJZG8geworCQlpbnQgbWF0Y2g7CisJCWNvbnN0IGNoYXIgKnMgPSBsb2MyOworCQljID0gKmxvYzI7CisJCWlmICh6ZXJvKSB7CisJCQkqbG9jMiA9ICdcMCc7CisJCQlzID0gcm1lc2M7CisJCX0KKwkJbWF0Y2ggPSBwbWF0Y2goc3RyLCBzKTsKKwkJKmxvYzIgPSBjOworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbG9jOworCQlpZiAocXVvdGVzICYmICpsb2MgPT0gKGNoYXIpQ1RMRVNDKQorCQkJbG9jKys7CisJCWxvYysrOworCQlsb2MyKys7CisJfSB3aGlsZSAoYyk7CisJcmV0dXJuIDA7Cit9CisKKworU1RBVElDIGNoYXIgKgorc2NhbnJpZ2h0KAorCWNoYXIgKnN0YXJ0cCwgY2hhciAqcm1lc2MsIGNoYXIgKnJtZXNjZW5kLCBjaGFyICpzdHIsIGludCBxdW90ZXMsCisJaW50IHplcm8KKykgeworCWludCBlc2MgPSAwOworCWNoYXIgKmxvYzsKKwljaGFyICpsb2MyOworCisJZm9yIChsb2MgPSBzdHIgLSAxLCBsb2MyID0gcm1lc2NlbmQ7IGxvYyA+PSBzdGFydHA7IGxvYzItLSkgeworCQlpbnQgbWF0Y2g7CisJCWNoYXIgYyA9ICpsb2MyOworCQljb25zdCBjaGFyICpzID0gbG9jMjsKKwkJaWYgKHplcm8pIHsKKwkJCSpsb2MyID0gJ1wwJzsKKwkJCXMgPSBybWVzYzsKKwkJfQorCQltYXRjaCA9IHBtYXRjaChzdHIsIHMpOworCQkqbG9jMiA9IGM7CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBsb2M7CisJCWxvYy0tOworCQlpZiAocXVvdGVzKSB7CisJCQlpZiAoLS1lc2MgPCAwKSB7CisJCQkJZXNjID0gZXNjbGVuKHN0YXJ0cCwgbG9jKTsKKwkJCX0KKwkJCWlmIChlc2MgJSAyKSB7CisJCQkJZXNjLS07CisJCQkJbG9jLS07CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBjb25zdCBjaGFyICoKK3N1YmV2YWx2YXIoY2hhciAqcCwgY2hhciAqc3RyLCBpbnQgc3RybG9jLCBpbnQgc3VidHlwZSwgaW50IHN0YXJ0bG9jLCBpbnQgdmFyZmxhZ3MsIGludCBxdW90ZXMpCit7CisJY2hhciAqc3RhcnRwOworCWNoYXIgKmxvYzsKKwlpbnQgc2F2ZWhlcmVmZCA9IGhlcmVmZDsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKnNhdmVhcmdiYWNrcSA9IGFyZ2JhY2txOworCWludCBhbW91bnQ7CisJY2hhciAqcm1lc2MsICpybWVzY2VuZDsKKwlpbnQgemVybzsKKwljaGFyICooKnNjYW4pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICwgaW50KTsKKworCWhlcmVmZCA9IC0xOworCWFyZ3N0cihwLCBzdWJ0eXBlICE9IFZTQVNTSUdOICYmIHN1YnR5cGUgIT0gVlNRVUVTVElPTiA/IEVYUF9DQVNFIDogMCk7CisJU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCWhlcmVmZCA9IHNhdmVoZXJlZmQ7CisJYXJnYmFja3EgPSBzYXZlYXJnYmFja3E7CisJc3RhcnRwID0gc3RhY2tibG9jaygpICsgc3RhcnRsb2M7CisKKwlzd2l0Y2ggKHN1YnR5cGUpIHsKKwljYXNlIFZTQVNTSUdOOgorCQlzZXR2YXIoc3RyLCBzdGFydHAsIDApOworCQlhbW91bnQgPSBzdGFydHAgLSBleHBkZXN0OworCQlTVEFESlVTVChhbW91bnQsIGV4cGRlc3QpOworCQlyZXR1cm4gc3RhcnRwOworCisJY2FzZSBWU1FVRVNUSU9OOgorCQl2YXJ1bnNldChwLCBzdHIsIHN0YXJ0cCwgdmFyZmxhZ3MpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJc3VidHlwZSAtPSBWU1RSSU1SSUdIVDsKKyNpZmRlZiBERUJVRworCWlmIChzdWJ0eXBlIDwgMCB8fCBzdWJ0eXBlID4gMykKKwkJYWJvcnQoKTsKKyNlbmRpZgorCisJcm1lc2MgPSBzdGFydHA7CisJcm1lc2NlbmQgPSBzdGFja2Jsb2NrKCkgKyBzdHJsb2M7CisJaWYgKHF1b3RlcykgeworCQlybWVzYyA9IF9ybWVzY2FwZXMoc3RhcnRwLCBSTUVTQ0FQRV9BTExPQyB8IFJNRVNDQVBFX0dST1cpOworCQlpZiAocm1lc2MgIT0gc3RhcnRwKSB7CisJCQlybWVzY2VuZCA9IGV4cGRlc3Q7CisJCQlzdGFydHAgPSBzdGFja2Jsb2NrKCkgKyBzdGFydGxvYzsKKwkJfQorCX0KKwlybWVzY2VuZC0tOworCXN0ciA9IHN0YWNrYmxvY2soKSArIHN0cmxvYzsKKwlwcmVnbG9iKHN0ciwgdmFyZmxhZ3MgJiBWU1FVT1RFLCAwKTsKKworCS8qIHplcm8gPSBzdWJ0eXBlID09IFZTVFJJTUxFRlQgfHwgc3VidHlwZSA9PSBWU1RSSU1MRUZUTUFYICovCisJemVybyA9IHN1YnR5cGUgPj4gMTsKKwkvKiBWU1RSSU1MRUZUL1ZTVFJJTVJJR0hUTUFYIC0+IHNjYW5sZWZ0ICovCisJc2NhbiA9IChzdWJ0eXBlICYgMSkgXiB6ZXJvID8gc2NhbmxlZnQgOiBzY2FucmlnaHQ7CisKKwlsb2MgPSBzY2FuKHN0YXJ0cCwgcm1lc2MsIHJtZXNjZW5kLCBzdHIsIHF1b3RlcywgemVybyk7CisJaWYgKGxvYykgeworCQlpZiAoemVybykgeworCQkJbWVtbW92ZShzdGFydHAsIGxvYywgc3RyIC0gbG9jKTsKKwkJCWxvYyA9IHN0YXJ0cCArIChzdHIgLSBsb2MpIC0gMTsKKwkJfQorCQkqbG9jID0gJ1wwJzsKKwkJYW1vdW50ID0gbG9jIC0gZXhwZGVzdDsKKwkJU1RBREpVU1QoYW1vdW50LCBleHBkZXN0KTsKKwl9CisJcmV0dXJuIGxvYzsKK30KKworCisvKgorICogRXhwYW5kIGEgdmFyaWFibGUsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUKKyAqIGlucHV0IHN0cmluZy4KKyAqLworU1RBVElDIGNoYXIgKgorZXZhbHZhcihjaGFyICpwLCBpbnQgZmxhZykKK3sKKwlpbnQgc3VidHlwZTsKKwlpbnQgdmFyZmxhZ3M7CisJY2hhciAqdmFyOworCWludCBwYXRsb2M7CisJaW50IGM7CisJaW50IHN0YXJ0bG9jOworCXNzaXplX3QgdmFybGVuOworCWludCBlYXN5OworCWludCBxdW90ZXM7CisJaW50IHF1b3RlZDsKKworCXF1b3RlcyA9IGZsYWcgJiBRVU9URVNfRVNDOworCXZhcmZsYWdzID0gKnArKzsKKwlzdWJ0eXBlID0gdmFyZmxhZ3MgJiBWU1RZUEU7CisJcXVvdGVkID0gdmFyZmxhZ3MgJiBWU1FVT1RFOworCXZhciA9IHA7CisJZWFzeSA9ICghcXVvdGVkIHx8ICgqdmFyID09ICdAJyAmJiBzaGVsbHBhcmFtLm5wYXJhbSkpOworCXN0YXJ0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCXAgPSBzdHJjaHIocCwgJz0nKSArIDE7CisKK2FnYWluOgorCXZhcmxlbiA9IHZhcnZhbHVlKHZhciwgdmFyZmxhZ3MsIGZsYWcpOworCWlmICh2YXJmbGFncyAmIFZTTlVMKQorCQl2YXJsZW4tLTsKKworCWlmIChzdWJ0eXBlID09IFZTUExVUykgeworCQl2YXJsZW4gPSAtMSAtIHZhcmxlbjsKKwkJZ290byB2c3BsdXM7CisJfQorCisJaWYgKHN1YnR5cGUgPT0gVlNNSU5VUykgewordnNwbHVzOgorCQlpZiAodmFybGVuIDwgMCkgeworCQkJYXJnc3RyKAorCQkJCXAsIGZsYWcgfCBFWFBfVElMREUgfAorCQkJCQkocXVvdGVkID8gIEVYUF9RV09SRCA6IEVYUF9XT1JEKQorCQkJKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCWlmIChlYXN5KQorCQkJZ290byByZWNvcmQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChzdWJ0eXBlID09IFZTQVNTSUdOIHx8IHN1YnR5cGUgPT0gVlNRVUVTVElPTikgeworCQlpZiAodmFybGVuIDwgMCkgeworCQkJaWYgKHN1YmV2YWx2YXIocCwgdmFyLCAwLCBzdWJ0eXBlLCBzdGFydGxvYywKKwkJCQkgICAgICAgdmFyZmxhZ3MsIDApKSB7CisJCQkJdmFyZmxhZ3MgJj0gflZTTlVMOworCQkJCS8qCisJCQkJICogUmVtb3ZlIGFueSByZWNvcmRlZCByZWdpb25zIGJleW9uZAorCQkJCSAqIHN0YXJ0IG9mIHZhcmlhYmxlCisJCQkJICovCisJCQkJcmVtb3ZlcmVjb3JkcmVnaW9ucyhzdGFydGxvYyk7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCWdvdG8gZW5kOworCQl9CisJCWlmIChlYXN5KQorCQkJZ290byByZWNvcmQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmICh2YXJsZW4gPCAwICYmIHVmbGFnKQorCQl2YXJ1bnNldChwLCB2YXIsIDAsIDApOworCisJaWYgKHN1YnR5cGUgPT0gVlNMRU5HVEgpIHsKKwkJY3Z0bnVtKHZhcmxlbiA+IDAgPyB2YXJsZW4gOiAwKTsKKwkJZ290byByZWNvcmQ7CisJfQorCisJaWYgKHN1YnR5cGUgPT0gVlNOT1JNQUwpIHsKKwkJaWYgKCFlYXN5KQorCQkJZ290byBlbmQ7CityZWNvcmQ6CisJCXJlY29yZHJlZ2lvbihzdGFydGxvYywgZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpLCBxdW90ZWQpOworCQlnb3RvIGVuZDsKKwl9CisKKyNpZmRlZiBERUJVRworCXN3aXRjaCAoc3VidHlwZSkgeworCWNhc2UgVlNUUklNTEVGVDoKKwljYXNlIFZTVFJJTUxFRlRNQVg6CisJY2FzZSBWU1RSSU1SSUdIVDoKKwljYXNlIFZTVFJJTVJJR0hUTUFYOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKyNlbmRpZgorCisJaWYgKHZhcmxlbiA+PSAwKSB7CisJCS8qCisJCSAqIFRlcm1pbmF0ZSB0aGUgc3RyaW5nIGFuZCBzdGFydCByZWNvcmRpbmcgdGhlIHBhdHRlcm4KKwkJICogcmlnaHQgYWZ0ZXIgaXQKKwkJICovCisJCVNUUFVUQygnXDAnLCBleHBkZXN0KTsKKwkJcGF0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCQlpZiAoc3ViZXZhbHZhcihwLCBOVUxMLCBwYXRsb2MsIHN1YnR5cGUsCisJCQkgICAgICAgc3RhcnRsb2MsIHZhcmZsYWdzLCBxdW90ZXMpID09IDApIHsKKwkJCWludCBhbW91bnQgPSBleHBkZXN0IC0gKAorCQkJCShjaGFyICopc3RhY2tibG9jaygpICsgcGF0bG9jIC0gMQorCQkJKTsKKwkJCVNUQURKVVNUKC1hbW91bnQsIGV4cGRlc3QpOworCQl9CisJCS8qIFJlbW92ZSBhbnkgcmVjb3JkZWQgcmVnaW9ucyBiZXlvbmQgc3RhcnQgb2YgdmFyaWFibGUgKi8KKwkJcmVtb3ZlcmVjb3JkcmVnaW9ucyhzdGFydGxvYyk7CisJCWdvdG8gcmVjb3JkOworCX0KKworZW5kOgorCWlmIChzdWJ0eXBlICE9IFZTTk9STUFMKSB7CS8qIHNraXAgdG8gZW5kIG9mIGFsdGVybmF0aXZlICovCisJCWludCBuZXN0aW5nID0gMTsKKwkJZm9yICg7OykgeworCQkJaWYgKChjID0gKHNpZ25lZCBjaGFyKSpwKyspID09IENUTEVTQykKKwkJCQlwKys7CisJCQllbHNlIGlmIChjID09IENUTEJBQ0tRIHx8IGMgPT0gKENUTEJBQ0tRfENUTFFVT1RFKSkgeworCQkJCWlmICh2YXJsZW4gPj0gMCkKKwkJCQkJYXJnYmFja3EgPSBhcmdiYWNrcS0+bmV4dDsKKwkJCX0gZWxzZSBpZiAoYyA9PSBDVExWQVIpIHsKKwkJCQlpZiAoKCpwKysgJiBWU1RZUEUpICE9IFZTTk9STUFMKQorCQkJCQluZXN0aW5nKys7CisJCQl9IGVsc2UgaWYgKGMgPT0gQ1RMRU5EVkFSKSB7CisJCQkJaWYgKC0tbmVzdGluZyA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcDsKK30KKworCisvKgorICogUHV0IGEgc3RyaW5nIG9uIHRoZSBzdGFjay4KKyAqLworCitTVEFUSUMgdm9pZAorbWVtdG9kZXN0KGNvbnN0IGNoYXIgKnAsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnN5bnRheCwgaW50IHF1b3RlcykgeworCWNoYXIgKnE7CisKKwlpZiAodW5saWtlbHkoIWxlbikpCisJCXJldHVybjsKKworCXEgPSBtYWtlc3Ryc3BhY2UobGVuICogMiwgZXhwZGVzdCk7CisKKwlkbyB7CisJCWludCBjID0gKHNpZ25lZCBjaGFyKSpwKys7CisJCWlmIChjKSB7CisJCQlpZiAoKHF1b3RlcyAmIFFVT1RFU19FU0MpICYmCisJCQkgICAgKHN5bnRheFtjXSA9PSBDQ1RMIHx8IHN5bnRheFtjXSA9PSBDQkFDSykpCisJCQkJVVNUUFVUQyhDVExFU0MsIHEpOworCQl9IGVsc2UgaWYgKCEocXVvdGVzICYgUVVPVEVTX0tFRVBOVUwpKQorCQkJY29udGludWU7CisJCVVTVFBVVEMoYywgcSk7CisJfSB3aGlsZSAoLS1sZW4pOworCisJZXhwZGVzdCA9IHE7Cit9CisKKworU1RBVElDIHNpemVfdAorc3RydG9kZXN0KHAsIHN5bnRheCwgcXVvdGVzKQorCWNvbnN0IGNoYXIgKnA7CisJY29uc3QgY2hhciAqc3ludGF4OworCWludCBxdW90ZXM7Cit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihwKTsKKwltZW10b2Rlc3QocCwgbGVuLCBzeW50YXgsIHF1b3Rlcyk7CisJcmV0dXJuIGxlbjsKK30KKworCisKKy8qCisgKiBBZGQgdGhlIHZhbHVlIG9mIGEgc3BlY2lhbGl6ZWQgdmFyaWFibGUgdG8gdGhlIHN0YWNrIHN0cmluZy4KKyAqLworCitTVEFUSUMgc3NpemVfdAordmFydmFsdWUoY2hhciAqbmFtZSwgaW50IHZhcmZsYWdzLCBpbnQgZmxhZ3MpCit7CisJaW50IG51bTsKKwljaGFyICpwOworCWludCBpOworCWludCBzZXA7CisJY2hhciBzZXBjOworCWNoYXIgKiphcDsKKwljaGFyIGNvbnN0ICpzeW50YXg7CisJaW50IHF1b3RlZCA9IHZhcmZsYWdzICYgVlNRVU9URTsKKwlpbnQgc3VidHlwZSA9IHZhcmZsYWdzICYgVlNUWVBFOworCWludCBkaXNjYXJkID0gc3VidHlwZSA9PSBWU1BMVVMgfHwgc3VidHlwZSA9PSBWU0xFTkdUSDsKKwlpbnQgcXVvdGVzID0gKGRpc2NhcmQgPyAwIDogKGZsYWdzICYgUVVPVEVTX0VTQykpIHwgUVVPVEVTX0tFRVBOVUw7CisJc3NpemVfdCBsZW4gPSAwOworCisJc2VwID0gcXVvdGVkID8gKChmbGFncyAmIEVYUF9GVUxMKSA8PCBDSEFSX0JJVCkgOiAwOworCXN5bnRheCA9IHF1b3RlZCA/IERRU1lOVEFYIDogQkFTRVNZTlRBWDsKKworCXN3aXRjaCAoKm5hbWUpIHsKKwljYXNlICckJzoKKwkJbnVtID0gcm9vdHBpZDsKKwkJZ290byBudW12YXI7CisJY2FzZSAnPyc6CisJCW51bSA9IGV4aXRzdGF0dXM7CisJCWdvdG8gbnVtdmFyOworCWNhc2UgJyMnOgorCQludW0gPSBzaGVsbHBhcmFtLm5wYXJhbTsKKwkJZ290byBudW12YXI7CisJY2FzZSAnISc6CisJCW51bSA9IGJhY2tnbmRwaWQ7CisJCWlmIChudW0gPT0gMCkKKwkJCXJldHVybiAtMTsKK251bXZhcjoKKwkJbGVuID0gY3Z0bnVtKG51bSk7CisJCWJyZWFrOworCWNhc2UgJy0nOgorCQlwID0gbWFrZXN0cnNwYWNlKE5PUFRTLCBleHBkZXN0KTsKKwkJZm9yIChpID0gTk9QVFMgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKG9wdGxpc3RbaV0pIHsKKwkJCQlVU1RQVVRDKG9wdGxldHRlcnNbaV0sIHApOworCQkJCWxlbisrOworCQkJfQorCQl9CisJCWV4cGRlc3QgPSBwOworCQlicmVhazsKKwljYXNlICdAJzoKKwkJaWYgKHNlcCkKKwkJCWdvdG8gcGFyYW07CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgJyonOgorCQlzZXAgPSBpZnNzZXQoKSA/IGlmc3ZhbCgpWzBdIDogJyAnOworcGFyYW06CisJCWlmICghKGFwID0gc2hlbGxwYXJhbS5wKSkKKwkJCXJldHVybiAtMTsKKwkJc2VwYyA9IHNlcDsKKwkJd2hpbGUgKChwID0gKmFwKyspKSB7CisJCQlsZW4gKz0gc3RydG9kZXN0KHAsIHN5bnRheCwgcXVvdGVzKTsKKworCQkJaWYgKCphcCAmJiBzZXApIHsKKwkJCQlsZW4rKzsKKwkJCQltZW10b2Rlc3QoJnNlcGMsIDEsIHN5bnRheCwgcXVvdGVzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlICcwJzoKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwljYXNlICc3JzoKKwljYXNlICc4JzoKKwljYXNlICc5JzoKKwkJbnVtID0gYXRvaShuYW1lKTsKKwkJaWYgKG51bSA8IDAgfHwgbnVtID4gc2hlbGxwYXJhbS5ucGFyYW0pCisJCQlyZXR1cm4gLTE7CisJCXAgPSBudW0gPyBzaGVsbHBhcmFtLnBbbnVtIC0gMV0gOiBhcmcwOworCQlnb3RvIHZhbHVlOworCWRlZmF1bHQ6CisJCXAgPSBsb29rdXB2YXIobmFtZSk7Cit2YWx1ZToKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC0xOworCisJCWxlbiA9IHN0cnRvZGVzdChwLCBzeW50YXgsIHF1b3Rlcyk7CisJCWJyZWFrOworCX0KKworCWlmIChkaXNjYXJkKQorCQlTVEFESlVTVCgtbGVuLCBleHBkZXN0KTsKKwlyZXR1cm4gbGVuOworfQorCisKKworLyoKKyAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgdG8gc2NhbiB0aGlzIHJlZ2lvbiBvZiB0aGUKKyAqIHN0cmluZyBmb3IgSUZTIGNoYXJhY3RlcnMuCisgKi8KKworU1RBVElDIHZvaWQKK3JlY29yZHJlZ2lvbihpbnQgc3RhcnQsIGludCBlbmQsIGludCBudWxvbmx5KQoreworCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisKKwlpZiAoaWZzbGFzdHAgPT0gTlVMTCkgeworCQlpZnNwID0gJmlmc2ZpcnN0OworCX0gZWxzZSB7CisJCUlOVE9GRjsKKwkJaWZzcCA9IChzdHJ1Y3QgaWZzcmVnaW9uICopY2ttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaWZzcmVnaW9uKSk7CisJCWlmc3AtPm5leHQgPSBOVUxMOworCQlpZnNsYXN0cC0+bmV4dCA9IGlmc3A7CisJCUlOVE9OOworCX0KKwlpZnNsYXN0cCA9IGlmc3A7CisJaWZzbGFzdHAtPmJlZ29mZiA9IHN0YXJ0OworCWlmc2xhc3RwLT5lbmRvZmYgPSBlbmQ7CisJaWZzbGFzdHAtPm51bG9ubHkgPSBudWxvbmx5OworfQorCisKKworLyoKKyAqIEJyZWFrIHRoZSBhcmd1bWVudCBzdHJpbmcgaW50byBwaWVjZXMgYmFzZWQgdXBvbiBJRlMgYW5kIGFkZCB0aGUKKyAqIHN0cmluZ3MgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICBUaGUgcmVnaW9ucyBvZiB0aGUgc3RyaW5nIHRvIGJlCisgKiBzZWFyY2hlZCBmb3IgSUZTIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHN0b3JlZCBieSByZWNvcmRyZWdpb24uCisgKi8KK1NUQVRJQyB2b2lkCitpZnNicmVha3VwKGNoYXIgKnN0cmluZywgc3RydWN0IGFyZ2xpc3QgKmFyZ2xpc3QpCit7CisJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJY2hhciAqc3RhcnQ7CisJY2hhciAqcDsKKwljaGFyICpxOworCWNvbnN0IGNoYXIgKmlmcywgKnJlYWxpZnM7CisJaW50IGlmc3NwYzsKKwlpbnQgbnVsb25seTsKKworCisJc3RhcnQgPSBzdHJpbmc7CisJaWYgKGlmc2xhc3RwICE9IE5VTEwpIHsKKwkJaWZzc3BjID0gMDsKKwkJbnVsb25seSA9IDA7CisJCXJlYWxpZnMgPSBpZnNzZXQoKSA/IGlmc3ZhbCgpIDogZGVmaWZzOworCQlpZnNwID0gJmlmc2ZpcnN0OworCQlkbyB7CisJCQlwID0gc3RyaW5nICsgaWZzcC0+YmVnb2ZmOworCQkJbnVsb25seSA9IGlmc3AtPm51bG9ubHk7CisJCQlpZnMgPSBudWxvbmx5ID8gbnVsbHN0ciA6IHJlYWxpZnM7CisJCQlpZnNzcGMgPSAwOworCQkJd2hpbGUgKHAgPCBzdHJpbmcgKyBpZnNwLT5lbmRvZmYpIHsKKwkJCQlxID0gcDsKKwkJCQlpZiAoKnAgPT0gKGNoYXIpQ1RMRVNDKQorCQkJCQlwKys7CisJCQkJaWYgKHN0cmNocihpZnMsICpwKSkgeworCQkJCQlpZiAoIW51bG9ubHkpCisJCQkJCQlpZnNzcGMgPSAoc3RyY2hyKGRlZmlmcywgKnApICE9IE5VTEwpOworCQkJCQkvKiBJZ25vcmUgSUZTIHdoaXRlc3BhY2UgYXQgc3RhcnQgKi8KKwkJCQkJaWYgKHEgPT0gc3RhcnQgJiYgaWZzc3BjKSB7CisJCQkJCQlwKys7CisJCQkJCQlzdGFydCA9IHA7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkqcSA9ICdcMCc7CisJCQkJCXNwID0gKHN0cnVjdCBzdHJsaXN0ICopc3RhbGxvYyhzaXplb2YgKnNwKTsKKwkJCQkJc3AtPnRleHQgPSBzdGFydDsKKwkJCQkJKmFyZ2xpc3QtPmxhc3RwID0gc3A7CisJCQkJCWFyZ2xpc3QtPmxhc3RwID0gJnNwLT5uZXh0OworCQkJCQlwKys7CisJCQkJCWlmICghbnVsb25seSkgeworCQkJCQkJZm9yICg7OykgeworCQkJCQkJCWlmIChwID49IHN0cmluZyArIGlmc3AtPmVuZG9mZikgeworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJcSA9IHA7CisJCQkJCQkJaWYgKCpwID09IChjaGFyKUNUTEVTQykKKwkJCQkJCQkJcCsrOworCQkJCQkJCWlmIChzdHJjaHIoaWZzLCAqcCkgPT0gTlVMTCApIHsKKwkJCQkJCQkJcCA9IHE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0gZWxzZSBpZiAoc3RyY2hyKGRlZmlmcywgKnApID09IE5VTEwpIHsKKwkJCQkJCQkJaWYgKGlmc3NwYykgeworCQkJCQkJCQkJcCsrOworCQkJCQkJCQkJaWZzc3BjID0gMDsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXAgPSBxOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UKKwkJCQkJCQkJcCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXN0YXJ0ID0gcDsKKwkJCQl9IGVsc2UKKwkJCQkJcCsrOworCQkJfQorCQl9IHdoaWxlICgoaWZzcCA9IGlmc3AtPm5leHQpICE9IE5VTEwpOworCQlpZiAobnVsb25seSkKKwkJCWdvdG8gYWRkOworCX0KKworCWlmICghKnN0YXJ0KQorCQlyZXR1cm47CisKK2FkZDoKKwlzcCA9IChzdHJ1Y3Qgc3RybGlzdCAqKXN0YWxsb2Moc2l6ZW9mICpzcCk7CisJc3AtPnRleHQgPSBzdGFydDsKKwkqYXJnbGlzdC0+bGFzdHAgPSBzcDsKKwlhcmdsaXN0LT5sYXN0cCA9ICZzcC0+bmV4dDsKK30KKworU1RBVElDIHZvaWQKK2lmc2ZyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgaWZzcmVnaW9uICpwOworCisJSU5UT0ZGOworCXAgPSBpZnNmaXJzdC5uZXh0OworCWRvIHsKKwkJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKwkJaWZzcCA9IHAtPm5leHQ7CisJCWNrZnJlZShwKTsKKwkJcCA9IGlmc3A7CisJfSB3aGlsZSAocCk7CisJaWZzbGFzdHAgPSBOVUxMOworCWlmc2ZpcnN0Lm5leHQgPSBOVUxMOworCUlOVE9OOworfQorCisKKworLyoKKyAqIEV4cGFuZCBzaGVsbCBtZXRhY2hhcmFjdGVycy4gIEF0IHRoaXMgcG9pbnQsIHRoZSBvbmx5IGNvbnRyb2wgY2hhcmFjdGVycworICogc2hvdWxkIGJlIGVzY2FwZXMuICBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluIHRoZSBsaXN0IGV4cGFyZy4KKyAqLworCisjaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKSAmJiAhZGVmaW5lZChHTE9CX0JST0tFTikKK1NUQVRJQyB2b2lkCitleHBhbmRtZXRhKHN0ciwgZmxhZykKKwlzdHJ1Y3Qgc3RybGlzdCAqc3RyOworCWludCBmbGFnOworeworCS8qIFRPRE8gLSBFWFBfUkVESVIgKi8KKworCXdoaWxlIChzdHIpIHsKKwkJY29uc3QgY2hhciAqcDsKKwkJZ2xvYl90IHBnbG9iOworCQlpbnQgaTsKKworCQlpZiAoZmZsYWcpCisJCQlnb3RvIG5vbWV0YTsKKwkJSU5UT0ZGOworCQlwID0gcHJlZ2xvYihzdHItPnRleHQsIDAsIFJNRVNDQVBFX0FMTE9DIHwgUk1FU0NBUEVfSEVBUCk7CisJCWkgPSBnbG9iKHAsIEdMT0JfTk9NQUdJQywgMCwgJnBnbG9iKTsKKwkJaWYgKHAgIT0gc3RyLT50ZXh0KQorCQkJY2tmcmVlKHApOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJaWYgKCEocGdsb2IuZ2xfZmxhZ3MgJiBHTE9CX01BR0NIQVIpKQorCQkJCWdvdG8gbm9tZXRhMjsKKwkJCWFkZGdsb2IoJnBnbG9iKTsKKwkJCWdsb2JmcmVlKCZwZ2xvYik7CisJCQlJTlRPTjsKKwkJCWJyZWFrOworCQljYXNlIEdMT0JfTk9NQVRDSDoKK25vbWV0YTI6CisJCQlnbG9iZnJlZSgmcGdsb2IpOworCQkJSU5UT047Citub21ldGE6CisJCQkqZXhwYXJnLmxhc3RwID0gc3RyOworCQkJcm1lc2NhcGVzKHN0ci0+dGV4dCk7CisJCQlleHBhcmcubGFzdHAgPSAmc3RyLT5uZXh0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIEdMT0JfTk9TUEFDRSAqLworCQkJc2hfZXJyb3IoIk91dCBvZiBzcGFjZSIpOworCQl9CisJCXN0ciA9IHN0ci0+bmV4dDsKKwl9Cit9CisKKworLyoKKyAqIEFkZCB0aGUgcmVzdWx0IG9mIGdsb2IoMykgdG8gdGhlIGxpc3QuCisgKi8KKworU1RBVElDIHZvaWQKK2FkZGdsb2IocGdsb2IpCisJY29uc3QgZ2xvYl90ICpwZ2xvYjsKK3sKKwljaGFyICoqcCA9IHBnbG9iLT5nbF9wYXRodjsKKworCWRvIHsKKwkJYWRkZm5hbWUoKnApOworCX0gd2hpbGUgKCorK3ApOworfQorCisKKyNlbHNlCS8qIGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChGTk1BVENIX0JST0tFTikgJiYgIWRlZmluZWQoR0xPQl9CUk9LRU4pICovCitTVEFUSUMgY2hhciAqZXhwZGlyOworCisKK1NUQVRJQyB2b2lkCitleHBhbmRtZXRhKHN0cnVjdCBzdHJsaXN0ICpzdHIsIGludCBmbGFnKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1ldGFjaGFyc1tdID0geworCQknKicsICc/JywgJ1snLCAwCisJfTsKKwkvKiBUT0RPIC0gRVhQX1JFRElSICovCisKKwl3aGlsZSAoc3RyKSB7CisJCXN0cnVjdCBzdHJsaXN0ICoqc2F2ZWxhc3RwOworCQlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJCWNoYXIgKnA7CisKKwkJaWYgKGZmbGFnKQorCQkJZ290byBub21ldGE7CisJCWlmICghc3RycGJyayhzdHItPnRleHQsIG1ldGFjaGFycykpCisJCQlnb3RvIG5vbWV0YTsKKwkJc2F2ZWxhc3RwID0gZXhwYXJnLmxhc3RwOworCisJCUlOVE9GRjsKKwkJcCA9IHByZWdsb2Ioc3RyLT50ZXh0LCAwLCBSTUVTQ0FQRV9BTExPQyB8IFJNRVNDQVBFX0hFQVApOworCQl7CisJCQlpbnQgaSA9IHN0cmxlbihzdHItPnRleHQpOworCQkJZXhwZGlyID0gY2ttYWxsb2MoaSA8IDIwNDggPyAyMDQ4IDogaSk7IC8qIFhYWCAqLworCQl9CisKKwkJZXhwbWV0YShleHBkaXIsIHApOworCQlja2ZyZWUoZXhwZGlyKTsKKwkJaWYgKHAgIT0gc3RyLT50ZXh0KQorCQkJY2tmcmVlKHApOworCQlJTlRPTjsKKwkJaWYgKGV4cGFyZy5sYXN0cCA9PSBzYXZlbGFzdHApIHsKKwkJCS8qCisJCQkgKiBubyBtYXRjaGVzCisJCQkgKi8KK25vbWV0YToKKwkJCSpleHBhcmcubGFzdHAgPSBzdHI7CisJCQlybWVzY2FwZXMoc3RyLT50ZXh0KTsKKwkJCWV4cGFyZy5sYXN0cCA9ICZzdHItPm5leHQ7CisJCX0gZWxzZSB7CisJCQkqZXhwYXJnLmxhc3RwID0gTlVMTDsKKwkJCSpzYXZlbGFzdHAgPSBzcCA9IGV4cHNvcnQoKnNhdmVsYXN0cCk7CisJCQl3aGlsZSAoc3AtPm5leHQgIT0gTlVMTCkKKwkJCQlzcCA9IHNwLT5uZXh0OworCQkJZXhwYXJnLmxhc3RwID0gJnNwLT5uZXh0OworCQl9CisJCXN0ciA9IHN0ci0+bmV4dDsKKwl9Cit9CisKKworLyoKKyAqIERvIG1ldGFjaGFyYWN0ZXIgKGkuZS4gKiwgPywgWy4uLl0pIGV4cGFuc2lvbi4KKyAqLworCitTVEFUSUMgdm9pZAorZXhwbWV0YShjaGFyICplbmRkaXIsIGNoYXIgKm5hbWUpCit7CisJY2hhciAqcDsKKwljb25zdCBjaGFyICpjcDsKKwljaGFyICpzdGFydDsKKwljaGFyICplbmRuYW1lOworCWludCBtZXRhZmxhZzsKKwlzdHJ1Y3Qgc3RhdDY0IHN0YXRiOworCURJUiAqZGlycDsKKwlzdHJ1Y3QgZGlyZW50ICpkcDsKKwlpbnQgYXRlbmQ7CisJaW50IG1hdGNoZG90OworCisJbWV0YWZsYWcgPSAwOworCXN0YXJ0ID0gbmFtZTsKKwlmb3IgKHAgPSBuYW1lOyAqcDsgcCsrKSB7CisJCWlmICgqcCA9PSAnKicgfHwgKnAgPT0gJz8nKQorCQkJbWV0YWZsYWcgPSAxOworCQllbHNlIGlmICgqcCA9PSAnWycpIHsKKwkJCWNoYXIgKnEgPSBwICsgMTsKKwkJCWlmICgqcSA9PSAnIScpCisJCQkJcSsrOworCQkJZm9yICg7OykgeworCQkJCWlmICgqcSA9PSAnXFwnKQorCQkJCQlxKys7CisJCQkJaWYgKCpxID09ICcvJyB8fCAqcSA9PSAnXDAnKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKisrcSA9PSAnXScpIHsKKwkJCQkJbWV0YWZsYWcgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoKnAgPT0gJ1xcJykKKwkJCXArKzsKKwkJZWxzZSBpZiAoKnAgPT0gJy8nKSB7CisJCQlpZiAobWV0YWZsYWcpCisJCQkJZ290byBvdXQ7CisJCQlzdGFydCA9IHAgKyAxOworCQl9CisJfQorb3V0OgorCWlmIChtZXRhZmxhZyA9PSAwKSB7CS8qIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlsZSBuYW1lICovCisJCWlmIChlbmRkaXIgIT0gZXhwZGlyKQorCQkJbWV0YWZsYWcrKzsKKwkJcCA9IG5hbWU7CisJCWRvIHsKKwkJCWlmICgqcCA9PSAnXFwnKQorCQkJCXArKzsKKwkJCSplbmRkaXIrKyA9ICpwOworCQl9IHdoaWxlICgqcCsrKTsKKwkJaWYgKG1ldGFmbGFnID09IDAgfHwgbHN0YXQ2NChleHBkaXIsICZzdGF0YikgPj0gMCkKKwkJCWFkZGZuYW1lKGV4cGRpcik7CisJCXJldHVybjsKKwl9CisJZW5kbmFtZSA9IHA7CisJaWYgKG5hbWUgPCBzdGFydCkgeworCQlwID0gbmFtZTsKKwkJZG8geworCQkJaWYgKCpwID09ICdcXCcpCisJCQkJcCsrOworCQkJKmVuZGRpcisrID0gKnArKzsKKwkJfSB3aGlsZSAocCA8IHN0YXJ0KTsKKwl9CisJaWYgKGVuZGRpciA9PSBleHBkaXIpIHsKKwkJY3AgPSAiLiI7CisJfSBlbHNlIGlmIChlbmRkaXIgPT0gZXhwZGlyICsgMSAmJiAqZXhwZGlyID09ICcvJykgeworCQljcCA9ICIvIjsKKwl9IGVsc2UgeworCQljcCA9IGV4cGRpcjsKKwkJZW5kZGlyWy0xXSA9ICdcMCc7CisJfQorCWlmICgoZGlycCA9IG9wZW5kaXIoY3ApKSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGVuZGRpciAhPSBleHBkaXIpCisJCWVuZGRpclstMV0gPSAnLyc7CisJaWYgKCplbmRuYW1lID09IDApIHsKKwkJYXRlbmQgPSAxOworCX0gZWxzZSB7CisJCWF0ZW5kID0gMDsKKwkJKmVuZG5hbWUrKyA9ICdcMCc7CisJfQorCW1hdGNoZG90ID0gMDsKKwlwID0gc3RhcnQ7CisJaWYgKCpwID09ICdcXCcpCisJCXArKzsKKwlpZiAoKnAgPT0gJy4nKQorCQltYXRjaGRvdCsrOworCXdoaWxlICghIGludF9wZW5kaW5nKCkgJiYgKGRwID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgeworCQlpZiAoZHAtPmRfbmFtZVswXSA9PSAnLicgJiYgISBtYXRjaGRvdCkKKwkJCWNvbnRpbnVlOworCQlpZiAocG1hdGNoKHN0YXJ0LCBkcC0+ZF9uYW1lKSkgeworCQkJaWYgKGF0ZW5kKSB7CisJCQkJc2NvcHkoZHAtPmRfbmFtZSwgZW5kZGlyKTsKKwkJCQlhZGRmbmFtZShleHBkaXIpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKHAgPSBlbmRkaXIsIGNwID0gZHAtPmRfbmFtZTsKKwkJCQkgICAgICgqcCsrID0gKmNwKyspICE9ICdcMCc7KQorCQkJCQljb250aW51ZTsKKwkJCQlwWy0xXSA9ICcvJzsKKwkJCQlleHBtZXRhKHAsIGVuZG5hbWUpOworCQkJfQorCQl9CisJfQorCWNsb3NlZGlyKGRpcnApOworCWlmICghIGF0ZW5kKQorCQllbmRuYW1lWy0xXSA9ICcvJzsKK30KKyNlbmRpZgkvKiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoRk5NQVRDSF9CUk9LRU4pICYmICFkZWZpbmVkKEdMT0JfQlJPS0VOKSAqLworCisKKy8qCisgKiBBZGQgYSBmaWxlIG5hbWUgdG8gdGhlIGxpc3QuCisgKi8KKworU1RBVElDIHZvaWQKK2FkZGZuYW1lKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCisJc3AgPSAoc3RydWN0IHN0cmxpc3QgKilzdGFsbG9jKHNpemVvZiAqc3ApOworCXNwLT50ZXh0ID0gc3N0cmR1cChuYW1lKTsKKwkqZXhwYXJnLmxhc3RwID0gc3A7CisJZXhwYXJnLmxhc3RwID0gJnNwLT5uZXh0OworfQorCisKKyNpZiAhKGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChGTk1BVENIX0JST0tFTikgJiYgIWRlZmluZWQoR0xPQl9CUk9LRU4pKQorLyoKKyAqIFNvcnQgdGhlIHJlc3VsdHMgb2YgZmlsZSBuYW1lIGV4cGFuc2lvbi4gIEl0IGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZgorICogc3RyaW5ncyB0byBzb3J0IGFuZCB0aGVuIGNhbGxzIG1zb3J0IChzaG9ydCBmb3IgbWVyZ2Ugc29ydCkgdG8gZG8gdGhlCisgKiB3b3JrLgorICovCisKK1NUQVRJQyBzdHJ1Y3Qgc3RybGlzdCAqCitleHBzb3J0KHN0cnVjdCBzdHJsaXN0ICpzdHIpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisKKwlsZW4gPSAwOworCWZvciAoc3AgPSBzdHIgOyBzcCA7IHNwID0gc3AtPm5leHQpCisJCWxlbisrOworCXJldHVybiBtc29ydChzdHIsIGxlbik7Cit9CisKKworU1RBVElDIHN0cnVjdCBzdHJsaXN0ICoKK21zb3J0KHN0cnVjdCBzdHJsaXN0ICpsaXN0LCBpbnQgbGVuKQoreworCXN0cnVjdCBzdHJsaXN0ICpwLCAqcSA9IE5VTEw7CisJc3RydWN0IHN0cmxpc3QgKipscHA7CisJaW50IGhhbGY7CisJaW50IG47CisKKwlpZiAobGVuIDw9IDEpCisJCXJldHVybiBsaXN0OworCWhhbGYgPSBsZW4gPj4gMTsKKwlwID0gbGlzdDsKKwlmb3IgKG4gPSBoYWxmIDsgLS1uID49IDAgOyApIHsKKwkJcSA9IHA7CisJCXAgPSBwLT5uZXh0OworCX0KKwlxLT5uZXh0ID0gTlVMTDsJCQkvKiB0ZXJtaW5hdGUgZmlyc3QgaGFsZiBvZiBsaXN0ICovCisJcSA9IG1zb3J0KGxpc3QsIGhhbGYpOwkJLyogc29ydCBmaXJzdCBoYWxmIG9mIGxpc3QgKi8KKwlwID0gbXNvcnQocCwgbGVuIC0gaGFsZik7CQkvKiBzb3J0IHNlY29uZCBoYWxmICovCisJbHBwID0gJmxpc3Q7CisJZm9yICg7OykgeworCQlpZiAoc3RyY21wKHAtPnRleHQsIHEtPnRleHQpIDwgMCkgeworCQkJKmxwcCA9IHA7CisJCQlscHAgPSAmcC0+bmV4dDsKKwkJCWlmICgocCA9ICpscHApID09IE5VTEwpIHsKKwkJCQkqbHBwID0gcTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpscHAgPSBxOworCQkJbHBwID0gJnEtPm5leHQ7CisJCQlpZiAoKHEgPSAqbHBwKSA9PSBOVUxMKSB7CisJCQkJKmxwcCA9IHA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGxpc3Q7Cit9CisjZW5kaWYKKworCisvKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIHN0cmluZy4KKyAqLworCitTVEFUSUMgaW5saW5lIGludAorcGF0bWF0Y2goY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyaW5nKQoreworCXJldHVybiBwbWF0Y2gocHJlZ2xvYihwYXR0ZXJuLCAwLCAwKSwgc3RyaW5nKTsKK30KKworCisjaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKQorU1RBVElDIGludCBjY21hdGNoKGNvbnN0IGNoYXIgKnAsIGludCBjaHIsIGNvbnN0IGNoYXIgKipyKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xhc3MgeworCQljaGFyIG5hbWVbMTBdOworCQlpbnQgKCpmbikoaW50KTsKKwl9IGNsYXNzZXNbXSA9IHsKKwkJeyAubmFtZSA9ICI6YWxudW06XSIsIC5mbiA9IGlzYWxudW0gfSwKKwkJeyAubmFtZSA9ICI6Y250cmw6XSIsIC5mbiA9IGlzY250cmwgfSwKKwkJeyAubmFtZSA9ICI6bG93ZXI6XSIsIC5mbiA9IGlzbG93ZXIgfSwKKwkJeyAubmFtZSA9ICI6c3BhY2U6XSIsIC5mbiA9IGlzc3BhY2UgfSwKKwkJeyAubmFtZSA9ICI6YWxwaGE6XSIsIC5mbiA9IGlzYWxwaGEgfSwKKwkJeyAubmFtZSA9ICI6ZGlnaXQ6XSIsIC5mbiA9IGlzZGlnaXQgfSwKKwkJeyAubmFtZSA9ICI6cHJpbnQ6XSIsIC5mbiA9IGlzcHJpbnQgfSwKKwkJeyAubmFtZSA9ICI6dXBwZXI6XSIsIC5mbiA9IGlzdXBwZXIgfSwKKwkJeyAubmFtZSA9ICI6Ymxhbms6XSIsIC5mbiA9IGlzYmxhbmsgfSwKKwkJeyAubmFtZSA9ICI6Z3JhcGg6XSIsIC5mbiA9IGlzZ3JhcGggfSwKKwkJeyAubmFtZSA9ICI6cHVuY3Q6XSIsIC5mbiA9IGlzcHVuY3QgfSwKKwkJeyAubmFtZSA9ICI6eGRpZ2l0Ol0iLCAuZm4gPSBpc3hkaWdpdCB9LAorCX07CisJY29uc3Qgc3RydWN0IGNsYXNzICpjbGFzcywgKmVuZDsKKworCWVuZCA9IGNsYXNzZXMgKyBzaXplb2YoY2xhc3NlcykgLyBzaXplb2YoY2xhc3Nlc1swXSk7CisJZm9yIChjbGFzcyA9IGNsYXNzZXM7IGNsYXNzIDwgZW5kOyBjbGFzcysrKSB7CisJCWNvbnN0IGNoYXIgKnE7CisKKwkJcSA9IHByZWZpeChwLCBjbGFzcy0+bmFtZSk7CisJCWlmICghcSkKKwkJCWNvbnRpbnVlOworCQkqciA9IHE7CisJCXJldHVybiBjbGFzcy0+Zm4oY2hyKTsKKwl9CisKKwkqciA9IDA7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3BtYXRjaChjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJY29uc3QgY2hhciAqcCwgKnE7CisJY2hhciBjOworCisJcCA9IHBhdHRlcm47CisJcSA9IHN0cmluZzsKKwlmb3IgKDs7KSB7CisJCXN3aXRjaCAoYyA9ICpwKyspIHsKKwkJY2FzZSAnXDAnOgorCQkJZ290byBicmVha2xvb3A7CisJCWNhc2UgJ1xcJzoKKwkJCWlmICgqcCkgeworCQkJCWMgPSAqcCsrOworCQkJfQorCQkJZ290byBkZnQ7CisJCWNhc2UgJz8nOgorCQkJaWYgKCpxKysgPT0gJ1wwJykKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlICcqJzoKKwkJCWMgPSAqcDsKKwkJCXdoaWxlIChjID09ICcqJykKKwkJCQljID0gKisrcDsKKwkJCWlmIChjICE9ICdcXCcgJiYgYyAhPSAnPycgJiYgYyAhPSAnKicgJiYgYyAhPSAnWycpIHsKKwkJCQl3aGlsZSAoKnEgIT0gYykgeworCQkJCQlpZiAoKnEgPT0gJ1wwJykKKwkJCQkJCXJldHVybiAwOworCQkJCQlxKys7CisJCQkJfQorCQkJfQorCQkJZG8geworCQkJCWlmIChwbWF0Y2gocCwgcSkpCisJCQkJCXJldHVybiAxOworCQkJfSB3aGlsZSAoKnErKyAhPSAnXDAnKTsKKwkJCXJldHVybiAwOworCQljYXNlICdbJzogeworCQkJY29uc3QgY2hhciAqc3RhcnRwOworCQkJaW50IGludmVydCwgZm91bmQ7CisJCQljaGFyIGNocjsKKworCQkJc3RhcnRwID0gcDsKKwkJCWludmVydCA9IDA7CisJCQlpZiAoKnAgPT0gJyEnKSB7CisJCQkJaW52ZXJ0Kys7CisJCQkJcCsrOworCQkJfQorCQkJZm91bmQgPSAwOworCQkJY2hyID0gKnErKzsKKwkJCWlmIChjaHIgPT0gJ1wwJykKKwkJCQlyZXR1cm4gMDsKKwkJCWMgPSAqcCsrOworCQkJZG8geworCQkJCWlmICghYykgeworCQkJCQlwID0gc3RhcnRwOworCQkJCQljID0gKnA7CisJCQkJCWdvdG8gZGZ0OworCQkJCX0KKwkJCQlpZiAoYyA9PSAnWycpIHsKKwkJCQkJY29uc3QgY2hhciAqcjsKKworCQkJCQlmb3VuZCB8PSBjY21hdGNoKHAsIGNociwgJnIpOworCQkJCQlpZiAocikgeworCQkJCQkJcCA9IHI7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoYyA9PSAnXFwnKQorCQkJCQljID0gKnArKzsKKwkJCQlpZiAoKnAgPT0gJy0nICYmIHBbMV0gIT0gJ10nKSB7CisJCQkJCXArKzsKKwkJCQkJaWYgKCpwID09ICdcXCcpCisJCQkJCQlwKys7CisJCQkJCWlmIChjaHIgPj0gYyAmJiBjaHIgPD0gKnApCisJCQkJCQlmb3VuZCA9IDE7CisJCQkJCXArKzsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY2hyID09IGMpCisJCQkJCQlmb3VuZCA9IDE7CisJCQkJfQorCQkJfSB3aGlsZSAoKGMgPSAqcCsrKSAhPSAnXScpOworCQkJaWYgKGZvdW5kID09IGludmVydCkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CitkZnQ6CSAgICAgICAgZGVmYXVsdDoKKwkJCWlmICgqcSsrICE9IGMpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCX0KK2JyZWFrbG9vcDoKKwlpZiAoKnEgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworCisKKy8qCisgKiBSZW1vdmUgYW55IENUTEVTQyBjaGFyYWN0ZXJzIGZyb20gYSBzdHJpbmcuCisgKi8KKworY2hhciAqCitfcm1lc2NhcGVzKGNoYXIgKnN0ciwgaW50IGZsYWcpCit7CisJY2hhciAqcCwgKnEsICpyOworCXN0YXRpYyBjb25zdCBjaGFyIHFjaGFyc1tdID0geyBDVExFU0MsIENUTFFVT1RFTUFSSywgMCB9OworCXVuc2lnbmVkIGlucXVvdGVzOworCWludCBub3Rlc2NhcGVkOworCWludCBnbG9iYmluZzsKKworCXAgPSBzdHJwYnJrKHN0ciwgcWNoYXJzKTsKKwlpZiAoIXApIHsKKwkJcmV0dXJuIHN0cjsKKwl9CisJcSA9IHA7CisJciA9IHN0cjsKKwlpZiAoZmxhZyAmIFJNRVNDQVBFX0FMTE9DKSB7CisJCXNpemVfdCBsZW4gPSBwIC0gc3RyOworCQlzaXplX3QgZnVsbGxlbiA9IGxlbiArIHN0cmxlbihwKSArIDE7CisKKwkJaWYgKGZsYWcgJiBSTUVTQ0FQRV9HUk9XKSB7CisJCQlyID0gbWFrZXN0cnNwYWNlKGZ1bGxsZW4sIGV4cGRlc3QpOworCQl9IGVsc2UgaWYgKGZsYWcgJiBSTUVTQ0FQRV9IRUFQKSB7CisJCQlyID0gY2ttYWxsb2MoZnVsbGxlbik7CisJCX0gZWxzZSB7CisJCQlyID0gc3RhbGxvYyhmdWxsbGVuKTsKKwkJfQorCQlxID0gcjsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCXEgPSBtZW1wY3B5KHEsIHN0ciwgbGVuKTsKKwkJfQorCX0KKwlpbnF1b3RlcyA9IChmbGFnICYgUk1FU0NBUEVfUVVPVEVEKSBeIFJNRVNDQVBFX1FVT1RFRDsKKwlnbG9iYmluZyA9IGZsYWcgJiBSTUVTQ0FQRV9HTE9COworCW5vdGVzY2FwZWQgPSBnbG9iYmluZzsKKwl3aGlsZSAoKnApIHsKKwkJaWYgKCpwID09IChjaGFyKUNUTFFVT1RFTUFSSykgeworCQkJaW5xdW90ZXMgPSB+aW5xdW90ZXM7CisJCQlwKys7CisJCQlub3Rlc2NhcGVkID0gZ2xvYmJpbmc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnAgPT0gJ1xcJykgeworCQkJLyogbmFrZWQgYmFjayBzbGFzaCAqLworCQkJbm90ZXNjYXBlZCA9IDA7CisJCQlnb3RvIGNvcHk7CisJCX0KKwkJaWYgKCpwID09IChjaGFyKUNUTEVTQykgeworCQkJcCsrOworCQkJaWYgKG5vdGVzY2FwZWQgJiYgaW5xdW90ZXMgJiYgKnAgIT0gJy8nKSB7CisJCQkJKnErKyA9ICdcXCc7CisJCQl9CisJCX0KKwkJbm90ZXNjYXBlZCA9IGdsb2JiaW5nOworY29weToKKwkJKnErKyA9ICpwKys7CisJfQorCSpxID0gJ1wwJzsKKwlpZiAoZmxhZyAmIFJNRVNDQVBFX0dST1cpIHsKKwkJZXhwZGVzdCA9IHI7CisJCVNUQURKVVNUKHEgLSByICsgMSwgZXhwZGVzdCk7CisJfQorCXJldHVybiByOworfQorCisKKworLyoKKyAqIFNlZSBpZiBhIHBhdHRlcm4gbWF0Y2hlcyBpbiBhIGNhc2Ugc3RhdGVtZW50LgorICovCisKK2ludAorY2FzZW1hdGNoKHVuaW9uIG5vZGUgKnBhdHRlcm4sIGNoYXIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCWludCByZXN1bHQ7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlhcmdiYWNrcSA9IHBhdHRlcm4tPm5hcmcuYmFja3F1b3RlOworCVNUQVJUU1RBQ0tTVFIoZXhwZGVzdCk7CisJaWZzbGFzdHAgPSBOVUxMOworCWFyZ3N0cihwYXR0ZXJuLT5uYXJnLnRleHQsIEVYUF9USUxERSB8IEVYUF9DQVNFKTsKKwlTVEFDS1NUUk5VTChleHBkZXN0KTsKKwlyZXN1bHQgPSBwYXRtYXRjaChzdGFja2Jsb2NrKCksIHZhbCk7CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIE91ciBvd24gaXRvYSgpLgorICovCisKK1NUQVRJQyBpbnQKK2N2dG51bShsb25nIG51bSkKK3sKKwlpbnQgbGVuOworCisJZXhwZGVzdCA9IG1ha2VzdHJzcGFjZSgzMiwgZXhwZGVzdCk7CisJbGVuID0gZm10c3RyKGV4cGRlc3QsIDMyLCAiJWxkIiwgbnVtKTsKKwlTVEFESlVTVChsZW4sIGV4cGRlc3QpOworCXJldHVybiBsZW47Cit9CisKK1NUQVRJQyB2b2lkCit2YXJ1bnNldChjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdW1zZywgaW50IHZhcmZsYWdzKQoreworCWNvbnN0IGNoYXIgKm1zZzsKKwljb25zdCBjaGFyICp0YWlsOworCisJdGFpbCA9IG51bGxzdHI7CisJbXNnID0gInBhcmFtZXRlciBub3Qgc2V0IjsKKwlpZiAodW1zZykgeworCQlpZiAoKmVuZCA9PSAoY2hhcilDVExFTkRWQVIpIHsKKwkJCWlmICh2YXJmbGFncyAmIFZTTlVMKQorCQkJCXRhaWwgPSAiIG9yIG51bGwiOworCQl9IGVsc2UKKwkJCW1zZyA9IHVtc2c7CisJfQorCXNoX2Vycm9yKCIlLipzOiAlcyVzIiwgZW5kIC0gdmFyIC0gMSwgdmFyLCBtc2csIHRhaWwpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZXhwYW5kLmggYi91c3IvZGFzaC9leHBhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzA0NTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZXhwYW5kLmgKQEAgLTAsMCArMSw4MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylleHBhbmQuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaWZuZGVmIERBU0hfU1RSTElTVF9ICisjZGVmaW5lIERBU0hfU1RSTElTVF9ICisKK3N0cnVjdCBzdHJsaXN0IHsKKwlzdHJ1Y3Qgc3RybGlzdCAqbmV4dDsKKwljaGFyICp0ZXh0OworfTsKKworCitzdHJ1Y3QgYXJnbGlzdCB7CisJc3RydWN0IHN0cmxpc3QgKmxpc3Q7CisJc3RydWN0IHN0cmxpc3QgKipsYXN0cDsKK307CisKKy8qCisgKiBleHBhbmRhcmcoKSBmbGFncworICovCisjZGVmaW5lIEVYUF9GVUxMCTB4MQkvKiBwZXJmb3JtIHdvcmQgc3BsaXR0aW5nICYgZmlsZSBnbG9iYmluZyAqLworI2RlZmluZSBFWFBfVElMREUJMHgyCS8qIGRvIG5vcm1hbCB0aWxkZSBleHBhbnNpb24gKi8KKyNkZWZpbmUJRVhQX1ZBUlRJTERFCTB4NAkvKiBleHBhbmQgdGlsZGVzIGluIGFuIGFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJRVhQX1JFRElSCTB4OAkvKiBmaWxlIGdsb2IgZm9yIGEgcmVkaXJlY3Rpb24gKDEgbWF0Y2ggb25seSkgKi8KKyNkZWZpbmUgRVhQX0NBU0UJMHgxMAkvKiBrZWVwcyBxdW90ZXMgYXJvdW5kIGZvciBDQVNFIHBhdHRlcm4gKi8KKyNkZWZpbmUgRVhQX1JFQ09SRAkweDIwCS8qIG5lZWQgdG8gcmVjb3JkIGFyZ3VtZW50cyBmb3IgaWZzIGJyZWFrdXAgKi8KKyNkZWZpbmUgRVhQX1ZBUlRJTERFMgkweDQwCS8qIGV4cGFuZCB0aWxkZXMgYWZ0ZXIgY29sb25zIG9ubHkgKi8KKyNkZWZpbmUgRVhQX1dPUkQJMHg4MAkvKiBleHBhbmQgd29yZCBpbiBwYXJhbWV0ZXIgZXhwYW5zaW9uICovCisjZGVmaW5lIEVYUF9RV09SRAkweDEwMAkvKiBleHBhbmQgd29yZCBpbiBxdW90ZWQgcGFyYW1ldGVyIGV4cGFuc2lvbiAqLworCisKK3VuaW9uIG5vZGU7Cit2b2lkIGV4cGFuZGhlcmUodW5pb24gbm9kZSAqLCBpbnQpOwordm9pZCBleHBhbmRhcmcodW5pb24gbm9kZSAqLCBzdHJ1Y3QgYXJnbGlzdCAqLCBpbnQpOwordm9pZCBleHBhcmkoaW50KTsKKyNkZWZpbmUgcm1lc2NhcGVzKHApIF9ybWVzY2FwZXMoKHApLCAwKQorY2hhciAqX3JtZXNjYXBlcyhjaGFyICosIGludCk7CitpbnQgY2FzZW1hdGNoKHVuaW9uIG5vZGUgKiwgY2hhciAqKTsKKworLyogRnJvbSBhcml0aC55ICovCitpbnQgYXJpdGgoY29uc3QgY2hhciAqKTsKK2ludCBleHBjbWQoaW50ICwgY2hhciAqKik7CisjaWZkZWYgVVNFX0xFWAordm9pZCBhcml0aF9sZXhfcmVzZXQodm9pZCk7CisjZWxzZQorI2RlZmluZSBhcml0aF9sZXhfcmVzZXQoKQorI2VuZGlmCitpbnQgeXlsZXgodm9pZCk7CisKKyNlbmRpZgkJLyogREFTSF9TVFJMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Z1bmNzL2NtdiBiL3Vzci9kYXNoL2Z1bmNzL2NtdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWE2N2M1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZnVuY3MvY212CkBAIC0wLDAgKzEsNDcgQEAKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKWNtdgk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKworIyBDb25kaXRpb25hbCBtb3ZlLS1kb24ndCByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGUuCisKK2NtdigpIHsKKwlpZiB0ZXN0ICQjICE9IDIKKwl0aGVuCWVjaG8gImNtdjogYXJnIGNvdW50IgorCQlyZXR1cm4gMgorCWZpCisJaWYgdGVzdCAtZiAiJDIiIC1vIC13ICIkMiIKKwl0aGVuCWVjaG8gIiQyIGV4aXN0cyIKKwkJcmV0dXJuIDIKKwlmaQorCS9iaW4vbXYgIiQxIiAiJDIiCit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9mdW5jcy9kaXJzIGIvdXNyL2Rhc2gvZnVuY3MvZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg0MGViCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZnVuY3MvZGlycwpAQCAtMCwwICsxLDcxIEBACisjIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworIwlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyMJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyMgS2VubmV0aCBBbG1xdWlzdC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisjCUAoIylkaXJzCTguMiAoQmVya2VsZXkpIDUvNC85NQorCisjIHB1c2hkLCBwb3BkLCBhbmQgZGlycyAtLS0gd3JpdHRlbiBieSBDaHJpcyBCZXJ0aW4KKyMgUGl4ZWwgQ29tcHV0ZXIgSW5jLiAuLi4hd2poMTIhcGl4ZWwhcGl4dXRsIWNocmlzCisjIGFzIG1vZGlmaWVkIGJ5IFBhdHJpY2sgRWxhbSBvZiBHVFJJIGFuZCBLZW5uZXRoIEFsbXF1aXN0IGF0IFVXCisKK3B1c2hkICgpIHsKKwlTQVZFPWBwd2RgCisJaWYgWyAiJDEiID0gIiIgXQorCXRoZW4JaWYgWyAiJERTVEFDSyIgPSAiIiBdCisJCXRoZW4JZWNobyAicHVzaGQ6IGRpcmVjdG9yeSBzdGFjayBlbXB0eS4iCisJCQlyZXR1cm4gMQorCQlmaQorCQlzZXQgJERTVEFDSworCQljZCAkMSB8fCByZXR1cm4KKwkJc2hpZnQgMQorCQlEU1RBQ0s9IiQqIgorCWVsc2UJY2QgJDEgPiAvZGV2L251bGwgfHwgcmV0dXJuCisJZmkKKwlEU1RBQ0s9IiRTQVZFICREU1RBQ0siCisJZGlycworfQorCitwb3BkICgpIHsKKwlpZiBbICIkRFNUQUNLIiA9ICIiIF0KKwl0aGVuCWVjaG8gInBvcGQ6IGRpcmVjdG9yeSBzdGFjayBlbXB0eS4iCisJCXJldHVybiAxCisJZmkKKwlzZXQgJERTVEFDSworCWNkICQxCisJc2hpZnQKKwlEU1RBQ0s9JCoKKwlkaXJzCit9CisKK2RpcnMgKCkgeworCWVjaG8gImBwd2RgICREU1RBQ0siCisJcmV0dXJuIDAKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Z1bmNzL2tpbGwgYi91c3IvZGFzaC9mdW5jcy9raWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGY5NWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9mdW5jcy9raWxsCkBAIC0wLDAgKzEsNDcgQEAKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKWtpbGwJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKKyMgQ29udmVydCBqb2IgbmFtZXMgdG8gcHJvY2VzcyBpZHMgYW5kIHRoZW4gcnVuIC9iaW4va2lsbC4KKwora2lsbCgpIHsKKwlsb2NhbCBhcmdzIHgKKwlhcmdzPQorCWZvciB4IGluICIkQCIKKwlkbwljYXNlICR4IGluCisJCSUqKQl4PWBqb2JpZCAiJHgiYCA7OworCQllc2FjCisJCWFyZ3M9IiRhcmdzICR4IgorCWRvbmUKKwkvYmluL2tpbGwgJGFyZ3MKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Z1bmNzL2xvZ2luIGIvdXNyL2Rhc2gvZnVuY3MvbG9naW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1ZTUzNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2Z1bmNzL2xvZ2luCkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKWxvZ2luCTguMiAoQmVya2VsZXkpIDUvNC85NQorCisjIHJlcGxhY2VzIHRoZSBsb2dpbiBidWlsdGluIGluIHRoZSBCU0Qgc2hlbGwKK2xvZ2luICgpIGV4ZWMgbG9naW4gIiRAIgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZnVuY3MvbmV3Z3JwIGIvdXNyL2Rhc2gvZnVuY3MvbmV3Z3JwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMGU3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9mdW5jcy9uZXdncnAKQEAgLTAsMCArMSwzNSBAQAorIyBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisjCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisjIEtlbm5ldGggQWxtcXVpc3QuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworIwlAKCMpbmV3Z3JwCTguMiAoQmVya2VsZXkpIDUvNC85NQorCituZXdncnAoKSBleGVjIG5ld2dycCAiJEAiCmRpZmYgLS1naXQgYS91c3IvZGFzaC9mdW5jcy9wb3BkIGIvdXNyL2Rhc2gvZnVuY3MvcG9wZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjFhYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZnVuY3MvcG9wZApAQCAtMCwwICsxLDcxIEBACisjIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworIwlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyMJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyMgS2VubmV0aCBBbG1xdWlzdC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisjCUAoIylwb3BkCTguMiAoQmVya2VsZXkpIDUvNC85NQorCisjIHB1c2hkLCBwb3BkLCBhbmQgZGlycyAtLS0gd3JpdHRlbiBieSBDaHJpcyBCZXJ0aW4KKyMgUGl4ZWwgQ29tcHV0ZXIgSW5jLiAuLi4hd2poMTIhcGl4ZWwhcGl4dXRsIWNocmlzCisjIGFzIG1vZGlmaWVkIGJ5IFBhdHJpY2sgRWxhbSBvZiBHVFJJIGFuZCBLZW5uZXRoIEFsbXF1aXN0IGF0IFVXCisKK3B1c2hkICgpIHsKKwlTQVZFPWBwd2RgCisJaWYgWyAiJDEiID0gIiIgXQorCXRoZW4JaWYgWyAiJERTVEFDSyIgPSAiIiBdCisJCXRoZW4JZWNobyAicHVzaGQ6IGRpcmVjdG9yeSBzdGFjayBlbXB0eS4iCisJCQlyZXR1cm4gMQorCQlmaQorCQlzZXQgJERTVEFDSworCQljZCAkMSB8fCByZXR1cm4KKwkJc2hpZnQgMQorCQlEU1RBQ0s9IiQqIgorCWVsc2UJY2QgJDEgPiAvZGV2L251bGwgfHwgcmV0dXJuCisJZmkKKwlEU1RBQ0s9IiRTQVZFICREU1RBQ0siCisJZGlycworfQorCitwb3BkICgpIHsKKwlpZiBbICIkRFNUQUNLIiA9ICIiIF0KKwl0aGVuCWVjaG8gInBvcGQ6IGRpcmVjdG9yeSBzdGFjayBlbXB0eS4iCisJCXJldHVybiAxCisJZmkKKwlzZXQgJERTVEFDSworCWNkICQxCisJc2hpZnQKKwlEU1RBQ0s9JCoKKwlkaXJzCit9CisKK2RpcnMgKCkgeworCWVjaG8gImBwd2RgICREU1RBQ0siCisJcmV0dXJuIDAKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Z1bmNzL3B1c2hkIGIvdXNyL2Rhc2gvZnVuY3MvcHVzaGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzZDM1OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2Z1bmNzL3B1c2hkCkBAIC0wLDAgKzEsNzEgQEAKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKXB1c2hkCTguMiAoQmVya2VsZXkpIDUvNC85NQorCisjIHB1c2hkLCBwb3BkLCBhbmQgZGlycyAtLS0gd3JpdHRlbiBieSBDaHJpcyBCZXJ0aW4KKyMgUGl4ZWwgQ29tcHV0ZXIgSW5jLiAuLi4hd2poMTIhcGl4ZWwhcGl4dXRsIWNocmlzCisjIGFzIG1vZGlmaWVkIGJ5IFBhdHJpY2sgRWxhbSBvZiBHVFJJIGFuZCBLZW5uZXRoIEFsbXF1aXN0IGF0IFVXCisKK3B1c2hkICgpIHsKKwlTQVZFPWBwd2RgCisJaWYgWyAiJDEiID0gIiIgXQorCXRoZW4JaWYgWyAiJERTVEFDSyIgPSAiIiBdCisJCXRoZW4JZWNobyAicHVzaGQ6IGRpcmVjdG9yeSBzdGFjayBlbXB0eS4iCisJCQlyZXR1cm4gMQorCQlmaQorCQlzZXQgJERTVEFDSworCQljZCAkMSB8fCByZXR1cm4KKwkJc2hpZnQgMQorCQlEU1RBQ0s9IiQqIgorCWVsc2UJY2QgJDEgPiAvZGV2L251bGwgfHwgcmV0dXJuCisJZmkKKwlEU1RBQ0s9IiRTQVZFICREU1RBQ0siCisJZGlycworfQorCitwb3BkICgpIHsKKwlpZiBbICIkRFNUQUNLIiA9ICIiIF0KKwl0aGVuCWVjaG8gInBvcGQ6IGRpcmVjdG9yeSBzdGFjayBlbXB0eS4iCisJCXJldHVybiAxCisJZmkKKwlzZXQgJERTVEFDSworCWNkICQxCisJc2hpZnQKKwlEU1RBQ0s9JCoKKwlkaXJzCit9CisKK2RpcnMgKCkgeworCWVjaG8gImBwd2RgICREU1RBQ0siCisJcmV0dXJuIDAKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Z1bmNzL3N1c3BlbmQgYi91c3IvZGFzaC9mdW5jcy9zdXNwZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODQ0NjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9mdW5jcy9zdXNwZW5kCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKXN1c3BlbmQJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKK3N1c3BlbmQoKSB7CisJbG9jYWwgLQorCXNldCAragorCWtpbGwgLVRTVFAgMAorfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZ2VuZGVwcy5wbCBiL3Vzci9kYXNoL2dlbmRlcHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY3OTdkZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2dlbmRlcHMucGwKQEAgLTAsMCArMSwzOCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIEdlbmVyYXRlIGRlcGVuZGVuY2llcyBmb3IgKmdlbmVyYXRlZCogaGVhZGVyIGZpbGVzLiAgR2VuZXJhdGVkCisjIGhlYWRlciBmaWxlcyBoYXZlIHRvIHVzZSAjaW5jbHVkZSAiZm9vLmgiIHN5bnRheC4KKyMKKworKCRzcmMsICRvYmosIEBidWlsZF9oZWFkZXJzKSA9IEBBUkdWOworJWJ1aWxkX2hlYWRlcnMgPSBtYXAgeyAkXyA9PiAxIH0gQGJ1aWxkX2hlYWRlcnM7CisKK29wZW4oR0VOREVQUywgIj4gJG9iai8uZ2VuZGVwc1wwIikKKyAgICBvciBkaWUgIiQwOiBDYW5ub3QgY3JlYXRlICRvYmovLmdlbmRlcHM6ICQhXG4iOworCitvcGVuZGlyKERJUiwgJHNyYykgb3IgZGllICIkMDogQ2Fubm90IG9wZW5kaXIgJHNyYzogJCFcbiI7Cit3aGlsZSAoIGRlZmluZWQoJGZpbGUgPSByZWFkZGlyKERJUikpICkgeworICAgIGlmICggJGZpbGUgPX4gL14oLiopXC5jJC8gKSB7CisJJGJhc2VuYW1lID0gJDE7CisJQGhkcnMgPSAoKTsKKwlvcGVuKEZJTEUsICI8ICRzcmMvJGZpbGVcMCIpCisJICAgIG9yIGRpZSAiJDA6IENhbm5vdCBvcGVuICRzcmMvJGZpbGU6ICQhXG4iOworCXdoaWxlICggZGVmaW5lZCgkbGluZSA9IDxGSUxFPikgKSB7CisJICAgIGlmICggJGxpbmUgPX4gL15ccypcI1xzKmluY2x1ZGVccytcIiguKilcIi8gKSB7CisJCSRoZWFkZXIgPSAkMTsKKworCQlpZiAoICRidWlsZF9oZWFkZXJzeyRoZWFkZXJ9ICkgeworCQkgICAgcHVzaChAaGRycywgIlwkKG9iaikvJGhlYWRlciIpOworCQl9CisJICAgIH0KKwl9CisJY2xvc2UoRklMRSk7CisKKwlpZiAoc2NhbGFyKEBoZHJzKSkgeworCSAgICBwcmludCBHRU5ERVBTICJcJChvYmopLyRiYXNlbmFtZS5vOiAiLCBqb2luKCcgJywgQGhkcnMpLCAiXG4iOworCX0KKyAgICB9Cit9CisKK2Nsb3NlZGlyKERJUik7CitjbG9zZShHRU5ERVBTKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2hldGlvLmMgYi91c3IvZGFzaC9oZXRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZDE3NWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9oZXRpby5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogVGVybWlvcyBjb21tYW5kIGxpbmUgSGlzdG9yeSBhbmQgRWRpdHRpbmcgZm9yIE5ldEJTRCBzaCAoYXNoKQorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKglNYWluIGNvZGU6CUFkYW0gUm9nb3lza2kgPHJvZ295c2tpQGNzLnV0ZXhhcy5lZHU+CisgKglFdGM6CQlEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorICoKKyAqIFlvdSBtYXkgdXNlIHRoaXMgY29kZSBhcyB5b3Ugd2lzaCwgc28gbG9uZyBhcyB0aGUgb3JpZ2luYWwgYXV0aG9yKHMpCisgKiBhcmUgYXR0cmlidXRlZCBpbiBhbnkgcmVkaXN0cmlidXRpb25zIG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqIFRoaXMgY29kZSBpcyAnYXMgaXMnIHdpdGggbm8gd2FycmFudHkuCisgKiBUaGlzIGNvZGUgbWF5IHNhZmVseSBiZSBjb25zdW1lZCBieSBhIEJTRCBvciBHUEwgbGljZW5zZS4KKyAqCisgKiB2IDAuNSAgMTk5OTAzMjgJSW5pdGlhbCByZWxlYXNlCisgKgorICogRnV0dXJlIHBsYW5zOiBTaW1wbGUgZmlsZSBhbmQgcGF0aCBuYW1lIGNvbXBsZXRpb24uIChsaWtlIEJBU0gpCisgKgorICovCisKKy8qCitVc2FnZSBhbmQgS25vd24gYnVnczoKKwlUZXJtaW5hbCBrZXkgY29kZXMgYXJlIG5vdCBleHRlbnNpdmUsIGFuZCBtb3JlIHdpbGwgcHJvYmFibHkKKwluZWVkIHRvIGJlIGFkZGVkLiBUaGlzIHZlcnNpb24gd2FzIGNyZWF0ZWQgb24gRGViaWFuIEdOVS9MaW51eCAyLnguCisJRGVsZXRlLCBCYWNrc3BhY2UsIEhvbWUsIEVuZCwgYW5kIHRoZSBhcnJvdyBrZXlzIHdlcmUgdGVzdGVkCisJdG8gd29yayBpbiBhbiBYdGVybSBhbmQgY29uc29sZS4gQ3RybC1BIGFsc28gd29ya3MgYXMgSG9tZS4KKwlDdHJsLUUgYWxzbyB3b3JrcyBhcyBFbmQuIEN0cmwtRCBhbmQgQ3RybC1VIHBlcmZvcm0gdGhlaXIgcmVzcGVjdGl2ZQorCWZ1bmN0aW9ucy4gVGhlIGJpbmFyeSBzaXplIGluY3JlYXNlIGlzIDwzSy4KKworCUVkaXR0aW5nIHdpbGwgbm90IGRpc3BsYXkgY29ycmVjdGx5IGZvciBsaW5lcyBncmVhdGVyIHRoZW4gdGhlCisJdGVybWluYWwgd2lkdGguIChtb3JlIHRoZW4gb25lIGxpbmUuKSBIb3dldmVyLCBoaXN0b3J5IHdpbGwuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgImlucHV0LmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisKKyNpbmNsdWRlICJoZXRpby5oIgorCisKKyNkZWZpbmUgIE1BWF9ISVNUT1JZICAgMTUJCQkvKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgbGlua2VkIGxpc3QgZm9yIHRoZSBjb21tYW5kIGxpbmUgaGlzdG9yeSAqLworCisjZGVmaW5lIEVTQwkyNworI2RlZmluZSBERUwJMTI3CisKK3N0YXRpYyBzdHJ1Y3QgaGlzdG9yeSAqaGlzX2Zyb250ID0gTlVMTDsJLyogRmlyc3QgZWxlbWVudCBpbiBjb21tYW5kIGxpbmUgbGlzdCAqLworc3RhdGljIHN0cnVjdCBoaXN0b3J5ICpoaXNfZW5kID0gTlVMTDsJCS8qIExhc3QgZWxlbWVudCBpbiBjb21tYW5kIGxpbmUgbGlzdCAqLworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIG9sZF90ZXJtLCBuZXdfdGVybTsJLyogQ3VycmVudCB0ZXJtaW8gYW5kIHRoZSBwcmV2aW91cyB0ZXJtaW8gYmVmb3JlIHN0YXJ0aW5nIGFzaCAqLworCitzdGF0aWMgaW50IGhpc3RvcnlfY291bnRlciA9IDA7CQkJLyogTnVtYmVyIG9mIGNvbW1hbmRzIGluIGhpc3RvcnkgbGlzdCAqLworc3RhdGljIGludCByZXNldF90ZXJtID0gMDsJCQkvKiBTZXQgdG8gdHJ1ZSBpZiB0aGUgdGVybWluYWwgbmVlZHMgdG8gYmUgcmVzZXQgdXBvbiBleGl0ICovCitzdGF0aWMgaW50IGhldGlvX2ludGVyID0gMDsKKworc3RydWN0IGhpc3RvcnkKK3sKKyAgIGNoYXIgKnM7CisgICBzdHJ1Y3QgaGlzdG9yeSAqcDsKKyAgIHN0cnVjdCBoaXN0b3J5ICpuOworfTsKKworCit2b2lkIGlucHV0X2RlbGV0ZSAgICAoaW50KTsKK3ZvaWQgaW5wdXRfaG9tZSAgICAgIChpbnQgKik7Cit2b2lkIGlucHV0X2VuZCAgICAgICAoaW50ICosIGludCk7Cit2b2lkIGlucHV0X2JhY2tzcGFjZSAoaW50ICosIGludCAqKTsKKworCisKK3ZvaWQgaGV0aW9faW5pdCh2b2lkKQoreworCWhldGlvX2ludGVyID0gMTsKK30KKworCit2b2lkIGhldGlvX3Jlc2V0X3Rlcm0odm9pZCkKK3sKKwlpZiAocmVzZXRfdGVybSkKKwkJdGNzZXRhdHRyKDEsIFRDU0FOT1csICZvbGRfdGVybSk7Cit9CisKKwordm9pZCBzZXRJTyhzdHJ1Y3QgdGVybWlvcyAqbmV3LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQkvKiBTZXQgdGVybWluYWwgSU8gdG8gY2Fub25pY2FsIG1vZGUsIGFuZCBzYXZlIG9sZCB0ZXJtIHNldHRpbmdzLiAqLworeworCXRjZ2V0YXR0cigwLCBvbGQpOworCW1lbWNweShuZXcsIG9sZCwgc2l6ZW9mKCpuZXcpKTsKKwluZXctPmNfY2NbVk1JTl0gPSAxOworCW5ldy0+Y19jY1tWVElNRV0gPSAwOworCW5ldy0+Y19sZmxhZyAmPSB+SUNBTk9OOyAvKiB1bmJ1ZmZlcmVkIGlucHV0ICovCisJbmV3LT5jX2xmbGFnICY9IH5FQ0hPOworCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCBuZXcpOworfQorCit2b2lkIGlucHV0X2hvbWUoaW50ICpjdXJzb3IpCQkJCS8qIENvbW1hbmQgbGluZSBpbnB1dCByb3V0aW5lcyAqLworeworIAl3aGlsZSAoKmN1cnNvciA+IDApIHsKKwkJb3V0MWMoJ1xiJyk7CisJCS0tKmN1cnNvcjsKKwl9CisJZmx1c2hvdXQob3V0MSk7Cit9CisKKwordm9pZCBpbnB1dF9kZWxldGUoaW50IGN1cnNvcikKK3sKKwlpbnQgaiA9IDA7CisKKwltZW1tb3ZlKHBhcnNlbmV4dGMgKyBjdXJzb3IsIHBhcnNlbmV4dGMgKyBjdXJzb3IgKyAxLAorCQlCVUZTSVogLSBjdXJzb3IgLSAxKTsKKwlmb3IgKGogPSBjdXJzb3I7IGogPCAoQlVGU0laIC0gMSk7IGorKykgeworCQlpZiAoISoocGFyc2VuZXh0YyArIGopKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCW91dDFjKCoocGFyc2VuZXh0YyArIGopKTsKKwl9CisKKwlvdXQxc3RyKCIgXGIiKTsKKworCXdoaWxlIChqLS0gPiBjdXJzb3IpCisJCW91dDFjKCdcYicpOworCWZsdXNob3V0KG91dDEpOworfQorCisKK3ZvaWQgaW5wdXRfZW5kKGludCAqY3Vyc29yLCBpbnQgbGVuKQoreworCXdoaWxlICgqY3Vyc29yIDwgbGVuKSB7CisJCW91dDFzdHIoIlwwMzNbQyIpOworCQkrKypjdXJzb3I7CisJfQorCWZsdXNob3V0KG91dDEpOworfQorCisKK3ZvaWQKK2lucHV0X2JhY2tzcGFjZShpbnQgKmN1cnNvciwgaW50ICpsZW4pCit7CisJaW50IGogPSAwOworCisJaWYgKCpjdXJzb3IgPiAwKSB7CisJCW91dDFzdHIoIlxiIFxiIik7CisJCS0tKmN1cnNvcjsKKwkJbWVtbW92ZShwYXJzZW5leHRjICsgKmN1cnNvciwgcGFyc2VuZXh0YyArICpjdXJzb3IgKyAxLAorCQkJQlVGU0laIC0gKmN1cnNvciArIDEpOworCisJCWZvciAoaiA9ICpjdXJzb3I7IGogPCAoQlVGU0laIC0gMSk7IGorKykgeworCQkJaWYgKCEqKHBhcnNlbmV4dGMgKyBqKSkKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQlvdXQxYygqKHBhcnNlbmV4dGMgKyBqKSk7CisJCX0KKworCQlvdXQxc3RyKCIgXGIiKTsKKworCQl3aGlsZSAoai0tID4gKmN1cnNvcikKKwkJCW91dDFjKCdcYicpOworCisJCS0tKmxlbjsKKwkJZmx1c2hvdXQob3V0MSk7CisJfQorfQorCitpbnQgaGV0aW9fcmVhZF9pbnB1dChpbnQgZmQpCit7CisJaW50IG5yID0gMDsKKworCS8qIEFyZSB3ZSBhbiBpbnRlcmFjdGl2ZSBzaGVsbD8gKi8KKwlpZiAoIWhldGlvX2ludGVyIHx8IGZkKSB7CisJCXJldHVybiAtMjU1OworCX0gZWxzZSB7CisJCWludCBsZW4gPSAwOworCQlpbnQgaiA9IDA7CisJCWludCBjdXJzb3IgPSAwOworCQlpbnQgYnJlYWtfb3V0ID0gMDsKKwkJaW50IHJldCA9IDA7CisJCWNoYXIgYyA9IDA7CisJCXN0cnVjdCBoaXN0b3J5ICpocCA9IGhpc19lbmQ7CisKKwkJaWYgKCFyZXNldF90ZXJtKSB7CisJCQlzZXRJTygmbmV3X3Rlcm0sICZvbGRfdGVybSk7CisJCQlyZXNldF90ZXJtID0gMTsKKwkJfSBlbHNlIHsKKwkJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmbmV3X3Rlcm0pOworCQl9CisKKwkJbWVtc2V0KHBhcnNlbmV4dGMsIDAsIEJVRlNJWik7CisKKwkJd2hpbGUgKDEpIHsKKwkJCWlmICgocmV0ID0gcmVhZChmZCwgJmMsIDEpKSA8IDEpCisJCQkJcmV0dXJuIHJldDsKKworCQkJc3dpdGNoIChjKSB7CisgICAJCQkJY2FzZSAxOgkJLyogQ29udHJvbC1BIEJlZ2lubmluZyBvZiBsaW5lICovCisgICAJCQkJCWlucHV0X2hvbWUoJmN1cnNvcik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToJCS8qIENvbnRyb2wtRSBFT0wgKi8KKwkJCQkJaW5wdXRfZW5kKCZjdXJzb3IsIGxlbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoJCS8qIENvbnRyb2wtRCAqLworCQkJCQlpZiAoIWxlbikKKwkJCQkJCWV4aXRzaGVsbCgwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyMTogCS8qIENvbnRyb2wtVSAqLworCQkJCQkvKiBSZXR1cm4gdG8gYmVnaW5pbmcgb2YgbGluZS4gKi8KKwkJCQkJZm9yICg7IGN1cnNvciA+IDA7IGN1cnNvci0tKQorCQkJCQkJb3V0MWMoJ1xiJyk7CisJCQkJCS8qIEVyYXNlIG9sZCBjb21tYW5kLiAqLworCQkJCQlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBDbGVhciBidWZmZXIgd2hpbGUgd2UncmUgYXQKKwkJCQkJCSAqIGl0LgorCQkJCQkJICovCisJCQkJCQlwYXJzZW5leHRjW2pdID0gMDsKKwkJCQkJCW91dDFjKCcgJyk7CisJCQkJCX0KKwkJCQkJLyogcmV0dXJuIHRvIGJlZ2luaW5nIG9mIGxpbmUgKi8KKwkJCQkJZm9yICg7IGxlbiA+IDA7IGxlbi0tKQorCQkJCQkJb3V0MWMoJ1xiJyk7CisJCQkJCWZsdXNob3V0KG91dDEpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdcYic6CS8qIEJhY2tzcGFjZSAqLworCQkJCWNhc2UgREVMOgorCQkJCQlpbnB1dF9iYWNrc3BhY2UoJmN1cnNvciwgJmxlbik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xuJzoJLyogRW50ZXIgKi8KKwkJCQkJKihwYXJzZW5leHRjICsgbGVuKysgKyAxKSA9IGM7CisJCQkJCW91dDFjKGMpOworCQkJCQlmbHVzaG91dChvdXQxKTsKKwkJCQkJYnJlYWtfb3V0ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFU0M6CS8qIGVzY2FwZSBzZXF1ZW5jZSBmb2xsb3dzICovCisJCQkJCWlmICgocmV0ID0gcmVhZChmZCwgJmMsIDEpKSA8IDEpCisJCQkJCQlyZXR1cm4gcmV0OworCisJCQkJCWlmIChjID09ICdbJyApIHsgICAgLyogOTEgKi8KKwkJCQkJCWlmICgocmV0ID0gcmVhZChmZCwgJmMsIDEpKSA8IDEpCisJCQkJCQkJcmV0dXJuIHJldDsKKworCQkJCQkJc3dpdGNoIChjKSB7CisJCQkJCQkJY2FzZSAnQSc6CisJCQkJCQkJCWlmIChocCAmJiBocC0+cCkgewkJLyogVXAgKi8KKwkJCQkJCQkJCWhwID0gaHAtPnA7CisJCQkJCQkJCQlnb3RvIGhvcDsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdCJzoKKwkJCQkJCQkJaWYgKGhwICYmIGhwLT5uICYmIGhwLT5uLT5zKSB7CS8qIERvd24gKi8KKwkJCQkJCQkJCWhwID0gaHAtPm47CisJCQkJCQkJCQlnb3RvIGhvcDsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKworaG9wOgkJCQkJCS8qIGhvcCAqLworCQkJCQkJCQlsZW4gPSBzdHJsZW4ocGFyc2VuZXh0Yyk7CisKKwkJCQkJCQkJZm9yICg7IGN1cnNvciA+IDA7IGN1cnNvci0tKQkJLyogcmV0dXJuIHRvIGJlZ2luaW5nIG9mIGxpbmUgKi8KKwkJCQkJCQkJCW91dDFjKCdcYicpOworCisJCSAgIAkJCQkJCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykJCS8qIGVyYXNlIG9sZCBjb21tYW5kICovCisJCQkJCQkJCQlvdXQxYygnICcpOworCisJCQkJCQkJCWZvciAoOyBqID4gMDsgai0tKQkJLyogcmV0dXJuIHRvIGJlZ2luaW5nIG9mIGxpbmUgKi8KKwkJCQkJCQkJCW91dDFjKCdcYicpOworCisJCQkJCQkJCXN0cmNweSAocGFyc2VuZXh0YywgaHAtPnMpOwkJLyogd3JpdGUgbmV3IGNvbW1hbmQgKi8KKwkJCQkJCQkJbGVuID0gc3RybGVuIChocC0+cyk7CisJCQkJCQkJCW91dDFzdHIocGFyc2VuZXh0Yyk7CisJCQkJCQkJCWZsdXNob3V0KG91dDEpOworCQkJCQkJCQljdXJzb3IgPSBsZW47CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ0MnOgkJLyogUmlnaHQgKi8KKwkJCQkJCQkJaWYgKGN1cnNvciA8IGxlbikgeworCQkJCQkJCQkJb3V0MXN0cigiXDAzM1tDIik7CisJCQkJCQkJCQljdXJzb3IrKzsKKwkJCQkJCQkJCWZsdXNob3V0KG91dDEpOworCQkJCQkJIAkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdEJzoJCS8qIExlZnQgKi8KKwkJCQkJCQkJaWYgKGN1cnNvciA+IDApIHsKKwkJCQkJCQkJCW91dDFzdHIoIlwwMzNbRCIpOworCQkJCQkJCQkJY3Vyc29yLS07CisJCQkJCQkJCQlmbHVzaG91dChvdXQxKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICczJzoJCS8qIERlbGV0ZSAqLworCQkJCQkJCQlpZiAoY3Vyc29yICE9IGxlbikgeworCQkJCQkJCQkJaW5wdXRfZGVsZXRlKGN1cnNvcik7CisJCQkJCQkJCQlsZW4tLTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICcxJzoJCS8qIEhvbWUgKEN0cmwtQSkgKi8KKwkJCQkJCQkJaW5wdXRfaG9tZSgmY3Vyc29yKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnNCc6CQkvKiBFbmQgKEN0cmwtRSkgKi8KKwkJCQkJCQkJaW5wdXRfZW5kKCZjdXJzb3IsIGxlbik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKGMgPT0gJzEnIHx8IGMgPT0gJzMnIHx8IGMgPT0gJzQnKQorCQkJCQkJCWlmICgocmV0ID0gcmVhZChmZCwgJmMsIDEpKSA8IDEpCisJCQkJCQkJCXJldHVybiByZXQ7ICAvKiByZWFkIDEyNiAofikgKi8KKwkJCQkJfQorCisJCQkJCWlmIChjID09ICdPJykgewkvKiA3OSAqLworCQkJCQkJaWYgKChyZXQgPSByZWFkKGZkLCAmYywgMSkpIDwgMSkKKwkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJc3dpdGNoIChjKSB7CisJCQkJCQkJY2FzZSAnSCc6CQkvKiBIb21lICh4dGVybSkgKi8KKyAgICAgIAkJCQkJCQkJaW5wdXRfaG9tZSgmY3Vyc29yKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnRic6CQkvKiBFbmQgKHh0ZXJtXyAqLworCQkJCQkJCQlpbnB1dF9lbmQoJmN1cnNvciwgbGVuKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQljID0gMDsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgkJCQkvKiBJZiBpdCdzIHJlZ3VsYXIgaW5wdXQsIGRvIHRoZSBub3JtYWwgdGhpbmcgKi8KKwkJCQkJaWYgKCFpc3ByaW50KGMpKQkJLyogU2tpcCBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgKi8KKwkJCQkJCWJyZWFrOworCisJICAgICAgIAkJCQlpZiAobGVuID49IChCVUZTSVogLSAyKSkJLyogTmVlZCB0byBsZWF2ZSBzcGFjZSBmb3IgZW50ZXIgKi8KKwkJICAJCQkJYnJlYWs7CisKKwkJCQkJbGVuKys7CisKKwkJCQkJaWYgKGN1cnNvciA9PSAobGVuIC0gMSkpIHsJLyogQXBwZW5kIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkJCQkJCSoocGFyc2VuZXh0YyArIGN1cnNvcikgPSBjOworCQkJCQl9IGVsc2UgewkJCS8qIEluc2VydCBvdGhlcndpc2UgKi8KKwkJCQkJCW1lbW1vdmUocGFyc2VuZXh0YyArIGN1cnNvciArIDEsIHBhcnNlbmV4dGMgKyBjdXJzb3IsCisJCQkJCQkJbGVuIC0gY3Vyc29yIC0gMSk7CisKKwkJCQkJCSoocGFyc2VuZXh0YyArIGN1cnNvcikgPSBjOworCisJCQkJCQlmb3IgKGogPSBjdXJzb3I7IGogPCBsZW47IGorKykKKwkJCQkJCQlvdXQxYygqKHBhcnNlbmV4dGMgKyBqKSk7CisJCQkJCQlmb3IgKDsgaiA+IGN1cnNvcjsgai0tKQorCQkJCQkJCW91dDFzdHIoIlwwMzNbRCIpOworCQkJCQl9CisKKwkJCQkJY3Vyc29yKys7CisJCQkJCW91dDFjKGMpOworCQkJCQlmbHVzaG91dChvdXQxKTsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChicmVha19vdXQpCQkvKiBFbnRlciBpcyB0aGUgY29tbWFuZCB0ZXJtaW5hdG9yLCBubyBtb3JlIGlucHV0LiAqLworCQkJCWJyZWFrOworCQl9CisKKwkJbnIgPSBsZW4gKyAxOworCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJm9sZF90ZXJtKTsKKworCQlpZiAoKihwYXJzZW5leHRjKSkgewkJLyogSGFuZGxlIGNvbW1hbmQgaGlzdG9yeSBsb2cgKi8KKwkJCXN0cnVjdCBoaXN0b3J5ICpoID0gaGlzX2VuZDsKKworCQkJaWYgKCFoKSB7ICAgICAgIC8qIE5vIHByZXZpb3VzIGhpc3RvcnkgKi8KKwkJCQloID0gaGlzX2Zyb250ID0gbWFsbG9jKHNpemVvZiAoc3RydWN0IGhpc3RvcnkpKTsKKwkJCQloLT5uID0gbWFsbG9jKHNpemVvZiAoc3RydWN0IGhpc3RvcnkpKTsKKwkJCQloLT5wID0gTlVMTDsKKwkJCQloLT5zID0gc3RyZHVwKHBhcnNlbmV4dGMpOworCisJCQkJaC0+bi0+cCA9IGg7CisJCQkJaC0+bi0+biA9IE5VTEw7CisJCQkJaC0+bi0+cyA9IE5VTEw7CisJCQkJaGlzX2VuZCA9IGgtPm47CisJCQkJaGlzdG9yeV9jb3VudGVyKys7CisJCQl9IGVsc2UgewkvKiBBZGQgYSBuZXcgaGlzdG9yeSBjb21tYW5kICovCisKKwkJCQloLT5uID0gbWFsbG9jKHNpemVvZiAoc3RydWN0IGhpc3RvcnkpKTsKKworCQkJCWgtPm4tPnAgPSBoOworCQkJCWgtPm4tPm4gPSBOVUxMOworCQkJCWgtPm4tPnMgPSBOVUxMOworCQkJCWgtPnMgPSBzdHJkdXAocGFyc2VuZXh0Yyk7CisJCQkJaGlzX2VuZCA9IGgtPm47CisKKwkJCQlpZiAoaGlzdG9yeV9jb3VudGVyID49IE1BWF9ISVNUT1JZKSB7CS8qIEFmdGVyIG1heCBoaXN0b3J5LCByZW1vdmUgdGhlIGxhc3Qga25vd24gY29tbWFuZCAqLworCQkJCQlzdHJ1Y3QgaGlzdG9yeSAqcCA9IGhpc19mcm9udC0+bjsKKworCQkJCQlwLT5wID0gTlVMTDsKKwkJCQkJZnJlZShoaXNfZnJvbnQtPnMpOworCQkJCQlmcmVlKGhpc19mcm9udCk7CisJCQkJCWhpc19mcm9udCA9IHA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGlzdG9yeV9jb3VudGVyKys7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG5yOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvaGV0aW8uaCBiL3Vzci9kYXNoL2hldGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0OTcxMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2hldGlvLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIFRlcm1pb3MgY29tbWFuZCBsaW5lIEhpc3RvcnkgYW5kIEVkaXR0aW5nIGZvciBOZXRCU0Qgc2ggKGFzaCkKKyAqIENvcHlyaWdodCAoYykgMTk5OQorICoJTWFpbiBjb2RlOglBZGFtIFJvZ295c2tpIDxyb2dveXNraUBjcy51dGV4YXMuZWR1PgorICoJRXRjOgkJRGF2ZSBDaW5lZ2UgPGRjaW5lZ2VAcHN5Y2hvc2lzLmNvbT4KKyAqCisgKiBZb3UgbWF5IHVzZSB0aGlzIGNvZGUgYXMgeW91IHdpc2gsIHNvIGxvbmcgYXMgdGhlIG9yaWdpbmFsIGF1dGhvcihzKQorICogYXJlIGF0dHJpYnV0ZWQgaW4gYW55IHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgc291cmNlIGNvZGUuCisgKiBUaGlzIGNvZGUgaXMgJ2FzIGlzJyB3aXRoIG5vIHdhcnJhbnR5LgorICogVGhpcyBjb2RlIG1heSBzYWZlbHkgYmUgY29uc3VtZWQgYnkgYSBCU0Qgb3IgR1BMIGxpY2Vuc2UuCisgKgorICogdiAwLjUgIDE5OTkwMzI4CUluaXRpYWwgcmVsZWFzZQorICoKKyAqIEZ1dHVyZSBwbGFuczogU2ltcGxlIGZpbGUgYW5kIHBhdGggbmFtZSBjb21wbGV0aW9uLiAobGlrZSBCQVNIKQorICoKKyAqLworCit2b2lkIGhldGlvX2luaXQodm9pZCk7CitpbnQgaGV0aW9fcmVhZF9pbnB1dChpbnQgZmQpOwordm9pZCBoZXRpb19yZXNldF90ZXJtKHZvaWQpOworCitleHRlcm4gaW50IGhldGlvX2ludGVyOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvaGlzdGVkaXQuYyBiL3Vzci9kYXNoL2hpc3RlZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNzkzNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2hpc3RlZGl0LmMKQEAgLTAsMCArMSw0OTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8cGF0aHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorLyoKKyAqIEVkaXRsaW5lIGFuZCBoaXN0b3J5IGZ1bmN0aW9ucyAoYW5kIGdsdWUpLgorICovCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpZm5kZWYgU01BTEwKKyNpbmNsdWRlICJteWhpc3RlZGl0LmgiCisjaW5jbHVkZSAiZXZhbC5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisKKyNkZWZpbmUgTUFYSElTVExPT1BTCTQJLyogbWF4IHJlY3Vyc2lvbnMgdGhyb3VnaCBmYyAqLworI2RlZmluZSBERUZFRElUT1IJImVkIgkvKiBkZWZhdWx0IGVkaXRvciAqc2hvdWxkKiBiZSAkRURJVE9SICovCisKK0hpc3RvcnkgKmhpc3Q7CS8qIGhpc3RvcnkgY29va2llICovCitFZGl0TGluZSAqZWw7CS8qIGVkaXRsaW5lIGNvb2tpZSAqLworaW50IGRpc3BsYXloaXN0Oworc3RhdGljIEZJTEUgKmVsX2luLCAqZWxfb3V0OworCitTVEFUSUMgY29uc3QgY2hhciAqZmNfcmVwbGFjZShjb25zdCBjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKKworI2lmZGVmIERFQlVHCitleHRlcm4gRklMRSAqdHJhY2VmaWxlOworI2VuZGlmCisKKy8qCisgKiBTZXQgaGlzdG9yeSBhbmQgZWRpdGluZyBzdGF0dXMuICBDYWxsZWQgd2hlbmV2ZXIgdGhlIHN0YXR1cyBtYXkKKyAqIGhhdmUgY2hhbmdlZCAoZmlndXJlcyBvdXQgd2hhdCB0byBkbykuCisgKi8KK3ZvaWQKK2hpc3RlZGl0KHZvaWQpCit7CisJRklMRSAqZWxfZXJyOworCisjZGVmaW5lIGVkaXRpbmcgKEVmbGFnIHx8IFZmbGFnKQorCisJaWYgKGlmbGFnKSB7CisJCWlmICghaGlzdCkgeworCQkJLyoKKwkJCSAqIHR1cm4gaGlzdG9yeSBvbgorCQkJICovCisJCQlJTlRPRkY7CisJCQloaXN0ID0gaGlzdG9yeV9pbml0KCk7CisJCQlJTlRPTjsKKworCQkJaWYgKGhpc3QgIT0gTlVMTCkKKwkJCQlzZXRoaXN0c2l6ZShoaXN0c2l6ZXZhbCgpKTsKKwkJCWVsc2UKKwkJCQlvdXQyc3RyKCJzaDogY2FuJ3QgaW5pdGlhbGl6ZSBoaXN0b3J5XG4iKTsKKwkJfQorCQlpZiAoZWRpdGluZyAmJiAhZWwgJiYgaXNhdHR5KDApKSB7IC8qICYmIGlzYXR0eSgyKSA/Pz8gKi8KKwkJCS8qCisJCQkgKiB0dXJuIGVkaXRpbmcgb24KKwkJCSAqLworCQkJSU5UT0ZGOworCQkJaWYgKGVsX2luID09IE5VTEwpCisJCQkJZWxfaW4gPSBmZG9wZW4oMCwgInIiKTsKKwkJCWlmIChlbF9vdXQgPT0gTlVMTCkKKwkJCQllbF9vdXQgPSBmZG9wZW4oMiwgInciKTsKKwkJCWlmIChlbF9pbiA9PSBOVUxMIHx8IGVsX291dCA9PSBOVUxMKQorCQkJCWdvdG8gYmFkOworCQkJZWxfZXJyID0gZWxfb3V0OworI2lmIERFQlVHCisJCQlpZiAodHJhY2VmaWxlKQorCQkJCWVsX2VyciA9IHRyYWNlZmlsZTsKKyNlbmRpZgorCQkJZWwgPSBlbF9pbml0KGFyZzAsIGVsX2luLCBlbF9vdXQsIGVsX2Vycik7CisJCQlpZiAoZWwgIT0gTlVMTCkgeworCQkJCWlmIChoaXN0KQorCQkJCQllbF9zZXQoZWwsIEVMX0hJU1QsIGhpc3RvcnksIGhpc3QpOworCQkJCWVsX3NldChlbCwgRUxfUFJPTVBULCBnZXRwcm9tcHQpOworCQkJfSBlbHNlIHsKK2JhZDoKKwkJCQlvdXQyc3RyKCJzaDogY2FuJ3QgaW5pdGlhbGl6ZSBlZGl0aW5nXG4iKTsKKwkJCX0KKwkJCUlOVE9OOworCQl9IGVsc2UgaWYgKCFlZGl0aW5nICYmIGVsKSB7CisJCQlJTlRPRkY7CisJCQllbF9lbmQoZWwpOworCQkJZWwgPSBOVUxMOworCQkJSU5UT047CisJCX0KKwkJaWYgKGVsKSB7CisJCQlpZiAoVmZsYWcpCisJCQkJZWxfc2V0KGVsLCBFTF9FRElUT1IsICJ2aSIpOworCQkJZWxzZSBpZiAoRWZsYWcpCisJCQkJZWxfc2V0KGVsLCBFTF9FRElUT1IsICJlbWFjcyIpOworCQkJZWxfc291cmNlKGVsLCBOVUxMKTsKKwkJfQorCX0gZWxzZSB7CisJCUlOVE9GRjsKKwkJaWYgKGVsKSB7CS8qIG5vIGVkaXRpbmcgaWYgbm90IGludGVyYWN0aXZlICovCisJCQllbF9lbmQoZWwpOworCQkJZWwgPSBOVUxMOworCQl9CisJCWlmIChoaXN0KSB7CisJCQloaXN0b3J5X2VuZChoaXN0KTsKKwkJCWhpc3QgPSBOVUxMOworCQl9CisJCUlOVE9OOworCX0KK30KKworCit2b2lkCitzZXRoaXN0c2l6ZShjb25zdCBjaGFyICpocykKK3sKKwlpbnQgaGlzdHNpemU7CisJSGlzdEV2ZW50IGhlOworCisJaWYgKGhpc3QgIT0gTlVMTCkgeworCQlpZiAoaHMgPT0gTlVMTCB8fCAqaHMgPT0gJ1wwJyB8fAorCQkgICAoaGlzdHNpemUgPSBhdG9pKGhzKSkgPCAwKQorCQkJaGlzdHNpemUgPSAxMDA7CisJCWhpc3RvcnkoaGlzdCwgJmhlLCBIX1NFVFNJWkUsIGhpc3RzaXplKTsKKwl9Cit9CisKK3ZvaWQKK3NldHRlcm0oY29uc3QgY2hhciAqdGVybSkKK3sKKwlpZiAoZWwgIT0gTlVMTCAmJiB0ZXJtICE9IE5VTEwpCisJCWlmIChlbF9zZXQoZWwsIEVMX1RFUk1JTkFMLCB0ZXJtKSAhPSAwKSB7CisJCQlvdXRmbXQob3V0MiwgInNoOiBDYW4ndCBzZXQgdGVybWluYWwgdHlwZSAlc1xuIiwgdGVybSk7CisJCQlvdXRmbXQob3V0MiwgInNoOiBVc2luZyBkdW1iIHRlcm1pbmFsIHNldHRpbmdzLlxuIik7CisJCX0KK30KKworLyoKKyAqICBUaGlzIGNvbW1hbmQgaXMgcHJvdmlkZWQgc2luY2UgUE9TSVggZGVjaWRlZCB0byBzdGFuZGFyZGl6ZQorICogIHRoZSBLb3JuIHNoZWxsIGZjIGNvbW1hbmQuICBPaCB3ZWxsLi4uCisgKi8KK2ludAoraGlzdGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGNoOworCWNvbnN0IGNoYXIgKmVkaXRvciA9IE5VTEw7CisJSGlzdEV2ZW50IGhlOworCWludCBsZmxnID0gMCwgbmZsZyA9IDAsIHJmbGcgPSAwLCBzZmxnID0gMDsKKwlpbnQgaSwgcmV0dmFsOworCWNvbnN0IGNoYXIgKmZpcnN0c3RyLCAqbGFzdHN0cjsKKwlpbnQgZmlyc3QsIGxhc3QsIGRpcmVjdGlvbjsKKwljaGFyICpwYXQgPSBOVUxMLCAqcmVwbDsJLyoga3NoICJmYyBvbGQ9bmV3IiBjcmFwICovCisJc3RhdGljIGludCBhY3RpdmUgPSAwOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCWNoYXIgZWRpdGZpbGVbTUFYUEFUSExFTiArIDFdOworCUZJTEUgKmVmcDsKKyNpZmRlZiBfX0dOVUNfXworCS8qIEF2b2lkIGxvbmdqbXAgY2xvYmJlcmluZyAqLworCSh2b2lkKSAmZWRpdG9yOworCSh2b2lkKSAmbGZsZzsKKwkodm9pZCkgJm5mbGc7CisJKHZvaWQpICZyZmxnOworCSh2b2lkKSAmc2ZsZzsKKwkodm9pZCkgJmZpcnN0c3RyOworCSh2b2lkKSAmbGFzdHN0cjsKKwkodm9pZCkgJnBhdDsKKwkodm9pZCkgJnJlcGw7CisJKHZvaWQpICZlZnA7CisJKHZvaWQpICZhcmdjOworCSh2b2lkKSAmYXJndjsKKyNlbmRpZgorCisJaWYgKGhpc3QgPT0gTlVMTCkKKwkJc2hfZXJyb3IoImhpc3Rvcnkgbm90IGFjdGl2ZSIpOworCisJaWYgKGFyZ2MgPT0gMSkKKwkJc2hfZXJyb3IoIm1pc3NpbmcgaGlzdG9yeSBhcmd1bWVudCIpOworCisjaWZkZWYgX19HTElCQ19fCisJb3B0aW5kID0gMDsKKyNlbHNlCisJb3B0cmVzZXQgPSAxOyBvcHRpbmQgPSAxOyAvKiBpbml0aWFsaXplIGdldG9wdCAqLworI2VuZGlmCisJd2hpbGUgKG5vdF9mY251bWJlcihhcmd2W29wdGluZF0pICYmCisJICAgICAgKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICI6ZTpsbnJzIikpICE9IC0xKQorCQlzd2l0Y2ggKChjaGFyKWNoKSB7CisJCWNhc2UgJ2UnOgorCQkJZWRpdG9yID0gb3B0aW9uYXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJbGZsZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQluZmxnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJmbGcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJc2ZsZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnOic6CisJCQlzaF9lcnJvcigib3B0aW9uIC0lYyBleHBlY3RzIGFyZ3VtZW50Iiwgb3B0b3B0KTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQlzaF9lcnJvcigidW5rbm93biBvcHRpb246IC0lYyIsIG9wdG9wdCk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwlhcmdjIC09IG9wdGluZCwgYXJndiArPSBvcHRpbmQ7CisKKwkvKgorCSAqIElmIGV4ZWN1dGluZy4uLgorCSAqLworCWlmIChsZmxnID09IDAgfHwgZWRpdG9yIHx8IHNmbGcpIHsKKwkJbGZsZyA9IDA7CS8qIGlnbm9yZSAqLworCQllZGl0ZmlsZVswXSA9ICdcMCc7CisJCS8qCisJCSAqIENhdGNoIGludGVycnVwdHMgdG8gcmVzZXQgYWN0aXZlIGNvdW50ZXIgYW5kCisJCSAqIGNsZWFudXAgdGVtcCBmaWxlcy4KKwkJICovCisJCWlmIChzZXRqbXAoam1wbG9jLmxvYykpIHsKKwkJCWFjdGl2ZSA9IDA7CisJCQlpZiAoKmVkaXRmaWxlKQorCQkJCXVubGluayhlZGl0ZmlsZSk7CisJCQloYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisJCQlsb25nam1wKGhhbmRsZXItPmxvYywgMSk7CisJCX0KKwkJc2F2ZWhhbmRsZXIgPSBoYW5kbGVyOworCQloYW5kbGVyID0gJmptcGxvYzsKKwkJaWYgKCsrYWN0aXZlID4gTUFYSElTVExPT1BTKSB7CisJCQlhY3RpdmUgPSAwOworCQkJZGlzcGxheWhpc3QgPSAwOworCQkJc2hfZXJyb3IoImNhbGxlZCByZWN1cnNpdmVseSB0b28gbWFueSB0aW1lcyIpOworCQl9CisJCS8qCisJCSAqIFNldCBlZGl0b3IuCisJCSAqLworCQlpZiAoc2ZsZyA9PSAwKSB7CisJCQlpZiAoZWRpdG9yID09IE5VTEwgJiYKKwkJCSAgICAoZWRpdG9yID0gYmx0aW5sb29rdXAoIkZDRURJVCIpKSA9PSBOVUxMICYmCisJCQkgICAgKGVkaXRvciA9IGJsdGlubG9va3VwKCJFRElUT1IiKSkgPT0gTlVMTCkKKwkJCQllZGl0b3IgPSBERUZFRElUT1I7CisJCQlpZiAoZWRpdG9yWzBdID09ICctJyAmJiBlZGl0b3JbMV0gPT0gJ1wwJykgeworCQkJCXNmbGcgPSAxOwkvKiBubyBlZGl0ICovCisJCQkJZWRpdG9yID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogSWYgZXhlY3V0aW5nLCBwYXJzZSBbb2xkPW5ld10gbm93CisJICovCisJaWYgKGxmbGcgPT0gMCAmJiBhcmdjID4gMCAmJgorCSAgICAgKChyZXBsID0gc3RyY2hyKGFyZ3ZbMF0sICc9JykpICE9IE5VTEwpKSB7CisJCXBhdCA9IGFyZ3ZbMF07CisJCSpyZXBsKysgPSAnXDAnOworCQlhcmdjLS0sIGFyZ3YrKzsKKwl9CisJLyoKKwkgKiBkZXRlcm1pbmUgW2ZpcnN0XSBhbmQgW2xhc3RdCisJICovCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAwOgorCQlmaXJzdHN0ciA9IGxmbGcgPyAiLTE2IiA6ICItMSI7CisJCWxhc3RzdHIgPSAiLTEiOworCQlicmVhazsKKwljYXNlIDE6CisJCWZpcnN0c3RyID0gYXJndlswXTsKKwkJbGFzdHN0ciA9IGxmbGcgPyAiLTEiIDogYXJndlswXTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmaXJzdHN0ciA9IGFyZ3ZbMF07CisJCWxhc3RzdHIgPSBhcmd2WzFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzaF9lcnJvcigidG9vIG1hbnkgYXJncyIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCS8qCisJICogVHVybiBpbnRvIGV2ZW50IG51bWJlcnMuCisJICovCisJZmlyc3QgPSBzdHJfdG9fZXZlbnQoZmlyc3RzdHIsIDApOworCWxhc3QgPSBzdHJfdG9fZXZlbnQobGFzdHN0ciwgMSk7CisKKwlpZiAocmZsZykgeworCQlpID0gbGFzdDsKKwkJbGFzdCA9IGZpcnN0OworCQlmaXJzdCA9IGk7CisJfQorCS8qCisJICogWFhYIC0gdGhpcyBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGUgZXZlbnQgbnVtYmVycworCSAqIGFsd2F5cyBpbmNyZWFzaW5nLiAgQWRkIHNlcXVlbmNlIG51bWJlcnMgb3Igb2Zmc2V0CisJICogdG8gdGhlIGhpc3RvcnkgZWxlbWVudCBpbiBuZXh0IChkaXNrYmFzZWQpIHJlbGVhc2UuCisJICovCisJZGlyZWN0aW9uID0gZmlyc3QgPCBsYXN0ID8gSF9QUkVWIDogSF9ORVhUOworCisJLyoKKwkgKiBJZiBlZGl0aW5nLCBncmFiIGEgdGVtcCBmaWxlLgorCSAqLworCWlmIChlZGl0b3IpIHsKKwkJaW50IGZkOworCQlJTlRPRkY7CQkvKiBlYXNpZXIgKi8KKwkJc3ByaW50ZihlZGl0ZmlsZSwgIiVzX3NoWFhYWFhYIiwgX1BBVEhfVE1QKTsKKwkJaWYgKChmZCA9IG1rc3RlbXAoZWRpdGZpbGUpKSA8IDApCisJCQlzaF9lcnJvcigiY2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIiwgZWRpdGZpbGUpOworCQlpZiAoKGVmcCA9IGZkb3BlbihmZCwgInciKSkgPT0gTlVMTCkgeworCQkJY2xvc2UoZmQpOworCQkJc2hfZXJyb3IoImNhbid0IGFsbG9jYXRlIHN0ZGlvIGJ1ZmZlciBmb3IgdGVtcCIpOworCQl9CisJfQorCisJLyoKKwkgKiBMb29wIHRocm91Z2ggc2VsZWN0ZWQgaGlzdG9yeSBldmVudHMuICBJZiBsaXN0aW5nIG9yIGV4ZWN1dGluZywKKwkgKiBkbyBpdCBub3cuICBPdGhlcndpc2UsIHB1dCBpbnRvIHRlbXAgZmlsZSBhbmQgY2FsbCB0aGUgZWRpdG9yCisJICogYWZ0ZXIuCisJICoKKwkgKiBUaGUgaGlzdG9yeSBpbnRlcmZhY2UgbmVlZHMgcmV0aGlua2luZywgYXMgdGhlIGZvbGxvd2luZworCSAqIGNvbnZvbHV0aW9ucyB3aWxsIGRlbW9uc3RyYXRlLgorCSAqLworCWhpc3RvcnkoaGlzdCwgJmhlLCBIX0ZJUlNUKTsKKwlyZXR2YWwgPSBoaXN0b3J5KGhpc3QsICZoZSwgSF9ORVhUX0VWRU5ULCBmaXJzdCk7CisJZm9yICg7cmV0dmFsICE9IC0xOyByZXR2YWwgPSBoaXN0b3J5KGhpc3QsICZoZSwgZGlyZWN0aW9uKSkgeworCQlpZiAobGZsZykgeworCQkJaWYgKCFuZmxnKQorCQkJCW91dDFmbXQoIiU1ZCAiLCBoZS5udW0pOworCQkJb3V0MXN0cihoZS5zdHIpOworCQl9IGVsc2UgeworCQkJY29uc3QgY2hhciAqcyA9IHBhdCA/CisJCQkgICBmY19yZXBsYWNlKGhlLnN0ciwgcGF0LCByZXBsKSA6IGhlLnN0cjsKKworCQkJaWYgKHNmbGcpIHsKKwkJCQlpZiAoZGlzcGxheWhpc3QpIHsKKwkJCQkJb3V0MnN0cihzKTsKKwkJCQl9CisKKwkJCQlldmFsc3RyaW5nKHN0cmNweShzdGFsbG9jKHN0cmxlbihzKSArIDEpLCBzKSwKKwkJCQkJICAgfjApOworCQkJCWlmIChkaXNwbGF5aGlzdCAmJiBoaXN0KSB7CisJCQkJCS8qCisJCQkJCSAqICBYWFggd2hhdCBhYm91dCByZWN1cnNpdmUgYW5kCisJCQkJCSAqICByZWxhdGl2ZSBoaXN0bnVtcy4KKwkJCQkJICovCisJCQkJCWhpc3RvcnkoaGlzdCwgJmhlLCBIX0VOVEVSLCBzKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlmcHV0cyhzLCBlZnApOworCQl9CisJCS8qCisJCSAqIEF0IGVuZD8gIChpZiB3ZSB3ZXJlIHRvIGxvc2UgbGFzdCwgd2UnZCBzdXJlIGJlCisJCSAqIG1lc3NlZCB1cCkuCisJCSAqLworCQlpZiAoaGUubnVtID09IGxhc3QpCisJCQlicmVhazsKKwl9CisJaWYgKGVkaXRvcikgeworCQljaGFyICplZGl0Y21kOworCisJCWZjbG9zZShlZnApOworCQllZGl0Y21kID0gc3RhbGxvYyhzdHJsZW4oZWRpdG9yKSArIHN0cmxlbihlZGl0ZmlsZSkgKyAyKTsKKwkJc3ByaW50ZihlZGl0Y21kLCAiJXMgJXMiLCBlZGl0b3IsIGVkaXRmaWxlKTsKKwkJLyogWFhYIC0gc2hvdWxkIHVzZSBubyBKQyBjb21tYW5kICovCisJCWV2YWxzdHJpbmcoZWRpdGNtZCwgfjApOworCQlJTlRPTjsKKwkJcmVhZGNtZGZpbGUoZWRpdGZpbGUpOwkvKiBYWFggLSBzaG91bGQgcmVhZCBiYWNrIC0gcXVpY2sgdHN0ICovCisJCXVubGluayhlZGl0ZmlsZSk7CisJfQorCisJaWYgKGxmbGcgPT0gMCAmJiBhY3RpdmUgPiAwKQorCQktLWFjdGl2ZTsKKwlpZiAoZGlzcGxheWhpc3QpCisJCWRpc3BsYXloaXN0ID0gMDsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGNvbnN0IGNoYXIgKgorZmNfcmVwbGFjZShjb25zdCBjaGFyICpzLCBjaGFyICpwLCBjaGFyICpyKQoreworCWNoYXIgKmRlc3Q7CisJaW50IHBsZW4gPSBzdHJsZW4ocCk7CisKKwlTVEFSVFNUQUNLU1RSKGRlc3QpOworCXdoaWxlICgqcykgeworCQlpZiAoKnMgPT0gKnAgJiYgc3RybmNtcChzLCBwLCBwbGVuKSA9PSAwKSB7CisJCQl3aGlsZSAoKnIpCisJCQkJU1RQVVRDKCpyKyssIGRlc3QpOworCQkJcyArPSBwbGVuOworCQkJKnAgPSAnXDAnOwkvKiBzbyBubyBtb3JlIG1hdGNoZXMgKi8KKwkJfSBlbHNlCisJCQlTVFBVVEMoKnMrKywgZGVzdCk7CisJfQorCVNUQUNLU1RSTlVMKGRlc3QpOworCWRlc3QgPSBncmFic3RhY2tzdHIoZGVzdCk7CisKKwlyZXR1cm4gKGRlc3QpOworfQorCitpbnQKK25vdF9mY251bWJlcihjaGFyICpzKQoreworCWlmIChzID09IE5VTEwpCisJCXJldHVybiAwOworICAgICAgICBpZiAoKnMgPT0gJy0nKQorICAgICAgICAgICAgICAgIHMrKzsKKwlyZXR1cm4gKCFpc19udW1iZXIocykpOworfQorCitpbnQKK3N0cl90b19ldmVudChjb25zdCBjaGFyICpzdHIsIGludCBsYXN0KQoreworCUhpc3RFdmVudCBoZTsKKwljb25zdCBjaGFyICpzID0gc3RyOworCWludCByZWxhdGl2ZSA9IDA7CisJaW50IGksIHJldHZhbDsKKworCXJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLCBIX0ZJUlNUKTsKKwlzd2l0Y2ggKCpzKSB7CisJY2FzZSAnLSc6CisJCXJlbGF0aXZlID0gMTsKKwkJLypGQUxMVEhST1VHSCovCisJY2FzZSAnKyc6CisJCXMrKzsKKwl9CisJaWYgKGlzX251bWJlcihzKSkgeworCQlpID0gYXRvaShzKTsKKwkJaWYgKHJlbGF0aXZlKSB7CisJCQl3aGlsZSAocmV0dmFsICE9IC0xICYmIGktLSkgeworCQkJCXJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLCBIX05FWFQpOworCQkJfQorCQkJaWYgKHJldHZhbCA9PSAtMSkKKwkJCQlyZXR2YWwgPSBoaXN0b3J5KGhpc3QsICZoZSwgSF9MQVNUKTsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLCBIX05FWFRfRVZFTlQsIGkpOworCQkJaWYgKHJldHZhbCA9PSAtMSkgeworCQkJCS8qCisJCQkJICogdGhlIG5vdGlvbiBvZiBmaXJzdCBhbmQgbGFzdCBpcworCQkJCSAqIGJhY2t3YXJkcyB0byB0aGF0IG9mIHRoZSBoaXN0b3J5IHBhY2thZ2UKKwkJCQkgKi8KKwkJCQlyZXR2YWwgPSBoaXN0b3J5KGhpc3QsICZoZSwKKwkJCQkJCWxhc3QgPyBIX0ZJUlNUIDogSF9MQVNUKTsKKwkJCX0KKwkJfQorCQlpZiAocmV0dmFsID09IC0xKQorCQkJc2hfZXJyb3IoImhpc3RvcnkgbnVtYmVyICVzIG5vdCBmb3VuZCAoaW50ZXJuYWwgZXJyb3IpIiwKKwkJCQkgc3RyKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBwYXR0ZXJuCisJCSAqLworCQlyZXR2YWwgPSBoaXN0b3J5KGhpc3QsICZoZSwgSF9QUkVWX1NUUiwgc3RyKTsKKwkJaWYgKHJldHZhbCA9PSAtMSkKKwkJCXNoX2Vycm9yKCJoaXN0b3J5IHBhdHRlcm4gbm90IGZvdW5kOiAlcyIsIHN0cik7CisJfQorCXJldHVybiAoaGUubnVtKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvaW5pdC5oIGIvdXNyL2Rhc2gvaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjZlODYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9pbml0LmgKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpbml0LmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKwordm9pZCBpbml0KHZvaWQpOwordm9pZCByZXNldCh2b2lkKTsKK3ZvaWQgaW5pdHNoZWxscHJvYyh2b2lkKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2lucHV0LmMgYi91c3IvZGFzaC9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1N2RhNzEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9pbnB1dC5jCkBAIC0wLDAgKzEsNTYzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIGRlZmluZXMgQlVGU0laICovCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBpbnB1dCByb3V0aW5lcyB1c2VkIGJ5IHRoZSBwYXJzZXIuCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAicmVkaXIuaCIKKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJpbnB1dC5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAiYWxpYXMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaWZuZGVmIFNNQUxMCisjaW5jbHVkZSAibXloaXN0ZWRpdC5oIgorI2VuZGlmCisKKyNpZmRlZiBIRVRJTworI2luY2x1ZGUgImhldGlvLmgiCisjZW5kaWYKKworI2RlZmluZSBFT0ZfTkxFRlQgLTk5CQkvKiB2YWx1ZSBvZiBwYXJzZW5sZWZ0IHdoZW4gRU9GIHB1c2hlZCBiYWNrICovCisjZGVmaW5lIElCVUZTSVogKEJVRlNJWiArIDEpCisKK01LSU5JVAorc3RydWN0IHN0cnB1c2ggeworCXN0cnVjdCBzdHJwdXNoICpwcmV2OwkvKiBwcmVjZWRpbmcgc3RyaW5nIG9uIHN0YWNrICovCisJY2hhciAqcHJldnN0cmluZzsKKwlpbnQgcHJldm5sZWZ0OworCXN0cnVjdCBhbGlhcyAqYXA7CS8qIGlmIHB1c2ggd2FzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGlhcyAqLworCWNoYXIgKnN0cmluZzsJCS8qIHJlbWVtYmVyIHRoZSBzdHJpbmcgc2luY2UgaXQgbWF5IGNoYW5nZSAqLworfTsKKworLyoKKyAqIFRoZSBwYXJzZWZpbGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGdsb2JhbCB2YXJpYWJsZSBwYXJzZWZpbGUKKyAqIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgYmVpbmcgcmVhZC4KKyAqLworCitNS0lOSVQKK3N0cnVjdCBwYXJzZWZpbGUgeworCXN0cnVjdCBwYXJzZWZpbGUgKnByZXY7CS8qIHByZWNlZGluZyBmaWxlIG9uIHN0YWNrICovCisJaW50IGxpbm5vOwkJLyogY3VycmVudCBsaW5lICovCisJaW50IGZkOwkJCS8qIGZpbGUgZGVzY3JpcHRvciAob3IgLTEgaWYgc3RyaW5nKSAqLworCWludCBubGVmdDsJCS8qIG51bWJlciBvZiBjaGFycyBsZWZ0IGluIHRoaXMgbGluZSAqLworCWludCBsbGVmdDsJCS8qIG51bWJlciBvZiBjaGFycyBsZWZ0IGluIHRoaXMgYnVmZmVyICovCisJY2hhciAqbmV4dGM7CQkvKiBuZXh0IGNoYXIgaW4gYnVmZmVyICovCisJY2hhciAqYnVmOwkJLyogaW5wdXQgYnVmZmVyICovCisJc3RydWN0IHN0cnB1c2ggKnN0cnB1c2g7IC8qIGZvciBwdXNoaW5nIHN0cmluZ3MgYXQgdGhpcyBsZXZlbCAqLworCXN0cnVjdCBzdHJwdXNoIGJhc2VzdHJwdXNoOyAvKiBzbyBwdXNoaW5nIG9uZSBpcyBmYXN0ICovCit9OworCisKK2ludCBwbGlubm8gPSAxOwkJCS8qIGlucHV0IGxpbmUgbnVtYmVyICovCitpbnQgcGFyc2VubGVmdDsJCQkvKiBjb3B5IG9mIHBhcnNlZmlsZS0+bmxlZnQgKi8KK01LSU5JVCBpbnQgcGFyc2VsbGVmdDsJCS8qIGNvcHkgb2YgcGFyc2VmaWxlLT5sbGVmdCAqLworY2hhciAqcGFyc2VuZXh0YzsJCS8qIGNvcHkgb2YgcGFyc2VmaWxlLT5uZXh0YyAqLworTUtJTklUIHN0cnVjdCBwYXJzZWZpbGUgYmFzZXBmOwkvKiB0b3AgbGV2ZWwgaW5wdXQgZmlsZSAqLworTUtJTklUIGNoYXIgYmFzZWJ1ZltJQlVGU0laXTsJLyogYnVmZmVyIGZvciB0b3AgbGV2ZWwgaW5wdXQgZmlsZSAqLworc3RydWN0IHBhcnNlZmlsZSAqcGFyc2VmaWxlID0gJmJhc2VwZjsJLyogY3VycmVudCBpbnB1dCBmaWxlICovCitpbnQgd2hpY2hwcm9tcHQ7CQkvKiAxID09IFBTMSwgMiA9PSBQUzIgKi8KKworI2lmbmRlZiBTTUFMTAorRWRpdExpbmUgKmVsOwkJCS8qIGNvb2tpZSBmb3IgZWRpdGxpbmUgcGFja2FnZSAqLworI2VuZGlmCisKK1NUQVRJQyB2b2lkIHB1c2hmaWxlKHZvaWQpOworc3RhdGljIGludCBwcmVhZGZkKHZvaWQpOworCisjaWZkZWYgbWtpbml0CitJTkNMVURFIDxzdGRpby5oPgorSU5DTFVERSAiaW5wdXQuaCIKK0lOQ0xVREUgImVycm9yLmgiCisKK0lOSVQgeworCWJhc2VwZi5uZXh0YyA9IGJhc2VwZi5idWYgPSBiYXNlYnVmOworfQorCitSRVNFVCB7CisJcGFyc2VsbGVmdCA9IHBhcnNlbmxlZnQgPSAwOwkvKiBjbGVhciBpbnB1dCBidWZmZXIgKi8KKwlwb3BhbGxmaWxlcygpOworfQorI2VuZGlmCisKKworLyoKKyAqIFJlYWQgYSBsaW5lIGZyb20gdGhlIHNjcmlwdC4KKyAqLworCitjaGFyICoKK3BmZ2V0cyhjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWNoYXIgKnAgPSBsaW5lOworCWludCBubGVmdCA9IGxlbjsKKwlpbnQgYzsKKworCXdoaWxlICgtLW5sZWZ0ID4gMCkgeworCQljID0gcGdldGMyKCk7CisJCWlmIChjID09IFBFT0YpIHsKKwkJCWlmIChwID09IGxpbmUpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJfQorCQkqcCsrID0gYzsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwkqcCA9ICdcMCc7CisJcmV0dXJuIGxpbmU7Cit9CisKKworLyoKKyAqIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgc2NyaXB0LCByZXR1cm5pbmcgUEVPRiBvbiBlbmQgb2YgZmlsZS4KKyAqIE51bCBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCBhcmUgc2lsZW50bHkgZGlzY2FyZGVkLgorICovCisKK2ludAorcGdldGModm9pZCkKK3sKKwlyZXR1cm4gcGdldGNfbWFjcm8oKTsKK30KKworCisvKgorICogU2FtZSBhcyBwZ2V0YygpLCBidXQgaWdub3JlcyBQRU9BLgorICovCisKK2ludAorcGdldGMyKCkKK3sKKwlpbnQgYzsKKwlkbyB7CisJCWMgPSBwZ2V0Y19tYWNybygpOworCX0gd2hpbGUgKGMgPT0gUEVPQSk7CisJcmV0dXJuIGM7Cit9CisKKworc3RhdGljIGludAorcHJlYWRmZCh2b2lkKQoreworCWludCBucjsKKwljaGFyICpidWYgPSAgcGFyc2VmaWxlLT5idWY7CisJcGFyc2VuZXh0YyA9IGJ1ZjsKKworcmV0cnk6CisjaWZuZGVmIFNNQUxMCisJaWYgKHBhcnNlZmlsZS0+ZmQgPT0gMCAmJiBlbCkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqcmxfY3A7CisJCXN0YXRpYyBpbnQgZWxfbGVuOworCisJCWlmIChybF9jcCA9PSBOVUxMKQorCQkJcmxfY3AgPSBlbF9nZXRzKGVsLCAmZWxfbGVuKTsKKwkJaWYgKHJsX2NwID09IE5VTEwpCisJCQluciA9IDA7CisJCWVsc2UgeworCQkJbnIgPSBlbF9sZW47CisJCQlpZiAobnIgPiBJQlVGU0laIC0gMSkKKwkJCQluciA9IElCVUZTSVogLSAxOworCQkJbWVtY3B5KGJ1ZiwgcmxfY3AsIG5yKTsKKwkJCWlmIChuciAhPSBlbF9sZW4pIHsKKwkJCQllbF9sZW4gLT0gbnI7CisJCQkJcmxfY3AgKz0gbnI7CisJCQl9IGVsc2UKKwkJCQlybF9jcCA9IDA7CisJCX0KKworCX0gZWxzZQorI2VuZGlmCisKKyNpZmRlZiBIRVRJTworCQluciA9IGhldGlvX3JlYWRfaW5wdXQocGFyc2VmaWxlLT5mZCk7CisJCWlmIChuciA9PSAtMjU1KQorI2VuZGlmCisJCW5yID0gcmVhZChwYXJzZWZpbGUtPmZkLCBidWYsIElCVUZTSVogLSAxKTsKKworCisJaWYgKG5yIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQlnb3RvIHJldHJ5OworCQlpZiAocGFyc2VmaWxlLT5mZCA9PSAwICYmIGVycm5vID09IEVXT1VMREJMT0NLKSB7CisJCQlpbnQgZmxhZ3MgPSBmY250bCgwLCBGX0dFVEZMLCAwKTsKKwkJCWlmIChmbGFncyA+PSAwICYmIGZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWZsYWdzICY9fiBPX05PTkJMT0NLOworCQkJCWlmIChmY250bCgwLCBGX1NFVEZMLCBmbGFncykgPj0gMCkgeworCQkJCQlvdXQyc3RyKCJzaDogdHVybmluZyBvZmYgTkRFTEFZIG1vZGVcbiIpOworCQkJCQlnb3RvIHJldHJ5OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbnI7Cit9CisKKy8qCisgKiBSZWZpbGwgdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmV0dXJuIHRoZSBuZXh0IGlucHV0IGNoYXJhY3RlcjoKKyAqCisgKiAxKSBJZiBhIHN0cmluZyB3YXMgcHVzaGVkIGJhY2sgb24gdGhlIGlucHV0LCBwb3AgaXQ7CisgKiAyKSBJZiBhbiBFT0Ygd2FzIHB1c2hlZCBiYWNrIChwYXJzZW5sZWZ0ID09IEVPRl9OTEVGVCkgb3Igd2UgYXJlIHJlYWRpbmcKKyAqICAgIGZyb20gYSBzdHJpbmcgc28gd2UgY2FuJ3QgcmVmaWxsIHRoZSBidWZmZXIsIHJldHVybiBFT0YuCisgKiAzKSBJZiB0aGUgaXMgbW9yZSBzdHVmZiBpbiB0aGlzIGJ1ZmZlciwgdXNlIGl0IGVsc2UgY2FsbCByZWFkIHRvIGZpbGwgaXQuCisgKiA0KSBQcm9jZXNzIGlucHV0IHVwIHRvIHRoZSBuZXh0IG5ld2xpbmUsIGRlbGV0aW5nIG51bCBjaGFyYWN0ZXJzLgorICovCisKK2ludAorcHJlYWRidWZmZXIodm9pZCkKK3sKKwljaGFyICpxOworCWludCBtb3JlOworI2lmbmRlZiBTTUFMTAorCWludCBzb21ldGhpbmc7CisjZW5kaWYKKwljaGFyIHNhdmVjOworCisJd2hpbGUgKHVubGlrZWx5KHBhcnNlZmlsZS0+c3RycHVzaCkpIHsKKwkJaWYgKAorCQkJcGFyc2VubGVmdCA9PSAtMSAmJiBwYXJzZWZpbGUtPnN0cnB1c2gtPmFwICYmCisJCQlwYXJzZW5leHRjWy0xXSAhPSAnICcgJiYgcGFyc2VuZXh0Y1stMV0gIT0gJ1x0JworCQkpIHsKKwkJCXJldHVybiBQRU9BOworCQl9CisJCXBvcHN0cmluZygpOworCQlpZiAoLS1wYXJzZW5sZWZ0ID49IDApCisJCQlyZXR1cm4gKHNpZ25lZCBjaGFyKSpwYXJzZW5leHRjKys7CisJfQorCWlmICh1bmxpa2VseShwYXJzZW5sZWZ0ID09IEVPRl9OTEVGVCB8fCBwYXJzZWZpbGUtPmJ1ZiA9PSBOVUxMKSkKKwkJcmV0dXJuIFBFT0Y7CisJZmx1c2hvdXQoJm91dHB1dCk7CisjaWZkZWYgRkxVU0hFUlIKKwlmbHVzaG91dCgmZXJyb3V0KTsKKyNlbmRpZgorCisJbW9yZSA9IHBhcnNlbGxlZnQ7CisJaWYgKG1vcmUgPD0gMCkgeworYWdhaW46CisJCWlmICgobW9yZSA9IHByZWFkZmQoKSkgPD0gMCkgeworCQkJcGFyc2VsbGVmdCA9IHBhcnNlbmxlZnQgPSBFT0ZfTkxFRlQ7CisJCQlyZXR1cm4gUEVPRjsKKwkJfQorCX0KKworCXEgPSBwYXJzZW5leHRjOworCisJLyogZGVsZXRlIG51bCBjaGFyYWN0ZXJzICovCisjaWZuZGVmIFNNQUxMCisJc29tZXRoaW5nID0gMDsKKyNlbmRpZgorCWZvciAoOzspIHsKKwkJaW50IGM7CisKKwkJbW9yZS0tOworCQljID0gKnE7CisKKwkJaWYgKCFjKQorCQkJbWVtbW92ZShxLCBxICsgMSwgbW9yZSk7CisJCWVsc2UgeworCQkJcSsrOworCisJCQlpZiAoYyA9PSAnXG4nKSB7CisJCQkJcGFyc2VubGVmdCA9IHEgLSBwYXJzZW5leHRjIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworI2lmbmRlZiBTTUFMTAorCQkJc3dpdGNoIChjKSB7CisJCQlkZWZhdWx0OgorCQkJCXNvbWV0aGluZyA9IDE7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQljYXNlICdcdCc6CisJCQljYXNlICcgJzoKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJaWYgKG1vcmUgPD0gMCkgeworCQkJcGFyc2VubGVmdCA9IHEgLSBwYXJzZW5leHRjIC0gMTsKKwkJCWlmIChwYXJzZW5sZWZ0IDwgMCkKKwkJCQlnb3RvIGFnYWluOworCQkJYnJlYWs7CisJCX0KKwl9CisJcGFyc2VsbGVmdCA9IG1vcmU7CisKKwlzYXZlYyA9ICpxOworCSpxID0gJ1wwJzsKKworI2lmbmRlZiBTTUFMTAorCWlmIChwYXJzZWZpbGUtPmZkID09IDAgJiYgaGlzdCAmJiBzb21ldGhpbmcpIHsKKwkJSGlzdEV2ZW50IGhlOworCQlJTlRPRkY7CisJCWhpc3RvcnkoaGlzdCwgJmhlLCB3aGljaHByb21wdCA9PSAxPyBIX0VOVEVSIDogSF9BUFBFTkQsCisJCSAgICBwYXJzZW5leHRjKTsKKwkJSU5UT047CisJfQorI2VuZGlmCisKKwlpZiAodmZsYWcpIHsKKwkJb3V0MnN0cihwYXJzZW5leHRjKTsKKyNpZmRlZiBGTFVTSEVSUgorCQlmbHVzaG91dChvdXQyKTsKKyNlbmRpZgorCX0KKworCSpxID0gc2F2ZWM7CisKKwlyZXR1cm4gKHNpZ25lZCBjaGFyKSpwYXJzZW5leHRjKys7Cit9CisKKy8qCisgKiBVbmRvIHRoZSBsYXN0IGNhbGwgdG8gcGdldGMuICBPbmx5IG9uZSBjaGFyYWN0ZXIgbWF5IGJlIHB1c2hlZCBiYWNrLgorICogUEVPRiBtYXkgYmUgcHVzaGVkIGJhY2suCisgKi8KKwordm9pZAorcHVuZ2V0Yyh2b2lkKQoreworCXBhcnNlbmxlZnQrKzsKKwlwYXJzZW5leHRjLS07Cit9CisKKy8qCisgKiBQdXNoIGEgc3RyaW5nIGJhY2sgb250byB0aGUgaW5wdXQgYXQgdGhpcyBjdXJyZW50IHBhcnNlZmlsZSBsZXZlbC4KKyAqIFdlIGhhbmRsZSBhbGlhc2VzIHRoaXMgd2F5LgorICovCit2b2lkCitwdXNoc3RyaW5nKGNoYXIgKnMsIHZvaWQgKmFwKQoreworCXN0cnVjdCBzdHJwdXNoICpzcDsKKwlzaXplX3QgbGVuOworCisJbGVuID0gc3RybGVuKHMpOworCUlOVE9GRjsKKy8qZHByaW50ZigiKioqIGNhbGxpbmcgcHVzaHN0cmluZzogJXMsICVkXG4iLCBzLCBsZW4pOyovCisJaWYgKHBhcnNlZmlsZS0+c3RycHVzaCkgeworCQlzcCA9IGNrbWFsbG9jKHNpemVvZiAoc3RydWN0IHN0cnB1c2gpKTsKKwkJc3AtPnByZXYgPSBwYXJzZWZpbGUtPnN0cnB1c2g7CisJCXBhcnNlZmlsZS0+c3RycHVzaCA9IHNwOworCX0gZWxzZQorCQlzcCA9IHBhcnNlZmlsZS0+c3RycHVzaCA9ICYocGFyc2VmaWxlLT5iYXNlc3RycHVzaCk7CisJc3AtPnByZXZzdHJpbmcgPSBwYXJzZW5leHRjOworCXNwLT5wcmV2bmxlZnQgPSBwYXJzZW5sZWZ0OworCXNwLT5hcCA9IChzdHJ1Y3QgYWxpYXMgKilhcDsKKwlpZiAoYXApIHsKKwkJKChzdHJ1Y3QgYWxpYXMgKilhcCktPmZsYWcgfD0gQUxJQVNJTlVTRTsKKwkJc3AtPnN0cmluZyA9IHM7CisJfQorCXBhcnNlbmV4dGMgPSBzOworCXBhcnNlbmxlZnQgPSBsZW47CisJSU5UT047Cit9CisKK3ZvaWQKK3BvcHN0cmluZyh2b2lkKQoreworCXN0cnVjdCBzdHJwdXNoICpzcCA9IHBhcnNlZmlsZS0+c3RycHVzaDsKKworCUlOVE9GRjsKKwlpZiAoc3AtPmFwKSB7CisJCWlmIChwYXJzZW5leHRjWy0xXSA9PSAnICcgfHwgcGFyc2VuZXh0Y1stMV0gPT0gJ1x0JykgeworCQkJY2hlY2trd2QgfD0gQ0hLQUxJQVM7CisJCX0KKwkJaWYgKHNwLT5zdHJpbmcgIT0gc3AtPmFwLT52YWwpIHsKKwkJCWNrZnJlZShzcC0+c3RyaW5nKTsKKwkJfQorCQlzcC0+YXAtPmZsYWcgJj0gfkFMSUFTSU5VU0U7CisJCWlmIChzcC0+YXAtPmZsYWcgJiBBTElBU0RFQUQpIHsKKwkJCXVuYWxpYXMoc3AtPmFwLT5uYW1lKTsKKwkJfQorCX0KKwlwYXJzZW5leHRjID0gc3AtPnByZXZzdHJpbmc7CisJcGFyc2VubGVmdCA9IHNwLT5wcmV2bmxlZnQ7CisvKmRwcmludGYoIioqKiBjYWxsaW5nIHBvcHN0cmluZzogcmVzdG9yaW5nIHRvICclcydcbiIsIHBhcnNlbmV4dGMpOyovCisJcGFyc2VmaWxlLT5zdHJwdXNoID0gc3AtPnByZXY7CisJaWYgKHNwICE9ICYocGFyc2VmaWxlLT5iYXNlc3RycHVzaCkpCisJCWNrZnJlZShzcCk7CisJSU5UT047Cit9CisKKy8qCisgKiBTZXQgdGhlIGlucHV0IHRvIHRha2UgaW5wdXQgZnJvbSBhIGZpbGUuICBJZiBwdXNoIGlzIHNldCwgcHVzaCB0aGUKKyAqIG9sZCBpbnB1dCBvbnRvIHRoZSBzdGFjayBmaXJzdC4KKyAqLworCitpbnQKK3NldGlucHV0ZmlsZShjb25zdCBjaGFyICpmbmFtZSwgaW50IGZsYWdzKQoreworCWludCBmZDsKKwlpbnQgZmQyOworCisJSU5UT0ZGOworCWlmICgoZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSkpIDwgMCkgeworCQlpZiAoZmxhZ3MgJiBJTlBVVF9OT0ZJTEVfT0spCisJCQlnb3RvIG91dDsKKwkJc2hfZXJyb3IoIkNhbid0IG9wZW4gJXMiLCBmbmFtZSk7CisJfQorCWlmIChmZCA8IDEwKSB7CisJCWZkMiA9IGNvcHlmZChmZCwgMTApOworCQljbG9zZShmZCk7CisJCWlmIChmZDIgPCAwKQorCQkJc2hfZXJyb3IoIk91dCBvZiBmaWxlIGRlc2NyaXB0b3JzIik7CisJCWZkID0gZmQyOworCX0KKwlzZXRpbnB1dGZkKGZkLCBmbGFncyAmIElOUFVUX1BVU0hfRklMRSk7CitvdXQ6CisJSU5UT047CisJcmV0dXJuIGZkOworfQorCisKKy8qCisgKiBMaWtlIHNldGlucHV0ZmlsZSwgYnV0IHRha2VzIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLiAgQ2FsbCB0aGlzIHdpdGgKKyAqIGludGVycnVwdHMgb2ZmLgorICovCisKK3ZvaWQKK3NldGlucHV0ZmQoaW50IGZkLCBpbnQgcHVzaCkKK3sKKwkodm9pZCkgZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCWlmIChwdXNoKSB7CisJCXB1c2hmaWxlKCk7CisJCXBhcnNlZmlsZS0+YnVmID0gMDsKKwl9CisJcGFyc2VmaWxlLT5mZCA9IGZkOworCWlmIChwYXJzZWZpbGUtPmJ1ZiA9PSBOVUxMKQorCQlwYXJzZWZpbGUtPmJ1ZiA9IGNrbWFsbG9jKElCVUZTSVopOworCXBhcnNlbGxlZnQgPSBwYXJzZW5sZWZ0ID0gMDsKKwlwbGlubm8gPSAxOworfQorCisKKy8qCisgKiBMaWtlIHNldGlucHV0ZmlsZSwgYnV0IHRha2VzIGlucHV0IGZyb20gYSBzdHJpbmcuCisgKi8KKwordm9pZAorc2V0aW5wdXRzdHJpbmcoY2hhciAqc3RyaW5nKQoreworCUlOVE9GRjsKKwlwdXNoZmlsZSgpOworCXBhcnNlbmV4dGMgPSBzdHJpbmc7CisJcGFyc2VubGVmdCA9IHN0cmxlbihzdHJpbmcpOworCXBhcnNlZmlsZS0+YnVmID0gTlVMTDsKKwlwbGlubm8gPSAxOworCUlOVE9OOworfQorCisKKworLyoKKyAqIFRvIGhhbmRsZSB0aGUgIi4iIGNvbW1hbmQsIGEgc3RhY2sgb2YgaW5wdXQgZmlsZXMgaXMgdXNlZC4gIFB1c2hmaWxlCisgKiBhZGRzIGEgbmV3IGVudHJ5IHRvIHRoZSBzdGFjayBhbmQgcG9wZmlsZSByZXN0b3JlcyB0aGUgcHJldmlvdXMgbGV2ZWwuCisgKi8KKworU1RBVElDIHZvaWQKK3B1c2hmaWxlKHZvaWQpCit7CisJc3RydWN0IHBhcnNlZmlsZSAqcGY7CisKKwlwYXJzZWZpbGUtPm5sZWZ0ID0gcGFyc2VubGVmdDsKKwlwYXJzZWZpbGUtPmxsZWZ0ID0gcGFyc2VsbGVmdDsKKwlwYXJzZWZpbGUtPm5leHRjID0gcGFyc2VuZXh0YzsKKwlwYXJzZWZpbGUtPmxpbm5vID0gcGxpbm5vOworCXBmID0gKHN0cnVjdCBwYXJzZWZpbGUgKilja21hbGxvYyhzaXplb2YgKHN0cnVjdCBwYXJzZWZpbGUpKTsKKwlwZi0+cHJldiA9IHBhcnNlZmlsZTsKKwlwZi0+ZmQgPSAtMTsKKwlwZi0+c3RycHVzaCA9IE5VTEw7CisJcGYtPmJhc2VzdHJwdXNoLnByZXYgPSBOVUxMOworCXBhcnNlZmlsZSA9IHBmOworfQorCisKK3ZvaWQKK3BvcGZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGFyc2VmaWxlICpwZiA9IHBhcnNlZmlsZTsKKworCUlOVE9GRjsKKwlpZiAocGYtPmZkID49IDApCisJCWNsb3NlKHBmLT5mZCk7CisJaWYgKHBmLT5idWYpCisJCWNrZnJlZShwZi0+YnVmKTsKKwl3aGlsZSAocGYtPnN0cnB1c2gpCisJCXBvcHN0cmluZygpOworCXBhcnNlZmlsZSA9IHBmLT5wcmV2OworCWNrZnJlZShwZik7CisJcGFyc2VubGVmdCA9IHBhcnNlZmlsZS0+bmxlZnQ7CisJcGFyc2VsbGVmdCA9IHBhcnNlZmlsZS0+bGxlZnQ7CisJcGFyc2VuZXh0YyA9IHBhcnNlZmlsZS0+bmV4dGM7CisJcGxpbm5vID0gcGFyc2VmaWxlLT5saW5ubzsKKwlJTlRPTjsKK30KKworCisvKgorICogUmV0dXJuIHRvIHRvcCBsZXZlbC4KKyAqLworCit2b2lkCitwb3BhbGxmaWxlcyh2b2lkKQoreworCXdoaWxlIChwYXJzZWZpbGUgIT0gJmJhc2VwZikKKwkJcG9wZmlsZSgpOworfQorCisKKworLyoKKyAqIENsb3NlIHRoZSBmaWxlKHMpIHRoYXQgdGhlIHNoZWxsIGlzIHJlYWRpbmcgY29tbWFuZHMgZnJvbS4gIENhbGxlZAorICogYWZ0ZXIgYSBmb3JrIGlzIGRvbmUuCisgKi8KKwordm9pZAorY2xvc2VzY3JpcHQodm9pZCkKK3sKKwlwb3BhbGxmaWxlcygpOworCWlmIChwYXJzZWZpbGUtPmZkID4gMCkgeworCQljbG9zZShwYXJzZWZpbGUtPmZkKTsKKwkJcGFyc2VmaWxlLT5mZCA9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvaW5wdXQuaCBiL3Vzci9kYXNoL2lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkOWRkZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2lucHV0LmgKQEAgLTAsMCArMSw2OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpbnB1dC5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKy8qIFBFT0YgKHRoZSBlbmQgb2YgZmlsZSBtYXJrZXIpIGlzIGRlZmluZWQgaW4gc3ludGF4LmggKi8KKworZW51bSB7CisJSU5QVVRfUFVTSF9GSUxFID0gMSwKKwlJTlBVVF9OT0ZJTEVfT0sgPSAyLAorfTsKKworLyoKKyAqIFRoZSBpbnB1dCBsaW5lIG51bWJlci4gIElucHV0LmMganVzdCBkZWZpbmVzIHRoaXMgdmFyaWFibGUsIGFuZCBzYXZlcworICogYW5kIHJlc3RvcmVzIGl0IHdoZW4gZmlsZXMgYXJlIHB1c2hlZCBhbmQgcG9wcGVkLiAgVGhlIHVzZXIgb2YgdGhpcworICogcGFja2FnZSBtdXN0IHNldCBpdHMgdmFsdWUuCisgKi8KK2V4dGVybiBpbnQgcGxpbm5vOworZXh0ZXJuIGludCBwYXJzZW5sZWZ0OwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiBpbnB1dCBidWZmZXIgKi8KK2V4dGVybiBjaGFyICpwYXJzZW5leHRjOwkvKiBuZXh0IGNoYXJhY3RlciBpbiBpbnB1dCBidWZmZXIgKi8KKworY2hhciAqcGZnZXRzKGNoYXIgKiwgaW50KTsKK2ludCBwZ2V0Yyh2b2lkKTsKK2ludCBwZ2V0YzIodm9pZCk7CitpbnQgcHJlYWRidWZmZXIodm9pZCk7Cit2b2lkIHB1bmdldGModm9pZCk7Cit2b2lkIHB1c2hzdHJpbmcoY2hhciAqLCB2b2lkICopOwordm9pZCBwb3BzdHJpbmcodm9pZCk7CitpbnQgc2V0aW5wdXRmaWxlKGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQgc2V0aW5wdXRmZChpbnQsIGludCk7Cit2b2lkIHNldGlucHV0c3RyaW5nKGNoYXIgKik7Cit2b2lkIHBvcGZpbGUodm9pZCk7Cit2b2lkIHBvcGFsbGZpbGVzKHZvaWQpOwordm9pZCBjbG9zZXNjcmlwdCh2b2lkKTsKKworI2RlZmluZSBwZ2V0Y19tYWNybygpIFwKKwkoLS1wYXJzZW5sZWZ0ID49IDAgPyAoc2lnbmVkIGNoYXIpKnBhcnNlbmV4dGMrKyA6IHByZWFkYnVmZmVyKCkpCmRpZmYgLS1naXQgYS91c3IvZGFzaC9qb2JzLmMgYi91c3IvZGFzaC9qb2JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZDc3OTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9qb2JzLmMKQEAgLTAsMCArMSwxNDk5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cGF0aHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpZmRlZiBCU0QKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaWYgSk9CUworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyN1bmRlZiBDRU9GCQkJLyogc3ludGF4LmggcmVkZWZpbmVzIHRoaXMgKi8KKyNlbmRpZgorI2luY2x1ZGUgInJlZGlyLmgiCisjaW5jbHVkZSAic2hvdy5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJub2Rlcy5oIgorI2luY2x1ZGUgImpvYnMuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAidHJhcC5oIgorI2luY2x1ZGUgInN5bnRheC5oIgorI2luY2x1ZGUgImlucHV0LmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisKKy8qIG1vZGUgZmxhZ3MgZm9yIHNldF9jdXJqb2IgKi8KKyNkZWZpbmUgQ1VSX0RFTEVURSAyCisjZGVmaW5lIENVUl9SVU5OSU5HIDEKKyNkZWZpbmUgQ1VSX1NUT1BQRUQgMAorCisvKiBtb2RlIGZsYWdzIGZvciBkb3dhaXQgKi8KKyNkZWZpbmUgRE9XQUlUX05PUk1BTCAwCisjZGVmaW5lIERPV0FJVF9CTE9DSyAxCisKKy8qIGFycmF5IG9mIGpvYnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgam9iICpqb2J0YWI7CisvKiBzaXplIG9mIGFycmF5ICovCitzdGF0aWMgdW5zaWduZWQgbmpvYnM7CisvKiBwaWQgb2YgbGFzdCBiYWNrZ3JvdW5kIHByb2Nlc3MgKi8KK3BpZF90IGJhY2tnbmRwaWQ7CisKKyNpZiBKT0JTCisvKiBwZ3JwIG9mIHNoZWxsIG9uIGludm9jYXRpb24gKi8KK3N0YXRpYyBpbnQgaW5pdGlhbHBncnA7CisvKiBjb250cm9sIHRlcm1pbmFsICovCitzdGF0aWMgaW50IHR0eWZkID0gLTE7CisjZW5kaWYKKworLyogY3VycmVudCBqb2IgKi8KK3N0YXRpYyBzdHJ1Y3Qgam9iICpjdXJqb2I7CisvKiBudW1iZXIgb2YgcHJlc3VtZWQgbGl2aW5nIHVudHJhY2tlZCBqb2JzICovCitzdGF0aWMgaW50IGpvYmxlc3M7CisKK1NUQVRJQyB2b2lkIHNldF9jdXJqb2Ioc3RydWN0IGpvYiAqLCB1bnNpZ25lZCk7CitTVEFUSUMgaW50IGpvYm5vKGNvbnN0IHN0cnVjdCBqb2IgKik7CitTVEFUSUMgaW50IHNwcmludF9zdGF0dXMoY2hhciAqLCBpbnQsIGludCk7CitTVEFUSUMgdm9pZCBmcmVlam9iKHN0cnVjdCBqb2IgKik7CitTVEFUSUMgc3RydWN0IGpvYiAqZ2V0am9iKGNvbnN0IGNoYXIgKiwgaW50KTsKK1NUQVRJQyBzdHJ1Y3Qgam9iICpncm93am9idGFiKHZvaWQpOworU1RBVElDIHZvaWQgZm9ya2NoaWxkKHN0cnVjdCBqb2IgKiwgdW5pb24gbm9kZSAqLCBpbnQpOworU1RBVElDIHZvaWQgZm9ya3BhcmVudChzdHJ1Y3Qgam9iICosIHVuaW9uIG5vZGUgKiwgaW50LCBwaWRfdCk7CitTVEFUSUMgaW50IGRvd2FpdChpbnQsIHN0cnVjdCBqb2IgKik7CisjaWZkZWYgU1lTVgorU1RBVElDIGludCBvbnNpZ2NoaWxkKHZvaWQpOworI2VuZGlmCitTVEFUSUMgaW50IHdhaXRwcm9jKGludCwgaW50ICopOworU1RBVElDIGNoYXIgKmNvbW1hbmR0ZXh0KHVuaW9uIG5vZGUgKik7CitTVEFUSUMgdm9pZCBjbWR0eHQodW5pb24gbm9kZSAqKTsKK1NUQVRJQyB2b2lkIGNtZGxpc3QodW5pb24gbm9kZSAqLCBpbnQpOworU1RBVElDIHZvaWQgY21kcHV0cyhjb25zdCBjaGFyICopOworU1RBVElDIHZvaWQgc2hvd3BpcGUoc3RydWN0IGpvYiAqLCBzdHJ1Y3Qgb3V0cHV0ICopOworU1RBVElDIGludCBnZXRzdGF0dXMoc3RydWN0IGpvYiAqKTsKKworI2lmIEpPQlMKK3N0YXRpYyBpbnQgcmVzdGFydGpvYihzdHJ1Y3Qgam9iICosIGludCk7CitzdGF0aWMgdm9pZCB4dGNzZXRwZ3JwKGludCwgcGlkX3QpOworI2VuZGlmCisKK1NUQVRJQyB2b2lkCitzZXRfY3Vyam9iKHN0cnVjdCBqb2IgKmpwLCB1bnNpZ25lZCBtb2RlKQoreworCXN0cnVjdCBqb2IgKmpwMTsKKwlzdHJ1Y3Qgam9iICoqanBwLCAqKmN1cnA7CisKKwkvKiBmaXJzdCByZW1vdmUgZnJvbSBsaXN0ICovCisJanBwID0gY3VycCA9ICZjdXJqb2I7CisJZG8geworCQlqcDEgPSAqanBwOworCQlpZiAoanAxID09IGpwKQorCQkJYnJlYWs7CisJCWpwcCA9ICZqcDEtPnByZXZfam9iOworCX0gd2hpbGUgKDEpOworCSpqcHAgPSBqcDEtPnByZXZfam9iOworCisJLyogVGhlbiByZS1pbnNlcnQgaW4gY29ycmVjdCBwb3NpdGlvbiAqLworCWpwcCA9IGN1cnA7CisJc3dpdGNoIChtb2RlKSB7CisJZGVmYXVsdDoKKyNpZmRlZiBERUJVRworCQlhYm9ydCgpOworI2VuZGlmCisJY2FzZSBDVVJfREVMRVRFOgorCQkvKiBqb2IgYmVpbmcgZGVsZXRlZCAqLworCQlicmVhazsKKwljYXNlIENVUl9SVU5OSU5HOgorCQkvKiBuZXdseSBjcmVhdGVkIGpvYiBvciBiYWNrZ3JvdW5kZWQgam9iLAorCQkgICBwdXQgYWZ0ZXIgYWxsIHN0b3BwZWQgam9icy4gKi8KKwkJZG8geworCQkJanAxID0gKmpwcDsKKwkJCWlmICghSk9CUyB8fCAhanAxIHx8IGpwMS0+c3RhdGUgIT0gSk9CU1RPUFBFRCkKKwkJCQlicmVhazsKKwkJCWpwcCA9ICZqcDEtPnByZXZfam9iOworCQl9IHdoaWxlICgxKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKyNpZiBKT0JTCisJY2FzZSBDVVJfU1RPUFBFRDoKKyNlbmRpZgorCQkvKiBuZXdseSBzdG9wcGVkIGpvYiAtIGJlY29tZXMgY3Vyam9iICovCisJCWpwLT5wcmV2X2pvYiA9ICpqcHA7CisJCSpqcHAgPSBqcDsKKwkJYnJlYWs7CisJfQorfQorCisjaWYgSk9CUworLyoKKyAqIFR1cm4gam9iIGNvbnRyb2wgb24gYW5kIG9mZi4KKyAqCisgKiBOb3RlOiAgVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgdGhpcmQgYXJnIHRvIGlvY3RsIGlzIGEgY2hhcmFjdGVyCisgKiBwb2ludGVyLCB3aGljaCBpcyB0cnVlIG9uIEJlcmtlbGV5IHN5c3RlbXMgYnV0IG5vdCBTeXN0ZW0gVi4gIFNpbmNlCisgKiBTeXN0ZW0gViBkb2Vzbid0IGhhdmUgam9iIGNvbnRyb2wgeWV0LCB0aGlzIGlzbid0IGEgcHJvYmxlbSBub3cuCisgKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KKworaW50IGpvYmN0bDsKKwordm9pZAorc2V0am9iY3RsKGludCBvbikKK3sKKwlpbnQgZmQ7CisJaW50IHBncnA7CisKKwlpZiAob24gPT0gam9iY3RsIHx8IHJvb3RzaGVsbCA9PSAwKQorCQlyZXR1cm47CisJaWYgKG9uKSB7CisJCWludCBvZmQ7CisJCW9mZCA9IGZkID0gb3BlbihfUEFUSF9UVFksIE9fUkRXUik7CisJCWlmIChmZCA8IDApIHsKKwkJCWZkICs9IDM7CisJCQl3aGlsZSAoIWlzYXR0eShmZCkgJiYgLS1mZCA+PSAwKQorCQkJCTsKKwkJfQorCQlmZCA9IGZjbnRsKGZkLCBGX0RVUEZELCAxMCk7CisJCWNsb3NlKG9mZCk7CisJCWlmIChmZCA8IDApCisJCQlnb3RvIG91dDsKKwkJZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCQlkbyB7IC8qIHdoaWxlIHdlIGFyZSBpbiB0aGUgYmFja2dyb3VuZCAqLworCQkJaWYgKChwZ3JwID0gdGNnZXRwZ3JwKGZkKSkgPCAwKSB7CitvdXQ6CisJCQkJc2hfd2FybngoImNhbid0IGFjY2VzcyB0dHk7IGpvYiBjb250cm9sIHR1cm5lZCBvZmYiKTsKKwkJCQltZmxhZyA9IG9uID0gMDsKKwkJCQlnb3RvIGNsb3NlOworCQkJfQorCQkJaWYgKHBncnAgPT0gZ2V0cGdycCgpKQorCQkJCWJyZWFrOworCQkJa2lsbHBnKDAsIFNJR1RUSU4pOworCQl9IHdoaWxlICgxKTsKKwkJaW5pdGlhbHBncnAgPSBwZ3JwOworCisJCXNldHNpZ25hbChTSUdUU1RQKTsKKwkJc2V0c2lnbmFsKFNJR1RUT1UpOworCQlzZXRzaWduYWwoU0lHVFRJTik7CisJCXBncnAgPSByb290cGlkOworCQlzZXRwZ2lkKDAsIHBncnApOworCQl4dGNzZXRwZ3JwKGZkLCBwZ3JwKTsKKwl9IGVsc2UgeworCQkvKiB0dXJuaW5nIGpvYiBjb250cm9sIG9mZiAqLworCQlmZCA9IHR0eWZkOworCQlwZ3JwID0gaW5pdGlhbHBncnA7CisJCXh0Y3NldHBncnAoZmQsIHBncnApOworCQlzZXRwZ2lkKDAsIHBncnApOworCQlzZXRzaWduYWwoU0lHVFNUUCk7CisJCXNldHNpZ25hbChTSUdUVE9VKTsKKwkJc2V0c2lnbmFsKFNJR1RUSU4pOworY2xvc2U6CisJCWNsb3NlKGZkKTsKKwkJZmQgPSAtMTsKKwl9CisJdHR5ZmQgPSBmZDsKKwlqb2JjdGwgPSBvbjsKK30KKyNlbmRpZgorCisKK2ludAora2lsbGNtZChhcmdjLCBhcmd2KQorCWludCBhcmdjOworCWNoYXIgKiphcmd2OworeworCWludCBzaWdubyA9IC0xOworCWludCBsaXN0ID0gMDsKKwlpbnQgaTsKKwlwaWRfdCBwaWQ7CisJc3RydWN0IGpvYiAqanA7CisKKwlpZiAoYXJnYyA8PSAxKSB7Cit1c2FnZToKKwkJc2hfZXJyb3IoCisiVXNhZ2U6IGtpbGwgWy1zIHNpZ3NwZWMgfCAtc2lnbnVtIHwgLXNpZ3NwZWNdIFtwaWQgfCBqb2JdLi4uIG9yXG4iCisia2lsbCAtbCBbZXhpdHN0YXR1c10iCisJCSk7CisJfQorCisJaWYgKCoqKythcmd2ID09ICctJykgeworCQlzaWdubyA9IGRlY29kZV9zaWduYWwoKmFyZ3YgKyAxLCAxKTsKKwkJaWYgKHNpZ25vIDwgMCkgeworCQkJaW50IGM7CisKKwkJCXdoaWxlICgoYyA9IG5leHRvcHQoImxzOiIpKSAhPSAnXDAnKQorCQkJCXN3aXRjaCAoYykgeworCQkJCWRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKwkJCQkJYWJvcnQoKTsKKyNlbmRpZgorCQkJCWNhc2UgJ2wnOgorCQkJCQlsaXN0ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAncyc6CisJCQkJCXNpZ25vID0gZGVjb2RlX3NpZ25hbChvcHRpb25hcmcsIDEpOworCQkJCQlpZiAoc2lnbm8gPCAwKSB7CisJCQkJCQlzaF9lcnJvcigKKwkJCQkJCQkiaW52YWxpZCBzaWduYWwgbnVtYmVyIG9yIG5hbWU6ICVzIiwKKwkJCQkJCQlvcHRpb25hcmcKKwkJCQkJCSk7CisJCQkJCX0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJfQorCQkJYXJndiA9IGFyZ3B0cjsKKwkJfSBlbHNlCisJCQlhcmd2Kys7CisJfQorCisJaWYgKCFsaXN0ICYmIHNpZ25vIDwgMCkKKwkJc2lnbm8gPSBTSUdURVJNOworCisJaWYgKChzaWdubyA8IDAgfHwgISphcmd2KSBeIGxpc3QpIHsKKwkJZ290byB1c2FnZTsKKwl9CisKKwlpZiAobGlzdCkgeworCQlzdHJ1Y3Qgb3V0cHV0ICpvdXQ7CisKKwkJb3V0ID0gb3V0MTsKKwkJaWYgKCEqYXJndikgeworCQkJb3V0c3RyKCIwXG4iLCBvdXQpOworCQkJZm9yIChpID0gMTsgaSA8IE5TSUc7IGkrKykgeworCQkJCW91dGZtdChvdXQsIHNubGZtdCwgc2lnbmFsX25hbWUoaSkpOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJc2lnbm8gPSBudW1iZXIoKmFyZ3YpOworCQlpZiAoc2lnbm8gPiAxMjgpCisJCQlzaWdubyAtPSAxMjg7CisJCWlmICgwIDwgc2lnbm8gJiYgc2lnbm8gPCBOU0lHKQorCQkJb3V0Zm10KG91dCwgc25sZm10LCBzaWduYWxfbmFtZShzaWdubykpOworCQllbHNlCisJCQlzaF9lcnJvcigiaW52YWxpZCBzaWduYWwgbnVtYmVyIG9yIGV4aXQgc3RhdHVzOiAlcyIsCisJCQkJICphcmd2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaSA9IDA7CisJZG8geworCQlpZiAoKiphcmd2ID09ICclJykgeworCQkJanAgPSBnZXRqb2IoKmFyZ3YsIDApOworCQkJcGlkID0gLWpwLT5wc1swXS5waWQ7CisJCX0gZWxzZQorCQkJcGlkID0gKiphcmd2ID09ICctJyA/CisJCQkJLW51bWJlcigqYXJndiArIDEpIDogbnVtYmVyKCphcmd2KTsKKwkJaWYgKGtpbGwocGlkLCBzaWdubykgIT0gMCkgeworCQkJc2hfd2FybngoIiVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJaSA9IDE7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBpOworfQorCitTVEFUSUMgaW50Citqb2Jubyhjb25zdCBzdHJ1Y3Qgam9iICpqcCkKK3sKKwlyZXR1cm4ganAgLSBqb2J0YWIgKyAxOworfQorCisjaWYgSk9CUworaW50CitmZ2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGpvYiAqanA7CisJc3RydWN0IG91dHB1dCAqb3V0OworCWludCBtb2RlOworCWludCByZXR2YWw7CisKKwltb2RlID0gKCoqYXJndiA9PSAnZicpID8gRk9SS19GRyA6IEZPUktfQkc7CisJbmV4dG9wdChudWxsc3RyKTsKKwlhcmd2ID0gYXJncHRyOworCW91dCA9IG91dDE7CisJZG8geworCQlqcCA9IGdldGpvYigqYXJndiwgMSk7CisJCWlmIChtb2RlID09IEZPUktfQkcpIHsKKwkJCXNldF9jdXJqb2IoanAsIENVUl9SVU5OSU5HKTsKKwkJCW91dGZtdChvdXQsICJbJWRdICIsIGpvYm5vKGpwKSk7CisJCX0KKwkJb3V0c3RyKGpwLT5wcy0+Y21kLCBvdXQpOworCQlzaG93cGlwZShqcCwgb3V0KTsKKwkJcmV0dmFsID0gcmVzdGFydGpvYihqcCwgbW9kZSk7CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGJnY21kKGludCwgY2hhciAqKikgX19hdHRyaWJ1dGVfXygoX19hbGlhc19fKCJmZ2NtZCIpKSk7CisKKworU1RBVElDIGludAorcmVzdGFydGpvYihzdHJ1Y3Qgam9iICpqcCwgaW50IG1vZGUpCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlpbnQgaTsKKwlpbnQgc3RhdHVzOworCXBpZF90IHBnaWQ7CisKKwlJTlRPRkY7CisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKQorCQlnb3RvIG91dDsKKwlqcC0+c3RhdGUgPSBKT0JSVU5OSU5HOworCXBnaWQgPSBqcC0+cHMtPnBpZDsKKwlpZiAobW9kZSA9PSBGT1JLX0ZHKQorCQl4dGNzZXRwZ3JwKHR0eWZkLCBwZ2lkKTsKKwlraWxscGcocGdpZCwgU0lHQ09OVCk7CisJcHMgPSBqcC0+cHM7CisJaSA9IGpwLT5ucHJvY3M7CisJZG8geworCQlpZiAoV0lGU1RPUFBFRChwcy0+c3RhdHVzKSkgeworCQkJcHMtPnN0YXR1cyA9IC0xOworCQl9CisJfSB3aGlsZSAocHMrKywgLS1pKTsKK291dDoKKwlzdGF0dXMgPSAobW9kZSA9PSBGT1JLX0ZHKSA/IHdhaXRmb3Jqb2IoanApIDogMDsKKwlJTlRPTjsKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK1NUQVRJQyBpbnQKK3NwcmludF9zdGF0dXMoY2hhciAqcywgaW50IHN0YXR1cywgaW50IHNpZ29ubHkpCit7CisJaW50IGNvbDsKKwlpbnQgc3Q7CisKKwljb2wgPSAwOworCXN0ID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKSB7CisjaWYgSk9CUworCQlzdCA9IFdTVE9QU0lHKHN0YXR1cyk7CisJCWlmICghV0lGU1RPUFBFRChzdGF0dXMpKQorI2VuZGlmCisJCQlzdCA9IFdURVJNU0lHKHN0YXR1cyk7CisJCWlmIChzaWdvbmx5KSB7CisJCQlpZiAoc3QgPT0gU0lHSU5UIHx8IHN0ID09IFNJR1BJUEUpCisJCQkJZ290byBvdXQ7CisjaWYgSk9CUworCQkJaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSkKKwkJCQlnb3RvIG91dDsKKyNlbmRpZgorCQl9CisJCWNvbCA9IGZtdHN0cihzLCAzMiwgc3Ryc2lnbmFsKHN0KSk7CisJCWlmIChXQ09SRURVTVAoc3RhdHVzKSkgeworCQkJY29sICs9IGZtdHN0cihzICsgY29sLCAxNiwgIiAoY29yZSBkdW1wZWQpIik7CisJCX0KKwl9IGVsc2UgaWYgKCFzaWdvbmx5KSB7CisJCWlmIChzdCkKKwkJCWNvbCA9IGZtdHN0cihzLCAxNiwgIkRvbmUoJWQpIiwgc3QpOworCQllbHNlCisJCQljb2wgPSBmbXRzdHIocywgMTYsICJEb25lIik7CisJfQorCitvdXQ6CisJcmV0dXJuIGNvbDsKK30KKworc3RhdGljIHZvaWQKK3Nob3dqb2Ioc3RydWN0IG91dHB1dCAqb3V0LCBzdHJ1Y3Qgam9iICpqcCwgaW50IG1vZGUpCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzZW5kOworCWludCBjb2w7CisJaW50IGluZGVudDsKKwljaGFyIHNbODBdOworCisJcHMgPSBqcC0+cHM7CisKKwlpZiAobW9kZSAmIFNIT1dfUEdJRCkgeworCQkvKiBqdXN0IG91dHB1dCBwcm9jZXNzIChncm91cCkgaWQgb2YgcGlwZWxpbmUgKi8KKwkJb3V0Zm10KG91dCwgIiVkXG4iLCBwcy0+cGlkKTsKKwkJcmV0dXJuOworCX0KKworCWNvbCA9IGZtdHN0cihzLCAxNiwgIlslZF0gICAiLCBqb2JubyhqcCkpOworCWluZGVudCA9IGNvbDsKKworCWlmIChqcCA9PSBjdXJqb2IpCisJCXNbY29sIC0gMl0gPSAnKyc7CisJZWxzZSBpZiAoY3Vyam9iICYmIGpwID09IGN1cmpvYi0+cHJldl9qb2IpCisJCXNbY29sIC0gMl0gPSAnLSc7CisKKwlpZiAobW9kZSAmIFNIT1dfUElEKQorCQljb2wgKz0gZm10c3RyKHMgKyBjb2wsIDE2LCAiJWQgIiwgcHMtPnBpZCk7CisKKwlwc2VuZCA9IHBzICsganAtPm5wcm9jczsKKworCWlmIChqcC0+c3RhdGUgPT0gSk9CUlVOTklORykgeworCQlzY29weSgiUnVubmluZyIsIHMgKyBjb2wpOworCQljb2wgKz0gc3RybGVuKCJSdW5uaW5nIik7CisJfSBlbHNlIHsKKwkJaW50IHN0YXR1cyA9IHBzZW5kWy0xXS5zdGF0dXM7CisjaWYgSk9CUworCQlpZiAoanAtPnN0YXRlID09IEpPQlNUT1BQRUQpCisJCQlzdGF0dXMgPSBqcC0+c3RvcHN0YXR1czsKKyNlbmRpZgorCQljb2wgKz0gc3ByaW50X3N0YXR1cyhzICsgY29sLCBzdGF0dXMsIDApOworCX0KKworCWdvdG8gc3RhcnQ7CisKKwlkbyB7CisJCS8qIGZvciBlYWNoIHByb2Nlc3MgKi8KKwkJY29sID0gZm10c3RyKHMsIDQ4LCAiIHxcbiUqYyVkICIsIGluZGVudCwgJyAnLCBwcy0+cGlkKSAtIDM7CisKK3N0YXJ0OgorCQlvdXRmbXQoCisJCQlvdXQsICIlcyUqYyVzIiwKKwkJCXMsIDMzIC0gY29sID49IDAgPyAzMyAtIGNvbCA6IDAsICcgJywgcHMtPmNtZAorCQkpOworCQlpZiAoIShtb2RlICYgU0hPV19QSUQpKSB7CisJCQlzaG93cGlwZShqcCwgb3V0KTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgrK3BzID09IHBzZW5kKSB7CisJCQlvdXRjc2xvdygnXG4nLCBvdXQpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWpwLT5jaGFuZ2VkID0gMDsKKworCWlmIChqcC0+c3RhdGUgPT0gSk9CRE9ORSkgeworCQlUUkFDRSgoInNob3dqb2I6IGZyZWVpbmcgam9iICVkXG4iLCBqb2JubyhqcCkpKTsKKwkJZnJlZWpvYihqcCk7CisJfQorfQorCisKK2ludAoram9ic2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG1vZGUsIG07CisJc3RydWN0IG91dHB1dCAqb3V0OworCisJbW9kZSA9IDA7CisJd2hpbGUgKChtID0gbmV4dG9wdCgibHAiKSkpCisJCWlmIChtID09ICdsJykKKwkJCW1vZGUgPSBTSE9XX1BJRDsKKwkJZWxzZQorCQkJbW9kZSA9IFNIT1dfUEdJRDsKKworCW91dCA9IG91dDE7CisJYXJndiA9IGFyZ3B0cjsKKwlpZiAoKmFyZ3YpCisJCWRvCisJCQlzaG93am9iKG91dCwgZ2V0am9iKCphcmd2LDApLCBtb2RlKTsKKwkJd2hpbGUgKCorK2FyZ3YpOworCWVsc2UKKwkJc2hvd2pvYnMob3V0LCBtb2RlKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBQcmludCBhIGxpc3Qgb2Ygam9icy4gIElmICJjaGFuZ2UiIGlzIG5vbnplcm8sIG9ubHkgcHJpbnQgam9icyB3aG9zZQorICogc3RhdHVzZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gc2hvd2pvYnMuCisgKi8KKwordm9pZAorc2hvd2pvYnMoc3RydWN0IG91dHB1dCAqb3V0LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKworCVRSQUNFKCgic2hvd2pvYnMoJXgpIGNhbGxlZFxuIiwgbW9kZSkpOworCisJLyogSWYgbm90IGV2ZW4gb25lIG9uZSBqb2IgY2hhbmdlZCwgdGhlcmUgaXMgbm90aGluZyB0byBkbyAqLworCXdoaWxlIChkb3dhaXQoRE9XQUlUX05PUk1BTCwgTlVMTCkgPiAwKQorCQljb250aW51ZTsKKworCWZvciAoanAgPSBjdXJqb2I7IGpwOyBqcCA9IGpwLT5wcmV2X2pvYikgeworCQlpZiAoIShtb2RlICYgU0hPV19DSEFOR0VEKSB8fCBqcC0+Y2hhbmdlZCkKKwkJCXNob3dqb2Iob3V0LCBqcCwgbW9kZSk7CisJfQorfQorCisvKgorICogTWFyayBhIGpvYiBzdHJ1Y3R1cmUgYXMgdW51c2VkLgorICovCisKK1NUQVRJQyB2b2lkCitmcmVlam9iKHN0cnVjdCBqb2IgKmpwKQoreworCXN0cnVjdCBwcm9jc3RhdCAqcHM7CisJaW50IGk7CisKKwlJTlRPRkY7CisJZm9yIChpID0ganAtPm5wcm9jcywgcHMgPSBqcC0+cHMgOyAtLWkgPj0gMCA7IHBzKyspIHsKKwkJaWYgKHBzLT5jbWQgIT0gbnVsbHN0cikKKwkJCWNrZnJlZShwcy0+Y21kKTsKKwl9CisJaWYgKGpwLT5wcyAhPSAmanAtPnBzMCkKKwkJY2tmcmVlKGpwLT5wcyk7CisJanAtPnVzZWQgPSAwOworCXNldF9jdXJqb2IoanAsIENVUl9ERUxFVEUpOworCUlOVE9OOworfQorCisKKworaW50Cit3YWl0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgam9iICpqb2I7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgam9iICpqcDsKKworCUVYU0lHT04oKTsKKworCW5leHRvcHQobnVsbHN0cik7CisJcmV0dmFsID0gMDsKKworCWFyZ3YgPSBhcmdwdHI7CisJaWYgKCEqYXJndikgeworCQkvKiB3YWl0IGZvciBhbGwgam9icyAqLworCQlmb3IgKDs7KSB7CisJCQlqcCA9IGN1cmpvYjsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCFqcCkgeworCQkJCQkvKiBubyBydW5uaW5nIHByb2NzICovCisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoanAtPnN0YXRlID09IEpPQlJVTk5JTkcpCisJCQkJCWJyZWFrOworCQkJCWpwLT53YWl0ZWQgPSAxOworCQkJCWpwID0ganAtPnByZXZfam9iOworCQkJfQorCQkJZG93YWl0KERPV0FJVF9CTE9DSywgMCk7CisJCX0KKwl9CisKKwlyZXR2YWwgPSAxMjc7CisJZG8geworCQlpZiAoKiphcmd2ICE9ICclJykgeworCQkJcGlkX3QgcGlkID0gbnVtYmVyKCphcmd2KTsKKwkJCWpvYiA9IGN1cmpvYjsKKwkJCWdvdG8gc3RhcnQ7CisJCQlkbyB7CisJCQkJaWYgKGpvYi0+cHNbam9iLT5ucHJvY3MgLSAxXS5waWQgPT0gcGlkKQorCQkJCQlicmVhazsKKwkJCQlqb2IgPSBqb2ItPnByZXZfam9iOworc3RhcnQ6CisJCQkJaWYgKCFqb2IpCisJCQkJCWdvdG8gcmVwZWF0OworCQkJfSB3aGlsZSAoMSk7CisJCX0gZWxzZQorCQkJam9iID0gZ2V0am9iKCphcmd2LCAwKTsKKwkJLyogbG9vcCB1bnRpbCBwcm9jZXNzIHRlcm1pbmF0ZWQgb3Igc3RvcHBlZCAqLworCQl3aGlsZSAoam9iLT5zdGF0ZSA9PSBKT0JSVU5OSU5HKQorCQkJZG93YWl0KERPV0FJVF9CTE9DSywgMCk7CisJCWpvYi0+d2FpdGVkID0gMTsKKwkJcmV0dmFsID0gZ2V0c3RhdHVzKGpvYik7CityZXBlYXQ6CisJCTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKworCisvKgorICogQ29udmVydCBhIGpvYiBuYW1lIHRvIGEgam9iIHN0cnVjdHVyZS4KKyAqLworCitTVEFUSUMgc3RydWN0IGpvYiAqCitnZXRqb2IoY29uc3QgY2hhciAqbmFtZSwgaW50IGdldGN0bCkKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlzdHJ1Y3Qgam9iICpmb3VuZDsKKwljb25zdCBjaGFyICplcnJfbXNnID0gIk5vIHN1Y2ggam9iOiAlcyI7CisJdW5zaWduZWQgbnVtOworCWludCBjOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqKCptYXRjaCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJanAgPSBjdXJqb2I7CisJcCA9IG5hbWU7CisJaWYgKCFwKQorCQlnb3RvIGN1cnJlbnRqb2I7CisKKwlpZiAoKnAgIT0gJyUnKQorCQlnb3RvIGVycjsKKworCWMgPSAqKytwOworCWlmICghYykKKwkJZ290byBjdXJyZW50am9iOworCisJaWYgKCFwWzFdKSB7CisJCWlmIChjID09ICcrJyB8fCBjID09ICclJykgeworY3VycmVudGpvYjoKKwkJCWVycl9tc2cgPSAiTm8gY3VycmVudCBqb2IiOworCQkJZ290byBjaGVjazsKKwkJfSBlbHNlIGlmIChjID09ICctJykgeworCQkJaWYgKGpwKQorCQkJCWpwID0ganAtPnByZXZfam9iOworCQkJZXJyX21zZyA9ICJObyBwcmV2aW91cyBqb2IiOworY2hlY2s6CisJCQlpZiAoIWpwKQorCQkJCWdvdG8gZXJyOworCQkJZ290byBnb3RpdDsKKwkJfQorCX0KKworCWlmIChpc19udW1iZXIocCkpIHsKKwkJbnVtID0gYXRvaShwKTsKKwkJaWYgKG51bSA8IG5qb2JzKSB7CisJCQlqcCA9IGpvYnRhYiArIG51bSAtIDE7CisJCQlpZiAoanAtPnVzZWQpCisJCQkJZ290byBnb3RpdDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJbWF0Y2ggPSBwcmVmaXg7CisJaWYgKCpwID09ICc/JykgeworCQltYXRjaCA9IHN0cnN0cjsKKwkJcCsrOworCX0KKworCWZvdW5kID0gMDsKKwl3aGlsZSAoMSkgeworCQlpZiAoIWpwKQorCQkJZ290byBlcnI7CisJCWlmIChtYXRjaChqcC0+cHNbMF0uY21kLCBwKSkgeworCQkJaWYgKGZvdW5kKQorCQkJCWdvdG8gZXJyOworCQkJZm91bmQgPSBqcDsKKwkJCWVycl9tc2cgPSAiJXM6IGFtYmlndW91cyI7CisJCX0KKwkJanAgPSBqcC0+cHJldl9qb2I7CisJfQorCitnb3RpdDoKKyNpZiBKT0JTCisJZXJyX21zZyA9ICJqb2IgJXMgbm90IGNyZWF0ZWQgdW5kZXIgam9iIGNvbnRyb2wiOworCWlmIChnZXRjdGwgJiYganAtPmpvYmN0bCA9PSAwKQorCQlnb3RvIGVycjsKKyNlbmRpZgorCXJldHVybiBqcDsKK2VycjoKKwlzaF9lcnJvcihlcnJfbXNnLCBuYW1lKTsKK30KKworCisKKy8qCisgKiBSZXR1cm4gYSBuZXcgam9iIHN0cnVjdHVyZS4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCisKK3N0cnVjdCBqb2IgKgorbWFrZWpvYih1bmlvbiBub2RlICpub2RlLCBpbnQgbnByb2NzKQoreworCWludCBpOworCXN0cnVjdCBqb2IgKmpwOworCisJZm9yIChpID0gbmpvYnMsIGpwID0gam9idGFiIDsgOyBqcCsrKSB7CisJCWlmICgtLWkgPCAwKSB7CisJCQlqcCA9IGdyb3dqb2J0YWIoKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChqcC0+dXNlZCA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChqcC0+c3RhdGUgIT0gSk9CRE9ORSB8fCAhanAtPndhaXRlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoam9iY3RsKQorCQkJY29udGludWU7CisJCWZyZWVqb2IoanApOworCQlicmVhazsKKwl9CisJbWVtc2V0KGpwLCAwLCBzaXplb2YoKmpwKSk7CisjaWYgSk9CUworCWlmIChqb2JjdGwpCisJCWpwLT5qb2JjdGwgPSAxOworI2VuZGlmCisJanAtPnByZXZfam9iID0gY3Vyam9iOworCWN1cmpvYiA9IGpwOworCWpwLT51c2VkID0gMTsKKwlqcC0+cHMgPSAmanAtPnBzMDsKKwlpZiAobnByb2NzID4gMSkgeworCQlqcC0+cHMgPSBja21hbGxvYyhucHJvY3MgKiBzaXplb2YgKHN0cnVjdCBwcm9jc3RhdCkpOworCX0KKwlUUkFDRSgoIm1ha2Vqb2IoMHglbHgsICVkKSByZXR1cm5zICUlJWRcbiIsIChsb25nKW5vZGUsIG5wcm9jcywKKwkgICAgam9ibm8oanApKSk7CisJcmV0dXJuIGpwOworfQorCitTVEFUSUMgc3RydWN0IGpvYiAqCitncm93am9idGFiKHZvaWQpCit7CisJc2l6ZV90IGxlbjsKKwlwdHJkaWZmX3Qgb2Zmc2V0OworCXN0cnVjdCBqb2IgKmpwLCAqanE7CisKKwlsZW4gPSBuam9icyAqIHNpemVvZigqanApOworCWpxID0gam9idGFiOworCWpwID0gY2tyZWFsbG9jKGpxLCBsZW4gKyA0ICogc2l6ZW9mKCpqcCkpOworCisJb2Zmc2V0ID0gKGNoYXIgKilqcCAtIChjaGFyICopanE7CisJaWYgKG9mZnNldCkgeworCQkvKiBSZWxvY2F0ZSBwb2ludGVycyAqLworCQlzaXplX3QgbCA9IGxlbjsKKworCQlqcSA9IChzdHJ1Y3Qgam9iICopKChjaGFyICopanEgKyBsKTsKKwkJd2hpbGUgKGwpIHsKKwkJCWwgLT0gc2l6ZW9mKCpqcCk7CisJCQlqcS0tOworI2RlZmluZSBqb2ZmKHApICgoc3RydWN0IGpvYiAqKSgoY2hhciAqKShwKSArIGwpKQorI2RlZmluZSBqbW92ZShwKSAocCkgPSAodm9pZCAqKSgoY2hhciAqKShwKSArIG9mZnNldCkKKwkJCWlmIChsaWtlbHkoam9mZihqcCktPnBzID09ICZqcS0+cHMwKSkKKwkJCQlqbW92ZShqb2ZmKGpwKS0+cHMpOworCQkJaWYgKGpvZmYoanApLT5wcmV2X2pvYikKKwkJCQlqbW92ZShqb2ZmKGpwKS0+cHJldl9qb2IpOworCQl9CisJCWlmIChjdXJqb2IpCisJCQlqbW92ZShjdXJqb2IpOworI3VuZGVmIGpvZmYKKyN1bmRlZiBqbW92ZQorCX0KKworCW5qb2JzICs9IDQ7CisJam9idGFiID0ganA7CisJanAgPSAoc3RydWN0IGpvYiAqKSgoY2hhciAqKWpwICsgbGVuKTsKKwlqcSA9IGpwICsgMzsKKwlkbyB7CisJCWpxLT51c2VkID0gMDsKKwl9IHdoaWxlICgtLWpxID49IGpwKTsKKwlyZXR1cm4ganA7Cit9CisKKworLyoKKyAqIEZvcmsgb2ZmIGEgc3Vic2hlbGwuICBJZiB3ZSBhcmUgZG9pbmcgam9iIGNvbnRyb2wsIGdpdmUgdGhlIHN1YnNoZWxsIGl0cworICogb3duIHByb2Nlc3MgZ3JvdXAuICBKcCBpcyBhIGpvYiBzdHJ1Y3R1cmUgdGhhdCB0aGUgam9iIGlzIHRvIGJlIGFkZGVkIHRvLgorICogTiBpcyB0aGUgY29tbWFuZCB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGJ5IHRoZSBjaGlsZC4gIEJvdGgganAgYW5kIG4gbWF5CisgKiBiZSBOVUxMLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqCUZPUktfRkcgLSBGb3JrIG9mZiBhIGZvcmVncm91bmQgcHJvY2Vzcy4KKyAqCUZPUktfQkcgLSBGb3JrIG9mZiBhIGJhY2tncm91bmQgcHJvY2Vzcy4KKyAqCUZPUktfTk9KT0IgLSBMaWtlIEZPUktfRkcsIGJ1dCBkb24ndCBnaXZlIHRoZSBwcm9jZXNzIGl0cyBvd24KKyAqCQkgICAgIHByb2Nlc3MgZ3JvdXAgZXZlbiBpZiBqb2IgY29udHJvbCBpcyBvbi4KKyAqCisgKiBXaGVuIGpvYiBjb250cm9sIGlzIHR1cm5lZCBvZmYsIGJhY2tncm91bmQgcHJvY2Vzc2VzIGhhdmUgdGhlaXIgc3RhbmRhcmQKKyAqIGlucHV0IHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsIChleGNlcHQgZm9yIHRoZSBzZWNvbmQgYW5kIGxhdGVyIHByb2Nlc3NlcworICogaW4gYSBwaXBlbGluZSkuCisgKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KKworU1RBVElDIGlubGluZSB2b2lkCitmb3JrY2hpbGQoc3RydWN0IGpvYiAqanAsIHVuaW9uIG5vZGUgKm4sIGludCBtb2RlKQoreworCWludCBvbGRsdmw7CisKKwlUUkFDRSgoIkNoaWxkIHNoZWxsICVkXG4iLCBnZXRwaWQoKSkpOworCW9sZGx2bCA9IHNobHZsOworCXNobHZsKys7CisKKwljbG9zZXNjcmlwdCgpOworCWNsZWFyX3RyYXBzKCk7CisjaWYgSk9CUworCS8qIGRvIGpvYiBjb250cm9sIG9ubHkgaW4gcm9vdCBzaGVsbCAqLworCWpvYmN0bCA9IDA7CisJaWYgKG1vZGUgIT0gRk9SS19OT0pPQiAmJiBqcC0+am9iY3RsICYmICFvbGRsdmwpIHsKKwkJcGlkX3QgcGdycDsKKworCQlpZiAoanAtPm5wcm9jcyA9PSAwKQorCQkJcGdycCA9IGdldHBpZCgpOworCQllbHNlCisJCQlwZ3JwID0ganAtPnBzWzBdLnBpZDsKKwkJLyogVGhpcyBjYW4gZmFpbCBiZWNhdXNlIHdlIGFyZSBkb2luZyBpdCBpbiB0aGUgcGFyZW50IGFsc28gKi8KKwkJKHZvaWQpc2V0cGdpZCgwLCBwZ3JwKTsKKwkJaWYgKG1vZGUgPT0gRk9SS19GRykKKwkJCXh0Y3NldHBncnAodHR5ZmQsIHBncnApOworCQlzZXRzaWduYWwoU0lHVFNUUCk7CisJCXNldHNpZ25hbChTSUdUVE9VKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmIChtb2RlID09IEZPUktfQkcpIHsKKwkJaWdub3Jlc2lnKFNJR0lOVCk7CisJCWlnbm9yZXNpZyhTSUdRVUlUKTsKKwkJaWYgKGpwLT5ucHJvY3MgPT0gMCkgeworCQkJY2xvc2UoMCk7CisJCQlpZiAob3BlbihfUEFUSF9ERVZOVUxMLCBPX1JET05MWSkgIT0gMCkKKwkJCQlzaF9lcnJvcigiQ2FuJ3Qgb3BlbiAlcyIsIF9QQVRIX0RFVk5VTEwpOworCQl9CisJfQorCWlmICghb2xkbHZsICYmIGlmbGFnKSB7CisJCXNldHNpZ25hbChTSUdJTlQpOworCQlzZXRzaWduYWwoU0lHUVVJVCk7CisJCXNldHNpZ25hbChTSUdURVJNKTsKKwl9CisJZm9yIChqcCA9IGN1cmpvYjsganA7IGpwID0ganAtPnByZXZfam9iKQorCQlmcmVlam9iKGpwKTsKKwlqb2JsZXNzID0gMDsKK30KKworU1RBVElDIGlubGluZSB2b2lkCitmb3JrcGFyZW50KHN0cnVjdCBqb2IgKmpwLCB1bmlvbiBub2RlICpuLCBpbnQgbW9kZSwgcGlkX3QgcGlkKQoreworCVRSQUNFKCgiSW4gcGFyZW50IHNoZWxsOiAgY2hpbGQgPSAlZFxuIiwgcGlkKSk7CisJaWYgKCFqcCkgeworCQl3aGlsZSAoam9ibGVzcyAmJiBkb3dhaXQoRE9XQUlUX05PUk1BTCwgMCkgPiAwKTsKKwkJam9ibGVzcysrOworCQlyZXR1cm47CisJfQorI2lmIEpPQlMKKwlpZiAobW9kZSAhPSBGT1JLX05PSk9CICYmIGpwLT5qb2JjdGwpIHsKKwkJaW50IHBncnA7CisKKwkJaWYgKGpwLT5ucHJvY3MgPT0gMCkKKwkJCXBncnAgPSBwaWQ7CisJCWVsc2UKKwkJCXBncnAgPSBqcC0+cHNbMF0ucGlkOworCQkvKiBUaGlzIGNhbiBmYWlsIGJlY2F1c2Ugd2UgYXJlIGRvaW5nIGl0IGluIHRoZSBjaGlsZCBhbHNvICovCisJCSh2b2lkKXNldHBnaWQocGlkLCBwZ3JwKTsKKwl9CisjZW5kaWYKKwlpZiAobW9kZSA9PSBGT1JLX0JHKSB7CisJCWJhY2tnbmRwaWQgPSBwaWQ7CQkvKiBzZXQgJCEgKi8KKwkJc2V0X2N1cmpvYihqcCwgQ1VSX1JVTk5JTkcpOworCX0KKwlpZiAoanApIHsKKwkJc3RydWN0IHByb2NzdGF0ICpwcyA9ICZqcC0+cHNbanAtPm5wcm9jcysrXTsKKwkJcHMtPnBpZCA9IHBpZDsKKwkJcHMtPnN0YXR1cyA9IC0xOworCQlwcy0+Y21kID0gbnVsbHN0cjsKKwkJaWYgKGpvYmN0bCAmJiBuKQorCQkJcHMtPmNtZCA9IGNvbW1hbmR0ZXh0KG4pOworCX0KK30KKworaW50Citmb3Jrc2hlbGwoc3RydWN0IGpvYiAqanAsIHVuaW9uIG5vZGUgKm4sIGludCBtb2RlKQoreworCWludCBwaWQ7CisKKwlUUkFDRSgoImZvcmtzaGVsbCglJSVkLCAlcCwgJWQpIGNhbGxlZFxuIiwgam9ibm8oanApLCBuLCBtb2RlKSk7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKSB7CisJCVRSQUNFKCgiRm9yayBmYWlsZWQsIGVycm5vPSVkIiwgZXJybm8pKTsKKwkJaWYgKGpwKQorCQkJZnJlZWpvYihqcCk7CisJCXNoX2Vycm9yKCJDYW5ub3QgZm9yayIpOworCX0KKwlpZiAocGlkID09IDApCisJCWZvcmtjaGlsZChqcCwgbiwgbW9kZSk7CisJZWxzZQorCQlmb3JrcGFyZW50KGpwLCBuLCBtb2RlLCBwaWQpOworCXJldHVybiBwaWQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciBqb2IgdG8gZmluaXNoLgorICoKKyAqIFVuZGVyIGpvYiBjb250cm9sIHdlIGhhdmUgdGhlIHByb2JsZW0gdGhhdCB3aGlsZSBhIGNoaWxkIHByb2Nlc3MgaXMKKyAqIHJ1bm5pbmcgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIHVzZXIgYXJlIHNlbnQgdG8gdGhlIGNoaWxkIGJ1dCBub3QKKyAqIHRvIHRoZSBzaGVsbC4gIFRoaXMgbWVhbnMgdGhhdCBhbiBpbmZpbml0ZSBsb29wIHN0YXJ0ZWQgYnkgYW4gaW50ZXItCisgKiBhY3RpdmUgdXNlciBtYXkgYmUgaGFyZCB0byBraWxsLiAgV2l0aCBqb2IgY29udHJvbCB0dXJuZWQgb2ZmLCBhbgorICogaW50ZXJhY3RpdmUgdXNlciBtYXkgcGxhY2UgYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbSBpbnNpZGUgYSBsb29wLiAgSWYKKyAqIHRoZSBpbnRlcmFjdGl2ZSBwcm9ncmFtIGNhdGNoZXMgaW50ZXJydXB0cywgdGhlIHVzZXIgZG9lc24ndCB3YW50CisgKiB0aGVzZSBpbnRlcnJ1cHRzIHRvIGFsc28gYWJvcnQgdGhlIGxvb3AuICBUaGUgYXBwcm9hY2ggd2UgdGFrZSBoZXJlCisgKiBpcyB0byBoYXZlIHRoZSBzaGVsbCBpZ25vcmUgaW50ZXJydXB0IHNpZ25hbHMgd2hpbGUgd2FpdGluZyBmb3IgYQorICogZm9yZ3JvdW5kIHByb2Nlc3MgdG8gdGVybWluYXRlLCBhbmQgdGhlbiBzZW5kIGl0c2VsZiBhbiBpbnRlcnJ1cHQKKyAqIHNpZ25hbCBpZiB0aGUgY2hpbGQgcHJvY2VzcyB3YXMgdGVybWluYXRlZCBieSBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorICogVW5mb3J0dW5hdGVseSwgc29tZSBwcm9ncmFtcyB3YW50IHRvIGRvIGEgYml0IG9mIGNsZWFudXAgYW5kIHRoZW4KKyAqIGV4aXQgb24gaW50ZXJydXB0OyB1bmxlc3MgdGhlc2UgcHJvY2Vzc2VzIHRlcm1pbmF0ZSB0aGVtc2VsdmVzIGJ5CisgKiBzZW5kaW5nIGEgc2lnbmFsIHRvIHRoZW1zZWx2ZXMgKGluc3RlYWQgb2YgY2FsbGluZyBleGl0KSB0aGV5IHdpbGwKKyAqIGNvbmZ1c2UgdGhpcyBhcHByb2FjaC4KKyAqCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworCitpbnQKK3dhaXRmb3Jqb2Ioc3RydWN0IGpvYiAqanApCit7CisJaW50IHN0OworCisJVFJBQ0UoKCJ3YWl0Zm9yam9iKCUlJWQpIGNhbGxlZFxuIiwgam9ibm8oanApKSk7CisJd2hpbGUgKGpwLT5zdGF0ZSA9PSBKT0JSVU5OSU5HKSB7CisJCWRvd2FpdChET1dBSVRfQkxPQ0ssIGpwKTsKKwl9CisJc3QgPSBnZXRzdGF0dXMoanApOworI2lmIEpPQlMKKwlpZiAoanAtPmpvYmN0bCkgeworCQl4dGNzZXRwZ3JwKHR0eWZkLCByb290cGlkKTsKKwkJLyoKKwkJICogVGhpcyBpcyB0cnVseSBncm9zcy4KKwkJICogSWYgd2UncmUgZG9pbmcgam9iIGNvbnRyb2wsIHRoZW4gd2UgZGlkIGEgVElPQ1NQR1JQIHdoaWNoCisJCSAqIGNhdXNlZCB1cyAodGhlIHNoZWxsKSB0byBubyBsb25nZXIgYmUgaW4gdGhlIGNvbnRyb2xsaW5nCisJCSAqIHNlc3Npb24gLS0gc28gd2Ugd291bGRuJ3QgaGF2ZSBzZWVuIGFueSBeQy9TSUdJTlQuICBTbywgd2UKKwkJICogaW50dWl0IGZyb20gdGhlIHN1YnByb2Nlc3MgZXhpdCBzdGF0dXMgd2hldGhlciBhIFNJR0lOVAorCQkgKiBvY2N1cnJlZCwgYW5kIGlmIHNvIGludGVycnVwdCBvdXJzZWx2ZXMuICBZdWNrLiAgLSBteWNyb2Z0CisJCSAqLworCQlpZiAoanAtPnNpZ2ludCkKKwkJCXJhaXNlKFNJR0lOVCk7CisJfQorI2VuZGlmCisJaWYgKCEgSk9CUyB8fCBqcC0+c3RhdGUgPT0gSk9CRE9ORSkKKwkJZnJlZWpvYihqcCk7CisJcmV0dXJuIHN0OworfQorCisKKworLyoKKyAqIFdhaXQgZm9yIGEgcHJvY2VzcyB0byB0ZXJtaW5hdGUuCisgKi8KKworU1RBVElDIGludAorZG93YWl0KGludCBibG9jaywgc3RydWN0IGpvYiAqam9iKQoreworCWludCBwaWQ7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgam9iICpqcDsKKwlzdHJ1Y3Qgam9iICp0aGlzam9iOworCWludCBzdGF0ZTsKKworCVRSQUNFKCgiZG93YWl0KCVkKSBjYWxsZWRcbiIsIGJsb2NrKSk7CisJcGlkID0gd2FpdHByb2MoYmxvY2ssICZzdGF0dXMpOworCVRSQUNFKCgid2FpdCByZXR1cm5zIHBpZCAlZCwgc3RhdHVzPSVkXG4iLCBwaWQsIHN0YXR1cykpOworCWlmIChwaWQgPD0gMCkKKwkJcmV0dXJuIHBpZDsKKwlJTlRPRkY7CisJdGhpc2pvYiA9IE5VTEw7CisJZm9yIChqcCA9IGN1cmpvYjsganA7IGpwID0ganAtPnByZXZfam9iKSB7CisJCXN0cnVjdCBwcm9jc3RhdCAqc3A7CisJCXN0cnVjdCBwcm9jc3RhdCAqc3BlbmQ7CisJCWlmIChqcC0+c3RhdGUgPT0gSk9CRE9ORSkKKwkJCWNvbnRpbnVlOworCQlzdGF0ZSA9IEpPQkRPTkU7CisJCXNwZW5kID0ganAtPnBzICsganAtPm5wcm9jczsKKwkJc3AgPSBqcC0+cHM7CisJCWRvIHsKKwkJCWlmIChzcC0+cGlkID09IHBpZCkgeworCQkJCVRSQUNFKCgiSm9iICVkOiBjaGFuZ2luZyBzdGF0dXMgb2YgcHJvYyAlZCBmcm9tIDB4JXggdG8gMHgleFxuIiwgam9ibm8oanApLCBwaWQsIHNwLT5zdGF0dXMsIHN0YXR1cykpOworCQkJCXNwLT5zdGF0dXMgPSBzdGF0dXM7CisJCQkJdGhpc2pvYiA9IGpwOworCQkJfQorCQkJaWYgKHNwLT5zdGF0dXMgPT0gLTEpCisJCQkJc3RhdGUgPSBKT0JSVU5OSU5HOworI2lmIEpPQlMKKwkJCWlmIChzdGF0ZSA9PSBKT0JSVU5OSU5HKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKFdJRlNUT1BQRUQoc3AtPnN0YXR1cykpIHsKKwkJCQlqcC0+c3RvcHN0YXR1cyA9IHNwLT5zdGF0dXM7CisJCQkJc3RhdGUgPSBKT0JTVE9QUEVEOworCQkJfQorI2VuZGlmCisJCX0gd2hpbGUgKCsrc3AgPCBzcGVuZCk7CisJCWlmICh0aGlzam9iKQorCQkJZ290byBnb3Rqb2I7CisJfQorCWlmICghSk9CUyB8fCAhV0lGU1RPUFBFRChzdGF0dXMpKQorCQlqb2JsZXNzLS07CisJZ290byBvdXQ7CisKK2dvdGpvYjoKKwlpZiAoc3RhdGUgIT0gSk9CUlVOTklORykgeworCQl0aGlzam9iLT5jaGFuZ2VkID0gMTsKKworCQlpZiAodGhpc2pvYi0+c3RhdGUgIT0gc3RhdGUpIHsKKwkJCVRSQUNFKCgiSm9iICVkOiBjaGFuZ2luZyBzdGF0ZSBmcm9tICVkIHRvICVkXG4iLCBqb2Jubyh0aGlzam9iKSwgdGhpc2pvYi0+c3RhdGUsIHN0YXRlKSk7CisJCQl0aGlzam9iLT5zdGF0ZSA9IHN0YXRlOworI2lmIEpPQlMKKwkJCWlmIChzdGF0ZSA9PSBKT0JTVE9QUEVEKSB7CisJCQkJc2V0X2N1cmpvYih0aGlzam9iLCBDVVJfU1RPUFBFRCk7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworb3V0OgorCUlOVE9OOworCisJaWYgKHRoaXNqb2IgJiYgdGhpc2pvYiA9PSBqb2IpIHsKKwkJY2hhciBzWzQ4ICsgMV07CisJCWludCBsZW47CisKKwkJbGVuID0gc3ByaW50X3N0YXR1cyhzLCBzdGF0dXMsIDEpOworCQlpZiAobGVuKSB7CisJCQlzW2xlbl0gPSAnXG4nOworCQkJc1tsZW4gKyAxXSA9IDA7CisJCQlvdXRzdHIocywgb3V0Mik7CisJCX0KKwl9CisJcmV0dXJuIHBpZDsKK30KKworCisKKy8qCisgKiBEbyBhIHdhaXQgc3lzdGVtIGNhbGwuICBJZiBqb2IgY29udHJvbCBpcyBjb21waWxlZCBpbiwgd2UgYWNjZXB0CisgKiBzdG9wcGVkIHByb2Nlc3Nlcy4gIElmIGJsb2NrIGlzIHplcm8sIHdlIHJldHVybiBhIHZhbHVlIG9mIHplcm8KKyAqIHJhdGhlciB0aGFuIGJsb2NraW5nLgorICoKKyAqIFN5c3RlbSBWIGRvZXNuJ3QgaGF2ZSBhIG5vbi1ibG9ja2luZyB3YWl0IHN5c3RlbSBjYWxsLiAgSXQgZG9lcworICogaGF2ZSBhIFNJR0NMRCBzaWduYWwgdGhhdCBpcyBzZW50IHRvIGEgcHJvY2VzcyB3aGVuIG9uZSBvZiBpdCdzCisgKiBjaGlsZHJlbiBkaWVzLiAgVGhlIG9idmlvdXMgd2F5IHRvIHVzZSBTSUdDTEQgd291bGQgYmUgdG8gaW5zdGFsbAorICogYSBoYW5kbGVyIGZvciBTSUdDTEQgd2hpY2ggc2ltcGx5IGJ1bXBlZCBhIGNvdW50ZXIgd2hlbiBhIFNJR0NMRAorICogd2FzIHJlY2VpdmVkLCBhbmQgaGF2ZSB3YWl0cHJvYyBidW1wIGFub3RoZXIgY291bnRlciB3aGVuIGl0IGdvdAorICogdGhlIHN0YXR1cyBvZiBhIHByb2Nlc3MuICBXYWl0cHJvYyB3b3VsZCB0aGVuIGtub3cgdGhhdCBhIHdhaXQKKyAqIHN5c3RlbSBjYWxsIHdvdWxkIG5vdCBibG9jayBpZiB0aGUgdHdvIGNvdW50ZXJzIHdlcmUgZGlmZmVyZW50LgorICogVGhpcyBhcHByb2FjaCBkb2Vzbid0IHdvcmsgYmVjYXVzZSBpZiBhIHByb2Nlc3MgaGFzIGNoaWxkcmVuIHRoYXQKKyAqIGhhdmUgbm90IGJlZW4gd2FpdGVkIGZvciwgU3lzdGVtIFYgd2lsbCBzZW5kIGl0IGEgU0lHQ0xEIHdoZW4gaXQKKyAqIGluc3RhbGxzIGEgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR0NMRC4gIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHdoZW4KKyAqIGEgY2hpbGQgZXhpdHMsIHRoZSBzaGVsbCB3aWxsIGJlIHNlbnQgU0lHQ0xEIHNpZ25hbHMgY29udGludW91c2x5CisgKiB1bnRpbCBpcyBydW5zIG91dCBvZiBzdGFjayBzcGFjZSwgdW5sZXNzIGl0IGRvZXMgYSB3YWl0IGNhbGwgYmVmb3JlCisgKiByZXN0b3JpbmcgdGhlIHNpZ25hbCBoYW5kbGVyLiAgVGhlIGNvZGUgYmVsb3cgdGFrZXMgYWR2YW50YWdlIG9mCisgKiB0aGlzIChtaXMpZmVhdHVyZSBieSBpbnN0YWxsaW5nIGEgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR0NMRCBhbmQKKyAqIHRoZW4gY2hlY2tpbmcgdG8gc2VlIHdoZXRoZXIgaXQgd2FzIGNhbGxlZC4gIElmIHRoZXJlIGFyZSBhbnkKKyAqIGNoaWxkcmVuIHRvIGJlIHdhaXRlZCBmb3IsIGl0IHdpbGwgYmUuCisgKgorICogSWYgbmVpdGhlciBTWVNWIG5vciBCU0QgaXMgZGVmaW5lZCwgd2UgZG9uJ3QgaW1wbGVtZW50IG5vbmJsb2NraW5nCisgKiB3YWl0cyBhdCBhbGwuICBJbiB0aGlzIGNhc2UsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGluZm9ybWVkIHdoZW4KKyAqIGEgYmFja2dyb3VuZCBwcm9jZXNzIHVudGlsIHRoZSBuZXh0IHRpbWUgc2hlIHJ1bnMgYSByZWFsIHByb2dyYW0KKyAqIChhcyBvcHBvc2VkIHRvIHJ1bm5pbmcgYSBidWlsdGluIGNvbW1hbmQgb3IganVzdCB0eXBpbmcgcmV0dXJuKSwKKyAqIGFuZCB0aGUgam9icyBjb21tYW5kIG1heSBnaXZlIG91dCBvZiBkYXRlIGluZm9ybWF0aW9uLgorICovCisKKyNpZmRlZiBTWVNWCitTVEFUSUMgaW50IGdvdHNpZ2NoaWxkOworCitTVEFUSUMgaW50IG9uc2lnY2hpbGQoKSB7CisJZ290c2lnY2hpbGQgPSAxOworfQorI2VuZGlmCisKKworU1RBVElDIGludAord2FpdHByb2MoaW50IGJsb2NrLCBpbnQgKnN0YXR1cykKK3sKKyNpZmRlZiBCU0QKKwlpbnQgZmxhZ3MgPSAwOworCisjaWYgSk9CUworCWlmIChqb2JjdGwpCisJCWZsYWdzIHw9IFdVTlRSQUNFRDsKKyNlbmRpZgorCWlmIChibG9jayA9PSAwKQorCQlmbGFncyB8PSBXTk9IQU5HOworCXJldHVybiB3YWl0MyhzdGF0dXMsIGZsYWdzLCAoc3RydWN0IHJ1c2FnZSAqKU5VTEwpOworI2Vsc2UKKyNpZmRlZiBTWVNWCisJaW50ICgqc2F2ZSkoKTsKKworCWlmIChibG9jayA9PSAwKSB7CisJCWdvdHNpZ2NoaWxkID0gMDsKKwkJc2F2ZSA9IHNpZ25hbChTSUdDTEQsIG9uc2lnY2hpbGQpOworCQlzaWduYWwoU0lHQ0xELCBzYXZlKTsKKwkJaWYgKGdvdHNpZ2NoaWxkID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHdhaXQoc3RhdHVzKTsKKyNlbHNlCisJaWYgKGJsb2NrID09IDApCisJCXJldHVybiAwOworCXJldHVybiB3YWl0KHN0YXR1cyk7CisjZW5kaWYKKyNlbmRpZgorfQorCisvKgorICogcmV0dXJuIDEgaWYgdGhlcmUgYXJlIHN0b3BwZWQgam9icywgb3RoZXJ3aXNlIDAKKyAqLworaW50IGpvYl93YXJuaW5nOworaW50CitzdG9wcGVkam9icyh2b2lkKQoreworCXN0cnVjdCBqb2IgKmpwOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCWlmIChqb2Jfd2FybmluZykKKwkJZ290byBvdXQ7CisJanAgPSBjdXJqb2I7CisJaWYgKGpwICYmIGpwLT5zdGF0ZSA9PSBKT0JTVE9QUEVEKSB7CisJCW91dDJzdHIoIllvdSBoYXZlIHN0b3BwZWQgam9icy5cbiIpOworCQlqb2Jfd2FybmluZyA9IDI7CisJCXJldHZhbCsrOworCX0KKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBjb21tYW5kICh0byBiZSBwcmludGVkIGJ5IHRoZQorICogam9icyBjb21tYW5kKS4KKyAqLworCitTVEFUSUMgY2hhciAqY21kbmV4dGM7CisKK1NUQVRJQyBjaGFyICoKK2NvbW1hbmR0ZXh0KHVuaW9uIG5vZGUgKm4pCit7CisJY2hhciAqbmFtZTsKKworCVNUQVJUU1RBQ0tTVFIoY21kbmV4dGMpOworCWNtZHR4dChuKTsKKwluYW1lID0gc3RhY2tibG9jaygpOworCVRSQUNFKCgiY29tbWFuZHRleHQ6IG5hbWUgJXAsIGVuZCAlcFxuXHRcIiVzXCJcbiIsCisJCW5hbWUsIGNtZG5leHRjLCBwcy0+Y21kKSk7CisJcmV0dXJuIHNhdmVzdHIobmFtZSk7Cit9CisKKworU1RBVElDIHZvaWQKK2NtZHR4dCh1bmlvbiBub2RlICpuKQoreworCXVuaW9uIG5vZGUgKm5wOworCXN0cnVjdCBub2RlbGlzdCAqbHA7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIHNbMl07CisKKwlpZiAoIW4pCisJCXJldHVybjsKKwlzd2l0Y2ggKG4tPnR5cGUpIHsKKwlkZWZhdWx0OgorI2lmIERFQlVHCisJCWFib3J0KCk7CisjZW5kaWYKKwljYXNlIE5QSVBFOgorCQlscCA9IG4tPm5waXBlLmNtZGxpc3Q7CisJCWZvciAoOzspIHsKKwkJCWNtZHR4dChscC0+bik7CisJCQlscCA9IGxwLT5uZXh0OworCQkJaWYgKCFscCkKKwkJCQlicmVhazsKKwkJCWNtZHB1dHMoIiB8ICIpOworCQl9CisJCWJyZWFrOworCWNhc2UgTlNFTUk6CisJCXAgPSAiOyAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTkFORDoKKwkJcCA9ICIgJiYgIjsKKwkJZ290byBiaW5vcDsKKwljYXNlIE5PUjoKKwkJcCA9ICIgfHwgIjsKK2Jpbm9wOgorCQljbWR0eHQobi0+bmJpbmFyeS5jaDEpOworCQljbWRwdXRzKHApOworCQluID0gbi0+bmJpbmFyeS5jaDI7CisJCWdvdG8gZG9ub2RlOworCWNhc2UgTlJFRElSOgorCWNhc2UgTkJBQ0tHTkQ6CisJCW4gPSBuLT5ucmVkaXIubjsKKwkJZ290byBkb25vZGU7CisJY2FzZSBOTk9UOgorCQljbWRwdXRzKCIhIik7CisJCW4gPSBuLT5ubm90LmNvbTsKK2Rvbm9kZToKKwkJY21kdHh0KG4pOworCQlicmVhazsKKwljYXNlIE5JRjoKKwkJY21kcHV0cygiaWYgIik7CisJCWNtZHR4dChuLT5uaWYudGVzdCk7CisJCWNtZHB1dHMoIjsgdGhlbiAiKTsKKwkJbiA9IG4tPm5pZi5pZnBhcnQ7CisJCWlmIChuLT5uaWYuZWxzZXBhcnQpIHsKKwkJCWNtZHR4dChuKTsKKwkJCWNtZHB1dHMoIjsgZWxzZSAiKTsKKwkJCW4gPSBuLT5uaWYuZWxzZXBhcnQ7CisJCX0KKwkJcCA9ICI7IGZpIjsKKwkJZ290byBkb3RhaWw7CisJY2FzZSBOU1VCU0hFTEw6CisJCWNtZHB1dHMoIigiKTsKKwkJbiA9IG4tPm5yZWRpci5uOworCQlwID0gIikiOworCQlnb3RvIGRvdGFpbDsKKwljYXNlIE5XSElMRToKKwkJcCA9ICJ3aGlsZSAiOworCQlnb3RvIHVudGlsOworCWNhc2UgTlVOVElMOgorCQlwID0gInVudGlsICI7Cit1bnRpbDoKKwkJY21kcHV0cyhwKTsKKwkJY21kdHh0KG4tPm5iaW5hcnkuY2gxKTsKKwkJbiA9IG4tPm5iaW5hcnkuY2gyOworCQlwID0gIjsgZG9uZSI7Citkb2RvOgorCQljbWRwdXRzKCI7IGRvICIpOworZG90YWlsOgorCQljbWR0eHQobik7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5GT1I6CisJCWNtZHB1dHMoImZvciAiKTsKKwkJY21kcHV0cyhuLT5uZm9yLnZhcik7CisJCWNtZHB1dHMoIiBpbiAiKTsKKwkJY21kbGlzdChuLT5uZm9yLmFyZ3MsIDEpOworCQluID0gbi0+bmZvci5ib2R5OworCQlwID0gIjsgZG9uZSI7CisJCWdvdG8gZG9kbzsKKwljYXNlIE5ERUZVTjoKKwkJY21kcHV0cyhuLT5uYXJnLnRleHQpOworCQlwID0gIigpIHsgLi4uIH0iOworCQlnb3RvIGRvdGFpbDI7CisJY2FzZSBOQ01EOgorCQljbWRsaXN0KG4tPm5jbWQuYXJncywgMSk7CisJCWNtZGxpc3Qobi0+bmNtZC5yZWRpcmVjdCwgMCk7CisJCWJyZWFrOworCWNhc2UgTkFSRzoKKwkJcCA9IG4tPm5hcmcudGV4dDsKK2RvdGFpbDI6CisJCWNtZHB1dHMocCk7CisJCWJyZWFrOworCWNhc2UgTkhFUkU6CisJY2FzZSBOWEhFUkU6CisJCXAgPSAiPDwuLi4iOworCQlnb3RvIGRvdGFpbDI7CisJY2FzZSBOQ0FTRToKKwkJY21kcHV0cygiY2FzZSAiKTsKKwkJY21kcHV0cyhuLT5uY2FzZS5leHByLT5uYXJnLnRleHQpOworCQljbWRwdXRzKCIgaW4gIik7CisJCWZvciAobnAgPSBuLT5uY2FzZS5jYXNlczsgbnA7IG5wID0gbnAtPm5jbGlzdC5uZXh0KSB7CisJCQljbWR0eHQobnAtPm5jbGlzdC5wYXR0ZXJuKTsKKwkJCWNtZHB1dHMoIikgIik7CisJCQljbWR0eHQobnAtPm5jbGlzdC5ib2R5KTsKKwkJCWNtZHB1dHMoIjs7ICIpOworCQl9CisJCXAgPSAiZXNhYyI7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5UTzoKKwkJcCA9ICI+IjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5DTE9CQkVSOgorCQlwID0gIj58IjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5BUFBFTkQ6CisJCXAgPSAiPj4iOworCQlnb3RvIHJlZGlyOworCWNhc2UgTlRPRkQ6CisJCXAgPSAiPiYiOworCQlnb3RvIHJlZGlyOworCWNhc2UgTkZST006CisJCXAgPSAiPCI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBORlJPTUZEOgorCQlwID0gIjwmIjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5GUk9NVE86CisJCXAgPSAiPD4iOworcmVkaXI6CisJCXNbMF0gPSBuLT5uZmlsZS5mZCArICcwJzsKKwkJc1sxXSA9ICdcMCc7CisJCWNtZHB1dHMocyk7CisJCWNtZHB1dHMocCk7CisJCWlmIChuLT50eXBlID09IE5UT0ZEIHx8IG4tPnR5cGUgPT0gTkZST01GRCkgeworCQkJc1swXSA9IG4tPm5kdXAuZHVwZmQgKyAnMCc7CisJCQlwID0gczsKKwkJCWdvdG8gZG90YWlsMjsKKwkJfSBlbHNlIHsKKwkJCW4gPSBuLT5uZmlsZS5mbmFtZTsKKwkJCWdvdG8gZG9ub2RlOworCQl9CisJfQorfQorCitTVEFUSUMgdm9pZAorY21kbGlzdCh1bmlvbiBub2RlICpucCwgaW50IHNlcCkKK3sKKwlmb3IgKDsgbnA7IG5wID0gbnAtPm5hcmcubmV4dCkgeworCQlpZiAoIXNlcCkKKwkJCWNtZHB1dHMoc3Bjc3RyKTsKKwkJY21kdHh0KG5wKTsKKwkJaWYgKHNlcCAmJiBucC0+bmFyZy5uZXh0KQorCQkJY21kcHV0cyhzcGNzdHIpOworCX0KK30KKworCitTVEFUSUMgdm9pZAorY21kcHV0cyhjb25zdCBjaGFyICpzKQoreworCWNvbnN0IGNoYXIgKnAsICpzdHI7CisJY2hhciBjY1syXSA9ICIgIjsKKwljaGFyICpuZXh0YzsKKwlzaWduZWQgY2hhciBjOworCWludCBzdWJ0eXBlID0gMDsKKwlpbnQgcXVvdGVkID0gMDsKKwlzdGF0aWMgY29uc3QgY2hhciB2c3R5cGVbVlNUWVBFICsgMV1bNF0gPSB7CisJCSIiLCAifSIsICItIiwgIisiLCAiPyIsICI9IiwKKwkJIiUiLCAiJSUiLCAiIyIsICIjIyIsCisJfTsKKworCW5leHRjID0gbWFrZXN0cnNwYWNlKChzdHJsZW4ocykgKyAxKSAqIDgsIGNtZG5leHRjKTsKKwlwID0gczsKKwl3aGlsZSAoKGMgPSAqcCsrKSAhPSAwKSB7CisJCXN0ciA9IDA7CisJCXN3aXRjaCAoYykgeworCQljYXNlIENUTEVTQzoKKwkJCWMgPSAqcCsrOworCQkJYnJlYWs7CisJCWNhc2UgQ1RMVkFSOgorCQkJc3VidHlwZSA9ICpwKys7CisJCQlpZiAoKHN1YnR5cGUgJiBWU1RZUEUpID09IFZTTEVOR1RIKQorCQkJCXN0ciA9ICIkeyMiOworCQkJZWxzZQorCQkJCXN0ciA9ICIkeyI7CisJCQlpZiAoIShzdWJ0eXBlICYgVlNRVU9URSkgIT0gIShxdW90ZWQgJiAxKSkgeworCQkJCXF1b3RlZCBePSAxOworCQkJCWMgPSAnIic7CisJCQl9IGVsc2UKKwkJCQlnb3RvIGRvc3RyOworCQkJYnJlYWs7CisJCWNhc2UgQ1RMRU5EVkFSOgorCQkJc3RyID0gIlwifSIgKyAhKHF1b3RlZCAmIDEpOworCQkJcXVvdGVkID4+PSAxOworCQkJc3VidHlwZSA9IDA7CisJCQlnb3RvIGRvc3RyOworCQljYXNlIENUTEJBQ0tROgorCQkJc3RyID0gIiQoLi4uKSI7CisJCQlnb3RvIGRvc3RyOworCQljYXNlIENUTEJBQ0tRK0NUTFFVT1RFOgorCQkJc3RyID0gIlwiJCguLi4pXCIiOworCQkJZ290byBkb3N0cjsKKwkJY2FzZSBDVExBUkk6CisJCQlzdHIgPSAiJCgoIjsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMRU5EQVJJOgorCQkJc3RyID0gIikpIjsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMUVVPVEVNQVJLOgorCQkJcXVvdGVkIF49IDE7CisJCQljID0gJyInOworCQkJYnJlYWs7CisJCWNhc2UgJz0nOgorCQkJaWYgKHN1YnR5cGUgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmICgoc3VidHlwZSAmIFZTVFlQRSkgIT0gVlNOT1JNQUwpCisJCQkJcXVvdGVkIDw8PSAxOworCQkJc3RyID0gdnN0eXBlW3N1YnR5cGUgJiBWU1RZUEVdOworCQkJaWYgKHN1YnR5cGUgJiBWU05VTCkKKwkJCQljID0gJzonOworCQkJZWxzZQorCQkJCWdvdG8gY2hlY2tzdHI7CisJCQlicmVhazsKKwkJY2FzZSAnXCcnOgorCQljYXNlICdcXCc6CisJCWNhc2UgJyInOgorCQljYXNlICckJzoKKwkJCS8qIFRoZXNlIGNhbiBvbmx5IGhhcHBlbiBpbnNpZGUgcXVvdGVzICovCisJCQljY1swXSA9IGM7CisJCQlzdHIgPSBjYzsKKwkJCWMgPSAnXFwnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlVU1RQVVRDKGMsIG5leHRjKTsKK2NoZWNrc3RyOgorCQlpZiAoIXN0cikKKwkJCWNvbnRpbnVlOworZG9zdHI6CisJCXdoaWxlICgoYyA9ICpzdHIrKykpIHsKKwkJCVVTVFBVVEMoYywgbmV4dGMpOworCQl9CisJfQorCWlmIChxdW90ZWQgJiAxKSB7CisJCVVTVFBVVEMoJyInLCBuZXh0Yyk7CisJfQorCSpuZXh0YyA9IDA7CisJY21kbmV4dGMgPSBuZXh0YzsKK30KKworCitTVEFUSUMgdm9pZAorc2hvd3BpcGUoc3RydWN0IGpvYiAqanAsIHN0cnVjdCBvdXRwdXQgKm91dCkKK3sKKwlzdHJ1Y3QgcHJvY3N0YXQgKnNwOworCXN0cnVjdCBwcm9jc3RhdCAqc3BlbmQ7CisKKwlzcGVuZCA9IGpwLT5wcyArIGpwLT5ucHJvY3M7CisJZm9yIChzcCA9IGpwLT5wcyArIDE7IHNwIDwgc3BlbmQ7IHNwKyspCisJCW91dGZtdChvdXQsICIgfCAlcyIsIHNwLT5jbWQpOworCW91dGNzbG93KCdcbicsIG91dCk7CisJZmx1c2hhbGwoKTsKK30KKworCisjaWYgSk9CUworU1RBVElDIHZvaWQKK3h0Y3NldHBncnAoaW50IGZkLCBwaWRfdCBwZ3JwKQoreworCWlmICh0Y3NldHBncnAoZmQsIHBncnApKQorCQlzaF9lcnJvcigiQ2Fubm90IHNldCB0dHkgcHJvY2VzcyBncm91cCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKK30KKyNlbmRpZgorCisKK1NUQVRJQyBpbnQKK2dldHN0YXR1cyhzdHJ1Y3Qgam9iICpqb2IpIHsKKwlpbnQgc3RhdHVzOworCWludCByZXR2YWw7CisKKwlzdGF0dXMgPSBqb2ItPnBzW2pvYi0+bnByb2NzIC0gMV0uc3RhdHVzOworCXJldHZhbCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworI2lmIEpPQlMKKwkJcmV0dmFsID0gV1NUT1BTSUcoc3RhdHVzKTsKKwkJaWYgKCFXSUZTVE9QUEVEKHN0YXR1cykpCisjZW5kaWYKKwkJeworCQkJLyogWFhYOiBsaW1pdHMgbnVtYmVyIG9mIHNpZ25hbHMgKi8KKwkJCXJldHZhbCA9IFdURVJNU0lHKHN0YXR1cyk7CisjaWYgSk9CUworCQkJaWYgKHJldHZhbCA9PSBTSUdJTlQpCisJCQkJam9iLT5zaWdpbnQgPSAxOworI2VuZGlmCisJCX0KKwkJcmV0dmFsICs9IDEyODsKKwl9CisJVFJBQ0UoKCJnZXRzdGF0dXM6IGpvYiAlZCwgbnByb2MgJWQsIHN0YXR1cyAleCwgcmV0dmFsICV4XG4iLAorCQlqb2Jubyhqb2IpLCBqb2ItPm5wcm9jcywgc3RhdHVzLCByZXR2YWwpKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvam9icy5oIGIvdXNyL2Rhc2gvam9icy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZTQyMWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9qb2JzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpam9icy5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogTW9kZSBhcmd1bWVudCB0byBmb3Jrc2hlbGwuICBEb24ndCBjaGFuZ2UgRk9SS19GRyBvciBGT1JLX0JHLiAqLworI2RlZmluZSBGT1JLX0ZHIDAKKyNkZWZpbmUgRk9SS19CRyAxCisjZGVmaW5lIEZPUktfTk9KT0IgMgorCisvKiBtb2RlIGZsYWdzIGZvciBzaG93am9iKHMpICovCisjZGVmaW5lCVNIT1dfUEdJRAkweDAxCS8qIG9ubHkgc2hvdyBwZ2lkIC0gZm9yIGpvYnMgLXAgKi8KKyNkZWZpbmUJU0hPV19QSUQJMHgwNAkvKiBpbmNsdWRlIHByb2Nlc3MgcGlkICovCisjZGVmaW5lCVNIT1dfQ0hBTkdFRAkweDA4CS8qIG9ubHkgam9icyB3aG9zZSBzdGF0ZSBoYXMgY2hhbmdlZCAqLworCisKKy8qCisgKiBBIGpvYiBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBqb2IuICBBIGpvYiBpcyBlaXRoZXIgYQorICogc2luZ2xlIHByb2Nlc3Mgb3IgYSBzZXQgb2YgcHJvY2Vzc2VzIGNvbnRhaW5lZCBpbiBhIHBpcGVsaW5lLiAgSW4gdGhlCisgKiBsYXR0ZXIgY2FzZSwgcGlkbGlzdCB3aWxsIGJlIG5vbi1OVUxMLCBhbmQgd2lsbCBwb2ludCB0byBhIC0xIHRlcm1pbmF0ZWQKKyAqIGFycmF5IG9mIHBpZHMuCisgKi8KKworc3RydWN0IHByb2NzdGF0IHsKKwlwaWRfdAlwaWQ7CQkvKiBwcm9jZXNzIGlkICovCisgCWludAlzdGF0dXM7CQkvKiBsYXN0IHByb2Nlc3Mgc3RhdHVzIGZyb20gd2FpdCgpICovCisgCWNoYXIJKmNtZDsJCS8qIHRleHQgb2YgY29tbWFuZCBiZWluZyBydW4gKi8KK307CisKK3N0cnVjdCBqb2IgeworCXN0cnVjdCBwcm9jc3RhdCBwczA7CS8qIHN0YXR1cyBvZiBwcm9jZXNzICovCisJc3RydWN0IHByb2NzdGF0ICpwczsJLyogc3RhdHVzIG9yIHByb2Nlc3NlcyB3aGVuIG1vcmUgdGhhbiBvbmUgKi8KKyNpZiBKT0JTCisJaW50IHN0b3BzdGF0dXM7CQkvKiBzdGF0dXMgb2YgYSBzdG9wcGVkIGpvYiAqLworI2VuZGlmCisJdWludDMyX3QKKwkJbnByb2NzOiAxNiwJLyogbnVtYmVyIG9mIHByb2Nlc3NlcyAqLworCQlzdGF0ZTogOCwKKyNkZWZpbmUJSk9CUlVOTklORwkwCS8qIGF0IGxlYXN0IG9uZSBwcm9jIHJ1bm5pbmcgKi8KKyNkZWZpbmUJSk9CU1RPUFBFRAkxCS8qIGFsbCBwcm9jcyBhcmUgc3RvcHBlZCAqLworI2RlZmluZQlKT0JET05FCQkyCS8qIGFsbCBwcm9jcyBhcmUgY29tcGxldGVkICovCisjaWYgSk9CUworCQlzaWdpbnQ6IDEsCS8qIGpvYiB3YXMga2lsbGVkIGJ5IFNJR0lOVCAqLworCQlqb2JjdGw6IDEsCS8qIGpvYiBydW5uaW5nIHVuZGVyIGpvYiBjb250cm9sICovCisjZW5kaWYKKwkJd2FpdGVkOiAxLAkvKiB0cnVlIGlmIHRoaXMgZW50cnkgaGFzIGJlZW4gd2FpdGVkIGZvciAqLworCQl1c2VkOiAxLAkvKiB0cnVlIGlmIHRoaXMgZW50cnkgaXMgaW4gdXNlZCAqLworCQljaGFuZ2VkOiAxOwkvKiB0cnVlIGlmIHN0YXR1cyBoYXMgY2hhbmdlZCAqLworCXN0cnVjdCBqb2IgKnByZXZfam9iOwkvKiBwcmV2aW91cyBqb2IgKi8KK307CisKK2V4dGVybiBwaWRfdCBiYWNrZ25kcGlkOwkvKiBwaWQgb2YgbGFzdCBiYWNrZ3JvdW5kIHByb2Nlc3MgKi8KK2V4dGVybiBpbnQgam9iX3dhcm5pbmc7CQkvKiB1c2VyIHdhcyB3YXJuZWQgYWJvdXQgc3RvcHBlZCBqb2JzICovCisjaWYgSk9CUworZXh0ZXJuIGludCBqb2JjdGw7CQkvKiB0cnVlIGlmIGRvaW5nIGpvYiBjb250cm9sICovCisjZWxzZQorI2RlZmluZSBqb2JjdGwgMAorI2VuZGlmCisKK3ZvaWQgc2V0am9iY3RsKGludCk7CitpbnQga2lsbGNtZChpbnQsIGNoYXIgKiopOworaW50IGZnY21kKGludCwgY2hhciAqKik7CitpbnQgYmdjbWQoaW50LCBjaGFyICoqKTsKK2ludCBqb2JzY21kKGludCwgY2hhciAqKik7CitzdHJ1Y3Qgb3V0cHV0Owordm9pZCBzaG93am9icyhzdHJ1Y3Qgb3V0cHV0ICosIGludCk7CitpbnQgd2FpdGNtZChpbnQsIGNoYXIgKiopOworc3RydWN0IGpvYiAqbWFrZWpvYih1bmlvbiBub2RlICosIGludCk7CitpbnQgZm9ya3NoZWxsKHN0cnVjdCBqb2IgKiwgdW5pb24gbm9kZSAqLCBpbnQpOworaW50IHdhaXRmb3Jqb2Ioc3RydWN0IGpvYiAqKTsKK2ludCBzdG9wcGVkam9icyh2b2lkKTsKKworI2lmICEgSk9CUworI2RlZmluZSBzZXRqb2JjdGwob24pCS8qIGRvIG5vdGhpbmcgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWFjaGRlcC5oIGIvdXNyL2Rhc2gvbWFjaGRlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxY2EwN2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9tYWNoZGVwLmgKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyltYWNoZGVwLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisvKgorICogTW9zdCBtYWNoaW5lcyByZXF1aXJlIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIG1hbGxvYyB0byBiZSBhbGlnbmVkCisgKiBpbiBzb21lIHdheS4gIFRoZSBmb2xsb3dpbmcgbWFjcm8gd2lsbCBnZXQgdGhpcyByaWdodCBvbiBtYW55IG1hY2hpbmVzLgorICovCisjaWZkZWYgSEFWRV9TVFJUT0QKKyMgZGVmaW5lIFNIRUxMX1NJWkUgKHNpemVvZih1bmlvbiB7aW50IGk7IGNoYXIgKmNwOyBkb3VibGUgZDsgfSkgLSAxKQorI2Vsc2UKKyMgZGVmaW5lIFNIRUxMX1NJWkUgKHNpemVvZih1bmlvbiB7aW50IGk7IGNoYXIgKmNwO30pIC0gMSkKKyNlbmRpZgorCisvKgorICogSXQgYXBwZWFycyB0aGF0IGdyYWJzdGFja3N0cigpIHdpbGwgYmFyZiB3aXRoIHN1Y2ggYWxpZ25tZW50cworICogYmVjYXVzZSBzdGFsbG9jKCkgd2lsbCByZXR1cm4gYSBzdHJpbmcgYWxsb2NhdGVkIGluIGEgbmV3IHN0YWNrYmxvY2suCisgKi8KKyNkZWZpbmUgU0hFTExfQUxJR04obmJ5dGVzKSAoKChuYnl0ZXMpICsgU0hFTExfU0laRSkgJiB+U0hFTExfU0laRSkKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21haWwuYyBiL3Vzci9kYXNoL21haWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUwN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWFpbC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFJvdXRpbmVzIHRvIGNoZWNrIGZvciBtYWlsLiAgKFBlcmhhcHMgbWFrZSBwYXJ0IG9mIG1haW4uYz8pCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJub2Rlcy5oIgorI2luY2x1ZGUgImV4ZWMuaCIJLyogZGVmaW5lcyBwYWR2YW5jZSgpICovCisjaW5jbHVkZSAidmFyLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm1haWwuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorCisKKyNkZWZpbmUgTUFYTUJPWEVTIDEwCisKKy8qIHRpbWVzIG9mIG1haWxib3hlcyAqLworc3RhdGljIHRpbWVfdCBtYWlsdGltZVtNQVhNQk9YRVNdOworLyogU2V0IGlmIE1BSUwgb3IgTUFJTFBBVEggaXMgY2hhbmdlZC4gKi8KK3N0YXRpYyBpbnQgY2hhbmdlZDsKKworCisKKy8qCisgKiBQcmludCBhcHByb3ByaWF0ZSBtZXNzYWdlKHMpIGlmIG1haWwgaGFzIGFycml2ZWQuICBJZiBjaGFuZ2VkIGlzIHNldCwKKyAqIHRoZW4gdGhlIHZhbHVlIG9mIE1BSUwgaGFzIGNoYW5nZWQsIHNvIHdlIGp1c3QgdXBkYXRlIHRoZSB2YWx1ZXMuCisgKi8KKwordm9pZAorY2hrbWFpbCh2b2lkKQoreworCWNvbnN0IGNoYXIgKm1wYXRoOworCWNoYXIgKnA7CisJY2hhciAqcTsKKwl0aW1lX3QgKm10cDsKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCXN0cnVjdCBzdGF0NjQgc3RhdGI7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwltcGF0aCA9IG1wYXRoc2V0KCkgPyBtcGF0aHZhbCgpIDogbWFpbHZhbCgpOworCWZvciAobXRwID0gbWFpbHRpbWU7IG10cCA8IG1haWx0aW1lICsgTUFYTUJPWEVTOyBtdHArKykgeworCQlwID0gcGFkdmFuY2UoJm1wYXRoLCBudWxsc3RyKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKnAgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlmb3IgKHEgPSBwIDsgKnEgOyBxKyspOworI2lmZGVmIERFQlVHCisJCWlmIChxWy0xXSAhPSAnLycpCisJCQlhYm9ydCgpOworI2VuZGlmCisJCXFbLTFdID0gJ1wwJzsJCQkvKiBkZWxldGUgdHJhaWxpbmcgJy8nICovCisJCWlmIChzdGF0NjQocCwgJnN0YXRiKSA8IDApIHsKKwkJCSptdHAgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFjaGFuZ2VkICYmIHN0YXRiLnN0X210aW1lICE9ICptdHApIHsKKwkJCW91dGZtdCgKKwkJCQkmZXJyb3V0LCBzbmxmbXQsCisJCQkJcGF0aG9wdCA/IHBhdGhvcHQgOiAieW91IGhhdmUgbWFpbCIKKwkJCSk7CisJCX0KKwkJKm10cCA9IHN0YXRiLnN0X210aW1lOworCX0KKwljaGFuZ2VkID0gMDsKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKK30KKworCit2b2lkCitjaGFuZ2VtYWlsKGNvbnN0IGNoYXIgKnZhbCkKK3sKKwljaGFuZ2VkKys7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9tYWlsLmggYi91c3IvZGFzaC9tYWlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2YjIxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21haWwuaApAQCAtMCwwICsxLDM4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW1haWwuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCit2b2lkIGNoa21haWwodm9pZCk7Cit2b2lkIGNoYW5nZW1haWwoY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21haW4uYyBiL3Vzci9kYXNoL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDIxZTRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWFpbi5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJtYWlsLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAiZXhwYW5kLmgiCisjaW5jbHVkZSAiZXZhbC5oIgorI2luY2x1ZGUgImpvYnMuaCIKKyNpbmNsdWRlICJpbnB1dC5oIgorI2luY2x1ZGUgInRyYXAuaCIKKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgImluaXQuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgImV4ZWMuaCIKKyNpbmNsdWRlICJjZC5oIgorCisjaWZkZWYgSEVUSU8KKyNpbmNsdWRlICJoZXRpby5oIgorI2VuZGlmCisKKyNkZWZpbmUgUFJPRklMRSAwCisKK2ludCByb290cGlkOworaW50IHNobHZsOworI2lmZGVmIF9fR0xJQkNfXworaW50ICpkYXNoX2Vycm5vOworI2VuZGlmCisjaWYgUFJPRklMRQorc2hvcnQgcHJvZmlsZV9idWZbMTYzODRdOworZXh0ZXJuIGludCBldGV4dCgpOworI2VuZGlmCisKK1NUQVRJQyB2b2lkIHJlYWRfcHJvZmlsZShjb25zdCBjaGFyICopOworU1RBVElDIGNoYXIgKmZpbmRfZG90X2ZpbGUoY2hhciAqKTsKK3N0YXRpYyBpbnQgY21kbG9vcChpbnQpOworaW50IG1haW4oaW50LCBjaGFyICoqKTsKKworLyoKKyAqIE1haW4gcm91dGluZS4gIFdlIGluaXRpYWxpemUgdGhpbmdzLCBwYXJzZSB0aGUgYXJndW1lbnRzLCBleGVjdXRlCisgKiBwcm9maWxlcyBpZiB3ZSdyZSBhIGxvZ2luIHNoZWxsLCBhbmQgdGhlbiBjYWxsIGNtZGxvb3AgdG8gZXhlY3V0ZQorICogY29tbWFuZHMuICBUaGUgc2V0am1wIGNhbGwgc2V0cyB1cCB0aGUgbG9jYXRpb24gdG8ganVtcCB0byB3aGVuIGFuCisgKiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIHRoZSB2YXJpYWJsZSAic3RhdGUiCisgKiBpcyB1c2VkIHRvIGZpZ3VyZSBvdXQgaG93IGZhciB3ZSBoYWQgZ290dGVuLgorICovCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqc2hpbml0OworCXZvbGF0aWxlIGludCBzdGF0ZTsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCisjaWZkZWYgX19HTElCQ19fCisJZGFzaF9lcnJubyA9IF9fZXJybm9fbG9jYXRpb24oKTsKKyNlbmRpZgorCisjaWYgUFJPRklMRQorCW1vbml0b3IoNCwgZXRleHQsIHByb2ZpbGVfYnVmLCBzaXplb2YgcHJvZmlsZV9idWYsIDUwKTsKKyNlbmRpZgorCXN0YXRlID0gMDsKKwlpZiAodW5saWtlbHkoc2V0am1wKGptcGxvYy5sb2MpKSkgeworCQlpbnQgZTsKKwkJaW50IHM7CisKKwkJcmVzZXQoKTsKKworCQllID0gZXhjZXB0aW9uOworCQlpZiAoZSA9PSBFWEVSUk9SKQorCQkJZXhpdHN0YXR1cyA9IDI7CisKKwkJcyA9IHN0YXRlOworCQlpZiAoZSA9PSBFWEVYSVQgfHwgcyA9PSAwIHx8IGlmbGFnID09IDAgfHwgc2hsdmwpCisJCQlleGl0c2hlbGwoKTsKKworCQlpZiAoZSA9PSBFWElOVAorI2lmIEFUVFkKKwkJICYmICghIGF0dHlzZXQoKSB8fCBlcXVhbCh0ZXJtdmFsKCksICJlbWFjcyIpKQorI2VuZGlmCisJCSApIHsKKwkJCW91dDJjKCdcbicpOworI2lmZGVmIEZMVVNIRVJSCisJCQlmbHVzaG91dChvdXQyKTsKKyNlbmRpZgorCQl9CisJCXBvcHN0YWNrbWFyaygmc21hcmspOworCQlGT1JDRUlOVE9OOwkJCQkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQlpZiAocyA9PSAxKQorCQkJZ290byBzdGF0ZTE7CisJCWVsc2UgaWYgKHMgPT0gMikKKwkJCWdvdG8gc3RhdGUyOworCQllbHNlIGlmIChzID09IDMpCisJCQlnb3RvIHN0YXRlMzsKKwkJZWxzZQorCQkJZ290byBzdGF0ZTQ7CisJfQorCWhhbmRsZXIgPSAmam1wbG9jOworI2lmZGVmIERFQlVHCisJb3BlbnRyYWNlKCk7CisJdHJwdXRzKCJTaGVsbCBhcmdzOiAgIik7ICB0cmFyZ3MoYXJndik7CisjZW5kaWYKKwlyb290cGlkID0gZ2V0cGlkKCk7CisJaW5pdCgpOworCXNldHN0YWNrbWFyaygmc21hcmspOworCXByb2NhcmdzKGFyZ2MsIGFyZ3YpOworCWlmIChhcmd2WzBdICYmIGFyZ3ZbMF1bMF0gPT0gJy0nKSB7CisJCXN0YXRlID0gMTsKKwkJcmVhZF9wcm9maWxlKCIvZXRjL3Byb2ZpbGUiKTsKK3N0YXRlMToKKwkJc3RhdGUgPSAyOworCQlyZWFkX3Byb2ZpbGUoIi5wcm9maWxlIik7CisJfQorc3RhdGUyOgorCXN0YXRlID0gMzsKKwlpZiAoCisjaWZuZGVmIGxpbnV4CisJCWdldHVpZCgpID09IGdldGV1aWQoKSAmJiBnZXRnaWQoKSA9PSBnZXRlZ2lkKCkgJiYKKyNlbmRpZgorCQlpZmxhZworCSkgeworCQlpZiAoKHNoaW5pdCA9IGxvb2t1cHZhcigiRU5WIikpICE9IE5VTEwgJiYgKnNoaW5pdCAhPSAnXDAnKSB7CisJCQlyZWFkX3Byb2ZpbGUoc2hpbml0KTsKKwkJfQorCX0KK3N0YXRlMzoKKwlzdGF0ZSA9IDQ7CisJaWYgKG1pbnVzYykKKwkJZXZhbHN0cmluZyhtaW51c2MsIDApOworCisJaWYgKHNmbGFnIHx8IG1pbnVzYyA9PSBOVUxMKSB7CitzdGF0ZTQ6CS8qIFhYWCA/Pz8gLSB3aHkgaXNuJ3QgdGhpcyBiZWZvcmUgdGhlICJpZiIgc3RhdGVtZW50ICovCisJCWNtZGxvb3AoMSk7CisJfQorI2lmIFBST0ZJTEUKKwltb25pdG9yKDApOworI2VuZGlmCisjaWYgR1BST0YKKwl7CisJCWV4dGVybiB2b2lkIF9tY2xlYW51cCh2b2lkKTsKKwkJX21jbGVhbnVwKCk7CisJfQorI2VuZGlmCisJZXhpdHNoZWxsKCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisKKy8qCisgKiBSZWFkIGFuZCBleGVjdXRlIGNvbW1hbmRzLiAgIlRvcCIgaXMgbm9uemVybyBmb3IgdGhlIHRvcCBsZXZlbCBjb21tYW5kCisgKiBsb29wOyBpdCB0dXJucyBvbiBwcm9tcHRpbmcgaWYgdGhlIHNoZWxsIGlzIGludGVyYWN0aXZlLgorICovCisKK3N0YXRpYyBpbnQKK2NtZGxvb3AoaW50IHRvcCkKK3sKKwl1bmlvbiBub2RlICpuOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJaW50IGludGVyOworCWludCBudW1lb2YgPSAwOworCisJVFJBQ0UoKCJjbWRsb29wKCVkKSBjYWxsZWRcbiIsIHRvcCkpOworI2lmZGVmIEhFVElPCisJaWYoaWZsYWcgJiYgdG9wKQorCQloZXRpb19pbml0KCk7CisjZW5kaWYKKwlmb3IgKDs7KSB7CisJCWludCBza2lwOworCisJCXNldHN0YWNrbWFyaygmc21hcmspOworCQlpZiAoam9iY3RsKQorCQkJc2hvd2pvYnMob3V0MiwgU0hPV19DSEFOR0VEKTsKKwkJaW50ZXIgPSAwOworCQlpZiAoaWZsYWcgJiYgdG9wKSB7CisJCQlpbnRlcisrOworCQkJY2hrbWFpbCgpOworCQl9CisJCW4gPSBwYXJzZWNtZChpbnRlcik7CisJCS8qIHNob3d0cmVlKG4pOyBERUJVRyAqLworCQlpZiAobiA9PSBORU9GKSB7CisJCQlpZiAoIXRvcCB8fCBudW1lb2YgPj0gNTApCisJCQkJYnJlYWs7CisJCQlpZiAoIXN0b3BwZWRqb2JzKCkpIHsKKwkJCQlpZiAoIUlmbGFnKQorCQkJCQlicmVhazsKKwkJCQlvdXQyc3RyKCJcblVzZSBcImV4aXRcIiB0byBsZWF2ZSBzaGVsbC5cbiIpOworCQkJfQorCQkJbnVtZW9mKys7CisJCX0gZWxzZSBpZiAobmZsYWcgPT0gMCkgeworCQkJam9iX3dhcm5pbmcgPSAoam9iX3dhcm5pbmcgPT0gMikgPyAxIDogMDsKKwkJCW51bWVvZiA9IDA7CisJCQlldmFsdHJlZShuLCAwKTsKKwkJfQorCQlwb3BzdGFja21hcmsoJnNtYXJrKTsKKworCQlza2lwID0gZXZhbHNraXA7CisJCWlmIChza2lwKSB7CisJCQlldmFsc2tpcCA9IDA7CisJCQlyZXR1cm4gc2tpcCAmIFNLSVBFVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisvKgorICogUmVhZCAvZXRjL3Byb2ZpbGUgb3IgLnByb2ZpbGUuICBSZXR1cm4gb24gZXJyb3IuCisgKi8KKworU1RBVElDIHZvaWQKK3JlYWRfcHJvZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCBza2lwOworCisJaWYgKHNldGlucHV0ZmlsZShuYW1lLCBJTlBVVF9QVVNIX0ZJTEUgfCBJTlBVVF9OT0ZJTEVfT0spIDwgMCkKKwkJcmV0dXJuOworCisJc2tpcCA9IGNtZGxvb3AoMCk7CisJcG9wZmlsZSgpOworCisJaWYgKHNraXApCisJCWV4aXRzaGVsbCgpOworfQorCisKKworLyoKKyAqIFJlYWQgYSBmaWxlIGNvbnRhaW5pbmcgc2hlbGwgZnVuY3Rpb25zLgorICovCisKK3ZvaWQKK3JlYWRjbWRmaWxlKGNoYXIgKm5hbWUpCit7CisJc2V0aW5wdXRmaWxlKG5hbWUsIElOUFVUX1BVU0hfRklMRSk7CisJY21kbG9vcCgwKTsKKwlwb3BmaWxlKCk7Cit9CisKKworCisvKgorICogVGFrZSBjb21tYW5kcyBmcm9tIGEgZmlsZS4gIFRvIGJlIGNvbXBhdGlibGUgd2Ugc2hvdWxkIGRvIGEgcGF0aAorICogc2VhcmNoIGZvciB0aGUgZmlsZSwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGZpbmQgc3ViLWNvbW1hbmRzLgorICovCisKKworU1RBVElDIGNoYXIgKgorZmluZF9kb3RfZmlsZShjaGFyICpiYXNlbmFtZSkKK3sKKwljaGFyICpmdWxsbmFtZTsKKwljb25zdCBjaGFyICpwYXRoID0gcGF0aHZhbCgpOworCXN0cnVjdCBzdGF0IHN0YXRiOworCisJLyogZG9uJ3QgdHJ5IHRoaXMgZm9yIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzICovCisJaWYgKHN0cmNocihiYXNlbmFtZSwgJy8nKSkKKwkJcmV0dXJuIGJhc2VuYW1lOworCisJd2hpbGUgKChmdWxsbmFtZSA9IHBhZHZhbmNlKCZwYXRoLCBiYXNlbmFtZSkpICE9IE5VTEwpIHsKKwkJaWYgKChzdGF0KGZ1bGxuYW1lLCAmc3RhdGIpID09IDApICYmIFNfSVNSRUcoc3RhdGIuc3RfbW9kZSkpIHsKKwkJCS8qCisJCQkgKiBEb24ndCBib3RoZXIgZnJlZWluZyBoZXJlLCBzaW5jZSBpdCB3aWxsCisJCQkgKiBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorCQkJICovCisJCQlyZXR1cm4gZnVsbG5hbWU7CisJCX0KKwkJc3R1bmFsbG9jKGZ1bGxuYW1lKTsKKwl9CisKKwkvKiBub3QgZm91bmQgaW4gdGhlIFBBVEggKi8KKwlzaF9lcnJvcigiJXM6IG5vdCBmb3VuZCIsIGJhc2VuYW1lKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK2ludAorZG90Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChhcmdjID49IDIpIHsJCS8qIFRoYXQncyB3aGF0IFNWUjIgZG9lcyAqLworCQljaGFyICpmdWxsbmFtZTsKKworCQlmdWxsbmFtZSA9IGZpbmRfZG90X2ZpbGUoYXJndlsxXSk7CisJCXNldGlucHV0ZmlsZShmdWxsbmFtZSwgSU5QVVRfUFVTSF9GSUxFKTsKKwkJY29tbWFuZG5hbWUgPSBmdWxsbmFtZTsKKwkJY21kbG9vcCgwKTsKKwkJcG9wZmlsZSgpOworCQlzdGF0dXMgPSBleGl0c3RhdHVzOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKK2ludAorZXhpdGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKHN0b3BwZWRqb2JzKCkpCisJCXJldHVybiAwOworCWlmIChhcmdjID4gMSkKKwkJZXhpdHN0YXR1cyA9IG51bWJlcihhcmd2WzFdKTsKKwlleHJhaXNlKEVYRVhJVCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWFpbi5oIGIvdXNyL2Rhc2gvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTQ5ODMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9tYWluLmgKQEAgLTAsMCArMSw1NCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyltYWluLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIHBpZCBvZiBtYWluIHNoZWxsICovCitleHRlcm4gaW50IHJvb3RwaWQ7CisvKiBzaGVsbCBsZXZlbDogMCBmb3IgdGhlIG1haW4gc2hlbGwsIDEgZm9yIGl0cyBjaGlsZHJlbiwgYW5kIHNvIG9uICovCitleHRlcm4gaW50IHNobHZsOworI2RlZmluZSByb290c2hlbGwgKCFzaGx2bCkKKworI2lmZGVmIF9fR0xJQkNfXworLyogZ2xpYmMgc3Vja3MgKi8KK2V4dGVybiBpbnQgKmRhc2hfZXJybm87CisjdW5kZWYgZXJybm8KKyNkZWZpbmUgZXJybm8gKCpkYXNoX2Vycm5vKQorI2VuZGlmCisKK3ZvaWQgcmVhZGNtZGZpbGUoY2hhciAqKTsKK2ludCBkb3RjbWQoaW50LCBjaGFyICoqKTsKK2ludCBleGl0Y21kKGludCwgY2hhciAqKik7CmRpZmYgLS1naXQgYS91c3IvZGFzaC9tZW1hbGxvYy5jIGIvdXNyL2Rhc2gvbWVtYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFiMzIzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWVtYWxsb2MuYwpAQCAtMCwwICsxLDMyOSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm1hY2hkZXAuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisvKgorICogTGlrZSBtYWxsb2MsIGJ1dCByZXR1cm5zIGFuIGVycm9yIHdoZW4gb3V0IG9mIHNwYWNlLgorICovCisKK3BvaW50ZXIKK2NrbWFsbG9jKHNpemVfdCBuYnl0ZXMpCit7CisJcG9pbnRlciBwOworCisJcCA9IG1hbGxvYyhuYnl0ZXMpOworCWlmIChwID09IE5VTEwpCisJCXNoX2Vycm9yKCJPdXQgb2Ygc3BhY2UiKTsKKwlyZXR1cm4gcDsKK30KKworCisvKgorICogU2FtZSBmb3IgcmVhbGxvYy4KKyAqLworCitwb2ludGVyCitja3JlYWxsb2MocG9pbnRlciBwLCBzaXplX3QgbmJ5dGVzKQoreworCXAgPSByZWFsbG9jKHAsIG5ieXRlcyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJc2hfZXJyb3IoIk91dCBvZiBzcGFjZSIpOworCXJldHVybiBwOworfQorCisKKy8qCisgKiBNYWtlIGEgY29weSBvZiBhIHN0cmluZyBpbiBzYWZlIHN0b3JhZ2UuCisgKi8KKworY2hhciAqCitzYXZlc3RyKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqcCA9IHN0cmR1cChzKTsKKwlpZiAoIXApCisJCXNoX2Vycm9yKCJPdXQgb2Ygc3BhY2UiKTsKKwlyZXR1cm4gcDsKK30KKworCisvKgorICogUGFyc2UgdHJlZXMgZm9yIGNvbW1hbmRzIGFyZSBhbGxvY2F0ZWQgaW4gbGlmbyBvcmRlciwgc28gd2UgdXNlIGEgc3RhY2sKKyAqIHRvIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudCwgYW5kIGFsc28gdG8gYXZvaWQgYWxsIHNvcnRzIG9mIGV4Y2VwdGlvbgorICogaGFuZGxpbmcgY29kZSB0byBoYW5kbGUgaW50ZXJydXB0cyBpbiB0aGUgbWlkZGxlIG9mIGEgcGFyc2UuCisgKgorICogVGhlIHNpemUgNTA0IHdhcyBjaG9zZW4gYmVjYXVzZSB0aGUgVWx0cml4IG1hbGxvYyBoYW5kbGVzIHRoYXQgc2l6ZQorICogd2VsbC4KKyAqLworCisvKiBtaW5pbXVtIHNpemUgb2YgYSBibG9jayAqLworI2RlZmluZSBNSU5TSVpFIFNIRUxMX0FMSUdOKDUwNCkKKworc3RydWN0IHN0YWNrX2Jsb2NrIHsKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnByZXY7CisJY2hhciBzcGFjZVtNSU5TSVpFXTsKK307CisKK3N0cnVjdCBzdGFja19ibG9jayBzdGFja2Jhc2U7CitzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnN0YWNrcCA9ICZzdGFja2Jhc2U7CitzdHJ1Y3Qgc3RhY2ttYXJrICptYXJrcDsKK2NoYXIgKnN0YWNrbnh0ID0gc3RhY2tiYXNlLnNwYWNlOworc2l6ZV90IHN0YWNrbmxlZnQgPSBNSU5TSVpFOworY2hhciAqc3N0cmVuZCA9IHN0YWNrYmFzZS5zcGFjZSArIE1JTlNJWkU7CitpbnQgaGVyZWZkID0gLTE7CisKK3BvaW50ZXIKK3N0YWxsb2Moc2l6ZV90IG5ieXRlcykKK3sKKwljaGFyICpwOworCXNpemVfdCBhbGlnbmVkOworCisJYWxpZ25lZCA9IFNIRUxMX0FMSUdOKG5ieXRlcyk7CisJaWYgKGFsaWduZWQgPiBzdGFja25sZWZ0KSB7CisJCXNpemVfdCBsZW47CisJCXNpemVfdCBibG9ja3NpemU7CisJCXN0cnVjdCBzdGFja19ibG9jayAqc3A7CisKKwkJYmxvY2tzaXplID0gYWxpZ25lZDsKKwkJaWYgKGJsb2Nrc2l6ZSA8IE1JTlNJWkUpCisJCQlibG9ja3NpemUgPSBNSU5TSVpFOworCQlsZW4gPSBzaXplb2Yoc3RydWN0IHN0YWNrX2Jsb2NrKSAtIE1JTlNJWkUgKyBibG9ja3NpemU7CisJCWlmIChsZW4gPCBibG9ja3NpemUpCisJCQlzaF9lcnJvcigiT3V0IG9mIHNwYWNlIik7CisJCUlOVE9GRjsKKwkJc3AgPSBja21hbGxvYyhsZW4pOworCQlzcC0+cHJldiA9IHN0YWNrcDsKKwkJc3RhY2tueHQgPSBzcC0+c3BhY2U7CisJCXN0YWNrbmxlZnQgPSBibG9ja3NpemU7CisJCXNzdHJlbmQgPSBzdGFja254dCArIGJsb2Nrc2l6ZTsKKwkJc3RhY2twID0gc3A7CisJCUlOVE9OOworCX0KKwlwID0gc3RhY2tueHQ7CisJc3RhY2tueHQgKz0gYWxpZ25lZDsKKwlzdGFja25sZWZ0IC09IGFsaWduZWQ7CisJcmV0dXJuIHA7Cit9CisKKwordm9pZAorc3R1bmFsbG9jKHBvaW50ZXIgcCkKK3sKKyNpZmRlZiBERUJVRworCWlmICghcCB8fCAoc3RhY2tueHQgPCAoY2hhciAqKXApIHx8ICgoY2hhciAqKXAgPCBzdGFja3AtPnNwYWNlKSkgeworCQl3cml0ZSgyLCAic3R1bmFsbG9jXG4iLCAxMCk7CisJCWFib3J0KCk7CisJfQorI2VuZGlmCisJc3RhY2tubGVmdCArPSBzdGFja254dCAtIChjaGFyICopcDsKKwlzdGFja254dCA9IHA7Cit9CisKKworCit2b2lkCitzZXRzdGFja21hcmsoc3RydWN0IHN0YWNrbWFyayAqbWFyaykKK3sKKwltYXJrLT5zdGFja3AgPSBzdGFja3A7CisJbWFyay0+c3RhY2tueHQgPSBzdGFja254dDsKKwltYXJrLT5zdGFja25sZWZ0ID0gc3RhY2tubGVmdDsKKwltYXJrLT5tYXJrbmV4dCA9IG1hcmtwOworCW1hcmtwID0gbWFyazsKK30KKworCit2b2lkCitwb3BzdGFja21hcmsoc3RydWN0IHN0YWNrbWFyayAqbWFyaykKK3sKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnNwOworCisJSU5UT0ZGOworCW1hcmtwID0gbWFyay0+bWFya25leHQ7CisJd2hpbGUgKHN0YWNrcCAhPSBtYXJrLT5zdGFja3ApIHsKKwkJc3AgPSBzdGFja3A7CisJCXN0YWNrcCA9IHNwLT5wcmV2OworCQlja2ZyZWUoc3ApOworCX0KKwlzdGFja254dCA9IG1hcmstPnN0YWNrbnh0OworCXN0YWNrbmxlZnQgPSBtYXJrLT5zdGFja25sZWZ0OworCXNzdHJlbmQgPSBtYXJrLT5zdGFja254dCArIG1hcmstPnN0YWNrbmxlZnQ7CisJSU5UT047Cit9CisKKworLyoKKyAqIFdoZW4gdGhlIHBhcnNlciByZWFkcyBpbiBhIHN0cmluZywgaXQgd2FudHMgdG8gc3RpY2sgdGhlIHN0cmluZyBvbiB0aGUKKyAqIHN0YWNrIGFuZCBvbmx5IGFkanVzdCB0aGUgc3RhY2sgcG9pbnRlciB3aGVuIGl0IGtub3dzIGhvdyBiaWcgdGhlCisgKiBzdHJpbmcgaXMuICBTdGFja2Jsb2NrIChkZWZpbmVkIGluIHN0YWNrLmgpIHJldHVybnMgYSBwb2ludGVyIHRvIGEgYmxvY2sKKyAqIG9mIHNwYWNlIG9uIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHN0YWNrYmxvY2tsZW4gcmV0dXJucyB0aGUgbGVuZ3RoIG9mCisgKiB0aGlzIGJsb2NrLiAgR3Jvd3N0YWNrYmxvY2sgd2lsbCBncm93IHRoaXMgc3BhY2UgYnkgYXQgbGVhc3Qgb25lIGJ5dGUsCisgKiBwb3NzaWJseSBtb3ZpbmcgaXQgKGxpa2UgcmVhbGxvYykuICBHcmFic3RhY2tibG9jayBhY3R1YWxseSBhbGxvY2F0ZXMgdGhlCisgKiBwYXJ0IG9mIHRoZSBibG9jayB0aGF0IGhhcyBiZWVuIHVzZWQuCisgKi8KKwordm9pZAorZ3Jvd3N0YWNrYmxvY2sodm9pZCkKK3sKKwlzaXplX3QgbmV3bGVuOworCisgCW5ld2xlbiA9IHN0YWNrbmxlZnQgKiAyOworCWlmIChuZXdsZW4gPCBzdGFja25sZWZ0KQorCQlzaF9lcnJvcigiT3V0IG9mIHNwYWNlIik7CisJaWYgKG5ld2xlbiA8IDEyOCkKKwkJbmV3bGVuICs9IDEyODsKKworCWlmIChzdGFja254dCA9PSBzdGFja3AtPnNwYWNlICYmIHN0YWNrcCAhPSAmc3RhY2tiYXNlKSB7CisJCXN0cnVjdCBzdGFja19ibG9jayAqb2xkc3RhY2twOworCQlzdHJ1Y3Qgc3RhY2ttYXJrICp4bWFyazsKKwkJc3RydWN0IHN0YWNrX2Jsb2NrICpzcDsKKwkJc3RydWN0IHN0YWNrX2Jsb2NrICpwcmV2c3RhY2twOworCQlzaXplX3QgZ3Jvc3NsZW47CisKKwkJSU5UT0ZGOworCQlvbGRzdGFja3AgPSBzdGFja3A7CisJCXNwID0gc3RhY2twOworCQlwcmV2c3RhY2twID0gc3AtPnByZXY7CisJCWdyb3NzbGVuID0gbmV3bGVuICsgc2l6ZW9mKHN0cnVjdCBzdGFja19ibG9jaykgLSBNSU5TSVpFOworCQlzcCA9IGNrcmVhbGxvYygocG9pbnRlcilzcCwgZ3Jvc3NsZW4pOworCQlzcC0+cHJldiA9IHByZXZzdGFja3A7CisJCXN0YWNrcCA9IHNwOworCQlzdGFja254dCA9IHNwLT5zcGFjZTsKKwkJc3RhY2tubGVmdCA9IG5ld2xlbjsKKwkJc3N0cmVuZCA9IHNwLT5zcGFjZSArIG5ld2xlbjsKKworCQkvKgorCQkgKiBTdGFjayBtYXJrcyBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIG9sZCBibG9jaworCQkgKiBtdXN0IGJlIHJlbG9jYXRlZCB0byBwb2ludCB0byB0aGUgbmV3IGJsb2NrCisJCSAqLworCQl4bWFyayA9IG1hcmtwOworCQl3aGlsZSAoeG1hcmsgIT0gTlVMTCAmJiB4bWFyay0+c3RhY2twID09IG9sZHN0YWNrcCkgeworCQkJeG1hcmstPnN0YWNrcCA9IHN0YWNrcDsKKwkJCXhtYXJrLT5zdGFja254dCA9IHN0YWNrbnh0OworCQkJeG1hcmstPnN0YWNrbmxlZnQgPSBzdGFja25sZWZ0OworCQkJeG1hcmsgPSB4bWFyay0+bWFya25leHQ7CisJCX0KKwkJSU5UT047CisJfSBlbHNlIHsKKwkJY2hhciAqb2xkc3BhY2UgPSBzdGFja254dDsKKwkJaW50IG9sZGxlbiA9IHN0YWNrbmxlZnQ7CisJCWNoYXIgKnAgPSBzdGFsbG9jKG5ld2xlbik7CisKKwkJLyogZnJlZSB0aGUgc3BhY2Ugd2UganVzdCBhbGxvY2F0ZWQgKi8KKwkJc3RhY2tueHQgPSBtZW1jcHkocCwgb2xkc3BhY2UsIG9sZGxlbik7CisJCXN0YWNrbmxlZnQgKz0gbmV3bGVuOworCX0KK30KKwordm9pZAorZ3JhYnN0YWNrYmxvY2soc2l6ZV90IGxlbikKK3sKKwlsZW4gPSBTSEVMTF9BTElHTihsZW4pOworCXN0YWNrbnh0ICs9IGxlbjsKKwlzdGFja25sZWZ0IC09IGxlbjsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHNvbWV3aGF0IGVhc2llciB0byB1c2UgdGhhbiB0aGUgYWJvdmUuCisgKiBUaGUgdXNlciBkZWNsYXJlcyBhIHZhcmlhYmxlIG9mIHR5cGUgU1RBQ0tTVFIsIHdoaWNoIG1heSBiZSBkZWNsYXJlZAorICogdG8gYmUgYSByZWdpc3Rlci4gIFRoZSBtYWNybyBTVEFSVFNUQUNLU1RSIGluaXRpYWxpemVzIHRoaW5ncy4gIFRoZW4KKyAqIHRoZSB1c2VyIHVzZXMgdGhlIG1hY3JvIFNUUFVUQyB0byBhZGQgY2hhcmFjdGVycyB0byB0aGUgc3RyaW5nLiAgSW4KKyAqIGVmZmVjdCwgU1RQVVRDKGMsIHApIGlzIHRoZSBzYW1lIGFzICpwKysgPSBjIGV4Y2VwdCB0aGF0IHRoZSBzdGFjayBpcworICogZ3Jvd24gYXMgbmVjZXNzYXJ5LiAgV2hlbiB0aGUgdXNlciBpcyBkb25lLCBzaGUgY2FuIGp1c3QgbGVhdmUgdGhlCisgKiBzdHJpbmcgdGhlcmUgYW5kIHJlZmVyIHRvIGl0IHVzaW5nIHN0YWNrYmxvY2soKS4gIE9yIHNoZSBjYW4gYWxsb2NhdGUKKyAqIHRoZSBzcGFjZSBmb3IgaXQgdXNpbmcgZ3JhYnN0YWNrc3RyKCkuICBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gYWxsb3cKKyAqIHNvbWVvbmUgZWxzZSB0byB1c2UgdGhlIHN0YWNrIHRlbXBvcmFyaWx5IGFuZCB0aGVuIGNvbnRpbnVlIHRvIGdyb3cKKyAqIHRoZSBzdHJpbmcsIHRoZSB1c2VyIHNob3VsZCB1c2UgZ3JhYnN0YWNrIHRvIGFsbG9jYXRlIHRoZSBzcGFjZSwgYW5kCisgKiB0aGVuIGNhbGwgdW5ncmFic3RyKHApIHRvIHJldHVybiB0byB0aGUgcHJldmlvdXMgbW9kZSBvZiBvcGVyYXRpb24uCisgKgorICogVVNUUFVUQyBpcyBsaWtlIFNUUFVUQyBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGNoZWNrIGZvciBvdmVyZmxvdy4KKyAqIENIRUNLU1RBQ0tTUEFDRSBjYW4gYmUgY2FsbGVkIGJlZm9yZSBVU1RQVVRDIHRvIGVuc3VyZSB0aGF0IHRoZXJlCisgKiBpcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KKyAqLworCit2b2lkICoKK2dyb3dzdGFja3N0cih2b2lkKQoreworCXNpemVfdCBsZW4gPSBzdGFja2Jsb2Nrc2l6ZSgpOworCWlmIChoZXJlZmQgPj0gMCAmJiBsZW4gPj0gMTAyNCkgeworCQl4d3JpdGUoaGVyZWZkLCBzdGFja2Jsb2NrKCksIGxlbik7CisJCXJldHVybiBzdGFja2Jsb2NrKCk7CisJfQorCWdyb3dzdGFja2Jsb2NrKCk7CisJcmV0dXJuIHN0YWNrYmxvY2soKSArIGxlbjsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIENIRUNLU1RSU1BBQ0UuCisgKi8KKworY2hhciAqCittYWtlc3Ryc3BhY2Uoc2l6ZV90IG5ld2xlbiwgY2hhciAqcCkKK3sKKwlzaXplX3QgbGVuID0gcCAtIHN0YWNrbnh0OworCXNpemVfdCBzaXplID0gc3RhY2tibG9ja3NpemUoKTsKKworCWZvciAoOzspIHsKKwkJc2l6ZV90IG5sZWZ0OworCisJCXNpemUgPSBzdGFja2Jsb2Nrc2l6ZSgpOworCQlubGVmdCA9IHNpemUgLSBsZW47CisJCWlmIChubGVmdCA+PSBuZXdsZW4pCisJCQlicmVhazsKKwkJZ3Jvd3N0YWNrYmxvY2soKTsKKwl9CisJcmV0dXJuIHN0YWNrYmxvY2soKSArIGxlbjsKK30KKworY2hhciAqCitzdG5wdXRzKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuLCBjaGFyICpwKQoreworCXAgPSBtYWtlc3Ryc3BhY2UobiwgcCk7CisJcCA9IG1lbXBjcHkocCwgcywgbik7CisJcmV0dXJuIHA7Cit9CisKK2NoYXIgKgorc3RwdXRzKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnApCit7CisJcmV0dXJuIHN0bnB1dHMocywgc3RybGVuKHMpLCBwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21lbWFsbG9jLmggYi91c3IvZGFzaC9tZW1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTFkMTMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9tZW1hbGxvYy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpbWVtYWxsb2MuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3N0cnVjdCBzdGFja21hcmsgeworCXN0cnVjdCBzdGFja19ibG9jayAqc3RhY2twOworCWNoYXIgKnN0YWNrbnh0OworCXNpemVfdCBzdGFja25sZWZ0OworCXN0cnVjdCBzdGFja21hcmsgKm1hcmtuZXh0OworfTsKKworCitleHRlcm4gY2hhciAqc3RhY2tueHQ7CitleHRlcm4gc2l6ZV90IHN0YWNrbmxlZnQ7CitleHRlcm4gY2hhciAqc3N0cmVuZDsKK2V4dGVybiBpbnQgaGVyZWZkOworCitwb2ludGVyIGNrbWFsbG9jKHNpemVfdCk7Citwb2ludGVyIGNrcmVhbGxvYyhwb2ludGVyLCBzaXplX3QpOworY2hhciAqc2F2ZXN0cihjb25zdCBjaGFyICopOworcG9pbnRlciBzdGFsbG9jKHNpemVfdCk7Cit2b2lkIHN0dW5hbGxvYyhwb2ludGVyKTsKK3ZvaWQgc2V0c3RhY2ttYXJrKHN0cnVjdCBzdGFja21hcmsgKik7Cit2b2lkIHBvcHN0YWNrbWFyayhzdHJ1Y3Qgc3RhY2ttYXJrICopOwordm9pZCBncm93c3RhY2tibG9jayh2b2lkKTsKK3ZvaWQgZ3JhYnN0YWNrYmxvY2soc2l6ZV90KTsKK3ZvaWQgKmdyb3dzdGFja3N0cih2b2lkKTsKK2NoYXIgKm1ha2VzdHJzcGFjZShzaXplX3QsIGNoYXIgKik7CitjaGFyICpzdG5wdXRzKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjaGFyICopOworY2hhciAqc3RwdXRzKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKKworCitzdGF0aWMgaW5saW5lIGNoYXIgKl9TVFBVVEMoY2hhciBjLCBjaGFyICpwKSB7CisJaWYgKHAgPT0gc3N0cmVuZCkKKwkJcCA9IGdyb3dzdGFja3N0cigpOworCSpwKysgPSBjOworCXJldHVybiBwOworfQorCisjZGVmaW5lIHN0YWNrYmxvY2soKSAoKHZvaWQgKilzdGFja254dCkKKyNkZWZpbmUgc3RhY2tibG9ja3NpemUoKSBzdGFja25sZWZ0CisjZGVmaW5lIFNUQVJUU1RBQ0tTVFIocCkgKChwKSA9IHN0YWNrYmxvY2soKSkKKyNkZWZpbmUgU1RQVVRDKGMsIHApICgocCkgPSBfU1RQVVRDKChjKSwgKHApKSkKKyNkZWZpbmUgQ0hFQ0tTVFJTUEFDRShuLCBwKSBcCisJKHsgXAorCQljaGFyICpxID0gKHApOyBcCisJCXNpemVfdCBsID0gKG4pOyBcCisJCXNpemVfdCBtID0gc3N0cmVuZCAtIHE7IFwKKwkJaWYgKGwgPiBtKSBcCisJCQkocCkgPSBtYWtlc3Ryc3BhY2UobCwgcSk7IFwKKwkJMDsgXAorCX0pCisjZGVmaW5lIFVTVFBVVEMoYywgcCkJKCpwKysgPSAoYykpCisjZGVmaW5lIFNUQUNLU1RSTlVMKHApCSgocCkgPT0gc3N0cmVuZD8gKHAgPSBncm93c3RhY2tzdHIoKSwgKnAgPSAnXDAnKSA6ICgqcCA9ICdcMCcpKQorI2RlZmluZSBTVFVOUFVUQyhwKQkoLS1wKQorI2RlZmluZSBTVFRPUEMocCkJcFstMV0KKyNkZWZpbmUgU1RBREpVU1QoYW1vdW50LCBwKQkocCArPSAoYW1vdW50KSkKKworI2RlZmluZSBncmFic3RhY2tzdHIocCkJc3RhbGxvYygoY2hhciAqKShwKSAtIChjaGFyICopc3RhY2tibG9jaygpKQorI2RlZmluZSB1bmdyYWJzdGFja3N0cihzLCBwKSBzdHVuYWxsb2MoKHMpKQorI2RlZmluZSBzdGFja3N0cmVuZCgpICgodm9pZCAqKXNzdHJlbmQpCisKKyNkZWZpbmUgY2tmcmVlKHApCWZyZWUoKHBvaW50ZXIpKHApKQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWlzY2JsdGluLmMgYi91c3IvZGFzaC9taXNjYmx0aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTFjZDFmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWlzY2JsdGluLmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogTWlzY2VsYW5lb3VzIGJ1aWx0aW5zLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIHF1YWRfdCAqLworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgkJLyogQlNENF80ICovCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgkJLyogc3RydG90aW1ldmFsKCkgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInZhci5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJtaXNjYmx0aW4uaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgIm1haW4uaCIKKworI3VuZGVmIHJmbGFnCisKKworCisvKgorICogVGhlIHJlYWQgYnVpbHRpbi4gIFRoZSAtZSBvcHRpb24gY2F1c2VzIGJhY2tzbGFzaGVzIHRvIGVzY2FwZSB0aGUKKyAqIGZvbGxvd2luZyBjaGFyYWN0ZXIuCisgKgorICogVGhpcyB1c2VzIHVuYnVmZmVyZWQgaW5wdXQsIHdoaWNoIG1heSBiZSBhdm9pZGFibGUgaW4gc29tZSBjYXNlcy4KKyAqLworCitpbnQKK3JlYWRjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKiphcDsKKwlpbnQgYmFja3NsYXNoOworCWNoYXIgYzsKKwlpbnQgcmZsYWc7CisJY2hhciAqcHJvbXB0OworCWNvbnN0IGNoYXIgKmlmczsKKwljaGFyICpwOworCWludCBzdGFydHdvcmQ7CisJaW50IHN0YXR1czsKKwlpbnQgdGltZW91dDsKKwlpbnQgaTsKKwlmZF9zZXQgc2V0OworCXN0cnVjdCB0aW1ldmFsIHRzLCB0MCwgdDEsIHRvOworCisJdHMudHZfc2VjID0gdHMudHZfdXNlYyA9IDA7CisKKwlyZmxhZyA9IDA7CisJdGltZW91dCA9IDA7CisJcHJvbXB0ID0gTlVMTDsKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJwOnJ0OiIpKSAhPSAnXDAnKSB7CisJCXN3aXRjaChpKSB7CisJCWNhc2UgJ3AnOgorCQkJcHJvbXB0ID0gb3B0aW9uYXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJcCA9IHN0cnRvdGltZXZhbChvcHRpb25hcmcsICZ0cyk7CisJCQlpZiAoKnAgfHwgKCF0cy50dl9zZWMgJiYgIXRzLnR2X3VzZWMpKQorCQkJCXNoX2Vycm9yKCJpbnZhbGlkIHRpbWVvdXQiKTsKKwkJCXRpbWVvdXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmZsYWcgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAocHJvbXB0ICYmIGlzYXR0eSgwKSkgeworCQlvdXQyc3RyKHByb21wdCk7CisjaWZkZWYgRkxVU0hFUlIKKwkJZmx1c2hhbGwoKTsKKyNlbmRpZgorCX0KKwlpZiAoKihhcCA9IGFyZ3B0cikgPT0gTlVMTCkKKwkJc2hfZXJyb3IoImFyZyBjb3VudCIpOworCWlmICgoaWZzID0gYmx0aW5sb29rdXAoIklGUyIpKSA9PSBOVUxMKQorCQlpZnMgPSBkZWZpZnM7CisJc3RhdHVzID0gMDsKKwlzdGFydHdvcmQgPSAxOworCWJhY2tzbGFzaCA9IDA7CisJaWYgKHRpbWVvdXQpIHsKKwkJZ2V0dGltZW9mZGF5KCZ0MCwgTlVMTCk7CisKKwkJLyogdHMgKz0gdDA7ICovCisJCXRzLnR2X3VzZWMgKz0gdDAudHZfdXNlYzsKKwkJd2hpbGUgKHRzLnR2X3VzZWMgPj0gMTAwMDAwMCkgeworCQkJdHMudHZfc2VjKys7CisJCQl0cy50dl91c2VjIC09IDEwMDAwMDA7CisJCX0KKwkJdHMudHZfc2VjICs9IHQwLnR2X3NlYzsKKwl9CisJU1RBUlRTVEFDS1NUUihwKTsKKwlmb3IgKDs7KSB7CisJCWlmICh0aW1lb3V0KSB7CisJCQlnZXR0aW1lb2ZkYXkoJnQxLCBOVUxMKTsKKwkJCWlmICh0MS50dl9zZWMgPiB0cy50dl9zZWMgfHwKKwkJCSAgICAodDEudHZfc2VjID09IHRzLnR2X3NlYyAmJgorCQkJICAgICB0MS50dl91c2VjID49IHRzLnR2X3VzZWMpKSB7CisJCQkJc3RhdHVzID0gMTsKKwkJCQlicmVhazsJLyogVGltZW91dCEgKi8KKwkJCX0KKworCQkJLyogdG8gPSB0cyAtIHQxOyAqLworCQkJaWYgKHRzLnR2X3VzZWMgPj0gdDEudHZfdXNlYykgeworCQkJCXRvLnR2X3VzZWMgPSB0cy50dl91c2VjIC0gdDEudHZfdXNlYzsKKwkJCQl0by50dl9zZWMgID0gdHMudHZfc2VjIC0gdDEudHZfc2VjOworCQkJfSBlbHNlIHsKKwkJCQl0by50dl91c2VjID0gdHMudHZfdXNlYyAtIHQxLnR2X3VzZWMgKyAxMDAwMDAwOworCQkJCXRvLnR2X3NlYyAgPSB0cy50dl9zZWMgLSB0MS50dl9zZWMgLSAxOworCQkJfQorCisJCQlGRF9aRVJPKCZzZXQpOworCQkJRkRfU0VUKDAsICZzZXQpOworCQkJaWYgKHNlbGVjdCgxLCAmc2V0LCBOVUxMLCBOVUxMLCAmdG8pICE9IDEpIHsKKwkJCQlzdGF0dXMgPSAxOworCQkJCWJyZWFrOyAvKiBUaW1lb3V0ISAqLworCQkJfQorCQl9CisJCWlmIChyZWFkKDAsICZjLCAxKSAhPSAxKSB7CisJCQlzdGF0dXMgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGMgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlpZiAoYmFja3NsYXNoKSB7CisJCQliYWNrc2xhc2ggPSAwOworCQkJaWYgKGMgIT0gJ1xuJykKKwkJCQlnb3RvIHB1dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcmZsYWcgJiYgYyA9PSAnXFwnKSB7CisJCQliYWNrc2xhc2grKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKwkJaWYgKHN0YXJ0d29yZCAmJiAqaWZzID09ICcgJyAmJiBzdHJjaHIoaWZzLCBjKSkgeworCQkJY29udGludWU7CisJCX0KKwkJc3RhcnR3b3JkID0gMDsKKwkJaWYgKGFwWzFdICE9IE5VTEwgJiYgc3RyY2hyKGlmcywgYykgIT0gTlVMTCkgeworCQkJU1RBQ0tTVFJOVUwocCk7CisJCQlzZXR2YXIoKmFwLCBzdGFja2Jsb2NrKCksIDApOworCQkJYXArKzsKKwkJCXN0YXJ0d29yZCA9IDE7CisJCQlTVEFSVFNUQUNLU1RSKHApOworCQl9IGVsc2UgeworcHV0OgorCQkJU1RQVVRDKGMsIHApOworCQl9CisJfQorCVNUQUNLU1RSTlVMKHApOworCS8qIFJlbW92ZSB0cmFpbGluZyBibGFua3MgKi8KKwl3aGlsZSAoKGNoYXIgKilzdGFja2Jsb2NrKCkgPD0gLS1wICYmIHN0cmNocihpZnMsICpwKSAhPSBOVUxMKQorCQkqcCA9ICdcMCc7CisJc2V0dmFyKCphcCwgc3RhY2tibG9jaygpLCAwKTsKKwl3aGlsZSAoKisrYXAgIT0gTlVMTCkKKwkJc2V0dmFyKCphcCwgbnVsbHN0ciwgMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCisKKy8qCisgKiB1bWFzayBidWlsdGluCisgKgorICogVGhpcyBjb2RlIHdhcyByaXBwZWQgZnJvbSBwZGtzaCA1LjIuMTQgYW5kIGhhY2tlZCBmb3IgdXNlIHdpdGgKKyAqIGRhc2ggYnkgSGVyYmVydCBYdS4KKyAqCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKK2ludAordW1hc2tjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmFwOworCWludCBtYXNrOworCWludCBpOworCWludCBzeW1ib2xpY19tb2RlID0gMDsKKworCXdoaWxlICgoaSA9IG5leHRvcHQoIlMiKSkgIT0gJ1wwJykgeworCQlzeW1ib2xpY19tb2RlID0gMTsKKwl9CisKKwlJTlRPRkY7CisJbWFzayA9IHVtYXNrKDApOworCXVtYXNrKG1hc2spOworCUlOVE9OOworCisJaWYgKChhcCA9ICphcmdwdHIpID09IE5VTEwpIHsKKwkJaWYgKHN5bWJvbGljX21vZGUpIHsKKwkJCWNoYXIgYnVmWzE4XTsKKwkJCWludCBqOworCisJCQltYXNrID0gfm1hc2s7CisJCQlhcCA9IGJ1ZjsKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkqYXArKyA9ICJ1Z28iW2ldOworCQkJCSphcCsrID0gJz0nOworCQkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspCisJCQkJCWlmIChtYXNrICYgKDEgPDwgKDggLSAoMyppICsgaikpKSkKKwkJCQkJCSphcCsrID0gInJ3eCJbal07CisJCQkJKmFwKysgPSAnLCc7CisJCQl9CisJCQlhcFstMV0gPSAnXDAnOworCQkJb3V0MWZtdCgiJXNcbiIsIGJ1Zik7CisJCX0gZWxzZSB7CisJCQlvdXQxZm10KCIlLjRvXG4iLCBtYXNrKTsKKwkJfQorCX0gZWxzZSB7CisJCWludCBuZXdfbWFzazsKKworCQlpZiAoaXNkaWdpdCgqYXApKSB7CisJCQluZXdfbWFzayA9IDA7CisJCQlkbyB7CisJCQkJaWYgKCphcCA+PSAnOCcgfHwgKmFwIDwgJzAnKQorCQkJCQlzaF9lcnJvcihpbGxudW0sICphcmdwdHIpOworCQkJCW5ld19tYXNrID0gKG5ld19tYXNrIDw8IDMpICsgKCphcCAtICcwJyk7CisJCQl9IHdoaWxlICgqKythcCAhPSAnXDAnKTsKKwkJfSBlbHNlIHsKKwkJCWludCBwb3NpdGlvbnMsIG5ld192YWw7CisJCQljaGFyIG9wOworCisJCQltYXNrID0gfm1hc2s7CisJCQluZXdfbWFzayA9IG1hc2s7CisJCQlwb3NpdGlvbnMgPSAwOworCQkJd2hpbGUgKCphcCkgeworCQkJCXdoaWxlICgqYXAgJiYgc3RyY2hyKCJhdWdvIiwgKmFwKSkKKwkJCQkJc3dpdGNoICgqYXArKykgeworCQkJCQljYXNlICdhJzogcG9zaXRpb25zIHw9IDAxMTE7IGJyZWFrOworCQkJCQljYXNlICd1JzogcG9zaXRpb25zIHw9IDAxMDA7IGJyZWFrOworCQkJCQljYXNlICdnJzogcG9zaXRpb25zIHw9IDAwMTA7IGJyZWFrOworCQkJCQljYXNlICdvJzogcG9zaXRpb25zIHw9IDAwMDE7IGJyZWFrOworCQkJCQl9CisJCQkJaWYgKCFwb3NpdGlvbnMpCisJCQkJCXBvc2l0aW9ucyA9IDAxMTE7IC8qIGRlZmF1bHQgaXMgYSAqLworCQkJCWlmICghc3RyY2hyKCI9Ky0iLCBvcCA9ICphcCkpCisJCQkJCWJyZWFrOworCQkJCWFwKys7CisJCQkJbmV3X3ZhbCA9IDA7CisJCQkJd2hpbGUgKCphcCAmJiBzdHJjaHIoInJ3eHVnb1hzIiwgKmFwKSkKKwkJCQkJc3dpdGNoICgqYXArKykgeworCQkJCQljYXNlICdyJzogbmV3X3ZhbCB8PSAwNDsgYnJlYWs7CisJCQkJCWNhc2UgJ3cnOiBuZXdfdmFsIHw9IDAyOyBicmVhazsKKwkJCQkJY2FzZSAneCc6IG5ld192YWwgfD0gMDE7IGJyZWFrOworCQkJCQljYXNlICd1JzogbmV3X3ZhbCB8PSBtYXNrID4+IDY7CisJCQkJCQkgIGJyZWFrOworCQkJCQljYXNlICdnJzogbmV3X3ZhbCB8PSBtYXNrID4+IDM7CisJCQkJCQkgIGJyZWFrOworCQkJCQljYXNlICdvJzogbmV3X3ZhbCB8PSBtYXNrID4+IDA7CisJCQkJCQkgIGJyZWFrOworCQkJCQljYXNlICdYJzogaWYgKG1hc2sgJiAwMTExKQorCQkJCQkJCW5ld192YWwgfD0gMDE7CisJCQkJCQkgIGJyZWFrOworCQkJCQljYXNlICdzJzogLyogaWdub3JlZCAqLworCQkJCQkJICBicmVhazsKKwkJCQkJfQorCQkJCW5ld192YWwgPSAobmV3X3ZhbCAmIDA3KSAqIHBvc2l0aW9uczsKKwkJCQlzd2l0Y2ggKG9wKSB7CisJCQkJY2FzZSAnLSc6CisJCQkJCW5ld19tYXNrICY9IH5uZXdfdmFsOworCQkJCQlicmVhazsKKwkJCQljYXNlICc9JzoKKwkJCQkJbmV3X21hc2sgPSBuZXdfdmFsCisJCQkJCSAgICB8IChuZXdfbWFzayAmIH4ocG9zaXRpb25zICogMDcpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKyc6CisJCQkJCW5ld19tYXNrIHw9IG5ld192YWw7CisJCQkJfQorCQkJCWlmICgqYXAgPT0gJywnKSB7CisJCQkJCXBvc2l0aW9ucyA9IDA7CisJCQkJCWFwKys7CisJCQkJfSBlbHNlIGlmICghc3RyY2hyKCI9Ky0iLCAqYXApKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgqYXApIHsKKwkJCQlzaF9lcnJvcigiSWxsZWdhbCBtb2RlOiAlcyIsICphcmdwdHIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJbmV3X21hc2sgPSB+bmV3X21hc2s7CisJCX0KKwkJdW1hc2sobmV3X21hc2spOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhBVkVfR0VUUkxJTUlUCisvKgorICogdWxpbWl0IGJ1aWx0aW4KKyAqCisgKiBUaGlzIGNvZGUsIG9yaWdpbmFsbHkgYnkgRG91ZyBHd3luLCBEb3VnIEtpbmdzdG9uLCBFcmljIEdpc2luLCBhbmQKKyAqIE1pY2hhZWwgUmVuZGVsbCB3YXMgcmlwcGVkIGZyb20gcGRrc2ggNS4wLjggYW5kIGhhY2tlZCBmb3IgdXNlIHdpdGgKKyAqIGFzaCBieSBKLlQuIENvbmtsaW4uCisgKgorICogUHVibGljIGRvbWFpbi4KKyAqLworCitzdHJ1Y3QgbGltaXRzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludAljbWQ7CisJaW50CWZhY3RvcjsJLyogbXVsdGlwbHkgYnkgdG8gZ2V0IHJsaW1fe2N1cixtYXh9IHZhbHVlcyAqLworCWNoYXIJb3B0aW9uOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsaW1pdHMgbGltaXRzW10gPSB7CisjaWZkZWYgUkxJTUlUX0NQVQorCXsgInRpbWUoc2Vjb25kcykiLAkJUkxJTUlUX0NQVSwJICAgMSwgJ3QnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfRlNJWkUKKwl7ICJmaWxlKGJsb2NrcykiLAkJUkxJTUlUX0ZTSVpFLAkgNTEyLCAnZicgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9EQVRBCisJeyAiZGF0YShrYnl0ZXMpIiwJCVJMSU1JVF9EQVRBLAkxMDI0LCAnZCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TVEFDSworCXsgInN0YWNrKGtieXRlcykiLAkJUkxJTUlUX1NUQUNLLAkxMDI0LCAncycgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9DT1JFCisJeyAiY29yZWR1bXAoYmxvY2tzKSIsCQlSTElNSVRfQ09SRSwJIDUxMiwgJ2MnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlNTCisJeyAibWVtb3J5KGtieXRlcykiLAkJUkxJTUlUX1JTUywJMTAyNCwgJ20nIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTUVNTE9DSworCXsgImxvY2tlZCBtZW1vcnkoa2J5dGVzKSIsCVJMSU1JVF9NRU1MT0NLLCAxMDI0LCAnbCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OUFJPQworCXsgInByb2Nlc3MiLAkJCVJMSU1JVF9OUFJPQywgICAgICAxLCAncCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OT0ZJTEUKKwl7ICJub2ZpbGVzIiwJCQlSTElNSVRfTk9GSUxFLCAgICAgMSwgJ24nIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQVMKKwl7ICJ2bWVtb3J5KGtieXRlcykiLAkJUkxJTUlUX0FTLAkxMDI0LCAndicgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9MT0NLUworCXsgImxvY2tzIiwJCQlSTElNSVRfTE9DS1MsCSAgIDEsICd3JyB9LAorI2VuZGlmCisJeyAoY2hhciAqKSAwLAkJCTAsCQkgICAwLCAgJ1wwJyB9Cit9OworCitlbnVtIGxpbXR5cGUgeyBTT0ZUID0gMHgxLCBIQVJEID0gMHgyIH07CisKK3N0YXRpYyB2b2lkIHByaW50bGltKGVudW0gbGltdHlwZSBob3csIGNvbnN0IHN0cnVjdCBybGltaXQgKmxpbWl0LAorCQkgICAgIGNvbnN0IHN0cnVjdCBsaW1pdHMgKmwpCit7CisJcmxpbV90IHZhbDsKKworCXZhbCA9IGxpbWl0LT5ybGltX21heDsKKwlpZiAoaG93ICYgU09GVCkKKwkJdmFsID0gbGltaXQtPnJsaW1fY3VyOworCisJaWYgKHZhbCA9PSBSTElNX0lORklOSVRZKQorCQlvdXQxZm10KCJ1bmxpbWl0ZWRcbiIpOworCWVsc2UgeworCQl2YWwgLz0gbC0+ZmFjdG9yOworCQlvdXQxZm10KCIlamRcbiIsIChpbnRtYXhfdCkgdmFsKTsKKwl9Cit9CisKK2ludAordWxpbWl0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQJYzsKKwlybGltX3QgdmFsID0gMDsKKwllbnVtIGxpbXR5cGUgaG93ID0gU09GVCB8IEhBUkQ7CisJY29uc3Qgc3RydWN0IGxpbWl0cwkqbDsKKwlpbnQJCXNldCwgYWxsID0gMDsKKwlpbnQJCW9wdGMsIHdoYXQ7CisJc3RydWN0IHJsaW1pdAlsaW1pdDsKKworCXdoYXQgPSAnZic7CisJd2hpbGUgKChvcHRjID0gbmV4dG9wdCgiSFNhIgorI2lmZGVmIFJMSU1JVF9DUFUKKwkJCSAgICAgICAidCIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9GU0laRQorCQkJICAgICAgICJmIgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0RBVEEKKwkJCSAgICAgICAiZCIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TVEFDSworCQkJICAgICAgICJzIgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NPUkUKKwkJCSAgICAgICAiYyIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9SU1MKKwkJCSAgICAgICAibSIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9NRU1MT0NLCisJCQkgICAgICAgImwiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTlBST0MKKwkJCSAgICAgICAicCIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OT0ZJTEUKKwkJCSAgICAgICAibiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9BUworCQkJICAgICAgICJ2IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0xPQ0tTCisJCQkgICAgICAgInciCisjZW5kaWYKKwkpKSAhPSAnXDAnKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnSCc6CisJCQlob3cgPSBIQVJEOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJaG93ID0gU09GVDsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCWFsbCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXdoYXQgPSBvcHRjOworCQl9CisKKwlmb3IgKGwgPSBsaW1pdHM7IGwtPm9wdGlvbiAhPSB3aGF0OyBsKyspCisJCTsKKworCXNldCA9ICphcmdwdHIgPyAxIDogMDsKKwlpZiAoc2V0KSB7CisJCWNoYXIgKnAgPSAqYXJncHRyOworCisJCWlmIChhbGwgfHwgYXJncHRyWzFdKQorCQkJc2hfZXJyb3IoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQlpZiAoc3RyY21wKHAsICJ1bmxpbWl0ZWQiKSA9PSAwKQorCQkJdmFsID0gUkxJTV9JTkZJTklUWTsKKwkJZWxzZSB7CisJCQl2YWwgPSAocmxpbV90KSAwOworCisJCQl3aGlsZSAoKGMgPSAqcCsrKSA+PSAnMCcgJiYgYyA8PSAnOScpCisJCQl7CisJCQkJdmFsID0gKHZhbCAqIDEwKSArIChsb25nKShjIC0gJzAnKTsKKwkJCQlpZiAodmFsIDwgKHJsaW1fdCkgMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYykKKwkJCQlzaF9lcnJvcigiYmFkIG51bWJlciIpOworCQkJdmFsICo9IGwtPmZhY3RvcjsKKwkJfQorCX0KKwlpZiAoYWxsKSB7CisJCWZvciAobCA9IGxpbWl0czsgbC0+bmFtZTsgbCsrKSB7CisJCQlnZXRybGltaXQobC0+Y21kLCAmbGltaXQpOworCQkJb3V0MWZtdCgiJS0yMHMgIiwgbC0+bmFtZSk7CisJCQlwcmludGxpbShob3csICZsaW1pdCwgbCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJZ2V0cmxpbWl0KGwtPmNtZCwgJmxpbWl0KTsKKwlpZiAoc2V0KSB7CisJCWlmIChob3cgJiBIQVJEKQorCQkJbGltaXQucmxpbV9tYXggPSB2YWw7CisJCWlmIChob3cgJiBTT0ZUKQorCQkJbGltaXQucmxpbV9jdXIgPSB2YWw7CisJCWlmIChzZXRybGltaXQobC0+Y21kLCAmbGltaXQpIDwgMCkKKwkJCXNoX2Vycm9yKCJlcnJvciBzZXR0aW5nIGxpbWl0ICglcykiLCBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSB7CisJCXByaW50bGltKGhvdywgJmxpbWl0LCBsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21pc2NibHRpbi5oIGIvdXNyL2Rhc2gvbWlzY2JsdGluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5YThkMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21pc2NibHRpbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgQ2hyaXN0b3MgWm91bGFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2ludCByZWFkY21kKGludCwgY2hhciAqKik7CitpbnQgdW1hc2tjbWQoaW50LCBjaGFyICoqKTsKK2ludCB1bGltaXRjbWQoaW50LCBjaGFyICoqKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21rYnVpbHRpbnMgYi91c3IvZGFzaC9ta2J1aWx0aW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzMwNTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ta2J1aWx0aW5zCkBAIC0wLDAgKzEsMTAxIEBACisjIS9iaW4vc2ggLQorIwkkTmV0QlNEOiBta2J1aWx0aW5zLHYgMS4xNyAyMDAyLzExLzI0IDIyOjM1OjQxIGNocmlzdG9zIEV4cCAkCisjCisjIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworIwlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyMJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyMgS2VubmV0aCBBbG1xdWlzdC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisjCUAoIylta2J1aWx0aW5zCTguMiAoQmVya2VsZXkpIDUvNC85NQorCit0ZW1wZmlsZT10ZW1wZmlsZQoraWYgISB0eXBlIHRlbXBmaWxlID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKwl0ZW1wZmlsZT0ibWt0ZW1wICR7VE1QRElSOi0vdG1wfS9idWlsdGluLlhYWFhYWCIKK2ZpCisKK3RyYXAgJ3JtIC1mICR0ZW1wICR0ZW1wMicgRVhJVAordGVtcD0kKCR0ZW1wZmlsZSkKK3RlbXAyPSQoJHRlbXBmaWxlKQorCitidWlsdGlucz0kMQorCitleGVjID4gYnVpbHRpbnMuYworY2F0IDw8XCEKKy8qCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgbWtidWlsdGlucyBwcm9ncmFtLgorICovCisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgImJ1aWx0aW5zLmgiCisKKyEKKzwgJGJ1aWx0aW5zIHNlZCAnL14jL2Q7IC9eJC9kJyA+ICR0ZW1wCithd2sgJ3sJcHJpbnRmICJpbnQgJXMoaW50LCBjaGFyICoqKTtcbiIsICQxfScgJHRlbXAKK2VjaG8gJworY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgYnVpbHRpbmNtZFtdID0geycKK2F3ayAnewlmb3IgKGkgPSAyIDsgaSA8PSBORiA7IGkrKykgeworCQlsaW5lID0gJGkgIlx0IiAkMQorCQlpZiAoJGkgfiAvXi0vKQorCQkJbGluZSA9ICQoKytpKSAiXHQiIGxpbmUKKwkJcHJpbnQgbGluZQorCX19JyAkdGVtcCB8IHNvcnQgLWsgMSwxIHwgdGVlICR0ZW1wMiB8IGF3ayAneworCQlvcHQgPSAiIgorCQlpZiAoTkYgPiAyKSB7CisJCQlvcHQgPSBzdWJzdHIoJDIsIDIpCisJCQkkMiA9ICQzCisJCX0KKwkJcHJpbnRmICJcdHsgXCIlc1wiLCAlcywgJWQgfSxcbiIsICQxLCAkMiwKKwkJCShvcHQgfiAvcy8pICsgKG9wdCB+IC9bc3VdLykgKiAyICsgKG9wdCB+IC9hLykgKiA0CisJfScKK2VjaG8gJ307JworCitleGVjID4gYnVpbHRpbnMuaAorY2F0IDw8XCEKKy8qCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgbWtidWlsdGlucyBwcm9ncmFtLgorICovCisKKyEKK3NlZCAncy8JLVthLXpdKi8vJyAkdGVtcDIgfCBubCAtdiAwIHwgc29ydCAtdSAtayAzLDMgfAordHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogfAorCWF3ayAnewlwcmludGYgIiNkZWZpbmUgJXMgKGJ1aWx0aW5jbWQgKyAlZClcbiIsICQzLCAkMX0nCitwcmludGYgJ1xuI2RlZmluZSBOVU1CVUlMVElOUyAlZFxuJyAkKHdjIC1sIDwgJHRlbXAyKQorZWNobyAnCisjZGVmaW5lIEJVSUxUSU5fU1BFQ0lBTCAweDEKKyNkZWZpbmUgQlVJTFRJTl9SRUdVTEFSIDB4MgorI2RlZmluZSBCVUlMVElOX0FTU0lHTiAweDQKKworc3RydWN0IGJ1aWx0aW5jbWQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqYnVpbHRpbikoaW50LCBjaGFyICoqKTsKKwl1bnNpZ25lZCBmbGFnczsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCBidWlsdGluY21kW107JwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWtpbml0LmMgYi91c3IvZGFzaC9ta2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODAzNzUxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWtpbml0LmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIHNjYW5zIGFsbCB0aGUgc291cmNlIGZpbGVzIGZvciBjb2RlIHRvIGhhbmRsZSB2YXJpb3VzCisgKiBzcGVjaWFsIGV2ZW50cyBhbmQgY29tYmluZXMgdGhpcyBjb2RlIGludG8gb25lIGZpbGUuICBUaGlzIChhbGxlZ2VkbHkpCisgKiBpbXByb3ZlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBwcm9ncmFtIHNpbmNlIHRoZXJlIGlzIG5vIG5lZWQgZm9yCisgKiBhbnlvbmUgb3V0c2lkZSBvZiBhIG1vZHVsZSB0byBrbm93IHRoYXQgdGhhdCBtb2R1bGUgcGVyZm9ybXMgc3BlY2lhbAorICogb3BlcmF0aW9ucyBvbiBwYXJ0aWN1bGFyIGV2ZW50cy4KKyAqCisgKiBVc2FnZTogIG1raW5pdCBzb3VyY2VmaWxlLi4uCisgKi8KKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisKKy8qCisgKiBPVVRGSUxFIGlzIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4gIE91dHB1dCBpcyBpbml0aWFsbHkgd3JpdHRlbgorICogdG8gdGhlIGZpbGUgT1VUVEVNUCwgd2hpY2ggaXMgdGhlbiBtb3ZlZCB0byBPVVRGSUxFLgorICovCisKKyNkZWZpbmUgT1VURklMRSAiaW5pdC5jIgorI2RlZmluZSBPVVRURU1QICJpbml0LmMubmV3IgorCisKKy8qCisgKiBBIHRleHQgc3RydWN0dXJlIGlzIGJhc2ljbHkganVzdCBhIHN0cmluZyB0aGF0IGdyb3dzIGFzIG1vcmUgY2hhcmFjdGVycworICogYXJlIGFkZGVkIG9udG8gdGhlIGVuZCBvZiBpdC4gIEl0IGlzIGltcGxlbWVudGVkIGFzIGEgbGlua2VkIGxpc3Qgb2YKKyAqIGJsb2NrcyBvZiBjaGFyYWN0ZXJzLiAgVGhlIHJvdXRpbmVzIGFkZHN0ciBhbmQgYWRkY2hhciBhcHBlbmQgYSBzdHJpbmcKKyAqIG9yIGEgc2luZ2xlIGNoYXJhY3RlciwgcmVzcGVjdGl2ZWx5LCB0byBhIHRleHQgc3RydWN0dXJlLiAgV3JpdGV0ZXh0CisgKiB3cml0ZXMgdGhlIGNvbnRlbnRzIG9mIGEgdGV4dCBzdHJ1Y3R1cmUgdG8gYSBmaWxlLgorICovCisKKyNkZWZpbmUgQkxPQ0tTSVpFIDUxMgorCitzdHJ1Y3QgdGV4dCB7CisJY2hhciAqbmV4dGM7CisJaW50IG5sZWZ0OworCXN0cnVjdCBibG9jayAqc3RhcnQ7CisJc3RydWN0IGJsb2NrICpsYXN0OworfTsKKworc3RydWN0IGJsb2NrIHsKKwlzdHJ1Y3QgYmxvY2sgKm5leHQ7CisJY2hhciB0ZXh0W0JMT0NLU0laRV07Cit9OworCisKKy8qCisgKiBUaGVyZSBpcyBvbmUgZXZlbnQgc3RydWN0dXJlIGZvciBlYWNoIGV2ZW50IHRoYXQgbWtpbml0IGhhbmRsZXMuCisgKi8KKworc3RydWN0IGV2ZW50IHsKKwljaGFyICpuYW1lOwkJLyogbmFtZSBvZiBldmVudCAoZS5nLiBJTklUKSAqLworCWNoYXIgKnJvdXRpbmU7CQkvKiBuYW1lIG9mIHJvdXRpbmUgY2FsbGVkIG9uIGV2ZW50ICovCisJY2hhciAqY29tbWVudDsJCS8qIGNvbW1lbnQgZGVzY3JpYmluZyByb3V0aW5lICovCisJc3RydWN0IHRleHQgY29kZTsJLyogY29kZSBmb3IgaGFuZGxpbmcgZXZlbnQgKi8KK307CisKKworY2hhciB3cml0ZXJbXSA9ICJcCisvKlxuXAorICogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIG1raW5pdCBwcm9ncmFtLlxuXAorICovXG5cCitcbiI7CisKK2NoYXIgaW5pdFtdID0gIlwKKy8qXG5cCisgKiBJbml0aWFsaXphdGlvbiBjb2RlLlxuXAorICovXG4iOworCitjaGFyIHJlc2V0W10gPSAiXAorLypcblwKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhbiBlcnJvciBvciBhbiBpbnRlcnJ1cHQgb2NjdXJzIGluIGFuXG5cCisgKiBpbnRlcmFjdGl2ZSBzaGVsbCBhbmQgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgbWFpbiBjb21tYW5kIGxvb3AuXG5cCisgKi9cbiI7CisKKworc3RydWN0IGV2ZW50IGV2ZW50W10gPSB7CisJeyJJTklUIiwgImluaXQiLCBpbml0fSwKKwl7IlJFU0VUIiwgInJlc2V0IiwgcmVzZXR9LAorCXtOVUxMLCBOVUxMfQorfTsKKworCitjaGFyICpjdXJmaWxlOwkJCQkvKiBjdXJyZW50IGZpbGUgKi8KK2ludCBsaW5ubzsJCQkJLyogY3VycmVudCBsaW5lICovCitjaGFyICpoZWFkZXJfZmlsZXNbMjAwXTsJCS8qIGxpc3Qgb2YgaGVhZGVyIGZpbGVzICovCitzdHJ1Y3QgdGV4dCBkZWZpbmVzOwkJCS8qICNkZWZpbmUgc3RhdGVtZW50cyAqLworc3RydWN0IHRleHQgZGVjbHM7CQkJLyogZGVjbGFyYXRpb25zICovCitpbnQgYW1pZGRlY2xzOwkJCQkvKiBmb3IgZm9ybWF0dGluZyAqLworCisKK3ZvaWQgcmVhZGZpbGUoY2hhciAqKTsKK2ludCBtYXRjaChjaGFyICosIGNoYXIgKik7CitpbnQgZ29vZGRlZmluZShjaGFyICopOwordm9pZCBkb2V2ZW50KHN0cnVjdCBldmVudCAqLCBGSUxFICosIGNoYXIgKik7Cit2b2lkIGRvaW5jbHVkZShjaGFyICopOwordm9pZCBkb2RlY2woY2hhciAqLCBGSUxFICopOwordm9pZCBvdXRwdXQodm9pZCk7Cit2b2lkIGFkZHN0cihjaGFyICosIHN0cnVjdCB0ZXh0ICopOwordm9pZCBhZGRjaGFyKGludCwgc3RydWN0IHRleHQgKik7Cit2b2lkIHdyaXRldGV4dChzdHJ1Y3QgdGV4dCAqLCBGSUxFICopOworRklMRSAqY2tmb3BlbihjaGFyICosIGNoYXIgKik7Cit2b2lkICpja21hbGxvYyhpbnQpOworY2hhciAqc2F2ZXN0cihjaGFyICopOworc3RhdGljIHZvaWQgZXJyb3IoY2hhciAqKTsKK2ludCBtYWluKGludCwgY2hhciAqKik7CisKKyNkZWZpbmUgZXF1YWwoczEsIHMyKQkoc3RyY21wKHMxLCBzMikgPT0gMCkKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqYXA7CisKKwloZWFkZXJfZmlsZXNbMF0gPSAiXCJzaGVsbC5oXCIiOworCWhlYWRlcl9maWxlc1sxXSA9ICJcIm15c3RyaW5nLmhcIiI7CisJaGVhZGVyX2ZpbGVzWzJdID0gIlwiaW5pdC5oXCIiOworCWZvciAoYXAgPSBhcmd2ICsgMSA7ICphcCA7IGFwKyspCisJCXJlYWRmaWxlKCphcCk7CisJb3V0cHV0KCk7CisJcmVuYW1lKE9VVFRFTVAsIE9VVEZJTEUpOworCWV4aXQoMCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisKKy8qCisgKiBQYXJzZSBhbiBpbnB1dCBmaWxlLgorICovCisKK3ZvaWQKK3JlYWRmaWxlKGNoYXIgKmZuYW1lKQoreworCUZJTEUgKmZwOworCWNoYXIgbGluZVsxMDI0XTsKKwlzdHJ1Y3QgZXZlbnQgKmVwOworCisJZnAgPSBja2ZvcGVuKGZuYW1lLCAiciIpOworCWN1cmZpbGUgPSBmbmFtZTsKKwlsaW5ubyA9IDA7CisJYW1pZGRlY2xzID0gMDsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mIGxpbmUsIGZwKSAhPSBOVUxMKSB7CisJCWxpbm5vKys7CisJCWZvciAoZXAgPSBldmVudCA7IGVwLT5uYW1lIDsgZXArKykgeworCQkJaWYgKGxpbmVbMF0gPT0gZXAtPm5hbWVbMF0gJiYgbWF0Y2goZXAtPm5hbWUsIGxpbmUpKSB7CisJCQkJZG9ldmVudChlcCwgZnAsIGZuYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAobGluZVswXSA9PSAnSScgJiYgbWF0Y2goIklOQ0xVREUiLCBsaW5lKSkKKwkJCWRvaW5jbHVkZShsaW5lKTsKKwkJaWYgKGxpbmVbMF0gPT0gJ00nICYmIG1hdGNoKCJNS0lOSVQiLCBsaW5lKSkKKwkJCWRvZGVjbChsaW5lLCBmcCk7CisJCWlmIChsaW5lWzBdID09ICcjJyAmJiBnb29kZGVmaW5lKGxpbmUpKSB7CisJCSAgICAgICAgY2hhciAqY3A7CisJCQljaGFyIGxpbmUyWzEwMjRdOworCQkJc3RhdGljIGNvbnN0IGNoYXIgdW5kZWZbXSA9ICIjdW5kZWYgIjsKKworCQkJc3RyY3B5KGxpbmUyLCBsaW5lKTsKKwkJCW1lbWNweShsaW5lMiwgdW5kZWYsIHNpemVvZih1bmRlZikgLSAxKTsKKwkJCWNwID0gbGluZTIgKyBzaXplb2YodW5kZWYpIC0gMTsKKwkJCXdoaWxlKCpjcCAmJiAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykpCisJCQkgICAgICAgIGNwKys7CisJCQl3aGlsZSgqY3AgJiYgKmNwICE9ICcgJyAmJiAqY3AgIT0gJ1x0JyAmJiAqY3AgIT0gJ1xuJykKKwkJCSAgICAgICAgY3ArKzsKKwkJCSpjcCsrID0gJ1xuJzsgKmNwID0gJ1wwJzsKKwkJCWFkZHN0cihsaW5lMiwgJmRlZmluZXMpOworCQkJYWRkc3RyKGxpbmUsICZkZWZpbmVzKTsKKwkJfQorCX0KKwlmY2xvc2UoZnApOworfQorCisKK2ludAorbWF0Y2goY2hhciAqbmFtZSwgY2hhciAqbGluZSkKK3sKKwljaGFyICpwLCAqcTsKKworCXAgPSBuYW1lLCBxID0gbGluZTsKKwl3aGlsZSAoKnApIHsKKwkJaWYgKCpwKysgIT0gKnErKykKKwkJCXJldHVybiAwOworCX0KKwlpZiAoKnEgIT0gJ3snICYmICpxICE9ICcgJyAmJiAqcSAhPSAnXHQnICYmICpxICE9ICdcbicpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisKK2ludAorZ29vZGRlZmluZShjaGFyICpsaW5lKQoreworCWNoYXIgKnA7CisKKwlpZiAoISBtYXRjaCgiI2RlZmluZSIsIGxpbmUpKQorCQlyZXR1cm4gMDsJCQkvKiBub3QgYSBkZWZpbmUgKi8KKwlwID0gbGluZSArIDc7CisJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQlwKys7CisJd2hpbGUgKCpwICE9ICcgJyAmJiAqcCAhPSAnXHQnKSB7CisJCWlmICgqcCA9PSAnKCcpCisJCQlyZXR1cm4gMDsJCS8qIG1hY3JvIGRlZmluaXRpb24gKi8KKwkJcCsrOworCX0KKwl3aGlsZSAoKnAgIT0gJ1xuJyAmJiAqcCAhPSAnXDAnKQorCQlwKys7CisJaWYgKHBbLTFdID09ICdcXCcpCisJCXJldHVybiAwOwkJCS8qIG11bHRpLWxpbmUgZGVmaW5pdGlvbiAqLworCXJldHVybiAxOworfQorCisKK3ZvaWQKK2RvZXZlbnQoc3RydWN0IGV2ZW50ICplcCwgRklMRSAqZnAsIGNoYXIgKmZuYW1lKQoreworCWNoYXIgbGluZVsxMDI0XTsKKwlpbnQgaW5kZW50OworCWNoYXIgKnA7CisKKwlzcHJpbnRmKGxpbmUsICJcbiAgICAgIC8qIGZyb20gJXM6ICovXG4iLCBmbmFtZSk7CisJYWRkc3RyKGxpbmUsICZlcC0+Y29kZSk7CisJYWRkc3RyKCIgICAgICB7XG4iLCAmZXAtPmNvZGUpOworCWZvciAoOzspIHsKKwkJbGlubm8rKzsKKwkJaWYgKGZnZXRzKGxpbmUsIHNpemVvZiBsaW5lLCBmcCkgPT0gTlVMTCkKKwkJCWVycm9yKCJVbmV4cGVjdGVkIEVPRiIpOworCQlpZiAoZXF1YWwobGluZSwgIn1cbiIpKQorCQkJYnJlYWs7CisJCWluZGVudCA9IDY7CisJCWZvciAocCA9IGxpbmUgOyAqcCA9PSAnXHQnIDsgcCsrKQorCQkJaW5kZW50ICs9IDg7CisJCWZvciAoIDsgKnAgPT0gJyAnIDsgcCsrKQorCQkJaW5kZW50Kys7CisJCWlmICgqcCA9PSAnXG4nIHx8ICpwID09ICcjJykKKwkJCWluZGVudCA9IDA7CisJCXdoaWxlIChpbmRlbnQgPj0gOCkgeworCQkJYWRkY2hhcignXHQnLCAmZXAtPmNvZGUpOworCQkJaW5kZW50IC09IDg7CisJCX0KKwkJd2hpbGUgKGluZGVudCA+IDApIHsKKwkJCWFkZGNoYXIoJyAnLCAmZXAtPmNvZGUpOworCQkJaW5kZW50LS07CisJCX0KKwkJYWRkc3RyKHAsICZlcC0+Y29kZSk7CisJfQorCWFkZHN0cigiICAgICAgfVxuIiwgJmVwLT5jb2RlKTsKK30KKworCit2b2lkCitkb2luY2x1ZGUoY2hhciAqbGluZSkKK3sKKwljaGFyICpwOworCWNoYXIgKm5hbWU7CisJY2hhciAqKnBwOworCisJZm9yIChwID0gbGluZSA7ICpwICE9ICciJyAmJiAqcCAhPSAnPCcgJiYgKnAgIT0gJ1wwJyA7IHArKyk7CisJaWYgKCpwID09ICdcMCcpCisJCWVycm9yKCJFeHBlY3RpbmcgJ1wiJyBvciAnPCciKTsKKwluYW1lID0gcDsKKwl3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcdCcgJiYgKnAgIT0gJ1xuJykKKwkJcCsrOworCWlmIChwWy0xXSAhPSAnIicgJiYgcFstMV0gIT0gJz4nKQorCQllcnJvcigiTWlzc2luZyB0ZXJtaW5hdG9yIik7CisJKnAgPSAnXDAnOworCisJLyogbmFtZSBub3cgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGluY2x1ZGUgZmlsZSAqLworCWZvciAocHAgPSBoZWFkZXJfZmlsZXMgOyAqcHAgJiYgISBlcXVhbCgqcHAsIG5hbWUpIDsgcHArKyk7CisJaWYgKCpwcCA9PSBOVUxMKQorCQkqcHAgPSBzYXZlc3RyKG5hbWUpOworfQorCisKK3ZvaWQKK2RvZGVjbChjaGFyICpsaW5lMSwgRklMRSAqZnApCit7CisJY2hhciBsaW5lWzEwMjRdOworCWNoYXIgKnAsICpxOworCisJaWYgKHN0cmNtcChsaW5lMSwgIk1LSU5JVFxuIikgPT0gMCkgeyAvKiBzdGFydCBvZiBzdHJ1Y3QvdW5pb24gZGVjbCAqLworCQlhZGRjaGFyKCdcbicsICZkZWNscyk7CisJCWRvIHsKKwkJCWxpbm5vKys7CisJCQlpZiAoZmdldHMobGluZSwgc2l6ZW9mIGxpbmUsIGZwKSA9PSBOVUxMKQorCQkJCWVycm9yKCJVbnRlcm1pbmF0ZWQgc3RydWN0dXJlIGRlY2xhcmF0aW9uIik7CisJCQlhZGRzdHIobGluZSwgJmRlY2xzKTsKKwkJfSB3aGlsZSAobGluZVswXSAhPSAnfScpOworCQlhbWlkZGVjbHMgPSAwOworCX0gZWxzZSB7CisJCWlmICghIGFtaWRkZWNscykKKwkJCWFkZGNoYXIoJ1xuJywgJmRlY2xzKTsKKwkJcSA9IE5VTEw7CisJCWZvciAocCA9IGxpbmUxICsgNiA7ICpwICYmIHN0cmNocigiPS9cbiIsICpwKSA9PSBOVUxMOyBwKyspCisJCQljb250aW51ZTsKKwkJaWYgKCpwID09ICc9JykgewkJLyogZWxpbWluYXRlIGluaXRpYWxpemF0aW9uICovCisJCQlmb3IgKHEgPSBwIDsgKnEgJiYgKnEgIT0gJzsnIDsgcSsrKTsKKwkJCWlmICgqcSA9PSAnXDAnKQorCQkJCXEgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJd2hpbGUgKHBbLTFdID09ICcgJykKKwkJCQkJcC0tOworCQkJCSpwID0gJ1wwJzsKKwkJCX0KKwkJfQorCQlhZGRzdHIoImV4dGVybiIsICZkZWNscyk7CisJCWFkZHN0cihsaW5lMSArIDYsICZkZWNscyk7CisJCWlmIChxICE9IE5VTEwpCisJCQlhZGRzdHIocSwgJmRlY2xzKTsKKwkJYW1pZGRlY2xzID0gMTsKKwl9Cit9CisKKworCisvKgorICogV3JpdGUgdGhlIG91dHB1dCB0byB0aGUgZmlsZSBPVVRURU1QLgorICovCisKK3ZvaWQKK291dHB1dCh2b2lkKQoreworCUZJTEUgKmZwOworCWNoYXIgKipwcDsKKwlzdHJ1Y3QgZXZlbnQgKmVwOworCisJZnAgPSBja2ZvcGVuKE9VVFRFTVAsICJ3Iik7CisJZnB1dHMod3JpdGVyLCBmcCk7CisJZm9yIChwcCA9IGhlYWRlcl9maWxlcyA7ICpwcCA7IHBwKyspCisJCWZwcmludGYoZnAsICIjaW5jbHVkZSAlc1xuIiwgKnBwKTsKKwlmcHV0cygiXG5cblxuIiwgZnApOworCXdyaXRldGV4dCgmZGVmaW5lcywgZnApOworCWZwdXRzKCJcblxuIiwgZnApOworCXdyaXRldGV4dCgmZGVjbHMsIGZwKTsKKwlmb3IgKGVwID0gZXZlbnQgOyBlcC0+bmFtZSA7IGVwKyspIHsKKwkJZnB1dHMoIlxuXG5cbiIsIGZwKTsKKwkJZnB1dHMoZXAtPmNvbW1lbnQsIGZwKTsKKwkJZnByaW50ZihmcCwgIlxudm9pZFxuJXMoKSB7XG4iLCBlcC0+cm91dGluZSk7CisJCXdyaXRldGV4dCgmZXAtPmNvZGUsIGZwKTsKKwkJZnByaW50ZihmcCwgIn1cbiIpOworCX0KKwlmY2xvc2UoZnApOworfQorCisKKy8qCisgKiBBIHRleHQgc3RydWN0dXJlIGlzIHNpbXBseSBhIGJsb2NrIG9mIHRleHQgdGhhdCBpcyBrZXB0IGluIG1lbW9yeS4KKyAqIEFkZHN0ciBhcHBlbmRzIGEgc3RyaW5nIHRvIHRoZSB0ZXh0IHN0cnVjdCwgYW5kIGFkZGNoYXIgYXBwZW5kcyBhIHNpbmdsZQorICogY2hhcmFjdGVyLgorICovCisKK3ZvaWQKK2FkZHN0cihjaGFyICpzLCBzdHJ1Y3QgdGV4dCAqdGV4dCkKK3sKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKC0tdGV4dC0+bmxlZnQgPCAwKQorCQkJYWRkY2hhcigqcysrLCB0ZXh0KTsKKwkJZWxzZQorCQkJKnRleHQtPm5leHRjKysgPSAqcysrOworCX0KK30KKworCit2b2lkCithZGRjaGFyKGludCBjLCBzdHJ1Y3QgdGV4dCAqdGV4dCkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmJwOworCisJaWYgKC0tdGV4dC0+bmxlZnQgPCAwKSB7CisJCWJwID0gY2ttYWxsb2Moc2l6ZW9mICpicCk7CisJCWlmICh0ZXh0LT5zdGFydCA9PSBOVUxMKQorCQkJdGV4dC0+c3RhcnQgPSBicDsKKwkJZWxzZQorCQkJdGV4dC0+bGFzdC0+bmV4dCA9IGJwOworCQl0ZXh0LT5sYXN0ID0gYnA7CisJCXRleHQtPm5leHRjID0gYnAtPnRleHQ7CisJCXRleHQtPm5sZWZ0ID0gQkxPQ0tTSVpFIC0gMTsKKwl9CisJKnRleHQtPm5leHRjKysgPSBjOworfQorCisvKgorICogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgdGV4dCBzdHJ1Y3R1cmUgdG8gYSBmaWxlLgorICovCit2b2lkCit3cml0ZXRleHQoc3RydWN0IHRleHQgKnRleHQsIEZJTEUgKmZwKQoreworCXN0cnVjdCBibG9jayAqYnA7CisKKwlpZiAodGV4dC0+c3RhcnQgIT0gTlVMTCkgeworCQlmb3IgKGJwID0gdGV4dC0+c3RhcnQgOyBicCAhPSB0ZXh0LT5sYXN0IDsgYnAgPSBicC0+bmV4dCkKKwkJCWZ3cml0ZShicC0+dGV4dCwgc2l6ZW9mIChjaGFyKSwgQkxPQ0tTSVpFLCBmcCk7CisJCWZ3cml0ZShicC0+dGV4dCwgc2l6ZW9mIChjaGFyKSwgQkxPQ0tTSVpFIC0gdGV4dC0+bmxlZnQsIGZwKTsKKwl9Cit9CisKK0ZJTEUgKgorY2tmb3BlbihjaGFyICpmaWxlLCBjaGFyICptb2RlKQoreworCUZJTEUgKmZwOworCisJaWYgKChmcCA9IGZvcGVuKGZpbGUsIG1vZGUpKSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZSk7CisJCWV4aXQoMik7CisJfQorCXJldHVybiBmcDsKK30KKwordm9pZCAqCitja21hbGxvYyhpbnQgbmJ5dGVzKQoreworCWNoYXIgKnA7CisKKwlpZiAoKHAgPSBtYWxsb2MobmJ5dGVzKSkgPT0gTlVMTCkKKwkJZXJyb3IoIk91dCBvZiBzcGFjZSIpOworCXJldHVybiBwOworfQorCitjaGFyICoKK3NhdmVzdHIoY2hhciAqcykKK3sKKwljaGFyICpwOworCisJcCA9IGNrbWFsbG9jKHN0cmxlbihzKSArIDEpOworCXN0cmNweShwLCBzKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQKK2Vycm9yKGNoYXIgKm1zZykKK3sKKwlpZiAoY3VyZmlsZSAhPSBOVUxMKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAiLCBjdXJmaWxlLCBsaW5ubyk7CisJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKTsKKwlleGl0KDIpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21rbm9kZXMuYyBiL3Vzci9kYXNoL21rbm9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTAzYTYwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWtub2Rlcy5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSByZWFkcyB0aGUgbm9kZXR5cGVzIGZpbGUgYW5kIG5vZGVzLmMucGF0IGZpbGUuICBJdCBnZW5lcmF0ZXMKKyAqIHRoZSBmaWxlcyBub2Rlcy5oIGFuZCBub2Rlcy5jLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIE1BWFRZUEVTIDUwCQkvKiBtYXggbnVtYmVyIG9mIG5vZGUgdHlwZXMgKi8KKyNkZWZpbmUgTUFYRklFTERTIDIwCQkvKiBtYXggZmllbGRzIGluIGEgc3RydWN0dXJlICovCisjZGVmaW5lIEJVRkxFTiAxMDAJCS8qIHNpemUgb2YgY2hhcmFjdGVyIGJ1ZmZlcnMgKi8KKworLyogZmllbGQgdHlwZXMgKi8KKyNkZWZpbmUgVF9OT0RFIDEJCS8qIHVuaW9uIG5vZGUgKmZpZWxkICovCisjZGVmaW5lIFRfTk9ERUxJU1QgMgkJLyogc3RydWN0IG5vZGVsaXN0ICpmaWVsZCAqLworI2RlZmluZSBUX1NUUklORyAzCisjZGVmaW5lIFRfSU5UIDQJCQkvKiBpbnQgZmllbGQgKi8KKyNkZWZpbmUgVF9PVEhFUiA1CQkvKiBvdGhlciAqLworI2RlZmluZSBUX1RFTVAgNgkJLyogZG9uJ3QgY29weSB0aGlzIGZpZWxkICovCisKKworc3RydWN0IGZpZWxkIHsJCQkvKiBhIHN0cnVjdHVyZSBmaWVsZCAqLworCWNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIGZpZWxkICovCisJaW50IHR5cGU7CQkJLyogdHlwZSBvZiBmaWVsZCAqLworCWNoYXIgKmRlY2w7CQkvKiBkZWNsYXJhdGlvbiBvZiBmaWVsZCAqLworfTsKKworCitzdHJ1Y3Qgc3RyIHsJCQkvKiBzdHJ1Y3QgcmVwcmVzZW50aW5nIGEgbm9kZSBzdHJ1Y3R1cmUgKi8KKwljaGFyICp0YWc7CQkvKiBzdHJ1Y3R1cmUgdGFnICovCisJaW50IG5maWVsZHM7CQkvKiBudW1iZXIgb2YgZmllbGRzIGluIHRoZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgZmllbGQgZmllbGRbTUFYRklFTERTXTsJLyogdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlICovCisJaW50IGRvbmU7CQkJLyogc2V0IGlmIGZ1bGx5IHBhcnNlZCAqLworfTsKKworCitzdGF0aWMgaW50IG50eXBlczsJCQkvKiBudW1iZXIgb2Ygbm9kZSB0eXBlcyAqLworc3RhdGljIGNoYXIgKm5vZGVuYW1lW01BWFRZUEVTXTsJLyogbmFtZXMgb2YgdGhlIG5vZGVzICovCitzdGF0aWMgc3RydWN0IHN0ciAqbm9kZXN0cltNQVhUWVBFU107CS8qIHR5cGUgb2Ygc3RydWN0dXJlIHVzZWQgYnkgdGhlIG5vZGUgKi8KK3N0YXRpYyBpbnQgbnN0cjsJCQkvKiBudW1iZXIgb2Ygc3RydWN0dXJlcyAqLworc3RhdGljIHN0cnVjdCBzdHIgc3RyW01BWFRZUEVTXTsJLyogdGhlIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RyICpjdXJzdHI7CQkvKiBjdXJyZW50IHN0cnVjdHVyZSAqLworc3RhdGljIEZJTEUgKmluZnA7CitzdGF0aWMgY2hhciBsaW5lWzEwMjRdOworc3RhdGljIGludCBsaW5ubzsKK3N0YXRpYyBjaGFyICpsaW5lcDsKKworc3RhdGljIHZvaWQgcGFyc2Vub2RlKHZvaWQpOworc3RhdGljIHZvaWQgcGFyc2VmaWVsZCh2b2lkKTsKK3N0YXRpYyB2b2lkIG91dHB1dChjaGFyICopOworc3RhdGljIHZvaWQgb3V0c2l6ZXMoRklMRSAqKTsKK3N0YXRpYyB2b2lkIG91dGZ1bmMoRklMRSAqLCBpbnQpOworc3RhdGljIHZvaWQgaW5kZW50KGludCwgRklMRSAqKTsKK3N0YXRpYyBpbnQgbmV4dGZpZWxkKGNoYXIgKik7CitzdGF0aWMgdm9pZCBza2lwYmwodm9pZCk7CitzdGF0aWMgaW50IHJlYWRsaW5lKHZvaWQpOworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIGNoYXIgKnNhdmVzdHIoY29uc3QgY2hhciAqKTsKK2ludCBtYWluKGludCwgY2hhciAqKik7CisKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworCS8qCisJICogc29tZSB2ZXJzaW9ucyBvZiBsaW51eCBjb21wbGFpbjogaW5pdGlhbGl6ZXIgZWxlbWVudCBpcyBub3QKKwkgKiBjb25zdGFudCBpZiB0aGlzIGlzIGRvbmUgYXQgY29tcGlsZSB0aW1lLgorCSAqLworCWluZnAgPSBzdGRpbjsKKworCWlmIChhcmdjICE9IDMpCisJCWVycm9yKCJ1c2FnZTogbWtub2RlcyBmaWxlIik7CisJaWYgKChpbmZwID0gZm9wZW4oYXJndlsxXSwgInIiKSkgPT0gTlVMTCkKKwkJZXJyb3IoIkNhbid0IG9wZW4gJXMiLCBhcmd2WzFdKTsKKwl3aGlsZSAocmVhZGxpbmUoKSkgeworCQlpZiAobGluZVswXSA9PSAnICcgfHwgbGluZVswXSA9PSAnXHQnKQorCQkJcGFyc2VmaWVsZCgpOworCQllbHNlIGlmIChsaW5lWzBdICE9ICdcMCcpCisJCQlwYXJzZW5vZGUoKTsKKwl9CisJb3V0cHV0KGFyZ3ZbMl0pOworCWV4aXQoMCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisKKworc3RhdGljIHZvaWQKK3BhcnNlbm9kZSh2b2lkKQoreworCWNoYXIgbmFtZVtCVUZMRU5dOworCWNoYXIgdGFnW0JVRkxFTl07CisJc3RydWN0IHN0ciAqc3A7CisKKwlpZiAoY3Vyc3RyICYmIGN1cnN0ci0+bmZpZWxkcyA+IDApCisJCWN1cnN0ci0+ZG9uZSA9IDE7CisJbmV4dGZpZWxkKG5hbWUpOworCWlmICghIG5leHRmaWVsZCh0YWcpKQorCQllcnJvcigiVGFnIGV4cGVjdGVkIik7CisJaWYgKCpsaW5lcCAhPSAnXDAnKQorCQllcnJvcigiR2FyYmFnZSBhdCBlbmQgb2YgbGluZSIpOworCW5vZGVuYW1lW250eXBlc10gPSBzYXZlc3RyKG5hbWUpOworCWZvciAoc3AgPSBzdHIgOyBzcCA8IHN0ciArIG5zdHIgOyBzcCsrKSB7CisJCWlmIChzdHJjbXAoc3AtPnRhZywgdGFnKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChzcCA+PSBzdHIgKyBuc3RyKSB7CisJCXNwLT50YWcgPSBzYXZlc3RyKHRhZyk7CisJCXNwLT5uZmllbGRzID0gMDsKKwkJY3Vyc3RyID0gc3A7CisJCW5zdHIrKzsKKwl9CisJbm9kZXN0cltudHlwZXNdID0gc3A7CisJbnR5cGVzKys7Cit9CisKKworc3RhdGljIHZvaWQKK3BhcnNlZmllbGQodm9pZCkKK3sKKwljaGFyIG5hbWVbQlVGTEVOXTsKKwljaGFyIHR5cGVbQlVGTEVOXTsKKwljaGFyIGRlY2xbMiAqIEJVRkxFTl07CisJc3RydWN0IGZpZWxkICpmcDsKKworCWlmIChjdXJzdHIgPT0gTlVMTCB8fCBjdXJzdHItPmRvbmUpCisJCWVycm9yKCJObyBjdXJyZW50IHN0cnVjdHVyZSB0byBhZGQgZmllbGQgdG8iKTsKKwlpZiAoISBuZXh0ZmllbGQobmFtZSkpCisJCWVycm9yKCJObyBmaWVsZCBuYW1lIik7CisJaWYgKCEgbmV4dGZpZWxkKHR5cGUpKQorCQllcnJvcigiTm8gZmllbGQgdHlwZSIpOworCWZwID0gJmN1cnN0ci0+ZmllbGRbY3Vyc3RyLT5uZmllbGRzXTsKKwlmcC0+bmFtZSA9IHNhdmVzdHIobmFtZSk7CisJaWYgKHN0cmNtcCh0eXBlLCAibm9kZXB0ciIpID09IDApIHsKKwkJZnAtPnR5cGUgPSBUX05PREU7CisJCXNwcmludGYoZGVjbCwgInVuaW9uIG5vZGUgKiVzIiwgbmFtZSk7CisJfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIm5vZGVsaXN0IikgPT0gMCkgeworCQlmcC0+dHlwZSA9IFRfTk9ERUxJU1Q7CisJCXNwcmludGYoZGVjbCwgInN0cnVjdCBub2RlbGlzdCAqJXMiLCBuYW1lKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAic3RyaW5nIikgPT0gMCkgeworCQlmcC0+dHlwZSA9IFRfU1RSSU5HOworCQlzcHJpbnRmKGRlY2wsICJjaGFyIColcyIsIG5hbWUpOworCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJpbnQiKSA9PSAwKSB7CisJCWZwLT50eXBlID0gVF9JTlQ7CisJCXNwcmludGYoZGVjbCwgImludCAlcyIsIG5hbWUpOworCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJvdGhlciIpID09IDApIHsKKwkJZnAtPnR5cGUgPSBUX09USEVSOworCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJ0ZW1wIikgPT0gMCkgeworCQlmcC0+dHlwZSA9IFRfVEVNUDsKKwl9IGVsc2UgeworCQllcnJvcigiVW5rbm93biB0eXBlICVzIiwgdHlwZSk7CisJfQorCWlmIChmcC0+dHlwZSA9PSBUX09USEVSIHx8IGZwLT50eXBlID09IFRfVEVNUCkgeworCQlza2lwYmwoKTsKKwkJZnAtPmRlY2wgPSBzYXZlc3RyKGxpbmVwKTsKKwl9IGVsc2UgeworCQlpZiAoKmxpbmVwKQorCQkJZXJyb3IoIkdhcmJhZ2UgYXQgZW5kIG9mIGxpbmUiKTsKKwkJZnAtPmRlY2wgPSBzYXZlc3RyKGRlY2wpOworCX0KKwljdXJzdHItPm5maWVsZHMrKzsKK30KKworCitjaGFyIHdyaXRlcltdID0gIlwKKy8qXG5cCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgbWtub2RlcyBwcm9ncmFtLlxuXAorICovXG5cCitcbiI7CisKK3N0YXRpYyB2b2lkCitvdXRwdXQoY2hhciAqZmlsZSkKK3sKKwlGSUxFICpoZmlsZTsKKwlGSUxFICpjZmlsZTsKKwlGSUxFICpwYXRmaWxlOworCWludCBpOworCXN0cnVjdCBzdHIgKnNwOworCXN0cnVjdCBmaWVsZCAqZnA7CisJY2hhciAqcDsKKworCWlmICgocGF0ZmlsZSA9IGZvcGVuKGZpbGUsICJyIikpID09IE5VTEwpCisJCWVycm9yKCJDYW4ndCBvcGVuICVzIiwgZmlsZSk7CisJaWYgKChoZmlsZSA9IGZvcGVuKCJub2Rlcy5oIiwgInciKSkgPT0gTlVMTCkKKwkJZXJyb3IoIkNhbid0IGNyZWF0ZSBub2Rlcy5oIik7CisJaWYgKChjZmlsZSA9IGZvcGVuKCJub2Rlcy5jIiwgInciKSkgPT0gTlVMTCkKKwkJZXJyb3IoIkNhbid0IGNyZWF0ZSBub2Rlcy5jIik7CisJZnB1dHMod3JpdGVyLCBoZmlsZSk7CisJZm9yIChpID0gMCA7IGkgPCBudHlwZXMgOyBpKyspCisJCWZwcmludGYoaGZpbGUsICIjZGVmaW5lICVzICVkXG4iLCBub2RlbmFtZVtpXSwgaSk7CisJZnB1dHMoIlxuXG5cbiIsIGhmaWxlKTsKKwlmb3IgKHNwID0gc3RyIDsgc3AgPCAmc3RyW25zdHJdIDsgc3ArKykgeworCQlmcHJpbnRmKGhmaWxlLCAic3RydWN0ICVzIHtcbiIsIHNwLT50YWcpOworCQlmb3IgKGkgPSBzcC0+bmZpZWxkcywgZnAgPSBzcC0+ZmllbGQgOyAtLWkgPj0gMCA7IGZwKyspIHsKKwkJCWZwcmludGYoaGZpbGUsICIgICAgICAlcztcbiIsIGZwLT5kZWNsKTsKKwkJfQorCQlmcHV0cygifTtcblxuXG4iLCBoZmlsZSk7CisJfQorCWZwdXRzKCJ1bmlvbiBub2RlIHtcbiIsIGhmaWxlKTsKKwlmcHJpbnRmKGhmaWxlLCAiICAgICAgaW50IHR5cGU7XG4iKTsKKwlmb3IgKHNwID0gc3RyIDsgc3AgPCAmc3RyW25zdHJdIDsgc3ArKykgeworCQlmcHJpbnRmKGhmaWxlLCAiICAgICAgc3RydWN0ICVzICVzO1xuIiwgc3AtPnRhZywgc3AtPnRhZyk7CisJfQorCWZwdXRzKCJ9O1xuXG5cbiIsIGhmaWxlKTsKKwlmcHV0cygic3RydWN0IG5vZGVsaXN0IHtcbiIsIGhmaWxlKTsKKwlmcHV0cygiXHRzdHJ1Y3Qgbm9kZWxpc3QgKm5leHQ7XG4iLCBoZmlsZSk7CisJZnB1dHMoIlx0dW5pb24gbm9kZSAqbjtcbiIsIGhmaWxlKTsKKwlmcHV0cygifTtcblxuXG4iLCBoZmlsZSk7CisJZnB1dHMoInN0cnVjdCBmdW5jbm9kZSB7XG4iLCBoZmlsZSk7CisJZnB1dHMoIlx0aW50IGNvdW50O1xuIiwgaGZpbGUpOworCWZwdXRzKCJcdHVuaW9uIG5vZGUgbjtcbiIsIGhmaWxlKTsKKwlmcHV0cygifTtcblxuXG4iLCBoZmlsZSk7CisJZnB1dHMoInN0cnVjdCBmdW5jbm9kZSAqY29weWZ1bmModW5pb24gbm9kZSAqKTtcbiIsIGhmaWxlKTsKKwlmcHV0cygidm9pZCBmcmVlZnVuYyhzdHJ1Y3QgZnVuY25vZGUgKik7XG4iLCBoZmlsZSk7CisKKwlmcHV0cyh3cml0ZXIsIGNmaWxlKTsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mIGxpbmUsIHBhdGZpbGUpICE9IE5VTEwpIHsKKwkJZm9yIChwID0gbGluZSA7ICpwID09ICcgJyB8fCAqcCA9PSAnXHQnIDsgcCsrKTsKKwkJaWYgKHN0cmNtcChwLCAiJVNJWkVTXG4iKSA9PSAwKQorCQkJb3V0c2l6ZXMoY2ZpbGUpOworCQllbHNlIGlmIChzdHJjbXAocCwgIiVDQUxDU0laRVxuIikgPT0gMCkKKwkJCW91dGZ1bmMoY2ZpbGUsIDEpOworCQllbHNlIGlmIChzdHJjbXAocCwgIiVDT1BZXG4iKSA9PSAwKQorCQkJb3V0ZnVuYyhjZmlsZSwgMCk7CisJCWVsc2UKKwkJCWZwdXRzKGxpbmUsIGNmaWxlKTsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZAorb3V0c2l6ZXMoRklMRSAqY2ZpbGUpCit7CisJaW50IGk7CisKKwlmcHJpbnRmKGNmaWxlLCAic3RhdGljIGNvbnN0IHNob3J0IG5vZGVzaXplWyVkXSA9IHtcbiIsIG50eXBlcyk7CisJZm9yIChpID0gMCA7IGkgPCBudHlwZXMgOyBpKyspIHsKKwkJZnByaW50ZihjZmlsZSwgIiAgICAgIFNIRUxMX0FMSUdOKHNpemVvZiAoc3RydWN0ICVzKSksXG4iLAorCQkgICAgbm9kZXN0cltpXS0+dGFnKTsKKwl9CisJZnByaW50ZihjZmlsZSwgIn07XG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorb3V0ZnVuYyhGSUxFICpjZmlsZSwgaW50IGNhbGNzaXplKQoreworCXN0cnVjdCBzdHIgKnNwOworCXN0cnVjdCBmaWVsZCAqZnA7CisJaW50IGk7CisKKwlmcHV0cygiICAgICAgaWYgKG4gPT0gTlVMTClcbiIsIGNmaWxlKTsKKwlpZiAoY2FsY3NpemUpCisJCWZwdXRzKCIJICAgIHJldHVybjtcbiIsIGNmaWxlKTsKKwllbHNlCisJCWZwdXRzKCIJICAgIHJldHVybiBOVUxMO1xuIiwgY2ZpbGUpOworCWlmIChjYWxjc2l6ZSkKKwkJZnB1dHMoIiAgICAgIGZ1bmNibG9ja3NpemUgKz0gbm9kZXNpemVbbi0+dHlwZV07XG4iLCBjZmlsZSk7CisJZWxzZSB7CisJCWZwdXRzKCIgICAgICBuZXcgPSBmdW5jYmxvY2s7XG4iLCBjZmlsZSk7CisJCWZwdXRzKCIgICAgICBmdW5jYmxvY2sgPSAoY2hhciAqKSBmdW5jYmxvY2sgKyBub2Rlc2l6ZVtuLT50eXBlXTtcbiIsIGNmaWxlKTsKKwl9CisJZnB1dHMoIiAgICAgIHN3aXRjaCAobi0+dHlwZSkge1xuIiwgY2ZpbGUpOworCWZvciAoc3AgPSBzdHIgOyBzcCA8ICZzdHJbbnN0cl0gOyBzcCsrKSB7CisJCWZvciAoaSA9IDAgOyBpIDwgbnR5cGVzIDsgaSsrKSB7CisJCQlpZiAobm9kZXN0cltpXSA9PSBzcCkKKwkJCQlmcHJpbnRmKGNmaWxlLCAiICAgICAgY2FzZSAlczpcbiIsIG5vZGVuYW1lW2ldKTsKKwkJfQorCQlmb3IgKGkgPSBzcC0+bmZpZWxkcyA7IC0taSA+PSAxIDsgKSB7CisJCQlmcCA9ICZzcC0+ZmllbGRbaV07CisJCQlzd2l0Y2ggKGZwLT50eXBlKSB7CisJCQljYXNlIFRfTk9ERToKKwkJCQlpZiAoY2FsY3NpemUpIHsKKwkJCQkJaW5kZW50KDEyLCBjZmlsZSk7CisJCQkJCWZwcmludGYoY2ZpbGUsICJjYWxjc2l6ZShuLT4lcy4lcyk7XG4iLAorCQkJCQkJc3AtPnRhZywgZnAtPm5hbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCWluZGVudCgxMiwgY2ZpbGUpOworCQkJCQlmcHJpbnRmKGNmaWxlLCAibmV3LT4lcy4lcyA9IGNvcHlub2RlKG4tPiVzLiVzKTtcbiIsCisJCQkJCQlzcC0+dGFnLCBmcC0+bmFtZSwgc3AtPnRhZywgZnAtPm5hbWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVF9OT0RFTElTVDoKKwkJCQlpZiAoY2FsY3NpemUpIHsKKwkJCQkJaW5kZW50KDEyLCBjZmlsZSk7CisJCQkJCWZwcmludGYoY2ZpbGUsICJzaXplbm9kZWxpc3Qobi0+JXMuJXMpO1xuIiwKKwkJCQkJCXNwLT50YWcsIGZwLT5uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbmRlbnQoMTIsIGNmaWxlKTsKKwkJCQkJZnByaW50ZihjZmlsZSwgIm5ldy0+JXMuJXMgPSBjb3B5bm9kZWxpc3Qobi0+JXMuJXMpO1xuIiwKKwkJCQkJCXNwLT50YWcsIGZwLT5uYW1lLCBzcC0+dGFnLCBmcC0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUX1NUUklORzoKKwkJCQlpZiAoY2FsY3NpemUpIHsKKwkJCQkJaW5kZW50KDEyLCBjZmlsZSk7CisJCQkJCWZwcmludGYoY2ZpbGUsICJmdW5jc3RyaW5nc2l6ZSArPSBzdHJsZW4obi0+JXMuJXMpICsgMTtcbiIsCisJCQkJCQlzcC0+dGFnLCBmcC0+bmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW5kZW50KDEyLCBjZmlsZSk7CisJCQkJCWZwcmludGYoY2ZpbGUsICJuZXctPiVzLiVzID0gbm9kZXNhdmVzdHIobi0+JXMuJXMpO1xuIiwKKwkJCQkJCXNwLT50YWcsIGZwLT5uYW1lLCBzcC0+dGFnLCBmcC0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUX0lOVDoKKwkJCWNhc2UgVF9PVEhFUjoKKwkJCQlpZiAoISBjYWxjc2l6ZSkgeworCQkJCQlpbmRlbnQoMTIsIGNmaWxlKTsKKwkJCQkJZnByaW50ZihjZmlsZSwgIm5ldy0+JXMuJXMgPSBuLT4lcy4lcztcbiIsCisJCQkJCQlzcC0+dGFnLCBmcC0+bmFtZSwgc3AtPnRhZywgZnAtPm5hbWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpbmRlbnQoMTIsIGNmaWxlKTsKKwkJZnB1dHMoImJyZWFrO1xuIiwgY2ZpbGUpOworCX0KKwlmcHV0cygiICAgICAgfTtcbiIsIGNmaWxlKTsKKwlpZiAoISBjYWxjc2l6ZSkKKwkJZnB1dHMoIiAgICAgIG5ldy0+dHlwZSA9IG4tPnR5cGU7XG4iLCBjZmlsZSk7Cit9CisKKworc3RhdGljIHZvaWQKK2luZGVudChpbnQgYW1vdW50LCBGSUxFICpmcCkKK3sKKwl3aGlsZSAoYW1vdW50ID49IDgpIHsKKwkJcHV0YygnXHQnLCBmcCk7CisJCWFtb3VudCAtPSA4OworCX0KKwl3aGlsZSAoLS1hbW91bnQgPj0gMCkgeworCQlwdXRjKCcgJywgZnApOworCX0KK30KKworCitzdGF0aWMgaW50CituZXh0ZmllbGQoY2hhciAqYnVmKQoreworCWNoYXIgKnAsICpxOworCisJcCA9IGxpbmVwOworCXdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkJcCsrOworCXEgPSBidWY7CisJd2hpbGUgKCpwICE9ICcgJyAmJiAqcCAhPSAnXHQnICYmICpwICE9ICdcMCcpCisJCSpxKysgPSAqcCsrOworCSpxID0gJ1wwJzsKKwlsaW5lcCA9IHA7CisJcmV0dXJuIChxID4gYnVmKTsKK30KKworCitzdGF0aWMgdm9pZAorc2tpcGJsKHZvaWQpCit7CisJd2hpbGUgKCpsaW5lcCA9PSAnICcgfHwgKmxpbmVwID09ICdcdCcpCisJCWxpbmVwKys7Cit9CisKKworc3RhdGljIGludAorcmVhZGxpbmUodm9pZCkKK3sKKwljaGFyICpwOworCisJaWYgKGZnZXRzKGxpbmUsIDEwMjQsIGluZnApID09IE5VTEwpCisJCXJldHVybiAwOworCWZvciAocCA9IGxpbmUgOyAqcCAhPSAnIycgJiYgKnAgIT0gJ1xuJyAmJiAqcCAhPSAnXDAnIDsgcCsrKTsKKwl3aGlsZSAocCA+IGxpbmUgJiYgKHBbLTFdID09ICcgJyB8fCBwWy0xXSA9PSAnXHQnKSkKKwkJcC0tOworCSpwID0gJ1wwJzsKKwlsaW5lcCA9IGxpbmU7CisJbGlubm8rKzsKKwlpZiAocCAtIGxpbmUgPiBCVUZMRU4pCisJCWVycm9yKCJMaW5lIHRvbyBsb25nIik7CisJcmV0dXJuIDE7Cit9CisKKworCitzdGF0aWMgdm9pZAorZXJyb3IoY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCXZhX3N0YXJ0KHZhLCBtc2cpOworCisJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAibGluZSAlZDogIiwgbGlubm8pOworCSh2b2lkKSB2ZnByaW50ZihzdGRlcnIsIG1zZywgdmEpOworCSh2b2lkKSBmcHV0YygnXG4nLCBzdGRlcnIpOworCisJdmFfZW5kKHZhKTsKKworCWV4aXQoMik7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisKKworc3RhdGljIGNoYXIgKgorc2F2ZXN0cihjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnA7CisKKwlpZiAoKHAgPSBtYWxsb2Moc3RybGVuKHMpICsgMSkpID09IE5VTEwpCisJCWVycm9yKCJPdXQgb2Ygc3BhY2UiKTsKKwkodm9pZCkgc3RyY3B5KHAsIHMpOworCXJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWtzeW50YXguYyBiL3Vzci9kYXNoL21rc3ludGF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4YTlhZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21rc3ludGF4LmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGNyZWF0ZXMgc3ludGF4LmggYW5kIHN5bnRheC5jLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgInBhcnNlci5oIgorCisKK3N0cnVjdCBzeW5jbGFzcyB7CisJY2hhciAqbmFtZTsKKwljaGFyICpjb21tZW50OworfTsKKworLyogU3ludGF4IGNsYXNzZXMgKi8KK3N0cnVjdCBzeW5jbGFzcyBzeW5jbGFzc1tdID0geworCXsgIkNXT1JEIiwJImNoYXJhY3RlciBpcyBub3RoaW5nIHNwZWNpYWwiIH0sCisJeyAiQ05MIiwJIm5ld2xpbmUgY2hhcmFjdGVyIiB9LAorCXsgIkNCQUNLIiwJImEgYmFja3NsYXNoIGNoYXJhY3RlciIgfSwKKwl7ICJDU1FVT1RFIiwJInNpbmdsZSBxdW90ZSIgfSwKKwl7ICJDRFFVT1RFIiwJImRvdWJsZSBxdW90ZSIgfSwKKwl7ICJDRU5EUVVPVEUiLAkiYSB0ZXJtaW5hdGluZyBxdW90ZSIgfSwKKwl7ICJDQlFVT1RFIiwJImJhY2t3YXJkcyBzaW5nbGUgcXVvdGUiIH0sCisJeyAiQ1ZBUiIsCSJhIGRvbGxhciBzaWduIiB9LAorCXsgIkNFTkRWQVIiLAkiYSAnfScgY2hhcmFjdGVyIiB9LAorCXsgIkNMUCIsCSJhIGxlZnQgcGFyZW4gaW4gYXJpdGhtZXRpYyIgfSwKKwl7ICJDUlAiLAkiYSByaWdodCBwYXJlbiBpbiBhcml0aG1ldGljIiB9LAorCXsgIkNFT0YiLAkiZW5kIG9mIGZpbGUiIH0sCisJeyAiQ0NUTCIsCSJsaWtlIENXT1JELCBleGNlcHQgaXQgbXVzdCBiZSBlc2NhcGVkIiB9LAorCXsgIkNTUENMIiwJInRoZXNlIHRlcm1pbmF0ZSBhIHdvcmQiIH0sCisJeyAiQ0lHTiIsCSJjaGFyYWN0ZXIgc2hvdWxkIGJlIGlnbm9yZWQiIH0sCisJeyBOVUxMLAkJTlVMTCB9Cit9OworCisKKy8qCisgKiBTeW50YXggY2xhc3NlcyBmb3IgaXNfIGZ1bmN0aW9ucy4gIFdhcm5pbmc6ICBpZiB5b3UgYWRkIG5ldyBjbGFzc2VzCisgKiB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBpc19pbl9uYW1lIG1hY3JvLgorICovCitzdHJ1Y3Qgc3luY2xhc3MgaXNfZW50cnlbXSA9IHsKKwl7ICJJU0RJR0lUIiwJImEgZGlnaXQiIH0sCisJeyAiSVNVUFBFUiIsCSJhbiB1cHBlciBjYXNlIGxldHRlciIgfSwKKwl7ICJJU0xPV0VSIiwJImEgbG93ZXIgY2FzZSBsZXR0ZXIiIH0sCisJeyAiSVNVTkRFUiIsCSJhbiB1bmRlcnNjb3JlIiB9LAorCXsgIklTU1BFQ0wiLAkidGhlIG5hbWUgb2YgYSBzcGVjaWFsIHBhcmFtZXRlciIgfSwKKwl7IE5VTEwsIAlOVUxMIH0KK307CisKK3N0YXRpYyBjaGFyIHdyaXRlcltdID0gIlwKKy8qXG5cCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgbWtzeW50YXggcHJvZ3JhbS5cblwKKyAqL1xuXAorXG4iOworCisKK3N0YXRpYyBGSUxFICpjZmlsZTsKK3N0YXRpYyBGSUxFICpoZmlsZTsKK3N0YXRpYyBjaGFyICpzeW50YXhbNTEzXTsKKworc3RhdGljIHZvaWQgZmlsbHRhYmxlKGNoYXIgKik7CitzdGF0aWMgdm9pZCBpbml0KHZvaWQpOworc3RhdGljIHZvaWQgYWRkKGNoYXIgKiwgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHByaW50KGNoYXIgKik7CitzdGF0aWMgdm9pZCBvdXRwdXRfdHlwZV9tYWNyb3Modm9pZCk7CitpbnQgbWFpbihpbnQsIGNoYXIgKiopOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWNoYXIgYnVmWzgwXTsKKwlpbnQgcG9zOworCisJLyogQ3JlYXRlIG91dHB1dCBmaWxlcyAqLworCWlmICgoY2ZpbGUgPSBmb3Blbigic3ludGF4LmMiLCAidyIpKSA9PSBOVUxMKSB7CisJCXBlcnJvcigic3ludGF4LmMiKTsKKwkJZXhpdCgyKTsKKwl9CisJaWYgKChoZmlsZSA9IGZvcGVuKCJzeW50YXguaCIsICJ3IikpID09IE5VTEwpIHsKKwkJcGVycm9yKCJzeW50YXguaCIpOworCQlleGl0KDIpOworCX0KKwlmcHV0cyh3cml0ZXIsIGhmaWxlKTsKKwlmcHV0cyh3cml0ZXIsIGNmaWxlKTsKKworCWZwdXRzKCIjaW5jbHVkZSA8Y3R5cGUuaD5cbiIsIGhmaWxlKTsKKwlmcHV0cygiXG4iLCBoZmlsZSk7CisJZnB1dHMoIiNpZmRlZiBDRU9GXG4iLCBoZmlsZSk7CisJZnB1dHMoIiN1bmRlZiBDRU9GXG4iLCBoZmlsZSk7CisJZnB1dHMoIiNlbmRpZlxuIiwgaGZpbGUpOworCWZwdXRzKCJcbiIsIGhmaWxlKTsKKworCS8qIEdlbmVyYXRlIHRoZSAjZGVmaW5lIHN0YXRlbWVudHMgaW4gdGhlIGhlYWRlciBmaWxlICovCisJZnB1dHMoIi8qIFN5bnRheCBjbGFzc2VzICovXG4iLCBoZmlsZSk7CisJZm9yIChpID0gMCA7IHN5bmNsYXNzW2ldLm5hbWUgOyBpKyspIHsKKwkJc3ByaW50ZihidWYsICIjZGVmaW5lICVzICVkIiwgc3luY2xhc3NbaV0ubmFtZSwgaSk7CisJCWZwdXRzKGJ1ZiwgaGZpbGUpOworCQlmb3IgKHBvcyA9IHN0cmxlbihidWYpIDsgcG9zIDwgMzIgOyBwb3MgPSAocG9zICsgOCkgJiB+MDcpCisJCQlwdXRjKCdcdCcsIGhmaWxlKTsKKwkJZnByaW50ZihoZmlsZSwgIi8qICVzICovXG4iLCBzeW5jbGFzc1tpXS5jb21tZW50KTsKKwl9CisJcHV0YygnXG4nLCBoZmlsZSk7CisJZnB1dHMoIi8qIFN5bnRheCBjbGFzc2VzIGZvciBpc18gZnVuY3Rpb25zICovXG4iLCBoZmlsZSk7CisJZm9yIChpID0gMCA7IGlzX2VudHJ5W2ldLm5hbWUgOyBpKyspIHsKKwkJc3ByaW50ZihidWYsICIjZGVmaW5lICVzICUjbyIsIGlzX2VudHJ5W2ldLm5hbWUsIDEgPDwgaSk7CisJCWZwdXRzKGJ1ZiwgaGZpbGUpOworCQlmb3IgKHBvcyA9IHN0cmxlbihidWYpIDsgcG9zIDwgMzIgOyBwb3MgPSAocG9zICsgOCkgJiB+MDcpCisJCQlwdXRjKCdcdCcsIGhmaWxlKTsKKwkJZnByaW50ZihoZmlsZSwgIi8qICVzICovXG4iLCBpc19lbnRyeVtpXS5jb21tZW50KTsKKwl9CisJcHV0YygnXG4nLCBoZmlsZSk7CisJZnByaW50ZihoZmlsZSwgIiNkZWZpbmUgU1lOQkFTRSAlZFxuIiwgMTMwKTsKKwlmcHJpbnRmKGhmaWxlLCAiI2RlZmluZSBQRU9GICVkXG5cbiIsIC0xMzApOworCWZwcmludGYoaGZpbGUsICIjZGVmaW5lIFBFT0EgJWRcblxuIiwgLTEyOSk7CisJcHV0YygnXG4nLCBoZmlsZSk7CisJZnB1dHMoIiNkZWZpbmUgQkFTRVNZTlRBWCAoYmFzZXN5bnRheCArIFNZTkJBU0UpXG4iLCBoZmlsZSk7CisJZnB1dHMoIiNkZWZpbmUgRFFTWU5UQVggKGRxc3ludGF4ICsgU1lOQkFTRSlcbiIsIGhmaWxlKTsKKwlmcHV0cygiI2RlZmluZSBTUVNZTlRBWCAoc3FzeW50YXggKyBTWU5CQVNFKVxuIiwgaGZpbGUpOworCWZwdXRzKCIjZGVmaW5lIEFSSVNZTlRBWCAoYXJpc3ludGF4ICsgU1lOQkFTRSlcbiIsIGhmaWxlKTsKKwlwdXRjKCdcbicsIGhmaWxlKTsKKwlvdXRwdXRfdHlwZV9tYWNyb3MoKTsJCS8qIGlzX2RpZ2l0LCBldGMuICovCisJcHV0YygnXG4nLCBoZmlsZSk7CisKKwkvKiBHZW5lcmF0ZSB0aGUgc3ludGF4IHRhYmxlcy4gKi8KKwlmcHV0cygiI2luY2x1ZGUgXCJzaGVsbC5oXCJcbiIsIGNmaWxlKTsKKwlmcHV0cygiI2luY2x1ZGUgXCJzeW50YXguaFwiXG5cbiIsIGNmaWxlKTsKKwlpbml0KCk7CisJZnB1dHMoIi8qIHN5bnRheCB0YWJsZSB1c2VkIHdoZW4gbm90IGluIHF1b3RlcyAqL1xuIiwgY2ZpbGUpOworCWFkZCgiXG4iLCAiQ05MIik7CisJYWRkKCJcXCIsICJDQkFDSyIpOworCWFkZCgiJyIsICJDU1FVT1RFIik7CisJYWRkKCJcIiIsICJDRFFVT1RFIik7CisJYWRkKCJgIiwgIkNCUVVPVEUiKTsKKwlhZGQoIiQiLCAiQ1ZBUiIpOworCWFkZCgifSIsICJDRU5EVkFSIik7CisJYWRkKCI8PigpOyZ8IFx0IiwgIkNTUENMIik7CisJc3ludGF4WzFdID0gIkNTUENMIjsKKwlwcmludCgiYmFzZXN5bnRheCIpOworCWluaXQoKTsKKwlmcHV0cygiXG4vKiBzeW50YXggdGFibGUgdXNlZCB3aGVuIGluIGRvdWJsZSBxdW90ZXMgKi9cbiIsIGNmaWxlKTsKKwlhZGQoIlxuIiwgIkNOTCIpOworCWFkZCgiXFwiLCAiQ0JBQ0siKTsKKwlhZGQoIlwiIiwgIkNFTkRRVU9URSIpOworCWFkZCgiYCIsICJDQlFVT1RFIik7CisJYWRkKCIkIiwgIkNWQVIiKTsKKwlhZGQoIn0iLCAiQ0VORFZBUiIpOworCS8qICc6LycgZm9yIHRpbGRlIGV4cGFuc2lvbiwgJy0nIGZvciBbYVwteF0gcGF0dGVybiByYW5nZXMgKi8KKwlhZGQoIiEqP1s9fjovLV0iLCAiQ0NUTCIpOworCXByaW50KCJkcXN5bnRheCIpOworCWluaXQoKTsKKwlmcHV0cygiXG4vKiBzeW50YXggdGFibGUgdXNlZCB3aGVuIGluIHNpbmdsZSBxdW90ZXMgKi9cbiIsIGNmaWxlKTsKKwlhZGQoIlxuIiwgIkNOTCIpOworCWFkZCgiJyIsICJDRU5EUVVPVEUiKTsKKwkvKiAnOi8nIGZvciB0aWxkZSBleHBhbnNpb24sICctJyBmb3IgW2FcLXhdIHBhdHRlcm4gcmFuZ2VzICovCisJYWRkKCIhKj9bPX46Ly1dXFwiLCAiQ0NUTCIpOworCXByaW50KCJzcXN5bnRheCIpOworCWluaXQoKTsKKwlmcHV0cygiXG4vKiBzeW50YXggdGFibGUgdXNlZCB3aGVuIGluIGFyaXRobWV0aWMgKi9cbiIsIGNmaWxlKTsKKwlhZGQoIlxuIiwgIkNOTCIpOworCWFkZCgiXFwiLCAiQ0JBQ0siKTsKKwlhZGQoImAiLCAiQ0JRVU9URSIpOworCWFkZCgiJCIsICJDVkFSIik7CisJYWRkKCJ9IiwgIkNFTkRWQVIiKTsKKwlhZGQoIigiLCAiQ0xQIik7CisJYWRkKCIpIiwgIkNSUCIpOworCXByaW50KCJhcmlzeW50YXgiKTsKKwlmaWxsdGFibGUoIjAiKTsKKwlmcHV0cygiXG4vKiBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gdGFibGUgKi9cbiIsIGNmaWxlKTsKKwlhZGQoIjAxMjM0NTY3ODkiLCAiSVNESUdJVCIpOworCWFkZCgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1Y3Z3eHl6IiwgIklTTE9XRVIiKTsKKwlhZGQoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVUNWV1hZWiIsICJJU1VQUEVSIik7CisJYWRkKCJfIiwgIklTVU5ERVIiKTsKKwlhZGQoIiM/JCEtKkAiLCAiSVNTUEVDTCIpOworCXByaW50KCJpc190eXBlIik7CisJZXhpdCgwKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworCisvKgorICogQ2xlYXIgdGhlIHN5bnRheCB0YWJsZS4KKyAqLworCitzdGF0aWMgdm9pZAorZmlsbHRhYmxlKGNoYXIgKmRmdHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgMjU3OyBpKyspCisJCXN5bnRheFtpXSA9IGRmdHZhbDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc3ludGF4IHRhYmxlIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgKi8KKworc3RhdGljIHZvaWQKK2luaXQodm9pZCkKK3sKKwlpbnQgY3RsOworCisJZmlsbHRhYmxlKCJDV09SRCIpOworCXN5bnRheFswXSA9ICJDRU9GIjsKKwlzeW50YXhbMV0gPSAiQ0lHTiI7CisJZm9yIChjdGwgPSBDVExfRklSU1Q7IGN0bCA8PSBDVExfTEFTVDsgY3RsKysgKQorCQlzeW50YXhbMTMwICsgY3RsXSA9ICJDQ1RMIjsKK30KKworCisvKgorICogQWRkIGVudHJpZXMgdG8gdGhlIHN5bnRheCB0YWJsZS4KKyAqLworCitzdGF0aWMgdm9pZAorYWRkKGNoYXIgKnAsIGNoYXIgKnR5cGUpCit7CisJd2hpbGUgKCpwKQorCQlzeW50YXhbKHNpZ25lZCBjaGFyKSpwKysgKyAxMzBdID0gdHlwZTsKK30KKworCisKKy8qCisgKiBPdXRwdXQgdGhlIHN5bnRheCB0YWJsZS4KKyAqLworCitzdGF0aWMgdm9pZAorcHJpbnQoY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlpbnQgY29sOworCisJZnByaW50ZihoZmlsZSwgImV4dGVybiBjb25zdCBjaGFyICVzW107XG4iLCBuYW1lKTsKKwlmcHJpbnRmKGNmaWxlLCAiY29uc3QgY2hhciAlc1slZF0gPSB7XG4iLCBuYW1lLCAyNTcpOworCWNvbCA9IDA7CisJZm9yIChpID0gMCA7IGkgPCAyNTc7IGkrKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQlmcHV0cygiICAgICAgIiwgY2ZpbGUpOworCQl9IGVsc2UgaWYgKChpICYgMDMpID09IDApIHsKKwkJCWZwdXRzKCIsXG4gICAgICAiLCBjZmlsZSk7CisJCQljb2wgPSAwOworCQl9IGVsc2UgeworCQkJcHV0YygnLCcsIGNmaWxlKTsKKwkJCXdoaWxlICgrK2NvbCA8IDkgKiAoaSAmIDAzKSkKKwkJCQlwdXRjKCcgJywgY2ZpbGUpOworCQl9CisJCWZwdXRzKHN5bnRheFtpXSwgY2ZpbGUpOworCQljb2wgKz0gc3RybGVuKHN5bnRheFtpXSk7CisJfQorCWZwdXRzKCJcbn07XG4iLCBjZmlsZSk7Cit9CisKKworCisvKgorICogT3V0cHV0IGNoYXJhY3RlciBjbGFzc2lmaWNhdGlvbiBtYWNyb3MgKGUuZy4gaXNfZGlnaXQpLiAgSWYgZGlnaXRzIGFyZQorICogY29udGlndW91cywgd2UgY2FuIHRlc3QgZm9yIHRoZW0gcXVpY2tseS4KKyAqLworCitzdGF0aWMgY2hhciAqbWFjcm9bXSA9IHsKKwkiI2RlZmluZSBpc19kaWdpdChjKVx0KCh1bnNpZ25lZCkoKGMpIC0gJzAnKSA8PSA5KVxuIiwKKwkiI2RlZmluZSBpc19hbHBoYShjKVx0aXNhbHBoYSgodW5zaWduZWQgY2hhcikoYykpXG4iLAorCSIjZGVmaW5lIGlzX25hbWUoYylcdCgoYykgPT0gJ18nIHx8IGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKGMpKSlcbiIsCisJIiNkZWZpbmUgaXNfaW5fbmFtZShjKVx0KChjKSA9PSAnXycgfHwgaXNhbG51bSgodW5zaWduZWQgY2hhcikoYykpKVxuIiwKKwkiI2RlZmluZSBpc19zcGVjaWFsKGMpXHQoKGlzX3R5cGUrU1lOQkFTRSlbKHNpZ25lZCBjaGFyKShjKV0gJiAoSVNTUEVDTHxJU0RJR0lUKSlcbiIsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQKK291dHB1dF90eXBlX21hY3Jvcyh2b2lkKQoreworCWNoYXIgKipwcDsKKworCWZvciAocHAgPSBtYWNybyA7ICpwcCA7IHBwKyspCisJCWZwdXRzKCpwcCwgaGZpbGUpOworCWZwdXRzKCIjZGVmaW5lIGRpZ2l0X3ZhbChjKVx0KChjKSAtICcwJylcbiIsIGhmaWxlKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21rdG9rZW5zIGIvdXNyL2Rhc2gvbWt0b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiY2VmMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21rdG9rZW5zCkBAIC0wLDAgKzEsOTIgQEAKKyMhL2Jpbi9zaCAtCisjIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworIwlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyMJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyMgS2VubmV0aCBBbG1xdWlzdC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisjCUAoIylta3Rva2Vucwk4LjEgKEJlcmtlbGV5KSA1LzMxLzkzCisKKyMgVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdG9rZW5zLiAgVGhlIHNlY29uZCBjb2x1bW4gaXMgbm9uemVybyBpZiB0aGUKKyMgdG9rZW4gbWFya3MgdGhlIGVuZCBvZiBhIGxpc3QuICBUaGUgdGhpcmQgY29sdW1uIGlzIHRoZSBuYW1lIHRvIHByaW50IGluCisjIGVycm9yIG1lc3NhZ2VzLgorCitjYXQgPiAvdG1wL2thJCQgPDxcIQorVEVPRgkxCWVuZCBvZiBmaWxlCitUTkwJMAluZXdsaW5lCitUU0VNSQkwCSI7IgorVEJBQ0tHTkQgMAkiJiIKK1RBTkQJMAkiJiYiCitUT1IJMAkifHwiCitUUElQRQkwCSJ8IgorVExQCTAJIigiCitUUlAJMQkiKSIKK1RFTkRDQVNFIDEJIjs7IgorVEVOREJRVU9URSAxCSJgIgorVFJFRElSCTAJcmVkaXJlY3Rpb24KK1RXT1JECTAJd29yZAorVE5PVAkwCSIhIgorVENBU0UJMAkiY2FzZSIKK1RETwkxCSJkbyIKK1RET05FCTEJImRvbmUiCitURUxJRgkxCSJlbGlmIgorVEVMU0UJMQkiZWxzZSIKK1RFU0FDCTEJImVzYWMiCitURkkJMQkiZmkiCitURk9SCTAJImZvciIKK1RJRgkwCSJpZiIKK1RJTgkwCSJpbiIKK1RUSEVOCTEJInRoZW4iCitUVU5USUwJMAkidW50aWwiCitUV0hJTEUJMAkid2hpbGUiCitUQkVHSU4JMAkieyIKK1RFTkQJMQkifSIKKyEKK25sPWB3YyAtbCAvdG1wL2thJCRgCisKK2F3ayAne3ByaW50ICIjZGVmaW5lICIgJDEgIiAiIE5SLTF9JyAvdG1wL2thJCQKK2VjaG8gJworLyogQXJyYXkgaW5kaWNhdGluZyB3aGljaCB0b2tlbnMgbWFyayB0aGUgZW5kIG9mIGEgbGlzdCAqLworY29uc3QgY2hhciB0b2tlbmRsaXN0W10gPSB7JworYXdrICd7cHJpbnQgIlx0IiAkMiAiLCJ9JyAvdG1wL2thJCQKK2VjaG8gJ307CisKK2NvbnN0IGNoYXIgKmNvbnN0IHRva25hbWVbXSA9IHsnCitzZWQgLWUgJ3MvIi9cXCIvZycgXAorICAgIC1lICdzL1teCSBdKlsJIF1bCSBdKlteCSBdKlsJIF1bCSBdKlwoLipcKS8JIlwxIiwvJyBcCisgICAgL3RtcC9rYSQkCitlY2hvICd9OworJworc2VkICdzLyIvL2cnIC90bXAva2EkJCB8IGF3ayAnCisvVE5PVC97cHJpbnQgIiNkZWZpbmUgS1dET0ZGU0VUICIgTlItMTsgcHJpbnQgIiI7CisgICAgICBwcmludCAiU1RBVElDIGNvbnN0IGNoYXIgKmNvbnN0IHBhcnNla3dkW10gPSB7In0KKy9UTk9ULywvbmV2ZXJmb3VuZC97aWYgKGxhc3QpIHByaW50ICIJXCIiIGxhc3QgIlwiLCI7IGxhc3QgPSAkM30KK0VORHtwcmludCAiCVwiIiBsYXN0ICJcIlxufTsifScKKworcm0gL3RtcC9rYSQkCmRpZmYgLS1naXQgYS91c3IvZGFzaC9teWhpc3RlZGl0LmggYi91c3IvZGFzaC9teWhpc3RlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4ODA4OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL215aGlzdGVkaXQuaApAQCAtMCwwICsxLDQ1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylteWhpc3RlZGl0LmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2luY2x1ZGUgPGhpc3RlZGl0Lmg+CisKK2V4dGVybiBIaXN0b3J5ICpoaXN0OworZXh0ZXJuIEVkaXRMaW5lICplbDsKK2V4dGVybiBpbnQgZGlzcGxheWhpc3Q7CisKK3ZvaWQgaGlzdGVkaXQodm9pZCk7Cit2b2lkIHNldGhpc3RzaXplKGNvbnN0IGNoYXIgKik7Cit2b2lkIHNldHRlcm0oY29uc3QgY2hhciAqKTsKK2ludCBoaXN0Y21kKGludCwgY2hhciAqKik7CitpbnQgbm90X2ZjbnVtYmVyKGNoYXIgKik7CitpbnQgc3RyX3RvX2V2ZW50KGNvbnN0IGNoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL215c3RyaW5nLmMgYi91c3IvZGFzaC9teXN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MjAxYTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9teXN0cmluZy5jCkBAIC0wLDAgKzEsMjA5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFN0cmluZyBmdW5jdGlvbnMuCisgKgorICoJZXF1YWwoczEsIHMyKQkJUmV0dXJuIHRydWUgaWYgc3RyaW5ncyBhcmUgZXF1YWwuCisgKglzY29weShmcm9tLCB0bykJCUNvcHkgYSBzdHJpbmcuCisgKglzY29weW4oZnJvbSwgdG8sIG4pCUxpa2Ugc2NvcHksIGJ1dCBjaGVja3MgZm9yIG92ZXJmbG93LgorICoJbnVtYmVyKHMpCQlDb252ZXJ0IGEgc3RyaW5nIG9mIGRpZ2l0cyB0byBhbiBpbnRlZ2VyLgorICoJaXNfbnVtYmVyKHMpCQlSZXR1cm4gdHJ1ZSBpZiBzIGlzIGEgc3RyaW5nIG9mIGRpZ2l0cy4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworCitjaGFyIG51bGxzdHJbMV07CQkvKiB6ZXJvIGxlbmd0aCBzdHJpbmcgKi8KK2NvbnN0IGNoYXIgc3Bjc3RyW10gPSAiICI7Citjb25zdCBjaGFyIHNubGZtdFtdID0gIiVzXG4iOworY29uc3QgY2hhciBkb2xhdHN0cltdID0geyBDVExWQVIsIFZTTk9STUFMfFZTUVVPVEUsICdAJywgJz0nLCAnXDAnIH07Citjb25zdCBjaGFyIGlsbG51bVtdID0gIklsbGVnYWwgbnVtYmVyOiAlcyI7Citjb25zdCBjaGFyIGhvbWVzdHJbXSA9ICJIT01FIjsKKworLyoKKyAqIGVxdWFsIC0gI2RlZmluZWQgaW4gbXlzdHJpbmcuaAorICovCisKKy8qCisgKiBzY29weSAtICNkZWZpbmVkIGluIG15c3RyaW5nLmgKKyAqLworCisKKyNpZiAwCisvKgorICogc2NvcHluIC0gY29weSBhIHN0cmluZyBmcm9tICJmcm9tIiB0byAidG8iLCB0cnVuY2F0aW5nIHRoZSBzdHJpbmcKKyAqCQlpZiBuZWNlc3NhcnkuICAiVG8iIGlzIGFsd2F5cyBudWwgdGVybWluYXRlZCwgZXZlbiBpZgorICoJCXRydW5jYXRpb24gaXMgcGVyZm9ybWVkLiAgIlNpemUiIGlzIHRoZSBzaXplIG9mICJ0byIuCisgKi8KKwordm9pZAorc2NvcHluKGNvbnN0IGNoYXIgKmZyb20sIGNoYXIgKnRvLCBpbnQgc2l6ZSkKK3sKKworCXdoaWxlICgtLXNpemUgPiAwKSB7CisJCWlmICgoKnRvKysgPSAqZnJvbSsrKSA9PSAnXDAnKQorCQkJcmV0dXJuOworCX0KKwkqdG8gPSAnXDAnOworfQorI2VuZGlmCisKKworLyoKKyAqIHByZWZpeCAtLSBzZWUgaWYgcGZ4IGlzIGEgcHJlZml4IG9mIHN0cmluZy4KKyAqLworCitjaGFyICoKK3ByZWZpeChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKwl3aGlsZSAoKnBmeCkgeworCQlpZiAoKnBmeCsrICE9ICpzdHJpbmcrKykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gKGNoYXIgKikgc3RyaW5nOworfQorCisKKy8qCisgKiBDb252ZXJ0IGEgc3RyaW5nIG9mIGRpZ2l0cyB0byBhbiBpbnRlZ2VyLCBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlIG9uCisgKiBmYWlsdXJlLgorICovCisKK2ludAorbnVtYmVyKGNvbnN0IGNoYXIgKnMpCit7CisKKwlpZiAoISBpc19udW1iZXIocykpCisJCXNoX2Vycm9yKGlsbG51bSwgcyk7CisJcmV0dXJuIGF0b2kocyk7Cit9CisKKworCisvKgorICogQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyLiAgVGhpcyBzaG91bGQgYmUgZWxzZXdoZXJlLgorICovCisKK2ludAoraXNfbnVtYmVyKGNvbnN0IGNoYXIgKnApCit7CisJZG8geworCQlpZiAoISBpc19kaWdpdCgqcCkpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlICgqKytwICE9ICdcMCcpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBQcm9kdWNlIGEgcG9zc2libHkgc2luZ2xlIHF1b3RlZCBzdHJpbmcgc3VpdGFibGUgYXMgaW5wdXQgdG8gdGhlIHNoZWxsLgorICogVGhlIHJldHVybiBzdHJpbmcgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAqLworCitjaGFyICoKK3NpbmdsZV9xdW90ZShjb25zdCBjaGFyICpzKSB7CisJY2hhciAqcDsKKworCVNUQVJUU1RBQ0tTVFIocCk7CisKKwlkbyB7CisJCWNoYXIgKnE7CisJCXNpemVfdCBsZW47CisKKwkJbGVuID0gc3RyY2hybnVsKHMsICdcJycpIC0gczsKKworCQlxID0gcCA9IG1ha2VzdHJzcGFjZShsZW4gKyAzLCBwKTsKKworCQkqcSsrID0gJ1wnJzsKKwkJcSA9IG1lbXBjcHkocSwgcywgbGVuKTsKKwkJKnErKyA9ICdcJyc7CisJCXMgKz0gbGVuOworCisJCVNUQURKVVNUKHEgLSBwLCBwKTsKKworCQlsZW4gPSBzdHJzcG4ocywgIiciKTsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKworCQlxID0gcCA9IG1ha2VzdHJzcGFjZShsZW4gKyAzLCBwKTsKKworCQkqcSsrID0gJyInOworCQlxID0gbWVtcGNweShxLCBzLCBsZW4pOworCQkqcSsrID0gJyInOworCQlzICs9IGxlbjsKKworCQlTVEFESlVTVChxIC0gcCwgcCk7CisJfSB3aGlsZSAoKnMpOworCisJVVNUUFVUQygwLCBwKTsKKworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisKKy8qCisgKiBMaWtlIHN0cmR1cCBidXQgd29ya3Mgd2l0aCB0aGUgYXNoIHN0YWNrLgorICovCisKK2NoYXIgKgorc3N0cmR1cChjb25zdCBjaGFyICpwKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4ocCkgKyAxOworCXJldHVybiBtZW1jcHkoc3RhbGxvYyhsZW4pLCBwLCBsZW4pOworfQorCisvKgorICogV3JhcHBlciBhcm91bmQgc3RyY21wIGZvciBxc29ydC9ic2VhcmNoLy4uLgorICovCitpbnQKK3BzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwlyZXR1cm4gc3RyY21wKCooY29uc3QgY2hhciAqY29uc3QgKikgYSwgKihjb25zdCBjaGFyICpjb25zdCAqKSBiKTsKK30KKworLyoKKyAqIEZpbmQgYSBzdHJpbmcgaXMgaW4gYSBzb3J0ZWQgYXJyYXkuCisgKi8KK2NvbnN0IGNoYXIgKmNvbnN0ICoKK2ZpbmRzdHJpbmcoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqY29uc3QgKmFycmF5LCBzaXplX3Qgbm1lbWIpCit7CisJcmV0dXJuIGJzZWFyY2goJnMsIGFycmF5LCBubWVtYiwgc2l6ZW9mKGNvbnN0IGNoYXIgKiksIHBzdHJjbXApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbXlzdHJpbmcuaCBiL3Vzci9kYXNoL215c3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmZDdlNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL215c3RyaW5nLmgKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylteXN0cmluZy5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIGNvbnN0IGNoYXIgc25sZm10W107CitleHRlcm4gY29uc3QgY2hhciBzcGNzdHJbXTsKK2V4dGVybiBjb25zdCBjaGFyIGRvbGF0c3RyW107CisjZGVmaW5lIERPTEFUU1RSTEVOIDQKK2V4dGVybiBjb25zdCBjaGFyIGlsbG51bVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgaG9tZXN0cltdOworCisjaWYgMAordm9pZCBzY29weW4oY29uc3QgY2hhciAqLCBjaGFyICosIGludCk7CisjZW5kaWYKK2NoYXIgKnByZWZpeChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitpbnQgbnVtYmVyKGNvbnN0IGNoYXIgKik7CitpbnQgaXNfbnVtYmVyKGNvbnN0IGNoYXIgKik7CitjaGFyICpzaW5nbGVfcXVvdGUoY29uc3QgY2hhciAqKTsKK2NoYXIgKnNzdHJkdXAoY29uc3QgY2hhciAqKTsKK2ludCBwc3RyY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK2NvbnN0IGNoYXIgKmNvbnN0ICpmaW5kc3RyaW5nKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqY29uc3QgKiwgc2l6ZV90KTsKKworI2RlZmluZSBlcXVhbChzMSwgczIpCShzdHJjbXAoczEsIHMyKSA9PSAwKQorI2RlZmluZSBzY29weShzMSwgczIpCSgodm9pZClzdHJjcHkoczIsIHMxKSkKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL25vZGVzLmMucGF0IGIvdXNyL2Rhc2gvbm9kZXMuYy5wYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyNWJjNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL25vZGVzLmMucGF0CkBAIC0wLDAgKzEsMTY2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW5vZGVzLmMucGF0CTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKy8qCisgKiBSb3V0aW5lIGZvciBkZWFsaW5nIHdpdGggcGFyc2VkIHNoZWxsIGNvbW1hbmRzLgorICovCisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJtYWNoZGVwLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworCitpbnQgICAgIGZ1bmNibG9ja3NpemU7CQkvKiBzaXplIG9mIHN0cnVjdHVyZXMgaW4gZnVuY3Rpb24gKi8KK2ludCAgICAgZnVuY3N0cmluZ3NpemU7CQkvKiBzaXplIG9mIHN0cmluZ3MgaW4gbm9kZSAqLworcG9pbnRlciBmdW5jYmxvY2s7CQkvKiBibG9jayB0byBhbGxvY2F0ZSBmdW5jdGlvbiBmcm9tICovCitjaGFyICAgKmZ1bmNzdHJpbmc7CQkvKiBibG9jayB0byBhbGxvY2F0ZSBzdHJpbmdzIGZyb20gKi8KKworJVNJWkVTCisKKworU1RBVElDIHZvaWQgY2FsY3NpemUodW5pb24gbm9kZSAqKTsKK1NUQVRJQyB2b2lkIHNpemVub2RlbGlzdChzdHJ1Y3Qgbm9kZWxpc3QgKik7CitTVEFUSUMgdW5pb24gbm9kZSAqY29weW5vZGUodW5pb24gbm9kZSAqKTsKK1NUQVRJQyBzdHJ1Y3Qgbm9kZWxpc3QgKmNvcHlub2RlbGlzdChzdHJ1Y3Qgbm9kZWxpc3QgKik7CitTVEFUSUMgY2hhciAqbm9kZXNhdmVzdHIoY2hhciAqKTsKKworCisKKy8qCisgKiBNYWtlIGEgY29weSBvZiBhIHBhcnNlIHRyZWUuCisgKi8KKworc3RydWN0IGZ1bmNub2RlICoKK2NvcHlmdW5jKHVuaW9uIG5vZGUgKm4pCit7CisJc3RydWN0IGZ1bmNub2RlICpmOworCXNpemVfdCBibG9ja3NpemU7CisKKwlmdW5jYmxvY2tzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGZ1bmNub2RlLCBuKTsKKwlmdW5jc3RyaW5nc2l6ZSA9IDA7CisJY2FsY3NpemUobik7CisJYmxvY2tzaXplID0gZnVuY2Jsb2Nrc2l6ZTsKKwlmID0gY2ttYWxsb2MoYmxvY2tzaXplICsgZnVuY3N0cmluZ3NpemUpOworCWZ1bmNibG9jayA9IChjaGFyICopIGYgKyBvZmZzZXRvZihzdHJ1Y3QgZnVuY25vZGUsIG4pOworCWZ1bmNzdHJpbmcgPSAoY2hhciAqKSBmICsgYmxvY2tzaXplOworCWNvcHlub2RlKG4pOworCWYtPmNvdW50ID0gMDsKKwlyZXR1cm4gZjsKK30KKworCisKK1NUQVRJQyB2b2lkCitjYWxjc2l6ZShuKQorCXVuaW9uIG5vZGUgKm47Cit7CisJJUNBTENTSVpFCit9CisKKworCitTVEFUSUMgdm9pZAorc2l6ZW5vZGVsaXN0KGxwKQorCXN0cnVjdCBub2RlbGlzdCAqbHA7Cit7CisJd2hpbGUgKGxwKSB7CisJCWZ1bmNibG9ja3NpemUgKz0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBub2RlbGlzdCkpOworCQljYWxjc2l6ZShscC0+bik7CisJCWxwID0gbHAtPm5leHQ7CisJfQorfQorCisKKworU1RBVElDIHVuaW9uIG5vZGUgKgorY29weW5vZGUobikKKwl1bmlvbiBub2RlICpuOworeworCXVuaW9uIG5vZGUgKm5ldzsKKworCSVDT1BZCisJcmV0dXJuIG5ldzsKK30KKworCitTVEFUSUMgc3RydWN0IG5vZGVsaXN0ICoKK2NvcHlub2RlbGlzdChscCkKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmxwOworeworCXN0cnVjdCBub2RlbGlzdCAqc3RhcnQ7CisJc3RydWN0IG5vZGVsaXN0ICoqbHBwOworCisJbHBwID0gJnN0YXJ0OworCXdoaWxlIChscCkgeworCQkqbHBwID0gZnVuY2Jsb2NrOworCQlmdW5jYmxvY2sgPSAoY2hhciAqKSBmdW5jYmxvY2sgKworCQkgICAgU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBub2RlbGlzdCkpOworCQkoKmxwcCktPm4gPSBjb3B5bm9kZShscC0+bik7CisJCWxwID0gbHAtPm5leHQ7CisJCWxwcCA9ICYoKmxwcCktPm5leHQ7CisJfQorCSpscHAgPSBOVUxMOworCXJldHVybiBzdGFydDsKK30KKworCisKK1NUQVRJQyBjaGFyICoKK25vZGVzYXZlc3RyKHMpCisJY2hhciAgICpzOworeworCWNoYXIgICAqcnRuID0gZnVuY3N0cmluZzsKKworCWZ1bmNzdHJpbmcgPSBzdHBjcHkoZnVuY3N0cmluZywgcykgKyAxOworCXJldHVybiBydG47Cit9CisKKworCisvKgorICogRnJlZSBhIHBhcnNlIHRyZWUuCisgKi8KKwordm9pZAorZnJlZWZ1bmMoc3RydWN0IGZ1bmNub2RlICpmKQoreworCWlmIChmICYmIC0tZi0+Y291bnQgPCAwKQorCQlja2ZyZWUoZik7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9ub2RldHlwZXMgYi91c3IvZGFzaC9ub2RldHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhN2IzYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL25vZGV0eXBlcwpAQCAtMCwwICsxLDE0NCBAQAorIyBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisjCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisjIEtlbm5ldGggQWxtcXVpc3QuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworIwlAKCMpbm9kZXR5cGVzCTguMiAoQmVya2VsZXkpIDUvNC85NQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIG5vZGVzIHVzZWQgaW4gcGFyc2UgdHJlZXMuICBVbmluZGVudGVkIGxpbmVzCisjIGNvbnRhaW4gYSBub2RlIHR5cGUgZm9sbG93ZWQgYnkgYSBzdHJ1Y3R1cmUgdGFnLiAgU3Vic2VxdWVudCBpbmRlbnRlZAorIyBsaW5lcyBzcGVjaWZ5IHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdHVyZS4gIFNldmVyYWwgbm9kZSB0eXBlcyBjYW4gc2hhcmUKKyMgdGhlIHNhbWUgc3RydWN0dXJlLCBpbiB3aGljaCBjYXNlIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdHVyZSBzaG91bGQgYmUKKyMgc3BlY2lmaWVkIG9ubHkgb25jZS4KKyMKKyMgQSBmaWVsZCBvZiBhIHN0cnVjdHVyZSBpcyBkZXNjcmliZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGZvbGxvd2VkCisjIGJ5IGEgdHlwZS4gIFRoZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQgdHlwZXMgYXJlOgorIwlub2RlcHRyIC0gYSBwb2ludGVyIHRvIGEgbm9kZQorIwlub2RlbGlzdCAtIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygbm9kZXMKKyMJc3RyaW5nIC0gYSBwb2ludGVyIHRvIGEgbnVsIHRlcm1pbmF0ZWQgc3RyaW5nCisjCWludCAtIGFuIGludGVnZXIKKyMJb3RoZXIgLSBhbnkgdHlwZSB0aGF0IGNhbiBiZSBjb3BpZWQgYnkgYXNzaWdubWVudAorIwl0ZW1wIC0gYSBmaWVsZCB0aGF0IGRvZXNuJ3QgaGF2ZSB0byBiZSBjb3BpZWQgd2hlbiB0aGUgbm9kZSBpcyBjb3BpZWQKKyMgVGhlIGxhc3QgdHdvIHR5cGVzIHNob3VsZCBiZSBmb2xsb3dlZCBieSB0aGUgdGV4dCBvZiBhIEMgZGVjbGFyYXRpb24gZm9yCisjIHRoZSBmaWVsZC4KKworTkNNRCBuY21kCQkJIyBhIHNpbXBsZSBjb21tYW5kCisJdHlwZQkgIGludAorCWFzc2lnbiAgICBub2RlcHRyCQkjIHZhcmlhYmxlIGFzc2lnbm1lbnRzCisJYXJncwkgIG5vZGVwdHIJCSMgdGhlIGFyZ3VtZW50cworCXJlZGlyZWN0ICBub2RlcHRyCQkjIGxpc3Qgb2YgZmlsZSByZWRpcmVjdGlvbnMKKworTlBJUEUgbnBpcGUJCQkjIGEgcGlwZWxpbmUKKwl0eXBlCSAgaW50CisJYmFja2duZAkgIGludAkJCSMgc2V0IHRvIHJ1biBwaXBlbGluZSBpbiBiYWNrZ3JvdW5kCisJY21kbGlzdAkgIG5vZGVsaXN0CQkjIHRoZSBjb21tYW5kcyBpbiB0aGUgcGlwZWxpbmUKKworTlJFRElSIG5yZWRpcgkJCSMgcmVkaXJlY3Rpb24gKG9mIGEgY29tcGxleCBjb21tYW5kKQorCXR5cGUJICBpbnQKKwluCSAgbm9kZXB0cgkJIyB0aGUgY29tbWFuZAorCXJlZGlyZWN0ICBub2RlcHRyCQkjIGxpc3Qgb2YgZmlsZSByZWRpcmVjdGlvbnMKKworTkJBQ0tHTkQgbnJlZGlyCQkJIyBydW4gY29tbWFuZCBpbiBiYWNrZ3JvdW5kCitOU1VCU0hFTEwgbnJlZGlyCQkjIHJ1biBjb21tYW5kIGluIGEgc3Vic2hlbGwKKworTkFORCBuYmluYXJ5CQkJIyB0aGUgJiYgb3BlcmF0b3IKK05PUiBuYmluYXJ5CQkJIyB0aGUgfHwgb3BlcmF0b3IKKworTlNFTUkgbmJpbmFyeQkJCSMgdHdvIGNvbW1hbmRzIHNlcGFyYXRlZCBieSBhIHNlbWljb2xvbgorCXR5cGUJICBpbnQKKwljaDEJICBub2RlcHRyCQkjIHRoZSBmaXJzdCBjaGlsZAorCWNoMgkgIG5vZGVwdHIJCSMgdGhlIHNlY29uZCBjaGlsZAorCitOSUYgbmlmCQkJCSMgdGhlIGlmIHN0YXRlbWVudC4gIEVsaWYgY2xhdXNlcyBhcmUgaGFuZGxlZAorCXR5cGUJICBpbnQJCSAgICAjIHVzaW5nIG11bHRpcGxlIGlmIG5vZGVzLgorCXRlc3QJICBub2RlcHRyCQkjIGlmIHRlc3QKKwlpZnBhcnQJICBub2RlcHRyCQkjIHRoZW4gaWZwYXJ0CisJZWxzZXBhcnQgIG5vZGVwdHIJCSMgZWxzZSBlbHNlcGFydAorCitOV0hJTEUgbmJpbmFyeQkJCSMgdGhlIHdoaWxlIHN0YXRlbWVudC4gIEZpcnN0IGNoaWxkIGlzIHRoZSB0ZXN0CitOVU5USUwgbmJpbmFyeQkJCSMgdGhlIHVudGlsIHN0YXRlbWVudAorCitORk9SIG5mb3IJCQkjIHRoZSBmb3Igc3RhdGVtZW50CisJdHlwZQkgIGludAorCWFyZ3MJICBub2RlcHRyCQkjIGZvciB2YXIgaW4gYXJncworCWJvZHkJICBub2RlcHRyCQkjIGRvIGJvZHk7IGRvbmUKKwl2YXIJICBzdHJpbmcJCSMgdGhlIGZvciB2YXJpYWJsZQorCitOQ0FTRSBuY2FzZQkJCSMgYSBjYXNlIHN0YXRlbWVudAorCXR5cGUJICBpbnQKKwlleHByCSAgbm9kZXB0cgkJIyB0aGUgd29yZCB0byBzd2l0Y2ggb24KKwljYXNlcwkgIG5vZGVwdHIJCSMgdGhlIGxpc3Qgb2YgY2FzZXMgKE5DTElTVCBub2RlcykKKworTkNMSVNUIG5jbGlzdAkJCSMgYSBjYXNlCisJdHlwZQkgIGludAorCW5leHQJICBub2RlcHRyCQkjIHRoZSBuZXh0IGNhc2UgaW4gbGlzdAorCXBhdHRlcm4JICBub2RlcHRyCQkjIGxpc3Qgb2YgcGF0dGVybnMgZm9yIHRoaXMgY2FzZQorCWJvZHkJICBub2RlcHRyCQkjIGNvZGUgdG8gZXhlY3V0ZSBmb3IgdGhpcyBjYXNlCisKKworTkRFRlVOIG5hcmcJCQkjIGRlZmluZSBhIGZ1bmN0aW9uLiAgVGhlICJuZXh0IiBmaWVsZCBjb250YWlucworCQkJCSMgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgorCitOQVJHIG5hcmcJCQkjIHJlcHJlc2VudHMgYSB3b3JkCisJdHlwZQkgIGludAorCW5leHQJICBub2RlcHRyCQkjIG5leHQgd29yZCBpbiBsaXN0CisJdGV4dAkgIHN0cmluZwkJIyB0aGUgdGV4dCBvZiB0aGUgd29yZAorCWJhY2txdW90ZSBub2RlbGlzdAkJIyBsaXN0IG9mIGNvbW1hbmRzIGluIGJhY2sgcXVvdGVzCisKK05UTyBuZmlsZQkJCSMgZmQ+IGZuYW1lCitOQ0xPQkJFUiBuZmlsZQkJCSMgZmQ+fCBmbmFtZQorTkZST00gbmZpbGUJCQkjIGZkPCBmbmFtZQorTkZST01UTyBuZmlsZQkJCSMgZmQ8PiBmbmFtZQorTkFQUEVORCBuZmlsZQkJCSMgZmQ+PiBmbmFtZQorCXR5cGUJICBpbnQKKwluZXh0CSAgbm9kZXB0cgkJIyBuZXh0IHJlZGlyZWN0aW9uIGluIGxpc3QKKwlmZAkgIGludAkJCSMgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIHJlZGlyZWN0ZWQKKwlmbmFtZQkgIG5vZGVwdHIJCSMgZmlsZSBuYW1lLCBpbiBhIE5BUkcgbm9kZQorCWV4cGZuYW1lICB0ZW1wCWNoYXIgKmV4cGZuYW1lCSMgYWN0dWFsIGZpbGUgbmFtZQorCitOVE9GRCBuZHVwCQkJIyBmZDwmZHVwZmQKK05GUk9NRkQgbmR1cAkJCSMgZmQ+JmR1cGZkCisJdHlwZQkgIGludAorCW5leHQJICBub2RlcHRyCQkjIG5leHQgcmVkaXJlY3Rpb24gaW4gbGlzdAorCWZkCSAgaW50CQkJIyBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgcmVkaXJlY3RlZAorCWR1cGZkCSAgaW50CQkJIyBmaWxlIGRlc2NyaXB0b3IgdG8gZHVwbGljYXRlCisJdm5hbWUJICBub2RlcHRyCQkjIGZpbGUgbmFtZSBpZiBmZD4mJHZhcgorCisKK05IRVJFIG5oZXJlCQkJIyBmZDw8XCEKK05YSEVSRSBuaGVyZQkJCSMgZmQ8PCEKKwl0eXBlCSAgaW50CisJbmV4dAkgIG5vZGVwdHIJCSMgbmV4dCByZWRpcmVjdGlvbiBpbiBsaXN0CisJZmQJICBpbnQJCQkjIGZpbGUgZGVzY3JpcHRvciBiZWluZyByZWRpcmVjdGVkCisJZG9jCSAgbm9kZXB0cgkJIyBpbnB1dCB0byBjb21tYW5kIChOQVJHIG5vZGUpCisKK05OT1Qgbm5vdAkJCSMgISBjb21tYW5kICAoYWN0dWFsbHkgcGlwZWxpbmUpCisJdHlwZQlpbnQKKwljb20Jbm9kZXB0cgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvb3B0aW9ucy5jIGIvdXNyL2Rhc2gvb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYWE2MDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9vcHRpb25zLmMKQEAgLTAsMCArMSw1NDcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2RlZmluZSBERUZJTkVfT1BUSU9OUworI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyN1bmRlZiBERUZJTkVfT1BUSU9OUworI2luY2x1ZGUgIm5vZGVzLmgiCS8qIGZvciBvdGhlciBoZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAiam9icy5oIgorI2luY2x1ZGUgImlucHV0LmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAidHJhcC5oIgorI2luY2x1ZGUgInZhci5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2lmbmRlZiBTTUFMTAorI2luY2x1ZGUgIm15aGlzdGVkaXQuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNob3cuaCIKKworY2hhciAqYXJnMDsJCQkvKiB2YWx1ZSBvZiAkMCAqLworc3RydWN0IHNocGFyYW0gc2hlbGxwYXJhbTsJLyogY3VycmVudCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKi8KK2NoYXIgKiphcmdwdHI7CQkJLyogYXJndW1lbnQgbGlzdCBmb3IgYnVpbHRpbiBjb21tYW5kcyAqLworY2hhciAqb3B0aW9uYXJnOwkJLyogc2V0IGJ5IG5leHRvcHQgKGxpa2UgZ2V0b3B0KSAqLworY2hhciAqb3B0cHRyOwkJCS8qIHVzZWQgYnkgbmV4dG9wdCAqLworCitjaGFyICptaW51c2M7CQkJLyogYXJndW1lbnQgdG8gLWMgb3B0aW9uICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBvcHRuYW1lc1tOT1BUU10gPSB7CisJImVycmV4aXQiLAorCSJub2dsb2IiLAorCSJpZ25vcmVlb2YiLAorCSJpbnRlcmFjdGl2ZSIsCisJIm1vbml0b3IiLAorCSJub2V4ZWMiLAorCSJzdGRpbiIsCisJInh0cmFjZSIsCisJInZlcmJvc2UiLAorCSJ2aSIsCisJImVtYWNzIiwKKwkibm9jbG9iYmVyIiwKKwkiYWxsZXhwb3J0IiwKKwkibm90aWZ5IiwKKwkibm91bnNldCIsCisJIm5vbG9nIiwKKwkiZGVidWciLAorfTsKKworY29uc3QgY2hhciBvcHRsZXR0ZXJzW05PUFRTXSA9IHsKKwknZScsCisJJ2YnLAorCSdJJywKKwknaScsCisJJ20nLAorCSduJywKKwkncycsCisJJ3gnLAorCSd2JywKKwknVicsCisJJ0UnLAorCSdDJywKKwknYScsCisJJ2InLAorCSd1JywKKwkwLAorCTAsCit9OworCitjaGFyIG9wdGxpc3RbTk9QVFNdOworCisKK1NUQVRJQyB2b2lkIG9wdGlvbnMoaW50KTsKK1NUQVRJQyB2b2lkIG1pbnVzX28oY2hhciAqLCBpbnQpOworU1RBVElDIHZvaWQgc2V0b3B0aW9uKGludCwgaW50KTsKK1NUQVRJQyBpbnQgZ2V0b3B0cyhjaGFyICosIGNoYXIgKiwgY2hhciAqKiwgaW50ICosIGludCAqKTsKKworCisvKgorICogUHJvY2VzcyB0aGUgc2hlbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAqLworCit2b2lkCitwcm9jYXJncyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqeG1pbnVzYzsKKwljaGFyICoqeGFyZ3Y7CisKKwl4YXJndiA9IGFyZ3Y7CisJYXJnMCA9IHhhcmd2WzBdOworCWlmIChhcmdjID4gMCkKKwkJeGFyZ3YrKzsKKwlmb3IgKGkgPSAwOyBpIDwgTk9QVFM7IGkrKykKKwkJb3B0bGlzdFtpXSA9IDI7CisJYXJncHRyID0geGFyZ3Y7CisJb3B0aW9ucygxKTsKKwl4YXJndiA9IGFyZ3B0cjsKKwl4bWludXNjID0gbWludXNjOworCWlmICgqeGFyZ3YgPT0gTlVMTCkgeworCQlpZiAoeG1pbnVzYykKKwkJCXNoX2Vycm9yKCItYyByZXF1aXJlcyBhbiBhcmd1bWVudCIpOworCQlzZmxhZyA9IDE7CisJfQorCWlmIChpZmxhZyA9PSAyICYmIHNmbGFnID09IDEgJiYgaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKKwkJaWZsYWcgPSAxOworCWlmIChtZmxhZyA9PSAyKQorCQltZmxhZyA9IGlmbGFnOworCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKQorCQlpZiAob3B0bGlzdFtpXSA9PSAyKQorCQkJb3B0bGlzdFtpXSA9IDA7CisjaWYgREVCVUcgPT0gMgorCWRlYnVnID0gMTsKKyNlbmRpZgorCS8qIFBPU0lYIDEwMDMuMjogZmlyc3QgYXJnIGFmdGVyIC1jIGNtZCBpcyAkMCwgcmVtYWluZGVyICQxLi4uICovCisJaWYgKHhtaW51c2MpIHsKKwkJbWludXNjID0gKnhhcmd2Kys7CisJCWlmICgqeGFyZ3YpCisJCQlnb3RvIHNldGFyZzA7CisJfSBlbHNlIGlmICghc2ZsYWcpIHsKKwkJc2V0aW5wdXRmaWxlKCp4YXJndiwgMCk7CitzZXRhcmcwOgorCQlhcmcwID0gKnhhcmd2Kys7CisJCWNvbW1hbmRuYW1lID0gYXJnMDsKKwl9CisKKwlzaGVsbHBhcmFtLnAgPSB4YXJndjsKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKwkvKiBhc3NlcnQoc2hlbGxwYXJhbS5tYWxsb2MgPT0gMCAmJiBzaGVsbHBhcmFtLm5wYXJhbSA9PSAwKTsgKi8KKwl3aGlsZSAoKnhhcmd2KSB7CisJCXNoZWxscGFyYW0ubnBhcmFtKys7CisJCXhhcmd2Kys7CisJfQorCW9wdHNjaGFuZ2VkKCk7Cit9CisKKwordm9pZAorb3B0c2NoYW5nZWQodm9pZCkKK3sKKyNpZmRlZiBERUJVRworCW9wZW50cmFjZSgpOworI2VuZGlmCisJc2V0aW50ZXJhY3RpdmUoaWZsYWcpOworI2lmbmRlZiBTTUFMTAorCWhpc3RlZGl0KCk7CisjZW5kaWYKKwlzZXRqb2JjdGwobWZsYWcpOworfQorCisvKgorICogUHJvY2VzcyBzaGVsbCBvcHRpb25zLiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBhcmdwdHIgY29udGFpbnMgYSBwb2ludGVyCisgKiB0byB0aGUgYXJndW1lbnQgbGlzdDsgd2UgYWR2YW5jZSBpdCBwYXN0IHRoZSBvcHRpb25zLgorICovCisKK1NUQVRJQyB2b2lkCitvcHRpb25zKGludCBjbWRsaW5lKQoreworCWNoYXIgKnA7CisJaW50IHZhbDsKKwlpbnQgYzsKKworCWlmIChjbWRsaW5lKQorCQltaW51c2MgPSBOVUxMOworCXdoaWxlICgocCA9ICphcmdwdHIpICE9IE5VTEwpIHsKKwkJYXJncHRyKys7CisJCWlmICgoYyA9ICpwKyspID09ICctJykgeworCQkJdmFsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwWzBdID09ICdcMCcgfHwgKHBbMF0gPT0gJy0nICYmIHBbMV0gPT0gJ1wwJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbWRsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIi0iIG1lYW5zIHR1cm4gb2ZmIC14IGFuZCAtdiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwWzBdID09ICdcMCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmxhZyA9IHZmbGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiLS0iIG1lYW5zIHJlc2V0IHBhcmFtcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCphcmdwdHIgPT0gTlVMTCkKKwkJCQkJCXNldHBhcmFtKGFyZ3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsJICAvKiAiLSIgb3IgICItLSIgdGVybWluYXRlcyBvcHRpb25zICovCisJCQl9CisJCX0gZWxzZSBpZiAoYyA9PSAnKycpIHsKKwkJCXZhbCA9IDA7CisJCX0gZWxzZSB7CisJCQlhcmdwdHItLTsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlICgoYyA9ICpwKyspICE9ICdcMCcpIHsKKwkJCWlmIChjID09ICdjJyAmJiBjbWRsaW5lKSB7CisJCQkJbWludXNjID0gcDsJLyogY29tbWFuZCBpcyBhZnRlciBzaGVsbCBhcmdzKi8KKwkJCX0gZWxzZSBpZiAoYyA9PSAnbycpIHsKKwkJCQltaW51c19vKCphcmdwdHIsIHZhbCk7CisJCQkJaWYgKCphcmdwdHIpCisJCQkJCWFyZ3B0cisrOworCQkJfSBlbHNlIHsKKwkJCQlzZXRvcHRpb24oYywgdmFsKTsKKwkJCX0KKwkJfQorCX0KK30KKworU1RBVElDIHZvaWQKK21pbnVzX28oY2hhciAqbmFtZSwgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCWlmIChuYW1lID09IE5VTEwpIHsKKwkJb3V0MXN0cigiQ3VycmVudCBvcHRpb24gc2V0dGluZ3NcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgTk9QVFM7IGkrKykKKwkJCW91dDFmbXQoIiUtMTZzJXNcbiIsIG9wdG5hbWVzW2ldLAorCQkJCW9wdGxpc3RbaV0gPyAib24iIDogIm9mZiIpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKQorCQkJaWYgKGVxdWFsKG5hbWUsIG9wdG5hbWVzW2ldKSkgeworCQkJCW9wdGxpc3RbaV0gPSB2YWw7CisJCQkJcmV0dXJuOworCQkJfQorCQlzaF9lcnJvcigiSWxsZWdhbCBvcHRpb24gLW8gJXMiLCBuYW1lKTsKKwl9Cit9CisKKworU1RBVElDIHZvaWQKK3NldG9wdGlvbihpbnQgZmxhZywgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKQorCQlpZiAob3B0bGV0dGVyc1tpXSA9PSBmbGFnKSB7CisJCQlvcHRsaXN0W2ldID0gdmFsOworCQkJaWYgKHZhbCkgeworCQkJCS8qICMlJCBoYWNrIGZvciBrc2ggc2VtYW50aWNzICovCisJCQkJaWYgKGZsYWcgPT0gJ1YnKQorCQkJCQlFZmxhZyA9IDA7CisJCQkJZWxzZSBpZiAoZmxhZyA9PSAnRScpCisJCQkJCVZmbGFnID0gMDsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCXNoX2Vycm9yKCJJbGxlZ2FsIG9wdGlvbiAtJWMiLCBmbGFnKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworCisvKgorICogU2V0IHRoZSBzaGVsbCBwYXJhbWV0ZXJzLgorICovCisKK3ZvaWQKK3NldHBhcmFtKGNoYXIgKiphcmd2KQoreworCWNoYXIgKipuZXdwYXJhbTsKKwljaGFyICoqYXA7CisJaW50IG5wYXJhbTsKKworCWZvciAobnBhcmFtID0gMCA7IGFyZ3ZbbnBhcmFtXSA7IG5wYXJhbSsrKTsKKwlhcCA9IG5ld3BhcmFtID0gY2ttYWxsb2MoKG5wYXJhbSArIDEpICogc2l6ZW9mICphcCk7CisJd2hpbGUgKCphcmd2KSB7CisJCSphcCsrID0gc2F2ZXN0cigqYXJndisrKTsKKwl9CisJKmFwID0gTlVMTDsKKwlmcmVlcGFyYW0oJnNoZWxscGFyYW0pOworCXNoZWxscGFyYW0ubWFsbG9jID0gMTsKKwlzaGVsbHBhcmFtLm5wYXJhbSA9IG5wYXJhbTsKKwlzaGVsbHBhcmFtLnAgPSBuZXdwYXJhbTsKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKK30KKworCisvKgorICogRnJlZSB0aGUgbGlzdCBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCisgKi8KKwordm9pZAorZnJlZXBhcmFtKHZvbGF0aWxlIHN0cnVjdCBzaHBhcmFtICpwYXJhbSkKK3sKKwljaGFyICoqYXA7CisKKwlpZiAocGFyYW0tPm1hbGxvYykgeworCQlmb3IgKGFwID0gcGFyYW0tPnAgOyAqYXAgOyBhcCsrKQorCQkJY2tmcmVlKCphcCk7CisJCWNrZnJlZShwYXJhbS0+cCk7CisJfQorfQorCisKKworLyoKKyAqIFRoZSBzaGlmdCBidWlsdGluIGNvbW1hbmQuCisgKi8KKworaW50CitzaGlmdGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJY2hhciAqKmFwMSwgKiphcDI7CisKKwluID0gMTsKKwlpZiAoYXJnYyA+IDEpCisJCW4gPSBudW1iZXIoYXJndlsxXSk7CisJaWYgKG4gPiBzaGVsbHBhcmFtLm5wYXJhbSkKKwkJc2hfZXJyb3IoImNhbid0IHNoaWZ0IHRoYXQgbWFueSIpOworCUlOVE9GRjsKKwlzaGVsbHBhcmFtLm5wYXJhbSAtPSBuOworCWZvciAoYXAxID0gc2hlbGxwYXJhbS5wIDsgLS1uID49IDAgOyBhcDErKykgeworCQlpZiAoc2hlbGxwYXJhbS5tYWxsb2MpCisJCQlja2ZyZWUoKmFwMSk7CisJfQorCWFwMiA9IHNoZWxscGFyYW0ucDsKKwl3aGlsZSAoKCphcDIrKyA9ICphcDErKykgIT0gTlVMTCk7CisJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisJSU5UT047CisJcmV0dXJuIDA7Cit9CisKKworCisvKgorICogVGhlIHNldCBjb21tYW5kIGJ1aWx0aW4uCisgKi8KKworaW50CitzZXRjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjID09IDEpCisJCXJldHVybiBzaG93dmFycyhudWxsc3RyLCAwLCBWVU5TRVQpOworCUlOVE9GRjsKKwlvcHRpb25zKDApOworCW9wdHNjaGFuZ2VkKCk7CisJaWYgKCphcmdwdHIgIT0gTlVMTCkgeworCQlzZXRwYXJhbShhcmdwdHIpOworCX0KKwlJTlRPTjsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkCitnZXRvcHRzcmVzZXQodmFsdWUpCisJY29uc3QgY2hhciAqdmFsdWU7Cit7CisJc2hlbGxwYXJhbS5vcHRpbmQgPSBudW1iZXIodmFsdWUpOworCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7Cit9CisKKy8qCisgKiBUaGUgZ2V0b3B0cyBidWlsdGluLiAgU2hlbGxwYXJhbS5vcHRuZXh0IHBvaW50cyB0byB0aGUgbmV4dCBhcmd1bWVudAorICogdG8gYmUgcHJvY2Vzc2VkLiAgU2hlbGxwYXJhbS5vcHRwdHIgcG9pbnRzIHRvIHRoZSBuZXh0IGNoYXJhY3RlciB0bworICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjdXJyZW50IGFyZ3VtZW50LiAgSWYgc2hlbGxwYXJhbS5vcHRuZXh0IGlzIE5VTEwsCisgKiB0aGVuIGl0J3MgdGhlIGZpcnN0IHRpbWUgZ2V0b3B0cyBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworaW50CitnZXRvcHRzY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqb3B0YmFzZTsKKworCWlmIChhcmdjIDwgMykKKwkJc2hfZXJyb3IoIlVzYWdlOiBnZXRvcHRzIG9wdHN0cmluZyB2YXIgW2FyZ10iKTsKKwllbHNlIGlmIChhcmdjID09IDMpIHsKKwkJb3B0YmFzZSA9IHNoZWxscGFyYW0ucDsKKwkJaWYgKHNoZWxscGFyYW0ub3B0aW5kID4gc2hlbGxwYXJhbS5ucGFyYW0gKyAxKSB7CisJCQlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJCQlzaGVsbHBhcmFtLm9wdG9mZiA9IC0xOworCQl9CisJfQorCWVsc2UgeworCQlvcHRiYXNlID0gJmFyZ3ZbM107CisJCWlmIChzaGVsbHBhcmFtLm9wdGluZCA+IGFyZ2MgLSAyKSB7CisJCQlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJCQlzaGVsbHBhcmFtLm9wdG9mZiA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIGdldG9wdHMoYXJndlsxXSwgYXJndlsyXSwgb3B0YmFzZSwgJnNoZWxscGFyYW0ub3B0aW5kLAorCQkgICAgICAgJnNoZWxscGFyYW0ub3B0b2ZmKTsKK30KKworU1RBVElDIGludAorZ2V0b3B0cyhjaGFyICpvcHRzdHIsIGNoYXIgKm9wdHZhciwgY2hhciAqKm9wdGZpcnN0LCBpbnQgKm9wdGluZCwgaW50ICpvcHRvZmYpCit7CisJY2hhciAqcCwgKnE7CisJY2hhciBjID0gJz8nOworCWludCBkb25lID0gMDsKKwlpbnQgZXJyID0gMDsKKwljaGFyIHNbMTJdOworCWNoYXIgKipvcHRuZXh0OworCisJaWYgKCpvcHRpbmQgPCAxKQorCQlyZXR1cm4gMTsKKwlvcHRuZXh0ID0gb3B0Zmlyc3QgKyAqb3B0aW5kIC0gMTsKKworCWlmICgqb3B0aW5kIDw9IDEgfHwgKm9wdG9mZiA8IDAgfHwgc3RybGVuKG9wdG5leHRbLTFdKSA8ICpvcHRvZmYpCisJCXAgPSBOVUxMOworCWVsc2UKKwkJcCA9IG9wdG5leHRbLTFdICsgKm9wdG9mZjsKKwlpZiAocCA9PSBOVUxMIHx8ICpwID09ICdcMCcpIHsKKwkJLyogQ3VycmVudCB3b3JkIGlzIGRvbmUsIGFkdmFuY2UgKi8KKwkJcCA9ICpvcHRuZXh0OworCQlpZiAocCA9PSBOVUxMIHx8ICpwICE9ICctJyB8fCAqKytwID09ICdcMCcpIHsKK2F0ZW5kOgorCQkJcCA9IE5VTEw7CisJCQlkb25lID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW9wdG5leHQrKzsKKwkJaWYgKHBbMF0gPT0gJy0nICYmIHBbMV0gPT0gJ1wwJykJLyogY2hlY2sgZm9yICItLSIgKi8KKwkJCWdvdG8gYXRlbmQ7CisJfQorCisJYyA9ICpwKys7CisJZm9yIChxID0gb3B0c3RyOyAqcSAhPSBjOyApIHsKKwkJaWYgKCpxID09ICdcMCcpIHsKKwkJCWlmIChvcHRzdHJbMF0gPT0gJzonKSB7CisJCQkJc1swXSA9IGM7CisJCQkJc1sxXSA9ICdcMCc7CisJCQkJZXJyIHw9IHNldHZhcnNhZmUoIk9QVEFSRyIsIHMsIDApOworCQkJfSBlbHNlIHsKKwkJCQlvdXRmbXQoJmVycm91dCwgIklsbGVnYWwgb3B0aW9uIC0lY1xuIiwgYyk7CisJCQkJKHZvaWQpIHVuc2V0dmFyKCJPUFRBUkciKTsKKwkJCX0KKwkJCWMgPSAnPyc7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoKisrcSA9PSAnOicpCisJCQlxKys7CisJfQorCisJaWYgKCorK3EgPT0gJzonKSB7CisJCWlmICgqcCA9PSAnXDAnICYmIChwID0gKm9wdG5leHQpID09IE5VTEwpIHsKKwkJCWlmIChvcHRzdHJbMF0gPT0gJzonKSB7CisJCQkJc1swXSA9IGM7CisJCQkJc1sxXSA9ICdcMCc7CisJCQkJZXJyIHw9IHNldHZhcnNhZmUoIk9QVEFSRyIsIHMsIDApOworCQkJCWMgPSAnOic7CisJCQl9IGVsc2UgeworCQkJCW91dGZtdCgmZXJyb3V0LCAiTm8gYXJnIGZvciAtJWMgb3B0aW9uXG4iLCBjKTsKKwkJCQkodm9pZCkgdW5zZXR2YXIoIk9QVEFSRyIpOworCQkJCWMgPSAnPyc7CisJCQl9CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChwID09ICpvcHRuZXh0KQorCQkJb3B0bmV4dCsrOworCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgcCwgMCk7CisJCXAgPSBOVUxMOworCX0gZWxzZQorCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgbnVsbHN0ciwgMCk7CisKK291dDoKKwkqb3B0b2ZmID0gcCA/IHAgLSAqKG9wdG5leHQgLSAxKSA6IC0xOworCSpvcHRpbmQgPSBvcHRuZXh0IC0gb3B0Zmlyc3QgKyAxOworCWZtdHN0cihzLCBzaXplb2YocyksICIlZCIsICpvcHRpbmQpOworCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRJTkQiLCBzLCBWTk9GVU5DKTsKKwlzWzBdID0gYzsKKwlzWzFdID0gJ1wwJzsKKwllcnIgfD0gc2V0dmFyc2FmZShvcHR2YXIsIHMsIDApOworCWlmIChlcnIpIHsKKwkJKm9wdGluZCA9IDE7CisJCSpvcHRvZmYgPSAtMTsKKwkJZmx1c2hhbGwoKTsKKwkJZXhyYWlzZShFWEVSUk9SKTsKKwl9CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBYWFggLSBzaG91bGQgZ2V0IHJpZCBvZi4gIGhhdmUgYWxsIGJ1aWx0aW5zIHVzZSBnZXRvcHQoMykuICB0aGUKKyAqIGxpYnJhcnkgZ2V0b3B0IG11c3QgaGF2ZSB0aGUgQlNEIGV4dGVuc2lvbiBzdGF0aWMgdmFyaWFibGUgIm9wdHJlc2V0IgorICogb3RoZXJ3aXNlIGl0IGNhbid0IGJlIHVzZWQgd2l0aGluIHRoZSBzaGVsbCBzYWZlbHkuCisgKgorICogU3RhbmRhcmQgb3B0aW9uIHByb2Nlc3NpbmcgKGEgbGEgZ2V0b3B0KSBmb3IgYnVpbHRpbiByb3V0aW5lcy4gIFRoZQorICogb25seSBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0byBuZXh0b3B0IGlzIHRoZSBvcHRpb24gc3RyaW5nOyB0aGUKKyAqIG90aGVyIGFyZ3VtZW50cyBhcmUgdW5uZWNlc3NhcnkuICBJdCByZXR1cm4gdGhlIGNoYXJhY3Rlciwgb3IgJ1wwJyBvbgorICogZW5kIG9mIGlucHV0LgorICovCisKK2ludAorbmV4dG9wdChjb25zdCBjaGFyICpvcHRzdHJpbmcpCit7CisJY2hhciAqcDsKKwljb25zdCBjaGFyICpxOworCWNoYXIgYzsKKworCWlmICgocCA9IG9wdHB0cikgPT0gTlVMTCB8fCAqcCA9PSAnXDAnKSB7CisJCXAgPSAqYXJncHRyOworCQlpZiAocCA9PSBOVUxMIHx8ICpwICE9ICctJyB8fCAqKytwID09ICdcMCcpCisJCQlyZXR1cm4gJ1wwJzsKKwkJYXJncHRyKys7CisJCWlmIChwWzBdID09ICctJyAmJiBwWzFdID09ICdcMCcpCS8qIGNoZWNrIGZvciAiLS0iICovCisJCQlyZXR1cm4gJ1wwJzsKKwl9CisJYyA9ICpwKys7CisJZm9yIChxID0gb3B0c3RyaW5nIDsgKnEgIT0gYyA7ICkgeworCQlpZiAoKnEgPT0gJ1wwJykKKwkJCXNoX2Vycm9yKCJJbGxlZ2FsIG9wdGlvbiAtJWMiLCBjKTsKKwkJaWYgKCorK3EgPT0gJzonKQorCQkJcSsrOworCX0KKwlpZiAoKisrcSA9PSAnOicpIHsKKwkJaWYgKCpwID09ICdcMCcgJiYgKHAgPSAqYXJncHRyKyspID09IE5VTEwpCisJCQlzaF9lcnJvcigiTm8gYXJnIGZvciAtJWMgb3B0aW9uIiwgYyk7CisJCW9wdGlvbmFyZyA9IHA7CisJCXAgPSBOVUxMOworCX0KKwlvcHRwdHIgPSBwOworCXJldHVybiBjOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvb3B0aW9ucy5oIGIvdXNyL2Rhc2gvb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmJlNWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9vcHRpb25zLmgKQEAgLTAsMCArMSw4NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylvcHRpb25zLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworc3RydWN0IHNocGFyYW0geworCWludCBucGFyYW07CQkvKiAjIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyAod2l0aG91dCAkMCkgKi8KKwl1bnNpZ25lZCBjaGFyIG1hbGxvYzsJLyogaWYgcGFyYW1ldGVyIGxpc3QgZHluYW1pY2FsbHkgYWxsb2NhdGVkICovCisJY2hhciAqKnA7CQkvKiBwYXJhbWV0ZXIgbGlzdCAqLworCWludCBvcHRpbmQ7CQkvKiBuZXh0IHBhcmFtZXRlciB0byBiZSBwcm9jZXNzZWQgYnkgZ2V0b3B0cyAqLworCWludCBvcHRvZmY7CQkvKiB1c2VkIGJ5IGdldG9wdHMgKi8KK307CisKKworCisjZGVmaW5lIGVmbGFnIG9wdGxpc3RbMF0KKyNkZWZpbmUgZmZsYWcgb3B0bGlzdFsxXQorI2RlZmluZSBJZmxhZyBvcHRsaXN0WzJdCisjZGVmaW5lIGlmbGFnIG9wdGxpc3RbM10KKyNkZWZpbmUgbWZsYWcgb3B0bGlzdFs0XQorI2RlZmluZSBuZmxhZyBvcHRsaXN0WzVdCisjZGVmaW5lIHNmbGFnIG9wdGxpc3RbNl0KKyNkZWZpbmUgeGZsYWcgb3B0bGlzdFs3XQorI2RlZmluZSB2ZmxhZyBvcHRsaXN0WzhdCisjZGVmaW5lIFZmbGFnIG9wdGxpc3RbOV0KKyNkZWZpbmUJRWZsYWcgb3B0bGlzdFsxMF0KKyNkZWZpbmUJQ2ZsYWcgb3B0bGlzdFsxMV0KKyNkZWZpbmUJYWZsYWcgb3B0bGlzdFsxMl0KKyNkZWZpbmUJYmZsYWcgb3B0bGlzdFsxM10KKyNkZWZpbmUJdWZsYWcgb3B0bGlzdFsxNF0KKyNkZWZpbmUJbm9sb2cgb3B0bGlzdFsxNV0KKyNkZWZpbmUJZGVidWcgb3B0bGlzdFsxNl0KKworI2RlZmluZSBOT1BUUwkxNworCitleHRlcm4gY29uc3QgY2hhciBvcHRsZXR0ZXJzW05PUFRTXTsKK2V4dGVybiBjaGFyIG9wdGxpc3RbTk9QVFNdOworCisKK2V4dGVybiBjaGFyICptaW51c2M7CQkvKiBhcmd1bWVudCB0byAtYyBvcHRpb24gKi8KK2V4dGVybiBjaGFyICphcmcwOwkJLyogJDAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2hwYXJhbSBzaGVsbHBhcmFtOyAgLyogJEAgKi8KK2V4dGVybiBjaGFyICoqYXJncHRyOwkJLyogYXJndW1lbnQgbGlzdCBmb3IgYnVpbHRpbiBjb21tYW5kcyAqLworZXh0ZXJuIGNoYXIgKm9wdGlvbmFyZzsJCS8qIHNldCBieSBuZXh0b3B0ICovCitleHRlcm4gY2hhciAqb3B0cHRyOwkJLyogdXNlZCBieSBuZXh0b3B0ICovCisKK3ZvaWQgcHJvY2FyZ3MoaW50LCBjaGFyICoqKTsKK3ZvaWQgb3B0c2NoYW5nZWQodm9pZCk7Cit2b2lkIHNldHBhcmFtKGNoYXIgKiopOwordm9pZCBmcmVlcGFyYW0odm9sYXRpbGUgc3RydWN0IHNocGFyYW0gKik7CitpbnQgc2hpZnRjbWQoaW50LCBjaGFyICoqKTsKK2ludCBzZXRjbWQoaW50LCBjaGFyICoqKTsKK2ludCBnZXRvcHRzY21kKGludCwgY2hhciAqKik7CitpbnQgbmV4dG9wdChjb25zdCBjaGFyICopOwordm9pZCBnZXRvcHRzcmVzZXQoY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL291dHB1dC5jIGIvdXNyL2Rhc2gvb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5YjVjNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL291dHB1dC5jCkBAIC0wLDAgKzEsMzg1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFNoZWxsIG91dHB1dCByb3V0aW5lcy4gIFdlIHVzZSBvdXIgb3duIG91dHB1dCByb3V0aW5lcyBiZWNhdXNlOgorICoJV2hlbiBhIGJ1aWx0aW4gY29tbWFuZCBpcyBpbnRlcnJ1cHRlZCB3ZSBoYXZlIHRvIGRpc2NhcmQKKyAqCQlhbnkgcGVuZGluZyBvdXRwdXQuCisgKglXaGVuIGEgYnVpbHRpbiBjb21tYW5kIGFwcGVhcnMgaW4gYmFjayBxdW90ZXMsIHdlIHdhbnQgdG8KKyAqCQlzYXZlIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgaW4gYSByZWdpb24gb2J0YWluZWQKKyAqCQl2aWEgbWFsbG9jLCByYXRoZXIgdGhhbiBkb2luZyBhIGZvcmsgYW5kIHJlYWRpbmcgdGhlCisgKgkJb3V0cHV0IG9mIHRoZSBjb21tYW5kIHZpYSBhIHBpcGUuCisgKglPdXIgb3V0cHV0IHJvdXRpbmVzIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIHN0ZGlvIHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIHF1YWRfdCAqLworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgkJLyogQlNENF80ICovCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgkvKiBkZWZpbmVzIEJVRlNJWiAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIFVTRV9HTElCQ19TVERJTworI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAic3ludGF4LmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworCisjZGVmaW5lIE9VVEJVRlNJWiBCVUZTSVoKKyNkZWZpbmUgTUVNX09VVCAtMwkJLyogb3V0cHV0IHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgKi8KKworCisjaWZkZWYgVVNFX0dMSUJDX1NURElPCitzdHJ1Y3Qgb3V0cHV0IG91dHB1dCA9IHsKKwlzdHJlYW06IDAsIG5leHRjOiAwLCBlbmQ6IDAsIGJ1ZjogMCwgYnVmc2l6ZTogMCwgZmQ6IDEsIGZsYWdzOiAwCit9Oworc3RydWN0IG91dHB1dCBlcnJvdXQgPSB7CisJc3RyZWFtOiAwLCBuZXh0YzogMCwgZW5kOiAwLCBidWY6IDAsIGJ1ZnNpemU6IDAsIGZkOiAyLCBmbGFnczogMAorfQorI2lmZGVmIG5vdHlldAorc3RydWN0IG91dHB1dCBtZW1vdXQgPSB7CisJc3RyZWFtOiAwLCBuZXh0YzogMCwgZW5kOiAwLCBidWY6IDAsIGJ1ZnNpemU6IDAsIGZkOiBNRU1fT1VULCBmbGFnczogMAorfTsKKyNlbmRpZgorI2Vsc2UKK3N0cnVjdCBvdXRwdXQgb3V0cHV0ID0geworCW5leHRjOiAwLCBlbmQ6IDAsIGJ1ZjogMCwgYnVmc2l6ZTogT1VUQlVGU0laLCBmZDogMSwgZmxhZ3M6IDAKK307CitzdHJ1Y3Qgb3V0cHV0IGVycm91dCA9IHsKKwluZXh0YzogMCwgZW5kOiAwLCBidWY6IDAsIGJ1ZnNpemU6IDAsIGZkOiAyLCBmbGFnczogMAorfTsKK3N0cnVjdCBvdXRwdXQgcHJldmVycm91dDsKKyNpZmRlZiBub3R5ZXQKK3N0cnVjdCBvdXRwdXQgbWVtb3V0ID0geworCW5leHRjOiAwLCBlbmQ6IDAsIGJ1ZjogMCwgYnVmc2l6ZTogMCwgZmQ6IE1FTV9PVVQsIGZsYWdzOiAwCit9OworI2VuZGlmCisjZW5kaWYKK3N0cnVjdCBvdXRwdXQgKm91dDEgPSAmb3V0cHV0Oworc3RydWN0IG91dHB1dCAqb3V0MiA9ICZlcnJvdXQ7CisKKworI2lmbmRlZiBVU0VfR0xJQkNfU1RESU8KK3N0YXRpYyB2b2lkIF9fb3V0c3RyKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBzdHJ1Y3Qgb3V0cHV0ICopOworI2VuZGlmCitzdGF0aWMgaW50IHh2c25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKworI2lmZGVmIG1raW5pdAorCitJTkNMVURFICJvdXRwdXQuaCIKK0lOQ0xVREUgIm1lbWFsbG9jLmgiCisKK0lOSVQgeworI2lmZGVmIFVTRV9HTElCQ19TVERJTworCWluaXRzdHJlYW1zKCk7CisjZW5kaWYKK30KKworUkVTRVQgeworI2lmZGVmIG5vdHlldAorCW91dDEgPSAmb3V0cHV0OworCW91dDIgPSAmZXJyb3V0OworI2lmZGVmIFVTRV9HTElCQ19TVERJTworCWlmIChtZW1vdXQuc3RyZWFtICE9IE5VTEwpCisJCV9fY2xvc2VtZW1vdXQoKTsKKyNlbmRpZgorCWlmIChtZW1vdXQuYnVmICE9IE5VTEwpIHsKKwkJY2tmcmVlKG1lbW91dC5idWYpOworCQltZW1vdXQuYnVmID0gTlVMTDsKKwl9CisjZW5kaWYKK30KKworI2VuZGlmCisKKworI2lmbmRlZiBVU0VfR0xJQkNfU1RESU8KK3N0YXRpYyB2b2lkCitfX291dHN0cihjb25zdCBjaGFyICpwLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgb3V0cHV0ICpkZXN0KQoreworCXNpemVfdCBidWZzaXplOworCXNpemVfdCBvZmZzZXQ7CisJc2l6ZV90IG5sZWZ0OworCisJbmxlZnQgPSBkZXN0LT5lbmQgLSBkZXN0LT5uZXh0YzsKKwlpZiAobmxlZnQgPj0gbGVuKSB7CitidWZmZXJlZDoKKwkJZGVzdC0+bmV4dGMgPSBtZW1wY3B5KGRlc3QtPm5leHRjLCBwLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJYnVmc2l6ZSA9IGRlc3QtPmJ1ZnNpemU7CisJaWYgKCFidWZzaXplKSB7CisJCTsKKwl9IGVsc2UgaWYgKGRlc3QtPmJ1ZiA9PSBOVUxMKSB7CisJCWlmIChkZXN0LT5mZCA9PSBNRU1fT1VUICYmIGxlbiA+IGJ1ZnNpemUpIHsKKwkJCWJ1ZnNpemUgPSBsZW47CisJCX0KKwkJb2Zmc2V0ID0gMDsKKwkJZ290byBhbGxvYzsKKwl9IGVsc2UgaWYgKGRlc3QtPmZkID09IE1FTV9PVVQpIHsKKwkJb2Zmc2V0ID0gYnVmc2l6ZTsKKwkJaWYgKGJ1ZnNpemUgPj0gbGVuKSB7CisJCQlidWZzaXplIDw8PSAxOworCQl9IGVsc2UgeworCQkJYnVmc2l6ZSArPSBsZW47CisJCX0KKwkJaWYgKGJ1ZnNpemUgPCBvZmZzZXQpCisJCQlnb3RvIGVycjsKK2FsbG9jOgorCQlJTlRPRkY7CisJCWRlc3QtPmJ1ZiA9IGNrcmVhbGxvYyhkZXN0LT5idWYsIGJ1ZnNpemUpOworCQlkZXN0LT5idWZzaXplID0gYnVmc2l6ZTsKKwkJZGVzdC0+ZW5kID0gZGVzdC0+YnVmICsgYnVmc2l6ZTsKKwkJZGVzdC0+bmV4dGMgPSBkZXN0LT5idWYgKyBvZmZzZXQ7CisJCUlOVE9OOworCX0gZWxzZSB7CisJCWZsdXNob3V0KGRlc3QpOworCX0KKworCW5sZWZ0ID0gZGVzdC0+ZW5kIC0gZGVzdC0+bmV4dGM7CisJaWYgKG5sZWZ0ID4gbGVuKQorCQlnb3RvIGJ1ZmZlcmVkOworCisJaWYgKCh4d3JpdGUoZGVzdC0+ZmQsIHAsIGxlbikpKSB7CitlcnI6CisJCWRlc3QtPmZsYWdzIHw9IE9VVFBVVF9FUlI7CisJfQorfQorI2VuZGlmCisKKwordm9pZAorb3V0c3RyKGNvbnN0IGNoYXIgKnAsIHN0cnVjdCBvdXRwdXQgKmZpbGUpCit7CisjaWZkZWYgVVNFX0dMSUJDX1NURElPCisJSU5UT0ZGOworCWZwdXRzKHAsIGZpbGUtPnN0cmVhbSk7CisJSU5UT047CisjZWxzZQorCXNpemVfdCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocCk7CisJX19vdXRzdHIocCwgbGVuLCBmaWxlKTsKKyNlbmRpZgorfQorCisKKyNpZm5kZWYgVVNFX0dMSUJDX1NURElPCisKKwordm9pZAorb3V0Y3Nsb3coaW50IGMsIHN0cnVjdCBvdXRwdXQgKmRlc3QpCit7CisJY2hhciBidWYgPSBjOworCV9fb3V0c3RyKCZidWYsIDEsIGRlc3QpOworfQorI2VuZGlmCisKKwordm9pZAorZmx1c2hhbGwodm9pZCkKK3sKKwlmbHVzaG91dCgmb3V0cHV0KTsKKyNpZmRlZiBGTFVTSEVSUgorCWZsdXNob3V0KCZlcnJvdXQpOworI2VuZGlmCit9CisKKwordm9pZAorZmx1c2hvdXQoc3RydWN0IG91dHB1dCAqZGVzdCkKK3sKKyNpZmRlZiBVU0VfR0xJQkNfU1RESU8KKwlJTlRPRkY7CisJZmZsdXNoKGRlc3QtPnN0cmVhbSk7CisJSU5UT047CisjZWxzZQorCXNpemVfdCBsZW47CisKKwlsZW4gPSBkZXN0LT5uZXh0YyAtIGRlc3QtPmJ1ZjsKKwlpZiAoIWxlbiB8fCBkZXN0LT5mZCA8IDApCisJCXJldHVybjsKKwlkZXN0LT5uZXh0YyA9IGRlc3QtPmJ1ZjsKKwlpZiAoKHh3cml0ZShkZXN0LT5mZCwgZGVzdC0+YnVmLCBsZW4pKSkKKwkJZGVzdC0+ZmxhZ3MgfD0gT1VUUFVUX0VSUjsKKyNlbmRpZgorfQorCisKK3ZvaWQKK291dGZtdChzdHJ1Y3Qgb3V0cHV0ICpmaWxlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJZG9mb3JtYXQoZmlsZSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworCit2b2lkCitvdXQxZm10KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlkb2Zvcm1hdChvdXQxLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCisKK2ludAorZm10c3RyKGNoYXIgKm91dGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmV0OworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmV0ID0geHZzbnByaW50ZihvdXRidWYsIGxlbmd0aCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcmV0OworfQorCisKKyNpZm5kZWYgVVNFX0dMSUJDX1NURElPCit2b2lkCitkb2Zvcm1hdChzdHJ1Y3Qgb3V0cHV0ICpkZXN0LCBjb25zdCBjaGFyICpmLCB2YV9saXN0IGFwKQoreworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJY2hhciAqczsKKwlpbnQgbGVuLCByZXQ7CisJc2l6ZV90IHNpemU7CisJdmFfbGlzdCBhcDI7CisKKwl2YV9jb3B5KGFwMiwgYXApOworCXNpemUgPSBkZXN0LT5lbmQgLSBkZXN0LT5uZXh0YzsKKwlsZW4gPSB4dnNucHJpbnRmKGRlc3QtPm5leHRjLCBzaXplLCBmLCBhcDIpOworCXZhX2VuZChhcDIpOworCWlmIChsZW4gPCAwKSB7CisJCWRlc3QtPmZsYWdzIHw9IE9VVFBVVF9FUlI7CisJCXJldHVybjsKKwl9CisJaWYgKGxlbiA8IHNpemUpIHsKKwkJZGVzdC0+bmV4dGMgKz0gbGVuOworCQlyZXR1cm47CisJfQorCXNldHN0YWNrbWFyaygmc21hcmspOworCXMgPSBzdGFsbG9jKChsZW4gPj0gc3RhY2tibG9ja3NpemUoKSA/IGxlbiA6IHN0YWNrYmxvY2tzaXplKCkpICsgMSk7CisJcmV0ID0geHZzbnByaW50ZihzLCBsZW4gKyAxLCBmLCBhcCk7CisJaWYgKHJldCA9PSBsZW4pCisJCV9fb3V0c3RyKHMsIGxlbiwgZGVzdCk7CisJZWxzZQorCQlkZXN0LT5mbGFncyB8PSBPVVRQVVRfRVJSOworCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorI2VuZGlmCisKKworCisvKgorICogVmVyc2lvbiBvZiB3cml0ZSB3aGljaCByZXN1bWVzIGFmdGVyIGEgc2lnbmFsIGlzIGNhdWdodC4KKyAqLworCitpbnQKK3h3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBuKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9IHA7CisKKwl3aGlsZSAobikgeworCQlzc2l6ZV90IGk7CisJCXNpemVfdCBtOworCisJCW0gPSBuOworCQlpZiAobSA+IFNTSVpFX01BWCkKKwkJCW0gPSBTU0laRV9NQVg7CisJCWRvIHsKKwkJCWkgPSB3cml0ZShmZCwgYnVmLCBtKTsKKwkJfSB3aGlsZSAoaSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCQlpZiAoaSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWJ1ZiArPSBpOworCQluIC09IGk7CisJfQorCXJldHVybiAwOworfQorCisKKyNpZmRlZiBub3R5ZXQKKyNpZmRlZiBVU0VfR0xJQkNfU1RESU8KK3ZvaWQgaW5pdHN0cmVhbXMoKSB7CisJb3V0cHV0LnN0cmVhbSA9IHN0ZG91dDsKKwllcnJvdXQuc3RyZWFtID0gc3RkZXJyOworfQorCisKK3ZvaWQKK29wZW5tZW1vdXQodm9pZCkgeworCUlOVE9GRjsKKwltZW1vdXQuc3RyZWFtID0gb3Blbl9tZW1zdHJlYW0oJm1lbW91dC5idWYsICZtZW1vdXQuYnVmc2l6ZSk7CisJSU5UT047Cit9CisKKworaW50CitfX2Nsb3NlbWVtb3V0KHZvaWQpIHsKKwlpbnQgZXJyb3I7CisJZXJyb3IgPSBmY2xvc2UobWVtb3V0LnN0cmVhbSk7CisJbWVtb3V0LnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIGVycm9yOworfQorI2VuZGlmCisjZW5kaWYKKworCitzdGF0aWMgaW50Cit4dnNucHJpbnRmKGNoYXIgKm91dGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCWludCByZXQ7CisKKwlJTlRPRkY7CisJcmV0ID0gdnNucHJpbnRmKG91dGJ1ZiwgbGVuZ3RoLCBmbXQsIGFwKTsKKwlJTlRPTjsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvb3V0cHV0LmggYi91c3IvZGFzaC9vdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTIzMzAxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvb3V0cHV0LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpb3V0cHV0LmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2lmbmRlZiBPVVRQVVRfSU5DTAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZkZWYgVVNFX0dMSUJDX1NURElPCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitzdHJ1Y3Qgb3V0cHV0IHsKKyNpZmRlZiBVU0VfR0xJQkNfU1RESU8KKwlGSUxFICpzdHJlYW07CisjZW5kaWYKKwljaGFyICpuZXh0YzsKKwljaGFyICplbmQ7CisJY2hhciAqYnVmOworCXNpemVfdCBidWZzaXplOworCWludCBmZDsKKwlpbnQgZmxhZ3M7Cit9OworCitleHRlcm4gc3RydWN0IG91dHB1dCBvdXRwdXQ7CitleHRlcm4gc3RydWN0IG91dHB1dCBlcnJvdXQ7CitleHRlcm4gc3RydWN0IG91dHB1dCBwcmV2ZXJyb3V0OworI2lmZGVmIG5vdHlldAorZXh0ZXJuIHN0cnVjdCBvdXRwdXQgbWVtb3V0OworI2VuZGlmCitleHRlcm4gc3RydWN0IG91dHB1dCAqb3V0MTsKK2V4dGVybiBzdHJ1Y3Qgb3V0cHV0ICpvdXQyOworCit2b2lkIG91dHN0cihjb25zdCBjaGFyICosIHN0cnVjdCBvdXRwdXQgKik7CisjaWZuZGVmIFVTRV9HTElCQ19TVERJTwordm9pZCBvdXRjc2xvdyhpbnQsIHN0cnVjdCBvdXRwdXQgKik7CisjZW5kaWYKK3ZvaWQgZmx1c2hhbGwodm9pZCk7Cit2b2lkIGZsdXNob3V0KHN0cnVjdCBvdXRwdXQgKik7Cit2b2lkIG91dGZtdChzdHJ1Y3Qgb3V0cHV0ICosIGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXywyLDMpKSk7Cit2b2lkIG91dDFmbXQoY29uc3QgY2hhciAqLCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDEsMikpKTsKK2ludCBmbXRzdHIoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXywzLDQpKSk7CisjaWZuZGVmIFVTRV9HTElCQ19TVERJTwordm9pZCBkb2Zvcm1hdChzdHJ1Y3Qgb3V0cHV0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjZW5kaWYKK2ludCB4d3JpdGUoaW50LCBjb25zdCB2b2lkICosIHNpemVfdCk7CisjaWZkZWYgbm90eWV0CisjaWZkZWYgVVNFX0dMSUJDX1NURElPCit2b2lkIGluaXRzdHJlYW1zKHZvaWQpOwordm9pZCBvcGVubWVtb3V0KHZvaWQpOworaW50IF9fY2xvc2VtZW1vdXQodm9pZCk7CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZyZWVzdGRvdXQoKQoreworCW91dHB1dC5uZXh0YyA9IG91dHB1dC5idWY7CisJb3V0cHV0LmZsYWdzID0gMDsKK30KKworI2RlZmluZSBPVVRQVVRfRVJSIDAxCQkvKiBlcnJvciBvY2N1cnJlZCBvbiBvdXRwdXQgKi8KKworI2lmZGVmIFVTRV9HTElCQ19TVERJTworI2RlZmluZSBvdXRjKGMsIG8pCXB1dGMoKGMpLCAobyktPnN0cmVhbSkKKyNkZWZpbmUgZG9mb3JtYXQoZCwgZiwgYSkJdmZwcmludGYoKGQpLT5zdHJlYW0sIChmKSwgKGEpKQorI2Vsc2UKKyNkZWZpbmUgb3V0YyhjLCBmaWxlKQkoKGZpbGUpLT5uZXh0YyA9PSAoZmlsZSktPmVuZCA/IG91dGNzbG93KChjKSwgKGZpbGUpKSA6ICgqKGZpbGUpLT5uZXh0YyA9IChjKSwgKGZpbGUpLT5uZXh0YysrKSkKKyNlbmRpZgorI2RlZmluZSBvdXQxYyhjKQlvdXRjKChjKSwgb3V0MSkKKyNkZWZpbmUgb3V0MmMoYykJb3V0Y3Nsb3coKGMpLCBvdXQyKQorI2RlZmluZSBvdXQxc3RyKHMpCW91dHN0cigocyksIG91dDEpCisjZGVmaW5lIG91dDJzdHIocykJb3V0c3RyKChzKSwgb3V0MikKKyNkZWZpbmUgb3V0ZXJyKGYpCShmKS0+ZmxhZ3MKKworI2RlZmluZSBPVVRQVVRfSU5DTAorI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvZGFzaC9wYXJzZXIuYyBiL3Vzci9kYXNoL3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjAxOWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9wYXJzZXIuYwpAQCAtMCwwICsxLDE1NTYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAiZXhwYW5kLmgiCS8qIGRlZmluZXMgcm1lc2NhcGVzKCkgKi8KKyNpbmNsdWRlICJyZWRpci5oIgkvKiBkZWZpbmVzIGNvcHlmZCgpICovCisjaW5jbHVkZSAiZXhlYy5oIgkvKiBkZWZpbmVzIGZpbmRfYnVpbHRpbigpICovCisjaW5jbHVkZSAic3ludGF4LmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgImlucHV0LmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAidmFyLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAiYWxpYXMuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAiYnVpbHRpbnMuaCIKKyNpZm5kZWYgU01BTEwKKyNpbmNsdWRlICJteWhpc3RlZGl0LmgiCisjZW5kaWYKKworLyoKKyAqIFNoZWxsIGNvbW1hbmQgcGFyc2VyLgorICovCisKKyNkZWZpbmUgRU9GTUFSS0xFTiA3OQorCisvKiB2YWx1ZXMgcmV0dXJuZWQgYnkgcmVhZHRva2VuICovCisjaW5jbHVkZSAidG9rZW4uaCIKKworCisKK3N0cnVjdCBoZXJlZG9jIHsKKwlzdHJ1Y3QgaGVyZWRvYyAqbmV4dDsJLyogbmV4dCBoZXJlIGRvY3VtZW50IGluIGxpc3QgKi8KKwl1bmlvbiBub2RlICpoZXJlOwkJLyogcmVkaXJlY3Rpb24gbm9kZSAqLworCWNoYXIgKmVvZm1hcms7CQkvKiBzdHJpbmcgaW5kaWNhdGluZyBlbmQgb2YgaW5wdXQgKi8KKwlpbnQgc3RyaXB0YWJzOwkJLyogaWYgc2V0LCBzdHJpcCBsZWFkaW5nIHRhYnMgKi8KK307CisKKworCitzdHJ1Y3QgaGVyZWRvYyAqaGVyZWRvY2xpc3Q7CS8qIGxpc3Qgb2YgaGVyZSBkb2N1bWVudHMgdG8gcmVhZCAqLworaW50IGRvcHJvbXB0OwkJCS8qIGlmIHNldCwgcHJvbXB0IHRoZSB1c2VyICovCitpbnQgbmVlZHByb21wdDsJCQkvKiB0cnVlIGlmIGludGVyYWN0aXZlIGFuZCBhdCBzdGFydCBvZiBsaW5lICovCitpbnQgbGFzdHRva2VuOwkJCS8qIGxhc3QgdG9rZW4gcmVhZCAqLworTUtJTklUIGludCB0b2twdXNoYmFjazsJCS8qIGxhc3QgdG9rZW4gcHVzaGVkIGJhY2sgKi8KK2NoYXIgKndvcmR0ZXh0OwkJCS8qIHRleHQgb2YgbGFzdCB3b3JkIHJldHVybmVkIGJ5IHJlYWR0b2tlbiAqLworaW50IGNoZWNra3dkOworc3RydWN0IG5vZGVsaXN0ICpiYWNrcXVvdGVsaXN0OwordW5pb24gbm9kZSAqcmVkaXJub2RlOworc3RydWN0IGhlcmVkb2MgKmhlcmVkb2M7CitpbnQgcXVvdGVmbGFnOwkJCS8qIHNldCBpZiAocGFydCBvZikgbGFzdCB0b2tlbiB3YXMgcXVvdGVkICovCitpbnQgc3RhcnRsaW5ubzsJCQkvKiBsaW5lICMgd2hlcmUgbGFzdCB0b2tlbiBzdGFydGVkICovCisKKworU1RBVElDIHVuaW9uIG5vZGUgKmxpc3QoaW50KTsKK1NUQVRJQyB1bmlvbiBub2RlICphbmRvcih2b2lkKTsKK1NUQVRJQyB1bmlvbiBub2RlICpwaXBlbGluZSh2b2lkKTsKK1NUQVRJQyB1bmlvbiBub2RlICpjb21tYW5kKHZvaWQpOworU1RBVElDIHVuaW9uIG5vZGUgKnNpbXBsZWNtZCh2b2lkKTsKK1NUQVRJQyB1bmlvbiBub2RlICptYWtlbmFtZSh2b2lkKTsKK1NUQVRJQyB2b2lkIHBhcnNlZm5hbWUodm9pZCk7CitTVEFUSUMgdm9pZCBwYXJzZWhlcmVkb2Modm9pZCk7CitTVEFUSUMgaW50IHBlZWt0b2tlbih2b2lkKTsKK1NUQVRJQyBpbnQgcmVhZHRva2VuKHZvaWQpOworU1RBVElDIGludCB4eHJlYWR0b2tlbih2b2lkKTsKK1NUQVRJQyBpbnQgcmVhZHRva2VuMShpbnQsIGNoYXIgY29uc3QgKiwgY2hhciAqLCBpbnQpOworU1RBVElDIGludCBub2V4cGFuZChjaGFyICopOworU1RBVElDIHZvaWQgc3luZXhwZWN0KGludCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CitTVEFUSUMgdm9pZCBzeW5lcnJvcihjb25zdCBjaGFyICopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworU1RBVElDIHZvaWQgc2V0cHJvbXB0KGludCk7CisKKworc3RhdGljIGlubGluZSBpbnQKK2lzYXNzaWdubWVudChjb25zdCBjaGFyICpwKQoreworCWNvbnN0IGNoYXIgKnEgPSBlbmRvZm5hbWUocCk7CisJaWYgKHAgPT0gcSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICpxID09ICc9JzsKK30KKworCisvKgorICogUmVhZCBhbmQgcGFyc2UgYSBjb21tYW5kLiAgUmV0dXJucyBORU9GIG9uIGVuZCBvZiBmaWxlLiAgKE5VTEwgaXMgYQorICogdmFsaWQgcGFyc2UgdHJlZSBpbmRpY2F0aW5nIGEgYmxhbmsgbGluZS4pCisgKi8KKwordW5pb24gbm9kZSAqCitwYXJzZWNtZChpbnQgaW50ZXJhY3QpCit7CisJaW50IHQ7CisKKwl0b2twdXNoYmFjayA9IDA7CisJZG9wcm9tcHQgPSBpbnRlcmFjdDsKKwlpZiAoZG9wcm9tcHQpCisJCXNldHByb21wdChkb3Byb21wdCk7CisJbmVlZHByb21wdCA9IDA7CisJdCA9IHJlYWR0b2tlbigpOworCWlmICh0ID09IFRFT0YpCisJCXJldHVybiBORU9GOworCWlmICh0ID09IFROTCkKKwkJcmV0dXJuIE5VTEw7CisJdG9rcHVzaGJhY2srKzsKKwlyZXR1cm4gbGlzdCgxKTsKK30KKworCitTVEFUSUMgdW5pb24gbm9kZSAqCitsaXN0KGludCBubGZsYWcpCit7CisJdW5pb24gbm9kZSAqbjEsICpuMiwgKm4zOworCWludCB0b2s7CisKKwljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJaWYgKG5sZmxhZyA9PSAyICYmIHRva2VuZGxpc3RbcGVla3Rva2VuKCldKQorCQlyZXR1cm4gTlVMTDsKKwluMSA9IE5VTEw7CisJZm9yICg7OykgeworCQluMiA9IGFuZG9yKCk7CisJCXRvayA9IHJlYWR0b2tlbigpOworCQlpZiAodG9rID09IFRCQUNLR05EKSB7CisJCQlpZiAobjItPnR5cGUgPT0gTlBJUEUpIHsKKwkJCQluMi0+bnBpcGUuYmFja2duZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWlmIChuMi0+dHlwZSAhPSBOUkVESVIpIHsKKwkJCQkJbjMgPSBzdGFsbG9jKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSk7CisJCQkJCW4zLT5ucmVkaXIubiA9IG4yOworCQkJCQluMy0+bnJlZGlyLnJlZGlyZWN0ID0gTlVMTDsKKwkJCQkJbjIgPSBuMzsKKwkJCQl9CisJCQkJbjItPnR5cGUgPSBOQkFDS0dORDsKKwkJCX0KKwkJfQorCQlpZiAobjEgPT0gTlVMTCkgeworCQkJbjEgPSBuMjsKKwkJfQorCQllbHNlIHsKKwkJCW4zID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5iaW5hcnkpKTsKKwkJCW4zLT50eXBlID0gTlNFTUk7CisJCQluMy0+bmJpbmFyeS5jaDEgPSBuMTsKKwkJCW4zLT5uYmluYXJ5LmNoMiA9IG4yOworCQkJbjEgPSBuMzsKKwkJfQorCQlzd2l0Y2ggKHRvaykgeworCQljYXNlIFRCQUNLR05EOgorCQljYXNlIFRTRU1JOgorCQkJdG9rID0gcmVhZHRva2VuKCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBUTkw6CisJCQlpZiAodG9rID09IFROTCkgeworCQkJCXBhcnNlaGVyZWRvYygpOworCQkJCWlmIChubGZsYWcgPT0gMSkKKwkJCQkJcmV0dXJuIG4xOworCQkJfSBlbHNlIHsKKwkJCQl0b2twdXNoYmFjaysrOworCQkJfQorCQkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCQkJaWYgKHRva2VuZGxpc3RbcGVla3Rva2VuKCldKQorCQkJCXJldHVybiBuMTsKKwkJCWJyZWFrOworCQljYXNlIFRFT0Y6CisJCQlpZiAoaGVyZWRvY2xpc3QpCisJCQkJcGFyc2VoZXJlZG9jKCk7CisJCQllbHNlCisJCQkJcHVuZ2V0YygpOwkJLyogcHVzaCBiYWNrIEVPRiBvbiBpbnB1dCAqLworCQkJcmV0dXJuIG4xOworCQlkZWZhdWx0OgorCQkJaWYgKG5sZmxhZyA9PSAxKQorCQkJCXN5bmV4cGVjdCgtMSk7CisJCQl0b2twdXNoYmFjaysrOworCQkJcmV0dXJuIG4xOworCQl9CisJfQorfQorCisKKworU1RBVElDIHVuaW9uIG5vZGUgKgorYW5kb3Iodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuMSwgKm4yLCAqbjM7CisJaW50IHQ7CisKKwluMSA9IHBpcGVsaW5lKCk7CisJZm9yICg7OykgeworCQlpZiAoKHQgPSByZWFkdG9rZW4oKSkgPT0gVEFORCkgeworCQkJdCA9IE5BTkQ7CisJCX0gZWxzZSBpZiAodCA9PSBUT1IpIHsKKwkJCXQgPSBOT1I7CisJCX0gZWxzZSB7CisJCQl0b2twdXNoYmFjaysrOworCQkJcmV0dXJuIG4xOworCQl9CisJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJbjIgPSBwaXBlbGluZSgpOworCQluMyA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYmluYXJ5KSk7CisJCW4zLT50eXBlID0gdDsKKwkJbjMtPm5iaW5hcnkuY2gxID0gbjE7CisJCW4zLT5uYmluYXJ5LmNoMiA9IG4yOworCQluMSA9IG4zOworCX0KK30KKworCisKK1NUQVRJQyB1bmlvbiBub2RlICoKK3BpcGVsaW5lKHZvaWQpCit7CisJdW5pb24gbm9kZSAqbjEsICpuMiwgKnBpcGVub2RlOworCXN0cnVjdCBub2RlbGlzdCAqbHAsICpwcmV2OworCWludCBuZWdhdGU7CisKKwluZWdhdGUgPSAwOworCVRSQUNFKCgicGlwZWxpbmU6IGVudGVyZWRcbiIpKTsKKwlpZiAocmVhZHRva2VuKCkgPT0gVE5PVCkgeworCQluZWdhdGUgPSAhbmVnYXRlOworCQljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCX0gZWxzZQorCQl0b2twdXNoYmFjaysrOworCW4xID0gY29tbWFuZCgpOworCWlmIChyZWFkdG9rZW4oKSA9PSBUUElQRSkgeworCQlwaXBlbm9kZSA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBucGlwZSkpOworCQlwaXBlbm9kZS0+dHlwZSA9IE5QSVBFOworCQlwaXBlbm9kZS0+bnBpcGUuYmFja2duZCA9IDA7CisJCWxwID0gKHN0cnVjdCBub2RlbGlzdCAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgbm9kZWxpc3QpKTsKKwkJcGlwZW5vZGUtPm5waXBlLmNtZGxpc3QgPSBscDsKKwkJbHAtPm4gPSBuMTsKKwkJZG8geworCQkJcHJldiA9IGxwOworCQkJbHAgPSAoc3RydWN0IG5vZGVsaXN0ICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBub2RlbGlzdCkpOworCQkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCQkJbHAtPm4gPSBjb21tYW5kKCk7CisJCQlwcmV2LT5uZXh0ID0gbHA7CisJCX0gd2hpbGUgKHJlYWR0b2tlbigpID09IFRQSVBFKTsKKwkJbHAtPm5leHQgPSBOVUxMOworCQluMSA9IHBpcGVub2RlOworCX0KKwl0b2twdXNoYmFjaysrOworCWlmIChuZWdhdGUpIHsKKwkJbjIgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgbm5vdCkpOworCQluMi0+dHlwZSA9IE5OT1Q7CisJCW4yLT5ubm90LmNvbSA9IG4xOworCQlyZXR1cm4gbjI7CisJfSBlbHNlCisJCXJldHVybiBuMTsKK30KKworCisKK1NUQVRJQyB1bmlvbiBub2RlICoKK2NvbW1hbmQodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuMSwgKm4yOworCXVuaW9uIG5vZGUgKmFwLCAqKmFwcDsKKwl1bmlvbiBub2RlICpjcCwgKipjcHA7CisJdW5pb24gbm9kZSAqcmVkaXIsICoqcnBwOworCXVuaW9uIG5vZGUgKipycHAyOworCWludCB0OworCisJcmVkaXIgPSBOVUxMOworCXJwcDIgPSAmcmVkaXI7CisKKwlzd2l0Y2ggKHJlYWR0b2tlbigpKSB7CisJZGVmYXVsdDoKKwkJc3luZXhwZWN0KC0xKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCWNhc2UgVElGOgorCQluMSA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuaWYpKTsKKwkJbjEtPnR5cGUgPSBOSUY7CisJCW4xLT5uaWYudGVzdCA9IGxpc3QoMCk7CisJCWlmIChyZWFkdG9rZW4oKSAhPSBUVEhFTikKKwkJCXN5bmV4cGVjdChUVEhFTik7CisJCW4xLT5uaWYuaWZwYXJ0ID0gbGlzdCgwKTsKKwkJbjIgPSBuMTsKKwkJd2hpbGUgKHJlYWR0b2tlbigpID09IFRFTElGKSB7CisJCQluMi0+bmlmLmVsc2VwYXJ0ID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5pZikpOworCQkJbjIgPSBuMi0+bmlmLmVsc2VwYXJ0OworCQkJbjItPnR5cGUgPSBOSUY7CisJCQluMi0+bmlmLnRlc3QgPSBsaXN0KDApOworCQkJaWYgKHJlYWR0b2tlbigpICE9IFRUSEVOKQorCQkJCXN5bmV4cGVjdChUVEhFTik7CisJCQluMi0+bmlmLmlmcGFydCA9IGxpc3QoMCk7CisJCX0KKwkJaWYgKGxhc3R0b2tlbiA9PSBURUxTRSkKKwkJCW4yLT5uaWYuZWxzZXBhcnQgPSBsaXN0KDApOworCQllbHNlIHsKKwkJCW4yLT5uaWYuZWxzZXBhcnQgPSBOVUxMOworCQkJdG9rcHVzaGJhY2srKzsKKwkJfQorCQl0ID0gVEZJOworCQlicmVhazsKKwljYXNlIFRXSElMRToKKwljYXNlIFRVTlRJTDogeworCQlpbnQgZ290OworCQluMSA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYmluYXJ5KSk7CisJCW4xLT50eXBlID0gKGxhc3R0b2tlbiA9PSBUV0hJTEUpPyBOV0hJTEUgOiBOVU5USUw7CisJCW4xLT5uYmluYXJ5LmNoMSA9IGxpc3QoMCk7CisJCWlmICgoZ290PXJlYWR0b2tlbigpKSAhPSBURE8pIHsKK1RSQUNFKCgiZXhwZWN0aW5nIERPIGdvdCAlcyAlc1xuIiwgdG9rbmFtZVtnb3RdLCBnb3QgPT0gVFdPUkQgPyB3b3JkdGV4dCA6ICIiKSk7CisJCQlzeW5leHBlY3QoVERPKTsKKwkJfQorCQluMS0+bmJpbmFyeS5jaDIgPSBsaXN0KDApOworCQl0ID0gVERPTkU7CisJCWJyZWFrOworCX0KKwljYXNlIFRGT1I6CisJCWlmIChyZWFkdG9rZW4oKSAhPSBUV09SRCB8fCBxdW90ZWZsYWcgfHwgISBnb29kbmFtZSh3b3JkdGV4dCkpCisJCQlzeW5lcnJvcigiQmFkIGZvciBsb29wIHZhcmlhYmxlIik7CisJCW4xID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5mb3IpKTsKKwkJbjEtPnR5cGUgPSBORk9SOworCQluMS0+bmZvci52YXIgPSB3b3JkdGV4dDsKKwkJY2hlY2trd2QgPSBDSEtLV0QgfCBDSEtBTElBUzsKKwkJaWYgKHJlYWR0b2tlbigpID09IFRJTikgeworCQkJYXBwID0gJmFwOworCQkJd2hpbGUgKHJlYWR0b2tlbigpID09IFRXT1JEKSB7CisJCQkJbjIgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmFyZykpOworCQkJCW4yLT50eXBlID0gTkFSRzsKKwkJCQluMi0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCQkJbjItPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwkJCQkqYXBwID0gbjI7CisJCQkJYXBwID0gJm4yLT5uYXJnLm5leHQ7CisJCQl9CisJCQkqYXBwID0gTlVMTDsKKwkJCW4xLT5uZm9yLmFyZ3MgPSBhcDsKKwkJCWlmIChsYXN0dG9rZW4gIT0gVE5MICYmIGxhc3R0b2tlbiAhPSBUU0VNSSkKKwkJCQlzeW5leHBlY3QoLTEpOworCQl9IGVsc2UgeworCQkJbjIgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmFyZykpOworCQkJbjItPnR5cGUgPSBOQVJHOworCQkJbjItPm5hcmcudGV4dCA9IChjaGFyICopZG9sYXRzdHI7CisJCQluMi0+bmFyZy5iYWNrcXVvdGUgPSBOVUxMOworCQkJbjItPm5hcmcubmV4dCA9IE5VTEw7CisJCQluMS0+bmZvci5hcmdzID0gbjI7CisJCQkvKgorCQkJICogTmV3bGluZSBvciBzZW1pY29sb24gaGVyZSBpcyBvcHRpb25hbCAoYnV0IG5vdGUKKwkJCSAqIHRoYXQgdGhlIG9yaWdpbmFsIEJvdXJuZSBzaGVsbCBvbmx5IGFsbG93ZWQgTkwpLgorCQkJICovCisJCQlpZiAobGFzdHRva2VuICE9IFROTCAmJiBsYXN0dG9rZW4gIT0gVFNFTUkpCisJCQkJdG9rcHVzaGJhY2srKzsKKwkJfQorCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCWlmIChyZWFkdG9rZW4oKSAhPSBURE8pCisJCQlzeW5leHBlY3QoVERPKTsKKwkJbjEtPm5mb3IuYm9keSA9IGxpc3QoMCk7CisJCXQgPSBURE9ORTsKKwkJYnJlYWs7CisJY2FzZSBUQ0FTRToKKwkJbjEgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmNhc2UpKTsKKwkJbjEtPnR5cGUgPSBOQ0FTRTsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRXT1JEKQorCQkJc3luZXhwZWN0KFRXT1JEKTsKKwkJbjEtPm5jYXNlLmV4cHIgPSBuMiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYXJnKSk7CisJCW4yLT50eXBlID0gTkFSRzsKKwkJbjItPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQluMi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQluMi0+bmFyZy5uZXh0ID0gTlVMTDsKKwkJZG8geworCQkJY2hlY2trd2QgPSBDSEtLV0QgfCBDSEtBTElBUzsKKwkJfSB3aGlsZSAocmVhZHRva2VuKCkgPT0gVE5MKTsKKwkJaWYgKGxhc3R0b2tlbiAhPSBUSU4pCisJCQlzeW5leHBlY3QoVElOKTsKKwkJY3BwID0gJm4xLT5uY2FzZS5jYXNlczsKK25leHRfY2FzZToKKwkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRDsKKwkJdCA9IHJlYWR0b2tlbigpOworCQl3aGlsZSh0ICE9IFRFU0FDKSB7CisJCQlpZiAobGFzdHRva2VuID09IFRMUCkKKwkJCQlyZWFkdG9rZW4oKTsKKwkJCSpjcHAgPSBjcCA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuY2xpc3QpKTsKKwkJCWNwLT50eXBlID0gTkNMSVNUOworCQkJYXBwID0gJmNwLT5uY2xpc3QucGF0dGVybjsKKwkJCWZvciAoOzspIHsKKwkJCQkqYXBwID0gYXAgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmFyZykpOworCQkJCWFwLT50eXBlID0gTkFSRzsKKwkJCQlhcC0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCQkJYXAtPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwkJCQlpZiAocmVhZHRva2VuKCkgIT0gVFBJUEUpCisJCQkJCWJyZWFrOworCQkJCWFwcCA9ICZhcC0+bmFyZy5uZXh0OworCQkJCXJlYWR0b2tlbigpOworCQkJfQorCQkJYXAtPm5hcmcubmV4dCA9IE5VTEw7CisJCQlpZiAobGFzdHRva2VuICE9IFRSUCkKKwkJCQlzeW5leHBlY3QoVFJQKTsKKwkJCWNwLT5uY2xpc3QuYm9keSA9IGxpc3QoMik7CisKKwkJCWNwcCA9ICZjcC0+bmNsaXN0Lm5leHQ7CisKKwkJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0Q7CisJCQlpZiAoKHQgPSByZWFkdG9rZW4oKSkgIT0gVEVTQUMpIHsKKwkJCQlpZiAodCAhPSBURU5EQ0FTRSkKKwkJCQkJc3luZXhwZWN0KFRFTkRDQVNFKTsKKwkJCQllbHNlCisJCQkJCWdvdG8gbmV4dF9jYXNlOworCQkJfQorCQl9CisJCSpjcHAgPSBOVUxMOworCQlnb3RvIHJlZGlyOworCWNhc2UgVExQOgorCQluMSA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBucmVkaXIpKTsKKwkJbjEtPnR5cGUgPSBOU1VCU0hFTEw7CisJCW4xLT5ucmVkaXIubiA9IGxpc3QoMCk7CisJCW4xLT5ucmVkaXIucmVkaXJlY3QgPSBOVUxMOworCQl0ID0gVFJQOworCQlicmVhazsKKwljYXNlIFRCRUdJTjoKKwkJbjEgPSBsaXN0KDApOworCQl0ID0gVEVORDsKKwkJYnJlYWs7CisJY2FzZSBUV09SRDoKKwljYXNlIFRSRURJUjoKKwkJdG9rcHVzaGJhY2srKzsKKwkJcmV0dXJuIHNpbXBsZWNtZCgpOworCX0KKworCWlmIChyZWFkdG9rZW4oKSAhPSB0KQorCQlzeW5leHBlY3QodCk7CisKK3JlZGlyOgorCS8qIE5vdyBjaGVjayBmb3IgcmVkaXJlY3Rpb24gd2hpY2ggbWF5IGZvbGxvdyBjb21tYW5kICovCisJY2hlY2trd2QgPSBDSEtLV0QgfCBDSEtBTElBUzsKKwlycHAgPSBycHAyOworCXdoaWxlIChyZWFkdG9rZW4oKSA9PSBUUkVESVIpIHsKKwkJKnJwcCA9IG4yID0gcmVkaXJub2RlOworCQlycHAgPSAmbjItPm5maWxlLm5leHQ7CisJCXBhcnNlZm5hbWUoKTsKKwl9CisJdG9rcHVzaGJhY2srKzsKKwkqcnBwID0gTlVMTDsKKwlpZiAocmVkaXIpIHsKKwkJaWYgKG4xLT50eXBlICE9IE5TVUJTSEVMTCkgeworCQkJbjIgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbnJlZGlyKSk7CisJCQluMi0+dHlwZSA9IE5SRURJUjsKKwkJCW4yLT5ucmVkaXIubiA9IG4xOworCQkJbjEgPSBuMjsKKwkJfQorCQluMS0+bnJlZGlyLnJlZGlyZWN0ID0gcmVkaXI7CisJfQorCisJcmV0dXJuIG4xOworfQorCisKK1NUQVRJQyB1bmlvbiBub2RlICoKK3NpbXBsZWNtZCh2b2lkKSB7CisJdW5pb24gbm9kZSAqYXJncywgKiphcHA7CisJdW5pb24gbm9kZSAqbiA9IE5VTEw7CisJdW5pb24gbm9kZSAqdmFycywgKip2cHA7CisJdW5pb24gbm9kZSAqKnJwcCwgKnJlZGlyOworCWludCBzYXZlY2hlY2trd2Q7CisKKwlhcmdzID0gTlVMTDsKKwlhcHAgPSAmYXJnczsKKwl2YXJzID0gTlVMTDsKKwl2cHAgPSAmdmFyczsKKwlyZWRpciA9IE5VTEw7CisJcnBwID0gJnJlZGlyOworCisJc2F2ZWNoZWNra3dkID0gQ0hLQUxJQVM7CisJZm9yICg7OykgeworCQljaGVja2t3ZCA9IHNhdmVjaGVja2t3ZDsKKwkJc3dpdGNoIChyZWFkdG9rZW4oKSkgeworCQljYXNlIFRXT1JEOgorCQkJbiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYXJnKSk7CisJCQluLT50eXBlID0gTkFSRzsKKwkJCW4tPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQkJbi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQkJaWYgKHNhdmVjaGVja2t3ZCAmJiBpc2Fzc2lnbm1lbnQod29yZHRleHQpKSB7CisJCQkJKnZwcCA9IG47CisJCQkJdnBwID0gJm4tPm5hcmcubmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJKmFwcCA9IG47CisJCQkJYXBwID0gJm4tPm5hcmcubmV4dDsKKwkJCQlzYXZlY2hlY2trd2QgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFJFRElSOgorCQkJKnJwcCA9IG4gPSByZWRpcm5vZGU7CisJCQlycHAgPSAmbi0+bmZpbGUubmV4dDsKKwkJCXBhcnNlZm5hbWUoKTsJLyogcmVhZCBuYW1lIG9mIHJlZGlyZWN0aW9uIGZpbGUgKi8KKwkJCWJyZWFrOworCQljYXNlIFRMUDoKKwkJCWlmICgKKwkJCQlhcmdzICYmIGFwcCA9PSAmYXJncy0+bmFyZy5uZXh0ICYmCisJCQkJIXZhcnMgJiYgIXJlZGlyCisJCQkpIHsKKwkJCQlzdHJ1Y3QgYnVpbHRpbmNtZCAqYmNtZDsKKwkJCQljb25zdCBjaGFyICpuYW1lOworCisJCQkJLyogV2UgaGF2ZSBhIGZ1bmN0aW9uICovCisJCQkJaWYgKHJlYWR0b2tlbigpICE9IFRSUCkKKwkJCQkJc3luZXhwZWN0KFRSUCk7CisJCQkJbmFtZSA9IG4tPm5hcmcudGV4dDsKKwkJCQlpZiAoCisJCQkJCSFnb29kbmFtZShuYW1lKSB8fCAoCisJCQkJCQkoYmNtZCA9IGZpbmRfYnVpbHRpbihuYW1lKSkgJiYKKwkJCQkJCWJjbWQtPmZsYWdzICYgQlVJTFRJTl9TUEVDSUFMCisJCQkJCSkKKwkJCQkpCisJCQkJCXN5bmVycm9yKCJCYWQgZnVuY3Rpb24gbmFtZSIpOworCQkJCW4tPnR5cGUgPSBOREVGVU47CisJCQkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCQkJCW4tPm5hcmcubmV4dCA9IGNvbW1hbmQoKTsKKwkJCQlyZXR1cm4gbjsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJdG9rcHVzaGJhY2srKzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCSphcHAgPSBOVUxMOworCSp2cHAgPSBOVUxMOworCSpycHAgPSBOVUxMOworCW4gPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmNtZCkpOworCW4tPnR5cGUgPSBOQ01EOworCW4tPm5jbWQuYXJncyA9IGFyZ3M7CisJbi0+bmNtZC5hc3NpZ24gPSB2YXJzOworCW4tPm5jbWQucmVkaXJlY3QgPSByZWRpcjsKKwlyZXR1cm4gbjsKK30KKworU1RBVElDIHVuaW9uIG5vZGUgKgorbWFrZW5hbWUodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuOworCisJbiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYXJnKSk7CisJbi0+dHlwZSA9IE5BUkc7CisJbi0+bmFyZy5uZXh0ID0gTlVMTDsKKwluLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwluLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJcmV0dXJuIG47Cit9CisKK3ZvaWQgZml4cmVkaXIodW5pb24gbm9kZSAqbiwgY29uc3QgY2hhciAqdGV4dCwgaW50IGVycikKKwl7CisJVFJBQ0UoKCJGaXggcmVkaXIgJXMgJWRcbiIsIHRleHQsIGVycikpOworCWlmICghZXJyKQorCQluLT5uZHVwLnZuYW1lID0gTlVMTDsKKworCWlmIChpc19kaWdpdCh0ZXh0WzBdKSAmJiB0ZXh0WzFdID09ICdcMCcpCisJCW4tPm5kdXAuZHVwZmQgPSBkaWdpdF92YWwodGV4dFswXSk7CisJZWxzZSBpZiAodGV4dFswXSA9PSAnLScgJiYgdGV4dFsxXSA9PSAnXDAnKQorCQluLT5uZHVwLmR1cGZkID0gLTE7CisJZWxzZSB7CisKKwkJaWYgKGVycikKKwkJCXN5bmVycm9yKCJCYWQgZmQgbnVtYmVyIik7CisJCWVsc2UKKwkJCW4tPm5kdXAudm5hbWUgPSBtYWtlbmFtZSgpOworCX0KK30KKworCitTVEFUSUMgdm9pZAorcGFyc2VmbmFtZSh2b2lkKQoreworCXVuaW9uIG5vZGUgKm4gPSByZWRpcm5vZGU7CisKKwlpZiAocmVhZHRva2VuKCkgIT0gVFdPUkQpCisJCXN5bmV4cGVjdCgtMSk7CisJaWYgKG4tPnR5cGUgPT0gTkhFUkUpIHsKKwkJc3RydWN0IGhlcmVkb2MgKmhlcmUgPSBoZXJlZG9jOworCQlzdHJ1Y3QgaGVyZWRvYyAqcDsKKwkJaW50IGk7CisKKwkJaWYgKHF1b3RlZmxhZyA9PSAwKQorCQkJbi0+dHlwZSA9IE5YSEVSRTsKKwkJVFJBQ0UoKCJIZXJlIGRvY3VtZW50ICVkXG4iLCBuLT50eXBlKSk7CisJCWlmICghIG5vZXhwYW5kKHdvcmR0ZXh0KSB8fCAoaSA9IHN0cmxlbih3b3JkdGV4dCkpID09IDAgfHwgaSA+IEVPRk1BUktMRU4pCisJCQlzeW5lcnJvcigiSWxsZWdhbCBlb2YgbWFya2VyIGZvciA8PCByZWRpcmVjdGlvbiIpOworCQlybWVzY2FwZXMod29yZHRleHQpOworCQloZXJlLT5lb2ZtYXJrID0gd29yZHRleHQ7CisJCWhlcmUtPm5leHQgPSBOVUxMOworCQlpZiAoaGVyZWRvY2xpc3QgPT0gTlVMTCkKKwkJCWhlcmVkb2NsaXN0ID0gaGVyZTsKKwkJZWxzZSB7CisJCQlmb3IgKHAgPSBoZXJlZG9jbGlzdCA7IHAtPm5leHQgOyBwID0gcC0+bmV4dCk7CisJCQlwLT5uZXh0ID0gaGVyZTsKKwkJfQorCX0gZWxzZSBpZiAobi0+dHlwZSA9PSBOVE9GRCB8fCBuLT50eXBlID09IE5GUk9NRkQpIHsKKwkJZml4cmVkaXIobiwgd29yZHRleHQsIDApOworCX0gZWxzZSB7CisJCW4tPm5maWxlLmZuYW1lID0gbWFrZW5hbWUoKTsKKwl9Cit9CisKKworLyoKKyAqIElucHV0IGFueSBoZXJlIGRvY3VtZW50cy4KKyAqLworCitTVEFUSUMgdm9pZAorcGFyc2VoZXJlZG9jKHZvaWQpCit7CisJc3RydWN0IGhlcmVkb2MgKmhlcmU7CisJdW5pb24gbm9kZSAqbjsKKworCWhlcmUgPSBoZXJlZG9jbGlzdDsKKwloZXJlZG9jbGlzdCA9IDA7CisKKwl3aGlsZSAoaGVyZSkgeworCQlpZiAobmVlZHByb21wdCkgeworCQkJc2V0cHJvbXB0KDIpOworCQl9CisJCXJlYWR0b2tlbjEocGdldGMoKSwgaGVyZS0+aGVyZS0+dHlwZSA9PSBOSEVSRT8gU1FTWU5UQVggOiBEUVNZTlRBWCwKKwkJCQloZXJlLT5lb2ZtYXJrLCBoZXJlLT5zdHJpcHRhYnMpOworCQluID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5hcmcpKTsKKwkJbi0+bmFyZy50eXBlID0gTkFSRzsKKwkJbi0+bmFyZy5uZXh0ID0gTlVMTDsKKwkJbi0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCW4tPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwkJaGVyZS0+aGVyZS0+bmhlcmUuZG9jID0gbjsKKwkJaGVyZSA9IGhlcmUtPm5leHQ7CisJfQorfQorCitTVEFUSUMgaW50CitwZWVrdG9rZW4odm9pZCkKK3sKKwlpbnQgdDsKKworCXQgPSByZWFkdG9rZW4oKTsKKwl0b2twdXNoYmFjaysrOworCXJldHVybiAodCk7Cit9CisKK1NUQVRJQyBpbnQKK3JlYWR0b2tlbih2b2lkKQoreworCWludCB0OworI2lmZGVmIERFQlVHCisJaW50IGFscmVhZHlzZWVuID0gdG9rcHVzaGJhY2s7CisjZW5kaWYKKwordG9wOgorCXQgPSB4eHJlYWR0b2tlbigpOworCisJLyoKKwkgKiBlYXQgbmV3bGluZXMKKwkgKi8KKwlpZiAoY2hlY2trd2QgJiBDSEtOTCkgeworCQl3aGlsZSAodCA9PSBUTkwpIHsKKwkJCXBhcnNlaGVyZWRvYygpOworCQkJdCA9IHh4cmVhZHRva2VuKCk7CisJCX0KKwl9CisKKwlpZiAodCAhPSBUV09SRCB8fCBxdW90ZWZsYWcpIHsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBjaGVjayBmb3Iga2V5d29yZHMKKwkgKi8KKwlpZiAoY2hlY2trd2QgJiBDSEtLV0QpIHsKKwkJY29uc3QgY2hhciAqY29uc3QgKnBwOworCisJCWlmICgocHAgPSBmaW5ka3dkKHdvcmR0ZXh0KSkpIHsKKwkJCWxhc3R0b2tlbiA9IHQgPSBwcCAtIHBhcnNla3dkICsgS1dET0ZGU0VUOworCQkJVFJBQ0UoKCJrZXl3b3JkICVzIHJlY29nbml6ZWRcbiIsIHRva25hbWVbdF0pKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNoZWNra3dkICYgQ0hLQUxJQVMpIHsKKwkJc3RydWN0IGFsaWFzICphcDsKKwkJaWYgKChhcCA9IGxvb2t1cGFsaWFzKHdvcmR0ZXh0LCAxKSkgIT0gTlVMTCkgeworCQkJaWYgKCphcC0+dmFsKSB7CisJCQkJcHVzaHN0cmluZyhhcC0+dmFsLCBhcCk7CisJCQl9CisJCQlnb3RvIHRvcDsKKwkJfQorCX0KK291dDoKKwljaGVja2t3ZCA9IDA7CisjaWZkZWYgREVCVUcKKwlpZiAoIWFscmVhZHlzZWVuKQorCSAgICBUUkFDRSgoInRva2VuICVzICVzXG4iLCB0b2tuYW1lW3RdLCB0ID09IFRXT1JEID8gd29yZHRleHQgOiAiIikpOworCWVsc2UKKwkgICAgVFJBQ0UoKCJyZXJlYWQgdG9rZW4gJXMgJXNcbiIsIHRva25hbWVbdF0sIHQgPT0gVFdPUkQgPyB3b3JkdGV4dCA6ICIiKSk7CisjZW5kaWYKKwlyZXR1cm4gKHQpOworfQorCisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGlucHV0IHRva2VuLgorICogSWYgdGhlIHRva2VuIGlzIGEgd29yZCwgd2Ugc2V0IGJhY2txdW90ZWxpc3QgdG8gdGhlIGxpc3Qgb2YgY21kcyBpbgorICoJYmFja3F1b3Rlcy4gIFdlIHNldCBxdW90ZWZsYWcgdG8gdHJ1ZSBpZiBhbnkgcGFydCBvZiB0aGUgd29yZCB3YXMKKyAqCXF1b3RlZC4KKyAqIElmIHRoZSB0b2tlbiBpcyBUUkVESVIsIHRoZW4gd2Ugc2V0IHJlZGlybm9kZSB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nCisgKgl0aGUgcmVkaXJlY3Rpb24uCisgKiBJbiBhbGwgY2FzZXMsIHRoZSB2YXJpYWJsZSBzdGFydGxpbm5vIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRoZSBsaW5lCisgKglvbiB3aGljaCB0aGUgdG9rZW4gc3RhcnRzLgorICoKKyAqIFtDaGFuZ2UgY29tbWVudDogIGhlcmUgZG9jdW1lbnRzIGFuZCBpbnRlcm5hbCBwcm9jZWR1cmVzXQorICogW1JlYWR0b2tlbiBzaG91bGRuJ3QgaGF2ZSBhbnkgYXJndW1lbnRzLiAgUGVyaGFwcyB3ZSBzaG91bGQgbWFrZSB0aGUKKyAqICB3b3JkIHBhcnNpbmcgY29kZSBpbnRvIGEgc2VwYXJhdGUgcm91dGluZS4gIEluIHRoaXMgY2FzZSwgcmVhZHRva2VuCisgKiAgZG9lc24ndCBuZWVkIHRvIGhhdmUgYW55IGludGVybmFsIHByb2NlZHVyZXMsIGJ1dCBwYXJzZXdvcmQgZG9lcy4KKyAqICBXZSBjb3VsZCBhbHNvIG1ha2UgcGFyc2VvcGVyYXRvciBpbiBlc3NlbmNlIHRoZSBtYWluIHJvdXRpbmUsIGFuZAorICogIGhhdmUgcGFyc2V3b3JkIChyZWFkdG9rZW4xPykgaGFuZGxlIGJvdGggd29yZHMgYW5kIHJlZGlyZWN0aW9uLl0KKyAqLworCisjZGVmaW5lIFJFVFVSTih0b2tlbikJcmV0dXJuIGxhc3R0b2tlbiA9IHRva2VuCisKK1NUQVRJQyBpbnQKK3h4cmVhZHRva2VuKHZvaWQpCit7CisJaW50IGM7CisKKwlpZiAodG9rcHVzaGJhY2spIHsKKwkJdG9rcHVzaGJhY2sgPSAwOworCQlyZXR1cm4gbGFzdHRva2VuOworCX0KKwlpZiAobmVlZHByb21wdCkgeworCQlzZXRwcm9tcHQoMik7CisJfQorCXN0YXJ0bGlubm8gPSBwbGlubm87CisJZm9yICg7OykgewkvKiB1bnRpbCB0b2tlbiBvciBzdGFydCBvZiB3b3JkIGZvdW5kICovCisJCWMgPSBwZ2V0Y19tYWNybygpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnICc6IGNhc2UgJ1x0JzoKKwkJY2FzZSBQRU9BOgorCQkJY29udGludWU7CisJCWNhc2UgJyMnOgorCQkJd2hpbGUgKChjID0gcGdldGMoKSkgIT0gJ1xuJyAmJiBjICE9IFBFT0YpOworCQkJcHVuZ2V0YygpOworCQkJY29udGludWU7CisJCWNhc2UgJ1xcJzoKKwkJCWlmIChwZ2V0YygpID09ICdcbicpIHsKKwkJCQlzdGFydGxpbm5vID0gKytwbGlubm87CisJCQkJaWYgKGRvcHJvbXB0KQorCQkJCQlzZXRwcm9tcHQoMik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwdW5nZXRjKCk7CisJCQlnb3RvIGJyZWFrbG9vcDsKKwkJY2FzZSAnXG4nOgorCQkJcGxpbm5vKys7CisJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQlSRVRVUk4oVE5MKTsKKwkJY2FzZSBQRU9GOgorCQkJUkVUVVJOKFRFT0YpOworCQljYXNlICcmJzoKKwkJCWlmIChwZ2V0YygpID09ICcmJykKKwkJCQlSRVRVUk4oVEFORCk7CisJCQlwdW5nZXRjKCk7CisJCQlSRVRVUk4oVEJBQ0tHTkQpOworCQljYXNlICd8JzoKKwkJCWlmIChwZ2V0YygpID09ICd8JykKKwkJCQlSRVRVUk4oVE9SKTsKKwkJCXB1bmdldGMoKTsKKwkJCVJFVFVSTihUUElQRSk7CisJCWNhc2UgJzsnOgorCQkJaWYgKHBnZXRjKCkgPT0gJzsnKQorCQkJCVJFVFVSTihURU5EQ0FTRSk7CisJCQlwdW5nZXRjKCk7CisJCQlSRVRVUk4oVFNFTUkpOworCQljYXNlICcoJzoKKwkJCVJFVFVSTihUTFApOworCQljYXNlICcpJzoKKwkJCVJFVFVSTihUUlApOworCQlkZWZhdWx0OgorCQkJZ290byBicmVha2xvb3A7CisJCX0KKwl9CiticmVha2xvb3A6CisJcmV0dXJuIHJlYWR0b2tlbjEoYywgQkFTRVNZTlRBWCwgKGNoYXIgKilOVUxMLCAwKTsKKyN1bmRlZiBSRVRVUk4KK30KKworCisKKy8qCisgKiBJZiBlb2ZtYXJrIGlzIE5VTEwsIHJlYWQgYSB3b3JkIG9yIGEgcmVkaXJlY3Rpb24gc3ltYm9sLiAgSWYgZW9mbWFyaworICogaXMgbm90IE5VTEwsIHJlYWQgYSBoZXJlIGRvY3VtZW50LiAgSW4gdGhlIGxhdHRlciBjYXNlLCBlb2ZtYXJrIGlzIHRoZQorICogd29yZCB3aGljaCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCBhbmQgc3RyaXB0YWJzIGlzIHRydWUgaWYKKyAqIGxlYWRpbmcgdGFicyBzaG91bGQgYmUgc3RyaXBwZWQgZnJvbSB0aGUgZG9jdW1lbnQuICBUaGUgYXJndW1lbnQgZmlyc3RjCisgKiBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCB0b2tlbiBvciBkb2N1bWVudC4KKyAqCisgKiBCZWNhdXNlIEMgZG9lcyBub3QgaGF2ZSBpbnRlcm5hbCBzdWJyb3V0aW5lcywgSSBoYXZlIHNpbXVsYXRlZCB0aGVtCisgKiB1c2luZyBnb3RvJ3MgdG8gaW1wbGVtZW50IHRoZSBzdWJyb3V0aW5lIGxpbmthZ2UuICBUaGUgZm9sbG93aW5nIG1hY3JvcworICogd2lsbCBydW4gY29kZSB0aGF0IGFwcGVhcnMgYXQgdGhlIGVuZCBvZiByZWFkdG9rZW4xLgorICovCisKKyNkZWZpbmUgQ0hFQ0tFTkQoKQl7Z290byBjaGVja2VuZDsgY2hlY2tlbmRfcmV0dXJuOjt9CisjZGVmaW5lIFBBUlNFUkVESVIoKQl7Z290byBwYXJzZXJlZGlyOyBwYXJzZXJlZGlyX3JldHVybjo7fQorI2RlZmluZSBQQVJTRVNVQigpCXtnb3RvIHBhcnNlc3ViOyBwYXJzZXN1Yl9yZXR1cm46O30KKyNkZWZpbmUgUEFSU0VCQUNLUU9MRCgpCXtvbGRzdHlsZSA9IDE7IGdvdG8gcGFyc2ViYWNrcTsgcGFyc2ViYWNrcV9vbGRyZXR1cm46O30KKyNkZWZpbmUgUEFSU0VCQUNLUU5FVygpCXtvbGRzdHlsZSA9IDA7IGdvdG8gcGFyc2ViYWNrcTsgcGFyc2ViYWNrcV9uZXdyZXR1cm46O30KKyNkZWZpbmUJUEFSU0VBUklUSCgpCXtnb3RvIHBhcnNlYXJpdGg7IHBhcnNlYXJpdGhfcmV0dXJuOjt9CisKK1NUQVRJQyBpbnQKK3JlYWR0b2tlbjEoaW50IGZpcnN0YywgY2hhciBjb25zdCAqc3ludGF4LCBjaGFyICplb2ZtYXJrLCBpbnQgc3RyaXB0YWJzKQoreworCWludCBjID0gZmlyc3RjOworCWNoYXIgKm91dDsKKwlpbnQgbGVuOworCWNoYXIgbGluZVtFT0ZNQVJLTEVOICsgMV07CisJc3RydWN0IG5vZGVsaXN0ICpicWxpc3Q7CisJaW50IHF1b3RlZjsKKwlpbnQgZGJscXVvdGU7CisJaW50IHZhcm5lc3Q7CS8qIGxldmVscyBvZiB2YXJpYWJsZXMgZXhwYW5zaW9uICovCisJaW50IGFyaW5lc3Q7CS8qIGxldmVscyBvZiBhcml0aG1ldGljIGV4cGFuc2lvbiAqLworCWludCBwYXJlbmxldmVsOwkvKiBsZXZlbHMgb2YgcGFyZW5zIGluIGFyaXRobWV0aWMgKi8KKwlpbnQgZHF2YXJuZXN0OwkvKiBsZXZlbHMgb2YgdmFyaWFibGVzIGV4cGFuc2lvbiB3aXRoaW4gZG91YmxlIHF1b3RlcyAqLworCWludCBvbGRzdHlsZTsKKwljaGFyIGNvbnN0ICpwcmV2c3ludGF4ID0gTlVMTDsgLyogc3ludGF4IGJlZm9yZSBhcml0aG1ldGljICovCisKKwlzdGFydGxpbm5vID0gcGxpbm5vOworCWRibHF1b3RlID0gMDsKKwlpZiAoc3ludGF4ID09IERRU1lOVEFYKQorCQlkYmxxdW90ZSA9IDE7CisJcXVvdGVmID0gMDsKKwlicWxpc3QgPSBOVUxMOworCXZhcm5lc3QgPSAwOworCWFyaW5lc3QgPSAwOworCXBhcmVubGV2ZWwgPSAwOworCWRxdmFybmVzdCA9IDA7CisKKwlTVEFSVFNUQUNLU1RSKG91dCk7CisJbG9vcDogewkvKiBmb3IgZWFjaCBsaW5lLCB1bnRpbCBlbmQgb2Ygd29yZCAqLworI2lmIEFUVFkKKwkJaWYgKGMgPT0gJ1wwMzQnICYmIGRvcHJvbXB0CisJCSAmJiBhdHR5c2V0KCkgJiYgISBlcXVhbCh0ZXJtdmFsKCksICJlbWFjcyIpKSB7CisJCQlhdHR5bGluZSgpOworCQkJaWYgKHN5bnRheCA9PSBCQVNFU1lOVEFYKQorCQkJCXJldHVybiByZWFkdG9rZW4oKTsKKwkJCWMgPSBwZ2V0YygpOworCQkJZ290byBsb29wOworCQl9CisjZW5kaWYKKwkJQ0hFQ0tFTkQoKTsJLyogc2V0IGMgdG8gUEVPRiBpZiBhdCBlbmQgb2YgaGVyZSBkb2N1bWVudCAqLworCQlmb3IgKDs7KSB7CS8qIHVudGlsIGVuZCBvZiBsaW5lIG9yIGVuZCBvZiB3b3JkICovCisJCQlDSEVDS1NUUlNQQUNFKDQsIG91dCk7CS8qIHBlcm1pdCA0IGNhbGxzIHRvIFVTVFBVVEMgKi8KKwkJCXN3aXRjaChzeW50YXhbY10pIHsKKwkJCWNhc2UgQ05MOgkvKiAnXG4nICovCisJCQkJaWYgKHN5bnRheCA9PSBCQVNFU1lOVEFYKQorCQkJCQlnb3RvIGVuZHdvcmQ7CS8qIGV4aXQgb3V0ZXIgbG9vcCAqLworCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQlwbGlubm8rKzsKKwkJCQlpZiAoZG9wcm9tcHQpCisJCQkJCXNldHByb21wdCgyKTsKKwkJCQljID0gcGdldGMoKTsKKwkJCQlnb3RvIGxvb3A7CQkvKiBjb250aW51ZSBvdXRlciBsb29wICovCisJCQljYXNlIENXT1JEOgorCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0NUTDoKKwkJCQlpZiAoZW9mbWFyayA9PSBOVUxMIHx8IGRibHF1b3RlKQorCQkJCQlVU1RQVVRDKENUTEVTQywgb3V0KTsKKwkJCQlVU1RQVVRDKGMsIG91dCk7CisJCQkJYnJlYWs7CisJCQljYXNlIENCQUNLOgkvKiBiYWNrc2xhc2ggKi8KKwkJCQljID0gcGdldGMyKCk7CisJCQkJaWYgKGMgPT0gUEVPRikgeworCQkJCQlVU1RQVVRDKENUTEVTQywgb3V0KTsKKwkJCQkJVVNUUFVUQygnXFwnLCBvdXQpOworCQkJCQlwdW5nZXRjKCk7CisJCQkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCQkJaWYgKGRvcHJvbXB0KQorCQkJCQkJc2V0cHJvbXB0KDIpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgKKwkJCQkJCWRibHF1b3RlICYmCisJCQkJCQljICE9ICdcXCcgJiYgYyAhPSAnYCcgJiYKKwkJCQkJCWMgIT0gJyQnICYmICgKKwkJCQkJCQljICE9ICciJyB8fAorCQkJCQkJCWVvZm1hcmsgIT0gTlVMTAorCQkJCQkJKQorCQkJCQkpIHsKKwkJCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCQkJVVNUUFVUQygnXFwnLCBvdXQpOworCQkJCQl9CisJCQkJCWlmIChTUVNZTlRBWFtjXSA9PSBDQ1RMKQorCQkJCQkJVVNUUFVUQyhDVExFU0MsIG91dCk7CisJCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQkJcXVvdGVmKys7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDU1FVT1RFOgorCQkJCXN5bnRheCA9IFNRU1lOVEFYOworcXVvdGVtYXJrOgorCQkJCWlmIChlb2ZtYXJrID09IE5VTEwpIHsKKwkJCQkJVVNUUFVUQyhDVExRVU9URU1BUkssIG91dCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDRFFVT1RFOgorCQkJCXN5bnRheCA9IERRU1lOVEFYOworCQkJCWRibHF1b3RlID0gMTsKKwkJCQlnb3RvIHF1b3RlbWFyazsKKwkJCWNhc2UgQ0VORFFVT1RFOgorCQkJCWlmIChlb2ZtYXJrICE9IE5VTEwgJiYgYXJpbmVzdCA9PSAwICYmCisJCQkJICAgIHZhcm5lc3QgPT0gMCkgeworCQkJCQlVU1RQVVRDKGMsIG91dCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGRxdmFybmVzdCA9PSAwKSB7CisJCQkJCQlzeW50YXggPSBCQVNFU1lOVEFYOworCQkJCQkJZGJscXVvdGUgPSAwOworCQkJCQl9CisJCQkJCXF1b3RlZisrOworCQkJCQlnb3RvIHF1b3RlbWFyazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENWQVI6CS8qICckJyAqLworCQkJCVBBUlNFU1VCKCk7CQkvKiBwYXJzZSBzdWJzdGl0dXRpb24gKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgQ0VORFZBUjoJLyogJ30nICovCisJCQkJaWYgKHZhcm5lc3QgPiAwKSB7CisJCQkJCXZhcm5lc3QtLTsKKwkJCQkJaWYgKGRxdmFybmVzdCA+IDApIHsKKwkJCQkJCWRxdmFybmVzdC0tOworCQkJCQl9CisJCQkJCVVTVFBVVEMoQ1RMRU5EVkFSLCBvdXQpOworCQkJCX0gZWxzZSB7CisJCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENMUDoJLyogJygnIGluIGFyaXRobWV0aWMgKi8KKwkJCQlwYXJlbmxldmVsKys7CisJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBDUlA6CS8qICcpJyBpbiBhcml0aG1ldGljICovCisJCQkJaWYgKHBhcmVubGV2ZWwgPiAwKSB7CisJCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQkJLS1wYXJlbmxldmVsOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChwZ2V0YygpID09ICcpJykgeworCQkJCQkJaWYgKC0tYXJpbmVzdCA9PSAwKSB7CisJCQkJCQkJVVNUUFVUQyhDVExFTkRBUkksIG91dCk7CisJCQkJCQkJc3ludGF4ID0gcHJldnN5bnRheDsKKwkJCQkJCQlpZiAoc3ludGF4ID09IERRU1lOVEFYKQorCQkJCQkJCQlkYmxxdW90ZSA9IDE7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlkYmxxdW90ZSA9IDA7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlVU1RQVVRDKCcpJywgb3V0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qCisJCQkJCQkgKiB1bmJhbGFuY2VkIHBhcmVucworCQkJCQkJICogIChkb24ndCAybmQgZ3Vlc3MgLSBubyBlcnJvcikKKwkJCQkJCSAqLworCQkJCQkJcHVuZ2V0YygpOworCQkJCQkJVVNUUFVUQygnKScsIG91dCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENCUVVPVEU6CS8qICdgJyAqLworCQkJCVBBUlNFQkFDS1FPTEQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0VPRjoKKwkJCQlnb3RvIGVuZHdvcmQ7CQkvKiBleGl0IG91dGVyIGxvb3AgKi8KKwkJCWNhc2UgQ0lHTjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKHZhcm5lc3QgPT0gMCkKKwkJCQkJZ290byBlbmR3b3JkOwkvKiBleGl0IG91dGVyIGxvb3AgKi8KKwkJCQlpZiAoYyAhPSBQRU9BKSB7CisJCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQl9CisJCQl9CisJCQljID0gcGdldGNfbWFjcm8oKTsKKwkJfQorCX0KK2VuZHdvcmQ6CisJaWYgKHN5bnRheCA9PSBBUklTWU5UQVgpCisJCXN5bmVycm9yKCJNaXNzaW5nICcpKSciKTsKKwlpZiAoc3ludGF4ICE9IEJBU0VTWU5UQVggJiYgZW9mbWFyayA9PSBOVUxMKQorCQlzeW5lcnJvcigiVW50ZXJtaW5hdGVkIHF1b3RlZCBzdHJpbmciKTsKKwlpZiAodmFybmVzdCAhPSAwKSB7CisJCXN0YXJ0bGlubm8gPSBwbGlubm87CisJCS8qIHsgKi8KKwkJc3luZXJyb3IoIk1pc3NpbmcgJ30nIik7CisJfQorCVVTVFBVVEMoJ1wwJywgb3V0KTsKKwlsZW4gPSBvdXQgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlvdXQgPSBzdGFja2Jsb2NrKCk7CisJaWYgKGVvZm1hcmsgPT0gTlVMTCkgeworCQlpZiAoKGMgPT0gJz4nIHx8IGMgPT0gJzwnKQorCQkgJiYgcXVvdGVmID09IDAKKwkJICYmIGxlbiA8PSAyCisJCSAmJiAoKm91dCA9PSAnXDAnIHx8IGlzX2RpZ2l0KCpvdXQpKSkgeworCQkJUEFSU0VSRURJUigpOworCQkJcmV0dXJuIGxhc3R0b2tlbiA9IFRSRURJUjsKKwkJfSBlbHNlIHsKKwkJCXB1bmdldGMoKTsKKwkJfQorCX0KKwlxdW90ZWZsYWcgPSBxdW90ZWY7CisJYmFja3F1b3RlbGlzdCA9IGJxbGlzdDsKKwlncmFic3RhY2tibG9jayhsZW4pOworCXdvcmR0ZXh0ID0gb3V0OworCXJldHVybiBsYXN0dG9rZW4gPSBUV09SRDsKKy8qIGVuZCBvZiByZWFkdG9rZW4gcm91dGluZSAqLworCisKKworLyoKKyAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBoZXJlIGRvY3VtZW50LiAgV2hlbiB0aGlzCisgKiBpcyBjYWxsZWQsIGMgaXMgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQgaW5wdXQgbGluZS4gIElmCisgKiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaGVyZSBkb2N1bWVudCwgdGhpcyByb3V0aW5lIHNldHMgdGhlIGMgdG8gUEVPRi4KKyAqLworCitjaGVja2VuZDogeworCWlmIChlb2ZtYXJrKSB7CisJCWlmIChjID09IFBFT0EpIHsKKwkJCWMgPSBwZ2V0YzIoKTsKKwkJfQorCQlpZiAoc3RyaXB0YWJzKSB7CisJCQl3aGlsZSAoYyA9PSAnXHQnKSB7CisJCQkJYyA9IHBnZXRjMigpOworCQkJfQorCQl9CisJCWlmIChjID09ICplb2ZtYXJrKSB7CisJCQlpZiAocGZnZXRzKGxpbmUsIHNpemVvZiBsaW5lKSAhPSBOVUxMKSB7CisJCQkJY2hhciAqcCwgKnE7CisKKwkJCQlwID0gbGluZTsKKwkJCQlmb3IgKHEgPSBlb2ZtYXJrICsgMSA7ICpxICYmICpwID09ICpxIDsgcCsrLCBxKyspOworCQkJCWlmICgqcCA9PSAnXG4nICYmICpxID09ICdcMCcpIHsKKwkJCQkJYyA9IFBFT0Y7CisJCQkJCXBsaW5ubysrOworCQkJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHVzaHN0cmluZyhsaW5lLCBOVUxMKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZ290byBjaGVja2VuZF9yZXR1cm47Cit9CisKKworLyoKKyAqIFBhcnNlIGEgcmVkaXJlY3Rpb24gb3BlcmF0b3IuICBUaGUgdmFyaWFibGUgIm91dCIgcG9pbnRzIHRvIGEgc3RyaW5nCisgKiBzcGVjaWZ5aW5nIHRoZSBmZCB0byBiZSByZWRpcmVjdGVkLiAgVGhlIHZhcmlhYmxlICJjIiBjb250YWlucyB0aGUKKyAqIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcmVkaXJlY3Rpb24gb3BlcmF0b3IuCisgKi8KKworcGFyc2VyZWRpcjogeworCWNoYXIgZmQgPSAqb3V0OworCXVuaW9uIG5vZGUgKm5wOworCisJbnAgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmZpbGUpKTsKKwlpZiAoYyA9PSAnPicpIHsKKwkJbnAtPm5maWxlLmZkID0gMTsKKwkJYyA9IHBnZXRjKCk7CisJCWlmIChjID09ICc+JykKKwkJCW5wLT50eXBlID0gTkFQUEVORDsKKwkJZWxzZSBpZiAoYyA9PSAnfCcpCisJCQlucC0+dHlwZSA9IE5DTE9CQkVSOworCQllbHNlIGlmIChjID09ICcmJykKKwkJCW5wLT50eXBlID0gTlRPRkQ7CisJCWVsc2UgeworCQkJbnAtPnR5cGUgPSBOVE87CisJCQlwdW5nZXRjKCk7CisJCX0KKwl9IGVsc2UgewkvKiBjID09ICc8JyAqLworCQlucC0+bmZpbGUuZmQgPSAwOworCQlzd2l0Y2ggKGMgPSBwZ2V0YygpKSB7CisJCWNhc2UgJzwnOgorCQkJaWYgKHNpemVvZiAoc3RydWN0IG5maWxlKSAhPSBzaXplb2YgKHN0cnVjdCBuaGVyZSkpIHsKKwkJCQlucCA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuaGVyZSkpOworCQkJCW5wLT5uZmlsZS5mZCA9IDA7CisJCQl9CisJCQlucC0+dHlwZSA9IE5IRVJFOworCQkJaGVyZWRvYyA9IChzdHJ1Y3QgaGVyZWRvYyAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaGVyZWRvYykpOworCQkJaGVyZWRvYy0+aGVyZSA9IG5wOworCQkJaWYgKChjID0gcGdldGMoKSkgPT0gJy0nKSB7CisJCQkJaGVyZWRvYy0+c3RyaXB0YWJzID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaGVyZWRvYy0+c3RyaXB0YWJzID0gMDsKKwkJCQlwdW5nZXRjKCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICcmJzoKKwkJCW5wLT50eXBlID0gTkZST01GRDsKKwkJCWJyZWFrOworCisJCWNhc2UgJz4nOgorCQkJbnAtPnR5cGUgPSBORlJPTVRPOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCW5wLT50eXBlID0gTkZST007CisJCQlwdW5nZXRjKCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZmQgIT0gJ1wwJykKKwkJbnAtPm5maWxlLmZkID0gZGlnaXRfdmFsKGZkKTsKKwlyZWRpcm5vZGUgPSBucDsKKwlnb3RvIHBhcnNlcmVkaXJfcmV0dXJuOworfQorCisKKy8qCisgKiBQYXJzZSBhIHN1YnN0aXR1dGlvbi4gIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgcmVhZCB0aGUgZG9sbGFyIHNpZ24KKyAqIGFuZCBub3RoaW5nIGVsc2UuCisgKi8KKworcGFyc2VzdWI6IHsKKwlpbnQgc3VidHlwZTsKKwlpbnQgdHlwZWxvYzsKKwlpbnQgZmxhZ3M7CisJY2hhciAqcDsKKwlzdGF0aWMgY29uc3QgY2hhciB0eXBlc1tdID0gIn0tKz89IjsKKworCWMgPSBwZ2V0YygpOworCWlmICgKKwkJYyA8PSBQRU9BICB8fAorCQkoYyAhPSAnKCcgJiYgYyAhPSAneycgJiYgIWlzX25hbWUoYykgJiYgIWlzX3NwZWNpYWwoYykpCisJKSB7CisJCVVTVFBVVEMoJyQnLCBvdXQpOworCQlwdW5nZXRjKCk7CisJfSBlbHNlIGlmIChjID09ICcoJykgewkvKiAkKGNvbW1hbmQpIG9yICQoKGFyaXRoKSkgKi8KKwkJaWYgKHBnZXRjKCkgPT0gJygnKSB7CisJCQlQQVJTRUFSSVRIKCk7CisJCX0gZWxzZSB7CisJCQlwdW5nZXRjKCk7CisJCQlQQVJTRUJBQ0tRTkVXKCk7CisJCX0KKwl9IGVsc2UgeworCQlVU1RQVVRDKENUTFZBUiwgb3V0KTsKKwkJdHlwZWxvYyA9IG91dCAtIChjaGFyICopc3RhY2tibG9jaygpOworCQlVU1RQVVRDKFZTTk9STUFMLCBvdXQpOworCQlzdWJ0eXBlID0gVlNOT1JNQUw7CisJCWlmIChjID09ICd7JykgeworCQkJYyA9IHBnZXRjKCk7CisJCQlpZiAoYyA9PSAnIycpIHsKKwkJCQlpZiAoKGMgPSBwZ2V0YygpKSA9PSAnfScpCisJCQkJCWMgPSAnIyc7CisJCQkJZWxzZQorCQkJCQlzdWJ0eXBlID0gVlNMRU5HVEg7CisJCQl9CisJCQllbHNlCisJCQkJc3VidHlwZSA9IDA7CisJCX0KKwkJaWYgKGMgPiBQRU9BICYmIGlzX25hbWUoYykpIHsKKwkJCWRvIHsKKwkJCQlTVFBVVEMoYywgb3V0KTsKKwkJCQljID0gcGdldGMoKTsKKwkJCX0gd2hpbGUgKGMgPiBQRU9BICYmIGlzX2luX25hbWUoYykpOworCQl9IGVsc2UgaWYgKGlzX2RpZ2l0KGMpKSB7CisJCQlkbyB7CisJCQkJU1RQVVRDKGMsIG91dCk7CisJCQkJYyA9IHBnZXRjKCk7CisJCQl9IHdoaWxlIChpc19kaWdpdChjKSk7CisJCX0KKwkJZWxzZSBpZiAoaXNfc3BlY2lhbChjKSkgeworCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYyA9IHBnZXRjKCk7CisJCX0KKwkJZWxzZQorYmFkc3ViOgkJCXN5bmVycm9yKCJCYWQgc3Vic3RpdHV0aW9uIik7CisKKwkJU1RQVVRDKCc9Jywgb3V0KTsKKwkJZmxhZ3MgPSAwOworCQlpZiAoc3VidHlwZSA9PSAwKSB7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJzonOgorCQkJCWZsYWdzID0gVlNOVUw7CisJCQkJYyA9IHBnZXRjKCk7CisJCQkJLypGQUxMVEhST1VHSCovCisJCQlkZWZhdWx0OgorCQkJCXAgPSBzdHJjaHIodHlwZXMsIGMpOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCWdvdG8gYmFkc3ViOworCQkJCXN1YnR5cGUgPSBwIC0gdHlwZXMgKyBWU05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyUnOgorCQkJY2FzZSAnIyc6CisJCQkJeworCQkJCQlpbnQgY2MgPSBjOworCQkJCQlzdWJ0eXBlID0gYyA9PSAnIycgPyBWU1RSSU1MRUZUIDoKKwkJCQkJCQkgICAgIFZTVFJJTVJJR0hUOworCQkJCQljID0gcGdldGMoKTsKKwkJCQkJaWYgKGMgPT0gY2MpCisJCQkJCQlzdWJ0eXBlKys7CisJCQkJCWVsc2UKKwkJCQkJCXB1bmdldGMoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcHVuZ2V0YygpOworCQl9CisJCWlmIChkYmxxdW90ZSB8fCBhcmluZXN0KQorCQkJZmxhZ3MgfD0gVlNRVU9URTsKKwkJKigoY2hhciAqKXN0YWNrYmxvY2soKSArIHR5cGVsb2MpID0gc3VidHlwZSB8IGZsYWdzOworCQlpZiAoc3VidHlwZSAhPSBWU05PUk1BTCkgeworCQkJdmFybmVzdCsrOworCQkJaWYgKGRibHF1b3RlIHx8IGFyaW5lc3QpIHsKKwkJCQlkcXZhcm5lc3QrKzsKKwkJCX0KKwkJfQorCX0KKwlnb3RvIHBhcnNlc3ViX3JldHVybjsKK30KKworCisvKgorICogQ2FsbGVkIHRvIHBhcnNlIGNvbW1hbmQgc3Vic3RpdHV0aW9ucy4gIE5ld3N0eWxlIGlzIHNldCBpZiB0aGUgY29tbWFuZAorICogaXMgZW5jbG9zZWQgaW5zaWRlICQoLi4uKTsgbmxwcCBpcyBhIHBvaW50ZXIgdG8gdGhlIGhlYWQgb2YgdGhlIGxpbmtlZAorICogbGlzdCBvZiBjb21tYW5kcyAocGFzc2VkIGJ5IHJlZmVyZW5jZSksIGFuZCBzYXZlbGVuIGlzIHRoZSBudW1iZXIgb2YKKyAqIGNoYXJhY3RlcnMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2hpY2ggbXVzdCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworcGFyc2ViYWNrcTogeworCXN0cnVjdCBub2RlbGlzdCAqKm5scHA7CisJdW5pb24gbm9kZSAqbjsKKwljaGFyICpzdHI7CisJc2l6ZV90IHNhdmVsZW47CisJaW50IHNhdmVwcm9tcHQgPSAwOworCisJc3RyID0gTlVMTDsKKwlzYXZlbGVuID0gb3V0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJaWYgKHNhdmVsZW4gPiAwKSB7CisJCXN0ciA9IGFsbG9jYShzYXZlbGVuKTsKKwkJbWVtY3B5KHN0ciwgc3RhY2tibG9jaygpLCBzYXZlbGVuKTsKKwl9CisgICAgICAgIGlmIChvbGRzdHlsZSkgeworICAgICAgICAgICAgICAgIC8qIFdlIG11c3QgcmVhZCB1bnRpbCB0aGUgY2xvc2luZyBiYWNrcXVvdGUsIGdpdmluZyBzcGVjaWFsCisgICAgICAgICAgICAgICAgICAgdHJlYXRtZW50IHRvIHNvbWUgc2xhc2hlcywgYW5kIHRoZW4gcHVzaCB0aGUgc3RyaW5nIGFuZAorICAgICAgICAgICAgICAgICAgIHJlcmVhZCBpdCBhcyBpbnB1dCwgaW50ZXJwcmV0aW5nIGl0IG5vcm1hbGx5LiAgKi8KKyAgICAgICAgICAgICAgICBjaGFyICpwb3V0OworICAgICAgICAgICAgICAgIGludCBwYzsKKyAgICAgICAgICAgICAgICBzaXplX3QgcHNhdmVsZW47CisgICAgICAgICAgICAgICAgY2hhciAqcHN0cjsKKworCisgICAgICAgICAgICAgICAgU1RBUlRTVEFDS1NUUihwb3V0KTsKKwkJZm9yICg7OykgeworCQkJaWYgKG5lZWRwcm9tcHQpIHsKKwkJCQlzZXRwcm9tcHQoMik7CisJCQl9CisJCQlzd2l0Y2ggKHBjID0gcGdldGMoKSkgeworCQkJY2FzZSAnYCc6CisJCQkJZ290byBkb25lOworCisJCQljYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGMgPSBwZ2V0YygpKSA9PSAnXG4nKSB7CisJCQkJCXBsaW5ubysrOworCQkJCQlpZiAoZG9wcm9tcHQpCisJCQkJCQlzZXRwcm9tcHQoMik7CisJCQkJCS8qCisJCQkJCSAqIElmIGVhdGluZyBhIG5ld2xpbmUsIGF2b2lkIHB1dHRpbmcKKwkJCQkJICogdGhlIG5ld2xpbmUgaW50byB0aGUgbmV3IGNoYXJhY3RlcgorCQkJCQkgKiBzdHJlYW0gKHZpYSB0aGUgU1RQVVRDIGFmdGVyIHRoZQorCQkJCQkgKiBzd2l0Y2gpLgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGMgIT0gJ1xcJyAmJiBwYyAhPSAnYCcgJiYgcGMgIT0gJyQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRibHF1b3RlIHx8IHBjICE9ICciJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RQVVRDKCdcXCcsIHBvdXQpOworCQkJCWlmIChwYyA+IFBFT0EpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCQljYXNlIFBFT0Y6CisJCQljYXNlIFBFT0E6CisJCQkgICAgICAgIHN0YXJ0bGlubm8gPSBwbGlubm87CisJCQkJc3luZXJyb3IoIkVPRiBpbiBiYWNrcXVvdGUgc3Vic3RpdHV0aW9uIik7CisKKwkJCWNhc2UgJ1xuJzoKKwkJCQlwbGlubm8rKzsKKwkJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlTVFBVVEMocGMsIHBvdXQpOworICAgICAgICAgICAgICAgIH0KK2RvbmU6CisgICAgICAgICAgICAgICAgU1RQVVRDKCdcMCcsIHBvdXQpOworICAgICAgICAgICAgICAgIHBzYXZlbGVuID0gcG91dCAtIChjaGFyICopc3RhY2tibG9jaygpOworICAgICAgICAgICAgICAgIGlmIChwc2F2ZWxlbiA+IDApIHsKKwkJCXBzdHIgPSBncmFic3RhY2tzdHIocG91dCk7CisJCQlzZXRpbnB1dHN0cmluZyhwc3RyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlubHBwID0gJmJxbGlzdDsKKwl3aGlsZSAoKm5scHApCisJCW5scHAgPSAmKCpubHBwKS0+bmV4dDsKKwkqbmxwcCA9IChzdHJ1Y3Qgbm9kZWxpc3QgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5vZGVsaXN0KSk7CisJKCpubHBwKS0+bmV4dCA9IE5VTEw7CisKKwlpZiAob2xkc3R5bGUpIHsKKwkJc2F2ZXByb21wdCA9IGRvcHJvbXB0OworCQlkb3Byb21wdCA9IDA7CisJfQorCisJbiA9IGxpc3QoMik7CisKKwlpZiAob2xkc3R5bGUpCisJCWRvcHJvbXB0ID0gc2F2ZXByb21wdDsKKwllbHNlIHsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRSUCkKKwkJCXN5bmV4cGVjdChUUlApOworCX0KKworCSgqbmxwcCktPm4gPSBuOworICAgICAgICBpZiAob2xkc3R5bGUpIHsKKwkJLyoKKwkJICogU3RhcnQgcmVhZGluZyBmcm9tIG9sZCBmaWxlIGFnYWluLCBpZ25vcmluZyBhbnkgcHVzaGVkIGJhY2sKKwkJICogdG9rZW5zIGxlZnQgZnJvbSB0aGUgYmFja3F1b3RlIHBhcnNpbmcKKwkJICovCisgICAgICAgICAgICAgICAgcG9wZmlsZSgpOworCQl0b2twdXNoYmFjayA9IDA7CisJfQorCXdoaWxlIChzdGFja2Jsb2Nrc2l6ZSgpIDw9IHNhdmVsZW4pCisJCWdyb3dzdGFja2Jsb2NrKCk7CisJU1RBUlRTVEFDS1NUUihvdXQpOworCWlmIChzdHIpIHsKKwkJbWVtY3B5KG91dCwgc3RyLCBzYXZlbGVuKTsKKwkJU1RBREpVU1Qoc2F2ZWxlbiwgb3V0KTsKKwl9CisJaWYgKGFyaW5lc3QgfHwgZGJscXVvdGUpCisJCVVTVFBVVEMoQ1RMQkFDS1EgfCBDVExRVU9URSwgb3V0KTsKKwllbHNlCisJCVVTVFBVVEMoQ1RMQkFDS1EsIG91dCk7CisJaWYgKG9sZHN0eWxlKQorCQlnb3RvIHBhcnNlYmFja3Ffb2xkcmV0dXJuOworCWVsc2UKKwkJZ290byBwYXJzZWJhY2txX25ld3JldHVybjsKK30KKworLyoKKyAqIFBhcnNlIGFuIGFyaXRobWV0aWMgZXhwYW5zaW9uIChpbmRpY2F0ZSBzdGFydCBvZiBvbmUgYW5kIHNldCBzdGF0ZSkKKyAqLworcGFyc2Vhcml0aDogeworCisJaWYgKCsrYXJpbmVzdCA9PSAxKSB7CisJCXByZXZzeW50YXggPSBzeW50YXg7CisJCXN5bnRheCA9IEFSSVNZTlRBWDsKKwkJVVNUUFVUQyhDVExBUkksIG91dCk7CisJCWlmIChkYmxxdW90ZSkKKwkJCVVTVFBVVEMoJyInLG91dCk7CisJCWVsc2UKKwkJCVVTVFBVVEMoJyAnLG91dCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogd2UgY29sbGFwc2UgZW1iZWRkZWQgYXJpdGhtZXRpYyBleHBhbnNpb24gdG8KKwkJICogcGFyZW50aGVzaXMsIHdoaWNoIHNob3VsZCBiZSBlcXVpdmFsZW50CisJCSAqLworCQlVU1RQVVRDKCcoJywgb3V0KTsKKwl9CisJZ290byBwYXJzZWFyaXRoX3JldHVybjsKK30KKworfSAvKiBlbmQgb2YgcmVhZHRva2VuICovCisKKworCisjaWZkZWYgbWtpbml0CitJTkNMVURFICJwYXJzZXIuaCIKK1JFU0VUIHsKKwl0b2twdXNoYmFjayA9IDA7CisJY2hlY2trd2QgPSAwOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29udGFpbnMgbm90aGluZyB0byBleHBhbmQgKG5vIGRvbGxhciBzaWducworICogb3IgYmFja3F1b3RlcykuCisgKi8KKworU1RBVElDIGludAorbm9leHBhbmQoY2hhciAqdGV4dCkKK3sKKwljaGFyICpwOworCXNpZ25lZCBjaGFyIGM7CisKKwlwID0gdGV4dDsKKwl3aGlsZSAoKGMgPSAqcCsrKSAhPSAnXDAnKSB7CisJCWlmIChjID09IENUTFFVT1RFTUFSSykKKwkJCWNvbnRpbnVlOworCQlpZiAoYyA9PSBDVExFU0MpCisJCQlwKys7CisJCWVsc2UgaWYgKEJBU0VTWU5UQVhbKGludCljXSA9PSBDQ1RMKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisKKy8qCisgKiBSZXR1cm4gb2YgYSBsZWdhbCB2YXJpYWJsZSBuYW1lIChhIGxldHRlciBvciB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IHplcm8gb3IKKyAqIG1vcmUgbGV0dGVycywgdW5kZXJzY29yZXMsIGFuZCBkaWdpdHMpLgorICovCisKK2NoYXIgKgorZW5kb2ZuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCisJeworCWNoYXIgKnA7CisKKwlwID0gKGNoYXIgKikgbmFtZTsKKwlpZiAoISBpc19uYW1lKCpwKSkKKwkJcmV0dXJuIHA7CisJd2hpbGUgKCorK3ApIHsKKwkJaWYgKCEgaXNfaW5fbmFtZSgqcCkpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHA7Cit9CisKKworLyoKKyAqIENhbGxlZCB3aGVuIGFuIHVuZXhwZWN0ZWQgdG9rZW4gaXMgcmVhZCBkdXJpbmcgdGhlIHBhcnNlLiAgVGhlIGFyZ3VtZW50CisgKiBpcyB0aGUgdG9rZW4gdGhhdCBpcyBleHBlY3RlZCwgb3IgLTEgaWYgbW9yZSB0aGFuIG9uZSB0eXBlIG9mIHRva2VuIGNhbgorICogb2NjdXIgYXQgdGhpcyBwb2ludC4KKyAqLworCitTVEFUSUMgdm9pZAorc3luZXhwZWN0KGludCB0b2tlbikKK3sKKwljaGFyIG1zZ1s2NF07CisKKwlpZiAodG9rZW4gPj0gMCkgeworCQlmbXRzdHIobXNnLCA2NCwgIiVzIHVuZXhwZWN0ZWQgKGV4cGVjdGluZyAlcykiLAorCQkJdG9rbmFtZVtsYXN0dG9rZW5dLCB0b2tuYW1lW3Rva2VuXSk7CisJfSBlbHNlIHsKKwkJZm10c3RyKG1zZywgNjQsICIlcyB1bmV4cGVjdGVkIiwgdG9rbmFtZVtsYXN0dG9rZW5dKTsKKwl9CisJc3luZXJyb3IobXNnKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworU1RBVElDIHZvaWQKK3N5bmVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3sKKwlzaF9lcnJvcigiU3ludGF4IGVycm9yOiAlcyIsIG1zZyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitTVEFUSUMgdm9pZAorc2V0cHJvbXB0KGludCB3aGljaCkKK3sKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCWludCBzaG93OworCisJbmVlZHByb21wdCA9IDA7CisJd2hpY2hwcm9tcHQgPSB3aGljaDsKKworI2lmZGVmIFNNQUxMCisJc2hvdyA9IDE7CisjZWxzZQorCXNob3cgPSAhZWw7CisjZW5kaWYKKwlpZiAoc2hvdykgeworCQlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwkJc3RhbGxvYyhzdGFja2Jsb2Nrc2l6ZSgpKTsKKwkJb3V0MnN0cihnZXRwcm9tcHQoTlVMTCkpOworCQlwb3BzdGFja21hcmsoJnNtYXJrKTsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKgorZXhwYW5kc3RyKGNvbnN0IGNoYXIgKnBzKQoreworCXVuaW9uIG5vZGUgbjsKKworCS8qIFhYWCBGaXggKGNoYXIgKikgY2FzdC4gKi8KKwlzZXRpbnB1dHN0cmluZygoY2hhciAqKXBzKTsKKwlyZWFkdG9rZW4xKHBnZXRjKCksIERRU1lOVEFYLCBudWxsc3RyLCAwKTsKKwlwb3BmaWxlKCk7CisKKwluLm5hcmcudHlwZSA9IE5BUkc7CisJbi5uYXJnLm5leHQgPSBOVUxMOworCW4ubmFyZy50ZXh0ID0gd29yZHRleHQ7CisJbi5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisKKwlleHBhbmRhcmcoJm4sIE5VTEwsIDApOworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisKKy8qCisgKiBjYWxsZWQgYnkgZWRpdGxpbmUgLS0gYW55IGV4cGFuc2lvbnMgdG8gdGhlIHByb21wdAorICogICAgc2hvdWxkIGJlIGFkZGVkIGhlcmUuCisgKi8KK2NvbnN0IGNoYXIgKgorZ2V0cHJvbXB0KHZvaWQgKnVudXNlZCkKK3sKKwljb25zdCBjaGFyICpwcm9tcHQ7CisKKwlzd2l0Y2ggKHdoaWNocHJvbXB0KSB7CisJZGVmYXVsdDoKKyNpZmRlZiBERUJVRworCQlyZXR1cm4gIjxpbnRlcm5hbCBwcm9tcHQgZXJyb3I+IjsKKyNlbmRpZgorCWNhc2UgMDoKKwkJcmV0dXJuIG51bGxzdHI7CisJY2FzZSAxOgorCQlwcm9tcHQgPSBwczF2YWwoKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcm9tcHQgPSBwczJ2YWwoKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGV4cGFuZHN0cihwcm9tcHQpOworfQorCitjb25zdCBjaGFyICpjb25zdCAqCitmaW5ka3dkKGNvbnN0IGNoYXIgKnMpCit7CisJcmV0dXJuIGZpbmRzdHJpbmcoCisJCXMsIHBhcnNla3dkLCBzaXplb2YocGFyc2Vrd2QpIC8gc2l6ZW9mKGNvbnN0IGNoYXIgKikKKwkpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvcGFyc2VyLmggYi91c3IvZGFzaC9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGNmNDQwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvcGFyc2VyLmgKQEAgLTAsMCArMSw5NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylwYXJzZXIuaAk4LjMgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisvKiBjb250cm9sIGNoYXJhY3RlcnMgaW4gYXJndW1lbnQgc3RyaW5ncyAqLworI2RlZmluZSBDVExfRklSU1QgLTEyNwkJLyogZmlyc3QgJ3NwZWNpYWwnIGNoYXJhY3RlciAqLworI2RlZmluZSBDVExFU0MgLTEyNwkJLyogZXNjYXBlIG5leHQgY2hhcmFjdGVyICovCisjZGVmaW5lIENUTFZBUiAtMTI2CQkvKiB2YXJpYWJsZSBkZWZuICovCisjZGVmaW5lIENUTEVORFZBUiAtMTI1CisjZGVmaW5lIENUTEJBQ0tRIC0xMjQKKyNkZWZpbmUgQ1RMUVVPVEUgMDEJCS8qIG9yZWQgd2l0aCBDVExCQUNLUSBjb2RlIGlmIGluIHF1b3RlcyAqLworLyoJQ1RMQkFDS1EgfCBDVExRVU9URSA9PSAxMzMgKi8KKyNkZWZpbmUJQ1RMQVJJIC0xMjIJCS8qIGFyaXRobWV0aWMgZXhwcmVzc2lvbiAqLworI2RlZmluZQlDVExFTkRBUkkgLTEyMQorI2RlZmluZQlDVExRVU9URU1BUksgLTEyMAorI2RlZmluZQlDVExfTEFTVCAtMTIwCQkvKiBsYXN0ICdzcGVjaWFsJyBjaGFyYWN0ZXIgKi8KKworLyogdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ5dGUgKGZvbGxvd3MgQ1RMVkFSKSAqLworI2RlZmluZSBWU1RZUEUJMHgwZgkJLyogdHlwZSBvZiB2YXJpYWJsZSBzdWJzdGl0dXRpb24gKi8KKyNkZWZpbmUgVlNOVUwJMHgxMAkJLyogY29sb24tLXRyZWF0IHRoZSBlbXB0eSBzdHJpbmcgYXMgdW5zZXQgKi8KKyNkZWZpbmUgVlNRVU9URSAweDgwCQkvKiBpbnNpZGUgZG91YmxlIHF1b3Rlcy0tc3VwcHJlc3Mgc3BsaXR0aW5nICovCisKKy8qIHZhbHVlcyBvZiBWU1RZUEUgZmllbGQgKi8KKyNkZWZpbmUgVlNOT1JNQUwJMHgxCQkvKiBub3JtYWwgdmFyaWFibGU6ICAkdmFyIG9yICR7dmFyfSAqLworI2RlZmluZSBWU01JTlVTCQkweDIJCS8qICR7dmFyLXRleHR9ICovCisjZGVmaW5lIFZTUExVUwkJMHgzCQkvKiAke3Zhcit0ZXh0fSAqLworI2RlZmluZSBWU1FVRVNUSU9OCTB4NAkJLyogJHt2YXI/bWVzc2FnZX0gKi8KKyNkZWZpbmUgVlNBU1NJR04JMHg1CQkvKiAke3Zhcj10ZXh0fSAqLworI2RlZmluZSBWU1RSSU1SSUdIVAkweDYJCS8qICR7dmFyJXBhdHRlcm59ICovCisjZGVmaW5lIFZTVFJJTVJJR0hUTUFYIAkweDcJCS8qICR7dmFyJSVwYXR0ZXJufSAqLworI2RlZmluZSBWU1RSSU1MRUZUCTB4OAkJLyogJHt2YXIjcGF0dGVybn0gKi8KKyNkZWZpbmUgVlNUUklNTEVGVE1BWAkweDkJCS8qICR7dmFyIyNwYXR0ZXJufSAqLworI2RlZmluZSBWU0xFTkdUSAkweGEJCS8qICR7I3Zhcn0gKi8KKworLyogdmFsdWVzIG9mIGNoZWNra3dkIHZhcmlhYmxlICovCisjZGVmaW5lIENIS0FMSUFTCTB4MQorI2RlZmluZSBDSEtLV0QJCTB4MgorI2RlZmluZSBDSEtOTAkJMHg0CisKKworLyoKKyAqIE5FT0YgaXMgcmV0dXJuZWQgYnkgcGFyc2VjbWQgd2hlbiBpdCBlbmNvdW50ZXJzIGFuIGVuZCBvZiBmaWxlLiAgSXQKKyAqIG11c3QgYmUgZGlzdGluY3QgZnJvbSBOVUxMLCBzbyB3ZSB1c2UgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSB0aGF0CisgKiBoYXBwZW5zIHRvIGJlIGhhbmR5LgorICovCitleHRlcm4gaW50IHRva3B1c2hiYWNrOworI2RlZmluZSBORU9GICgodW5pb24gbm9kZSAqKSZ0b2twdXNoYmFjaykKK2V4dGVybiBpbnQgd2hpY2hwcm9tcHQ7CQkvKiAxID09IFBTMSwgMiA9PSBQUzIgKi8KK2V4dGVybiBpbnQgY2hlY2trd2Q7CitleHRlcm4gaW50IHN0YXJ0bGlubm87CQkvKiBsaW5lICMgd2hlcmUgbGFzdCB0b2tlbiBzdGFydGVkICovCisKKwordW5pb24gbm9kZSAqcGFyc2VjbWQoaW50KTsKK3ZvaWQgZml4cmVkaXIodW5pb24gbm9kZSAqLCBjb25zdCBjaGFyICosIGludCk7Citjb25zdCBjaGFyICpnZXRwcm9tcHQodm9pZCAqKTsKK2NvbnN0IGNoYXIgKmNvbnN0ICpmaW5ka3dkKGNvbnN0IGNoYXIgKik7CitjaGFyICplbmRvZm5hbWUoY29uc3QgY2hhciAqKTsKK2NvbnN0IGNoYXIgKmV4cGFuZHN0cihjb25zdCBjaGFyICopOworCitzdGF0aWMgaW5saW5lIGludAorZ29vZG5hbWUoY29uc3QgY2hhciAqcCkKK3sKKwlyZXR1cm4gISplbmRvZm5hbWUocCk7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9yZWRpci5jIGIvdXNyL2Rhc2gvcmVkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmQ4ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvcmVkaXIuYwpAQCAtMCwwICsxLDQ3NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgkvKiBQSVBFX0JVRiAqLworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qCisgKiBDb2RlIGZvciBkZWFsaW5nIHdpdGggaW5wdXQvb3V0cHV0IHJlZGlyZWN0aW9uLgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJub2Rlcy5oIgorI2luY2x1ZGUgImpvYnMuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAiZXhwYW5kLmgiCisjaW5jbHVkZSAicmVkaXIuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisKKworI2RlZmluZSBFTVBUWSAtMgkJLyogbWFya3MgYW4gdW51c2VkIHNsb3QgaW4gcmVkaXJ0YWIgKi8KKyNpZm5kZWYgUElQRV9CVUYKKyMgZGVmaW5lIFBJUEVTSVpFIDQwOTYJCS8qIGFtb3VudCBvZiBidWZmZXJpbmcgaW4gYSBwaXBlICovCisjZWxzZQorIyBkZWZpbmUgUElQRVNJWkUgUElQRV9CVUYKKyNlbmRpZgorCisKK01LSU5JVAorc3RydWN0IHJlZGlydGFiIHsKKwlzdHJ1Y3QgcmVkaXJ0YWIgKm5leHQ7CisJaW50IHJlbmFtZWRbMTBdOworCWludCBudWxscmVkaXJzOworfTsKKworCitNS0lOSVQgc3RydWN0IHJlZGlydGFiICpyZWRpcmxpc3Q7CitNS0lOSVQgaW50IG51bGxyZWRpcnM7CisKK1NUQVRJQyBpbnQgb3BlbnJlZGlyZWN0KHVuaW9uIG5vZGUgKik7CisjaWZkZWYgbm90eWV0CitTVEFUSUMgdm9pZCBkdXByZWRpcmVjdCh1bmlvbiBub2RlICosIGludCwgY2hhclsxMF0pOworI2Vsc2UKK1NUQVRJQyB2b2lkIGR1cHJlZGlyZWN0KHVuaW9uIG5vZGUgKiwgaW50KTsKKyNlbmRpZgorU1RBVElDIGludCBvcGVuaGVyZSh1bmlvbiBub2RlICopOworU1RBVElDIGludCBub2Nsb2JiZXJvcGVuKGNvbnN0IGNoYXIgKik7CisKKworLyoKKyAqIFByb2Nlc3MgYSBsaXN0IG9mIHJlZGlyZWN0aW9uIGNvbW1hbmRzLiAgSWYgdGhlIFJFRElSX1BVU0ggZmxhZyBpcyBzZXQsCisgKiBvbGQgZmlsZSBkZXNjcmlwdG9ycyBhcmUgc3Rhc2hlZCBhd2F5IHNvIHRoYXQgdGhlIHJlZGlyZWN0aW9uIGNhbiBiZQorICogdW5kb25lIGJ5IGNhbGxpbmcgcG9wcmVkaXIuICBJZiB0aGUgUkVESVJfQkFDS1EgZmxhZyBpcyBzZXQsIHRoZW4gdGhlCisgKiBzdGFuZGFyZCBvdXRwdXQsIGFuZCB0aGUgc3RhbmRhcmQgZXJyb3IgaWYgaXQgYmVjb21lcyBhIGR1cGxpY2F0ZSBvZgorICogc3Rkb3V0LCBpcyBzYXZlZCBpbiBtZW1vcnkuCisgKi8KKwordm9pZAorcmVkaXJlY3QodW5pb24gbm9kZSAqcmVkaXIsIGludCBmbGFncykKK3sKKwl1bmlvbiBub2RlICpuOworCXN0cnVjdCByZWRpcnRhYiAqc3Y7CisJaW50IGk7CisJaW50IGZkOworCWludCBuZXdmZDsKKwlpbnQgKnA7CisjaWYgbm90eWV0CisJY2hhciBtZW1vcnlbMTBdOwkvKiBmaWxlIGRlc2NyaXB0b3JzIHRvIHdyaXRlIHRvIG1lbW9yeSAqLworCisJZm9yIChpID0gMTAgOyAtLWkgPj0gMCA7ICkKKwkJbWVtb3J5W2ldID0gMDsKKwltZW1vcnlbMV0gPSBmbGFncyAmIFJFRElSX0JBQ0tROworI2VuZGlmCisJbnVsbHJlZGlycysrOworCWlmICghcmVkaXIpIHsKKwkJcmV0dXJuOworCX0KKwlzdiA9IE5VTEw7CisJSU5UT0ZGOworCWlmIChmbGFncyAmIFJFRElSX1BVU0gpIHsKKwkJc3RydWN0IHJlZGlydGFiICpxOworCQlxID0gY2ttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgcmVkaXJ0YWIpKTsKKwkJcS0+bmV4dCA9IHJlZGlybGlzdDsKKwkJcmVkaXJsaXN0ID0gcTsKKwkJcS0+bnVsbHJlZGlycyA9IG51bGxyZWRpcnMgLSAxOworCQlmb3IgKGkgPSAwIDsgaSA8IDEwIDsgaSsrKQorCQkJcS0+cmVuYW1lZFtpXSA9IEVNUFRZOworCQludWxscmVkaXJzID0gMDsKKwkJc3YgPSBxOworCX0KKwluID0gcmVkaXI7CisJZG8geworCQlmZCA9IG4tPm5maWxlLmZkOworCQlpZiAoKG4tPm5maWxlLnR5cGUgPT0gTlRPRkQgfHwgbi0+bmZpbGUudHlwZSA9PSBORlJPTUZEKSAmJgorCQkgICAgbi0+bmR1cC5kdXBmZCA9PSBmZCkKKwkJCWNvbnRpbnVlOyAvKiByZWRpcmVjdCBmcm9tL3RvIHNhbWUgZmlsZSBkZXNjcmlwdG9yICovCisKKwkJbmV3ZmQgPSBvcGVucmVkaXJlY3Qobik7CisJCWlmIChmZCA9PSBuZXdmZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3YgJiYgKihwID0gJnN2LT5yZW5hbWVkW2ZkXSkgPT0gRU1QVFkpIHsKKwkJCWludCBpID0gZmNudGwoZmQsIEZfRFVQRkQsIDEwKTsKKwkJCWlmIChpID09IC0xKSB7CisJCQkJaSA9IGVycm5vOworCQkJCWlmIChpICE9IEVCQURGKSB7CisJCQkJCWNvbnN0IGNoYXIgKm0gPSBzdHJlcnJvcihpKTsKKwkJCQkJY2xvc2UobmV3ZmQpOworCQkJCQlzaF9lcnJvcigiJWQ6ICVzIiwgZmQsIG0pOworCQkJCQkvKiBOT1RSRUFDSEVEICovCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkqcCA9IGk7CisJCQkJY2xvc2UoZmQpOworCQkJfQorCQl9IGVsc2UgeworCQkJY2xvc2UoZmQpOworCQl9CisjaWZkZWYgbm90eWV0CisJCWR1cHJlZGlyZWN0KG4sIG5ld2ZkLCBtZW1vcnkpOworI2Vsc2UKKwkJZHVwcmVkaXJlY3QobiwgbmV3ZmQpOworI2VuZGlmCisJfSB3aGlsZSAoKG4gPSBuLT5uZmlsZS5uZXh0KSk7CisJSU5UT047CisjaWZkZWYgbm90eWV0CisJaWYgKG1lbW9yeVsxXSkKKwkJb3V0MSA9ICZtZW1vdXQ7CisJaWYgKG1lbW9yeVsyXSkKKwkJb3V0MiA9ICZtZW1vdXQ7CisjZW5kaWYKKwlpZiAoZmxhZ3MgJiBSRURJUl9TQVZFRkQyICYmIHN2ICYmIHN2LT5yZW5hbWVkWzJdID49IDApCisJCXByZXZlcnJvdXQuZmQgPSBzdi0+cmVuYW1lZFsyXTsKK30KKworCitTVEFUSUMgaW50CitvcGVucmVkaXJlY3QodW5pb24gbm9kZSAqcmVkaXIpCit7CisJY2hhciAqZm5hbWU7CisJaW50IGY7CisKKwlzd2l0Y2ggKHJlZGlyLT5uZmlsZS50eXBlKSB7CisJY2FzZSBORlJPTToKKwkJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJCWlmICgoZiA9IG9wZW42NChmbmFtZSwgT19SRE9OTFkpKSA8IDApCisJCQlnb3RvIGVvcGVuOworCQlicmVhazsKKwljYXNlIE5GUk9NVE86CisJCWZuYW1lID0gcmVkaXItPm5maWxlLmV4cGZuYW1lOworCQlpZiAoKGYgPSBvcGVuNjQoZm5hbWUsIE9fUkRXUnxPX0NSRUFUfE9fVFJVTkMsIDA2NjYpKSA8IDApCisJCQlnb3RvIGVjcmVhdGU7CisJCWJyZWFrOworCWNhc2UgTlRPOgorCQkvKiBUYWtlIGNhcmUgb2Ygbm9jbG9iYmVyIG1vZGUuICovCisJCWlmIChDZmxhZykgeworCQkJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJCQlpZiAoKGYgPSBub2Nsb2JiZXJvcGVuKGZuYW1lKSkgPCAwKQorCQkJCWdvdG8gZWNyZWF0ZTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBOQ0xPQkJFUjoKKwkJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJCWlmICgoZiA9IG9wZW42NChmbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KSkgPCAwKQorCQkJZ290byBlY3JlYXRlOworCQlicmVhazsKKwljYXNlIE5BUFBFTkQ6CisJCWZuYW1lID0gcmVkaXItPm5maWxlLmV4cGZuYW1lOworCQlpZiAoKGYgPSBvcGVuNjQoZm5hbWUsIE9fV1JPTkxZfE9fQ1JFQVR8T19BUFBFTkQsIDA2NjYpKSA8IDApCisJCQlnb3RvIGVjcmVhdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKwkJYWJvcnQoKTsKKyNlbmRpZgorCQkvKiBGYWxsIHRocm91Z2ggdG8gZWxpbWluYXRlIHdhcm5pbmcuICovCisJY2FzZSBOVE9GRDoKKwljYXNlIE5GUk9NRkQ6CisJCWYgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSBOSEVSRToKKwljYXNlIE5YSEVSRToKKwkJZiA9IG9wZW5oZXJlKHJlZGlyKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGY7CitlY3JlYXRlOgorCXNoX2Vycm9yKCJjYW5ub3QgY3JlYXRlICVzOiAlcyIsIGZuYW1lLCBlcnJtc2coZXJybm8sIEVfQ1JFQVQpKTsKK2VvcGVuOgorCXNoX2Vycm9yKCJjYW5ub3Qgb3BlbiAlczogJXMiLCBmbmFtZSwgZXJybXNnKGVycm5vLCBFX09QRU4pKTsKK30KKworCitTVEFUSUMgdm9pZAorI2lmZGVmIG5vdHlldAorZHVwcmVkaXJlY3QocmVkaXIsIGYsIG1lbW9yeSkKKyNlbHNlCitkdXByZWRpcmVjdChyZWRpciwgZikKKyNlbmRpZgorCXVuaW9uIG5vZGUgKnJlZGlyOworCWludCBmOworI2lmZGVmIG5vdHlldAorCWNoYXIgbWVtb3J5WzEwXTsKKyNlbmRpZgorCXsKKwlpbnQgZmQgPSByZWRpci0+bmZpbGUuZmQ7CisKKyNpZmRlZiBub3R5ZXQKKwltZW1vcnlbZmRdID0gMDsKKyNlbmRpZgorCWlmIChyZWRpci0+bmZpbGUudHlwZSA9PSBOVE9GRCB8fCByZWRpci0+bmZpbGUudHlwZSA9PSBORlJPTUZEKSB7CisJCWlmIChyZWRpci0+bmR1cC5kdXBmZCA+PSAwKSB7CS8qIGlmIG5vdCAiPiYtIiAqLworI2lmZGVmIG5vdHlldAorCQkJaWYgKG1lbW9yeVtyZWRpci0+bmR1cC5kdXBmZF0pCisJCQkJbWVtb3J5W2ZkXSA9IDE7CisJCQllbHNlCisjZW5kaWYKKwkJCQljb3B5ZmQocmVkaXItPm5kdXAuZHVwZmQsIGZkKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKGYgIT0gZmQpIHsKKwkJY29weWZkKGYsIGZkKTsKKwkJY2xvc2UoZik7CisJfQorCXJldHVybjsKK30KKworCisvKgorICogSGFuZGxlIGhlcmUgZG9jdW1lbnRzLiAgTm9ybWFsbHkgd2UgZm9yayBvZmYgYSBwcm9jZXNzIHRvIHdyaXRlIHRoZQorICogZGF0YSB0byBhIHBpcGUuICBJZiB0aGUgZG9jdW1lbnQgaXMgc2hvcnQsIHdlIGNhbiBzdHVmZiB0aGUgZGF0YSBpbgorICogdGhlIHBpcGUgd2l0aG91dCBmb3JraW5nLgorICovCisKK1NUQVRJQyBpbnQKK29wZW5oZXJlKHVuaW9uIG5vZGUgKnJlZGlyKQoreworCWludCBwaXBbMl07CisJc2l6ZV90IGxlbiA9IDA7CisKKwlpZiAocGlwZShwaXApIDwgMCkKKwkJc2hfZXJyb3IoIlBpcGUgY2FsbCBmYWlsZWQiKTsKKwlpZiAocmVkaXItPnR5cGUgPT0gTkhFUkUpIHsKKwkJbGVuID0gc3RybGVuKHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCk7CisJCWlmIChsZW4gPD0gUElQRVNJWkUpIHsKKwkJCXh3cml0ZShwaXBbMV0sIHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCwgbGVuKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmIChmb3Jrc2hlbGwoKHN0cnVjdCBqb2IgKilOVUxMLCAodW5pb24gbm9kZSAqKU5VTEwsIEZPUktfTk9KT0IpID09IDApIHsKKwkJY2xvc2UocGlwWzBdKTsKKwkJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisJCXNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKKwkJc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisjaWZkZWYgU0lHVFNUUAorCQlzaWduYWwoU0lHVFNUUCwgU0lHX0lHTik7CisjZW5kaWYKKwkJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworCQlpZiAocmVkaXItPnR5cGUgPT0gTkhFUkUpCisJCQl4d3JpdGUocGlwWzFdLCByZWRpci0+bmhlcmUuZG9jLT5uYXJnLnRleHQsIGxlbik7CisJCWVsc2UKKwkJCWV4cGFuZGhlcmUocmVkaXItPm5oZXJlLmRvYywgcGlwWzFdKTsKKwkJX2V4aXQoMCk7CisJfQorb3V0OgorCWNsb3NlKHBpcFsxXSk7CisJcmV0dXJuIHBpcFswXTsKK30KKworCisKKy8qCisgKiBVbmRvIHRoZSBlZmZlY3RzIG9mIHRoZSBsYXN0IHJlZGlyZWN0aW9uLgorICovCisKK3ZvaWQKK3BvcHJlZGlyKGludCBkcm9wKQoreworCXN0cnVjdCByZWRpcnRhYiAqcnA7CisJaW50IGk7CisKKwlpZiAoLS1udWxscmVkaXJzID49IDApCisJCXJldHVybjsKKwlJTlRPRkY7CisJcnAgPSByZWRpcmxpc3Q7CisJZm9yIChpID0gMCA7IGkgPCAxMCA7IGkrKykgeworCQlpZiAocnAtPnJlbmFtZWRbaV0gIT0gRU1QVFkpIHsKKwkJCWlmICghZHJvcCkgeworCQkJCWNsb3NlKGkpOworCQkJCWNvcHlmZChycC0+cmVuYW1lZFtpXSwgaSk7CisJCQl9CisJCQljbG9zZShycC0+cmVuYW1lZFtpXSk7CisJCX0KKwl9CisJcmVkaXJsaXN0ID0gcnAtPm5leHQ7CisJbnVsbHJlZGlycyA9IHJwLT5udWxscmVkaXJzOworCWNrZnJlZShycCk7CisJSU5UT047Cit9CisKKy8qCisgKiBVbmRvIGFsbCByZWRpcmVjdGlvbnMuICBDYWxsZWQgb24gZXJyb3Igb3IgaW50ZXJydXB0LgorICovCisKKyNpZmRlZiBta2luaXQKKworSU5DTFVERSAicmVkaXIuaCIKKworUkVTRVQgeworCWNsZWFycmVkaXIoMCk7Cit9CisKKyNlbmRpZgorCisvKgorICogRGlzY2FyZCBhbGwgc2F2ZWQgZmlsZSBkZXNjcmlwdG9ycy4KKyAqLworCit2b2lkCitjbGVhcnJlZGlyKGludCBkcm9wKQoreworCWZvciAoOzspIHsKKwkJbnVsbHJlZGlycyA9IDA7CisJCWlmICghcmVkaXJsaXN0KQorCQkJYnJlYWs7CisJCXBvcHJlZGlyKGRyb3ApOworCX0KK30KKworCisKKy8qCisgKiBDb3B5IGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlID49IHRvLiAgUmV0dXJucyAtMQorICogaWYgdGhlIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkLCBFTVBUWSBpZiB0aGVyZSBhcmUgbm8gdW51c2VkCisgKiBmaWxlIGRlc2NyaXB0b3JzIGxlZnQuCisgKi8KKworaW50Citjb3B5ZmQoaW50IGZyb20sIGludCB0bykKK3sKKwlpbnQgbmV3ZmQ7CisKKwluZXdmZCA9IGZjbnRsKGZyb20sIEZfRFVQRkQsIHRvKTsKKwlpZiAobmV3ZmQgPCAwKSB7CisJCWludCBlcnJubzIgPSBlcnJubzsKKwkJaWYgKGVycm5vMiA9PSBFTUZJTEUpCisJCQlyZXR1cm4gRU1QVFk7CisJCWVsc2UKKwkJCXNoX2Vycm9yKCIlZDogJXMiLCBmcm9tLCBzdHJlcnJvcihlcnJubzIpKTsKKwl9CisJcmV0dXJuIG5ld2ZkOworfQorCisKKy8qCisgKiBPcGVuIGEgZmlsZSBpbiBub2Nsb2JiZXIgbW9kZS4KKyAqIFRoZSBjb2RlIHdhcyBjb3BpZWQgZnJvbSBiYXNoLgorICovCitpbnQKK25vY2xvYmJlcm9wZW4oZm5hbWUpCisJY29uc3QgY2hhciAqZm5hbWU7Cit7CisJaW50IHIsIGZkOworCXN0cnVjdCBzdGF0NjQgZmluZm8sIGZpbmZvMjsKKworCS8qCisJICogSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSwgcmV0dXJuIGFuIGVycm9yCisJICogaW1tZWRpYXRlbHkuCisJICovCisJciA9IHN0YXQ2NChmbmFtZSwgJmZpbmZvKTsKKwlpZiAociA9PSAwICYmIFNfSVNSRUcoZmluZm8uc3RfbW9kZSkpIHsKKwkJZXJybm8gPSBFRVhJU1Q7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBmaWxlIHdhcyBub3QgcHJlc2VudCAociAhPSAwKSwgbWFrZSBzdXJlIHdlIG9wZW4gaXQKKwkgKiBleGNsdXNpdmVseSBzbyB0aGF0IGlmIGl0IGlzIGNyZWF0ZWQgYmVmb3JlIHdlIG9wZW4gaXQsIG91ciBvcGVuCisJICogd2lsbCBmYWlsLiAgTWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHRydW5jYXRlIGFuIGV4aXN0aW5nIGZpbGUuCisJICogTm90ZSB0aGF0IHdlIGRvbid0IHR1cm4gb24gT19FWENMIHVubGVzcyB0aGUgc3RhdCBmYWlsZWQgLS0gaWYgdGhlCisJICogZmlsZSB3YXMgbm90IGEgcmVndWxhciBmaWxlLCB3ZSBsZWF2ZSBPX0VYQ0wgb2ZmLgorCSAqLworCWlmIChyICE9IDApCisJCXJldHVybiBvcGVuNjQoZm5hbWUsIE9fV1JPTkxZfE9fQ1JFQVR8T19FWENMLCAwNjY2KTsKKwlmZCA9IG9wZW42NChmbmFtZSwgT19XUk9OTFl8T19DUkVBVCwgMDY2Nik7CisKKwkvKiBJZiB0aGUgb3BlbiBmYWlsZWQsIHJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJpZ2h0IGF3YXkuICovCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJLyoKKwkgKiBPSywgdGhlIG9wZW4gc3VjY2VlZGVkLCBidXQgdGhlIGZpbGUgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gYQorCSAqIG5vbi1yZWd1bGFyIGZpbGUgdG8gYSByZWd1bGFyIGZpbGUgYmV0d2VlbiB0aGUgc3RhdCBhbmQgdGhlIG9wZW4uCisJICogV2UgYXJlIGFzc3VtaW5nIHRoYXQgdGhlIE9fRVhDTCBvcGVuIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgRklMRU5BTUUKKwkgKiBkaWQgbm90IGV4aXN0IGFuZCBpcyBzeW1saW5rZWQgdG8gYW4gZXhpc3RpbmcgZmlsZSBiZXR3ZWVuIHRoZSBzdGF0CisJICogYW5kIG9wZW4uCisJICovCisKKwkvKgorCSAqIElmIHdlIGNhbiBvcGVuIGl0IGFuZCBmc3RhdCB0aGUgZmlsZSBkZXNjcmlwdG9yLCBhbmQgbmVpdGhlciBjaGVjaworCSAqIHJldmVhbGVkIHRoYXQgaXQgd2FzIGEgcmVndWxhciBmaWxlLCBhbmQgdGhlIGZpbGUgaGFzIG5vdCBiZWVuCisJICogcmVwbGFjZWQsIHJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorCSAqLworCSBpZiAoZnN0YXQ2NChmZCwgJmZpbmZvMikgPT0gMCAmJiAhU19JU1JFRyhmaW5mbzIuc3RfbW9kZSkgJiYKKwkgICAgIGZpbmZvLnN0X2RldiA9PSBmaW5mbzIuc3RfZGV2ICYmIGZpbmZvLnN0X2lubyA9PSBmaW5mbzIuc3RfaW5vKQorCSAJcmV0dXJuIGZkOworCisJLyogVGhlIGZpbGUgaGFzIGJlZW4gcmVwbGFjZWQuICBiYWRuZXNzLiAqLworCWNsb3NlKGZkKTsKKwllcnJubyA9IEVFWElTVDsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50CityZWRpcmVjdHNhZmUodW5pb24gbm9kZSAqcmVkaXIsIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCXZvbGF0aWxlIGludCBzYXZlaW50OworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyID0gaGFuZGxlcjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKworCVNBVkVJTlQoc2F2ZWludCk7CisJaWYgKCEoZXJyID0gc2V0am1wKGptcGxvYy5sb2MpICogMikpIHsKKwkJaGFuZGxlciA9ICZqbXBsb2M7CisJCXJlZGlyZWN0KHJlZGlyLCBmbGFncyk7CisJfQorCWhhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwlpZiAoZXJyICYmIGV4Y2VwdGlvbiAhPSBFWEVSUk9SKQorCQlsb25nam1wKGhhbmRsZXItPmxvYywgMSk7CisJUkVTVE9SRUlOVChzYXZlaW50KTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvcmVkaXIuaCBiL3Vzci9kYXNoL3JlZGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5N2Y2YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL3JlZGlyLmgKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylyZWRpci5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKy8qIGZsYWdzIHBhc3NlZCB0byByZWRpcmVjdCAqLworI2RlZmluZSBSRURJUl9QVVNIIDAxCQkvKiBzYXZlIHByZXZpb3VzIHZhbHVlcyBvZiBmaWxlIGRlc2NyaXB0b3JzICovCisjaWZkZWYgbm90eWV0CisjZGVmaW5lIFJFRElSX0JBQ0tRIDAyCQkvKiBzYXZlIHRoZSBjb21tYW5kIG91dHB1dCBpbiBtZW1vcnkgKi8KKyNlbmRpZgorI2RlZmluZSBSRURJUl9TQVZFRkQyIDAzCS8qIHNldCBwcmV2ZXJyb3V0ICovCisKK3VuaW9uIG5vZGU7Cit2b2lkIHJlZGlyZWN0KHVuaW9uIG5vZGUgKiwgaW50KTsKK3ZvaWQgcG9wcmVkaXIoaW50KTsKK3ZvaWQgY2xlYXJyZWRpcihpbnQpOworaW50IGNvcHlmZChpbnQsIGludCk7CitpbnQgcmVkaXJlY3RzYWZlKHVuaW9uIG5vZGUgKiwgaW50KTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3NoLjEgYi91c3IvZGFzaC9zaC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTg4MWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9zaC4xCkBAIC0wLDAgKzEsMjMzMiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisuXCIJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisuXCIgS2VubmV0aCBBbG1xdWlzdC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIglAKCMpc2guMQk4LjYgKEJlcmtlbGV5KSA1LzQvOTUKKy5cIgorLkRkIEphbnVhcnkgMTksIDIwMDMKKy5PcworLkR0IFNIIDEKKy5TaCBOQU1FCisuTm0gc2gKKy5OZCBjb21tYW5kIGludGVycHJldGVyIChzaGVsbCkKKy5TaCBTWU5PUFNJUworLk5tCisuQmsgLXdvcmRzCisuT3AgRmwgYUNlZm51dnhJaW1xVkViCisuT3AgQ20gK2FDZWZudXZ4SWltcVZFYgorLkVrCisuQmsgLXdvcmRzCisuT3AgRmwgbyBBciBvcHRpb25fbmFtZQorLk9wIENtICtvIEFyIG9wdGlvbl9uYW1lCisuRWsKKy5CayAtd29yZHMKKy5PcCBBciBjb21tYW5kX2ZpbGUgT28gQXIgYXJndW1lbnQgLi4uIE9jCisuRWsKKy5ObQorLkZsIGMKKy5CayAtd29yZHMKKy5PcCBGbCBhQ2VmbnV2eElpbXFWRWIKKy5PcCBDbSArYUNlZm51dnhJaW1xVkViCisuRWsKKy5CayAtd29yZHMKKy5PcCBGbCBvIEFyIG9wdGlvbl9uYW1lCisuT3AgQ20gK28gQXIgb3B0aW9uX25hbWUKKy5FaworLkJrIC13b3JkcworLkFyIGNvbW1hbmRfc3RyaW5nCisuT3AgQXIgY29tbWFuZF9uYW1lIE9vIEFyIGFyZ3VtZW50IC4uLiBPYworLkVrCisuTm0KKy5GbCBzCisuQmsgLXdvcmRzCisuT3AgRmwgYUNlZm51dnhJaW1xVkViCisuT3AgQ20gK2FDZWZudXZ4SWltcVZFYgorLkVrCisuQmsgLXdvcmRzCisuT3AgRmwgbyBBciBvcHRpb25fbmFtZQorLk9wIENtICtvIEFyIG9wdGlvbl9uYW1lCisuRWsKKy5CayAtd29yZHMKKy5PcCBBciBhcmd1bWVudCAuLi4KKy5FaworLlNoIERFU0NSSVBUSU9OCisuTm0KK2lzIHRoZSBzdGFuZGFyZCBjb21tYW5kIGludGVycHJldGVyIGZvciB0aGUgc3lzdGVtLgorVGhlIGN1cnJlbnQgdmVyc2lvbiBvZgorLk5tCitpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjaGFuZ2VkIHRvIGNvbmZvcm0gd2l0aCB0aGUKKy5UbiBQT1NJWAorMTAwMy4yIGFuZCAxMDAzLjJhIHNwZWNpZmljYXRpb25zIGZvciB0aGUgc2hlbGwuCitUaGlzIHZlcnNpb24gaGFzIG1hbnkKK2ZlYXR1cmVzIHdoaWNoIG1ha2UgaXQgYXBwZWFyIHNpbWlsYXIgaW4gc29tZSByZXNwZWN0cyB0byB0aGUgS29ybiBzaGVsbCwKK2J1dCBpdCBpcyBub3QgYSBLb3JuIHNoZWxsIGNsb25lIChzZWUKKy5YciBrc2ggMSApIC4KK09ubHkgZmVhdHVyZXMgZGVzaWduYXRlZCBieQorLlRuIFBPU0lYICwKK3BsdXMgYSBmZXcgQmVya2VsZXkgZXh0ZW5zaW9ucywgYXJlIGJlaW5nIGluY29ycG9yYXRlZCBpbnRvIHRoaXMgc2hlbGwuCitXZSBleHBlY3QKKy5UbiBQT1NJWAorY29uZm9ybWFuY2UgYnkgdGhlIHRpbWUgNC40IEJTRCBpcyByZWxlYXNlZC4KK1RoaXMgbWFuIHBhZ2UgaXMgbm90IGludGVuZGVkCit0byBiZSBhIHR1dG9yaWFsIG9yIGEgY29tcGxldGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2hlbGwuCisuU3MgT3ZlcnZpZXcKK1RoZSBzaGVsbCBpcyBhIGNvbW1hbmQgdGhhdCByZWFkcyBsaW5lcyBmcm9tIGVpdGhlciBhIGZpbGUgb3IgdGhlCit0ZXJtaW5hbCwgaW50ZXJwcmV0cyB0aGVtLCBhbmQgZ2VuZXJhbGx5IGV4ZWN1dGVzIG90aGVyIGNvbW1hbmRzLgorSXQgaXMgdGhlIHByb2dyYW0gdGhhdCBpcyBydW5uaW5nIHdoZW4gYSB1c2VyIGxvZ3MgaW50byB0aGUgc3lzdGVtCisoYWx0aG91Z2ggYSB1c2VyIGNhbiBzZWxlY3QgYSBkaWZmZXJlbnQgc2hlbGwgd2l0aCB0aGUKKy5YciBjaHNoIDEKK2NvbW1hbmQpLgorVGhlIHNoZWxsIGltcGxlbWVudHMgYSBsYW5ndWFnZSB0aGF0IGhhcyBmbG93IGNvbnRyb2wKK2NvbnN0cnVjdHMsIGEgbWFjcm8gZmFjaWxpdHkgdGhhdCBwcm92aWRlcyBhIHZhcmlldHkgb2YgZmVhdHVyZXMgaW4KK2FkZGl0aW9uIHRvIGRhdGEgc3RvcmFnZSwgYWxvbmcgd2l0aCBidWlsdCBpbiBoaXN0b3J5IGFuZCBsaW5lIGVkaXRpbmcKK2NhcGFiaWxpdGllcy4KK0l0IGluY29ycG9yYXRlcyBtYW55IGZlYXR1cmVzIHRvIGFpZCBpbnRlcmFjdGl2ZSB1c2UgYW5kCitoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHRoZSBpbnRlcnByZXRhdGl2ZSBsYW5ndWFnZSBpcyBjb21tb24gdG8gYm90aAoraW50ZXJhY3RpdmUgYW5kIG5vbi1pbnRlcmFjdGl2ZSB1c2UgKHNoZWxsIHNjcmlwdHMpLgorVGhhdCBpcywgY29tbWFuZHMKK2NhbiBiZSB0eXBlZCBkaXJlY3RseSB0byB0aGUgcnVubmluZyBzaGVsbCBvciBjYW4gYmUgcHV0IGludG8gYSBmaWxlIGFuZAordGhlIGZpbGUgY2FuIGJlIGV4ZWN1dGVkIGRpcmVjdGx5IGJ5IHRoZSBzaGVsbC4KKy5TcyBJbnZvY2F0aW9uCitJZiBubyBhcmdzIGFyZSBwcmVzZW50IGFuZCBpZiB0aGUgc3RhbmRhcmQgaW5wdXQgb2YgdGhlIHNoZWxsCitpcyBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbCAob3IgaWYgdGhlCisuRmwgaQorZmxhZyBpcyBzZXQpLAorYW5kIHRoZQorLkZsIGMKK29wdGlvbiBpcyBub3QgcHJlc2VudCwgdGhlIHNoZWxsIGlzIGNvbnNpZGVyZWQgYW4gaW50ZXJhY3RpdmUgc2hlbGwuCitBbiBpbnRlcmFjdGl2ZSBzaGVsbCBnZW5lcmFsbHkgcHJvbXB0cyBiZWZvcmUgZWFjaCBjb21tYW5kIGFuZCBoYW5kbGVzCitwcm9ncmFtbWluZyBhbmQgY29tbWFuZCBlcnJvcnMgZGlmZmVyZW50bHkgKGFzIGRlc2NyaWJlZCBiZWxvdykuCitXaGVuIGZpcnN0IHN0YXJ0aW5nLAordGhlIHNoZWxsIGluc3BlY3RzIGFyZ3VtZW50IDAsIGFuZCBpZiBpdCBiZWdpbnMgd2l0aCBhIGRhc2gKKy5TcSAtICwKK3RoZSBzaGVsbCBpcyBhbHNvIGNvbnNpZGVyZWQKK2EgbG9naW4gc2hlbGwuCitUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYXV0b21hdGljYWxseSBieSB0aGUgc3lzdGVtCit3aGVuIHRoZSB1c2VyIGZpcnN0IGxvZ3MgaW4uCitBIGxvZ2luIHNoZWxsIGZpcnN0IHJlYWRzIGNvbW1hbmRzCitmcm9tIHRoZSBmaWxlcworLlBhIC9ldGMvcHJvZmlsZQorYW5kCisuUGEgLnByb2ZpbGUKK2lmIHRoZXkgZXhpc3QuCitJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy5FdiBFTlYKK2lzIHNldCBvbiBlbnRyeSB0byBhbiBpbnRlcmFjdGl2ZSBzaGVsbCwgb3IgaXMgc2V0IGluIHRoZQorLlBhIC5wcm9maWxlCitvZiBhIGxvZ2luIHNoZWxsLCB0aGUgc2hlbGwgbmV4dCByZWFkcworY29tbWFuZHMgZnJvbSB0aGUgZmlsZSBuYW1lZCBpbgorLkV2IEVOViAuCitUaGVyZWZvcmUsIGEgdXNlciBzaG91bGQgcGxhY2UgY29tbWFuZHMgdGhhdCBhcmUgdG8gYmUgZXhlY3V0ZWQgb25seSBhdAorbG9naW4gdGltZSBpbiB0aGUKKy5QYSAucHJvZmlsZQorZmlsZSwgYW5kIGNvbW1hbmRzIHRoYXQgYXJlIGV4ZWN1dGVkIGZvciBldmVyeSBpbnRlcmFjdGl2ZSBzaGVsbCBpbnNpZGUgdGhlCisuRXYgRU5WCitmaWxlLgorVG8gc2V0IHRoZQorLkV2IEVOVgordmFyaWFibGUgdG8gc29tZSBmaWxlLCBwbGFjZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91cgorLlBhIC5wcm9maWxlCitvZiB5b3VyIGhvbWUgZGlyZWN0b3J5CisuUHAKKy5EbCBFTlY9JEhPTUUvLnNoaW5pdDsgZXhwb3J0IEVOVgorLlBwCitzdWJzdGl0dXRpbmcgZm9yCisuRHEgLnNoaW5pdAorYW55IGZpbGVuYW1lIHlvdSB3aXNoLgorLlBwCitJZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGJlc2lkZXMgdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIHNwZWNpZmllZCwgdGhlbgordGhlIHNoZWxsIHRyZWF0cyB0aGUgZmlyc3QgYXJndW1lbnQgYXMgdGhlIG5hbWUgb2YgYSBmaWxlIGZyb20gd2hpY2ggdG8KK3JlYWQgY29tbWFuZHMgKGEgc2hlbGwgc2NyaXB0KSwgYW5kIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBzZXQgYXMgdGhlCitwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb2YgdGhlIHNoZWxsICgkMSwgJDIsIGV0YykuCitPdGhlcndpc2UsIHRoZSBzaGVsbAorcmVhZHMgY29tbWFuZHMgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQuCisuU3MgQXJndW1lbnQgTGlzdCBQcm9jZXNzaW5nCitBbGwgb2YgdGhlIHNpbmdsZSBsZXR0ZXIgb3B0aW9ucyBoYXZlIGEgY29ycmVzcG9uZGluZyBuYW1lIHRoYXQgY2FuIGJlCit1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZQorLkZsIG8KK29wdGlvbi4KK1RoZSBzZXQKKy5GbCBvCituYW1lIGlzIHByb3ZpZGVkIG5leHQgdG8gdGhlIHNpbmdsZSBsZXR0ZXIgb3B0aW9uIGluCit0aGUgZGVzY3JpcHRpb24gYmVsb3cuCitTcGVjaWZ5aW5nIGEgZGFzaAorLkRxIC0KK3R1cm5zIHRoZSBvcHRpb24gb24sIHdoaWxlIHVzaW5nIGEgcGx1cworLkRxICsKK2Rpc2FibGVzIHRoZSBvcHRpb24uCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IKK3dpdGggdGhlCisuSWMgc2V0CitidWlsdGluIChkZXNjcmliZWQgbGF0ZXIpLgorLkJsIC10YWcgLXdpZHRoIGFhYWFsbGV4cG9ydGZvbyAtb2Zmc2V0IGluZGVudAorLkl0IEZsIGEgRW0gYWxsZXhwb3J0CitFeHBvcnQgYWxsIHZhcmlhYmxlcyBhc3NpZ25lZCB0by4KKy5JdCBGbCBjCitSZWFkIGNvbW1hbmRzIGZyb20gdGhlCisuQXIgY29tbWFuZF9zdHJpbmcKK29wZXJhbmQgaW5zdGVhZCBvZiBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KK1NwZWNpYWwgcGFyYW1ldGVyIDAgd2lsbCBiZSBzZXQgZnJvbSB0aGUKKy5BciBjb21tYW5kX25hbWUKK29wZXJhbmQgYW5kIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKCQxLCAkMiwgZXRjLikKK3NldCBmcm9tIHRoZSByZW1haW5pbmcgYXJndW1lbnQgb3BlcmFuZHMuCisuSXQgRmwgQyBFbSBub2Nsb2JiZXIKK0Rvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyB3aXRoCisuRHEgXCpbR3RdIC4KKy5JdCBGbCBlIEVtIGVycmV4aXQKK0lmIG5vdCBpbnRlcmFjdGl2ZSwgZXhpdCBpbW1lZGlhdGVseSBpZiBhbnkgdW50ZXN0ZWQgY29tbWFuZCBmYWlscy4KK1RoZSBleGl0IHN0YXR1cyBvZiBhIGNvbW1hbmQgaXMgY29uc2lkZXJlZCB0byBiZQorZXhwbGljaXRseSB0ZXN0ZWQgaWYgdGhlIGNvbW1hbmQgaXMgdXNlZCB0byBjb250cm9sIGFuCisuSWMgaWYgLAorLkljIGVsaWYgLAorLkljIHdoaWxlICwKK29yCisuSWMgdW50aWwgOworb3IgaWYgdGhlIGNvbW1hbmQgaXMgdGhlIGxlZnQgaGFuZCBvcGVyYW5kIG9mIGFuCisuRHEgJiYKK29yCisuRHEgfHwKK29wZXJhdG9yLgorLkl0IEZsIGYgRW0gbm9nbG9iCitEaXNhYmxlIHBhdGhuYW1lIGV4cGFuc2lvbi4KKy5JdCBGbCBuIEVtIG5vZXhlYworSWYgbm90IGludGVyYWN0aXZlLCByZWFkIGNvbW1hbmRzIGJ1dCBkbyBub3QgZXhlY3V0ZSB0aGVtLgorVGhpcyBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIHRoZSBzeW50YXggb2Ygc2hlbGwgc2NyaXB0cy4KKy5JdCBGbCB1IEVtIG5vdW5zZXQKK1dyaXRlIGEgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZXhwYW5kIGEgdmFyaWFibGUKK3RoYXQgaXMgbm90IHNldCwgYW5kIGlmIHRoZSBzaGVsbCBpcyBub3QgaW50ZXJhY3RpdmUsIGV4aXQgaW1tZWRpYXRlbHkuCisuSXQgRmwgdiBFbSB2ZXJib3NlCitUaGUgc2hlbGwgd3JpdGVzIGl0cyBpbnB1dCB0byBzdGFuZGFyZCBlcnJvciBhcyBpdCBpcyByZWFkLgorVXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisuSXQgRmwgeCBFbSB4dHJhY2UKK1dyaXRlIGVhY2ggY29tbWFuZCB0byBzdGFuZGFyZCBlcnJvciAocHJlY2VkZWQgYnkgYQorLlNxICtcICApCitiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCitVc2VmdWwgZm9yIGRlYnVnZ2luZy4KKy5JdCBGbCBJIEVtIGlnbm9yZWVvZgorSWdub3JlIEVPRidzIGZyb20gaW5wdXQgd2hlbiBpbnRlcmFjdGl2ZS4KKy5JdCBGbCBpIEVtIGludGVyYWN0aXZlCitGb3JjZSB0aGUgc2hlbGwgdG8gYmVoYXZlIGludGVyYWN0aXZlbHkuCisuSXQgRmwgbSBFbSBtb25pdG9yCitUdXJuIG9uIGpvYiBjb250cm9sIChzZXQgYXV0b21hdGljYWxseSB3aGVuIGludGVyYWN0aXZlKS4KKy5JdCBGbCBzIEVtIHN0ZGluCitSZWFkIGNvbW1hbmRzIGZyb20gc3RhbmRhcmQgaW5wdXQgKHNldCBhdXRvbWF0aWNhbGx5IGlmIG5vIGZpbGUgYXJndW1lbnRzCithcmUgcHJlc2VudCkuCitUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IHdoZW4gc2V0IGFmdGVyIHRoZSBzaGVsbCBoYXMKK2FscmVhZHkgc3RhcnRlZCBydW5uaW5nIChpLmUuIHdpdGgKKy5JYyBzZXQgKSAuCisuSXQgRmwgViBFbSB2aQorRW5hYmxlIHRoZSBidWlsdC1pbgorLlhyIHZpIDEKK2NvbW1hbmQgbGluZSBlZGl0b3IgKGRpc2FibGVzCisuRmwgRQoraWYgaXQgaGFzIGJlZW4gc2V0KS4KKy5JdCBGbCBFIEVtIGVtYWNzCitFbmFibGUgdGhlIGJ1aWx0LWluCisuWHIgZW1hY3MgMQorY29tbWFuZCBsaW5lIGVkaXRvciAoZGlzYWJsZXMKKy5GbCBWCitpZiBpdCBoYXMgYmVlbiBzZXQpLgorLkl0IEZsIGIgRW0gbm90aWZ5CitFbmFibGUgYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBvZiBiYWNrZ3JvdW5kIGpvYiBjb21wbGV0aW9uLgorKFVOSU1QTEVNRU5URUQgZm9yIDQuNGFscGhhKQorLkVsCisuU3MgTGV4aWNhbCBTdHJ1Y3R1cmUKK1RoZSBzaGVsbCByZWFkcyBpbnB1dCBpbiB0ZXJtcyBvZiBsaW5lcyBmcm9tIGEgZmlsZSBhbmQgYnJlYWtzIGl0IHVwIGludG8KK3dvcmRzIGF0IHdoaXRlc3BhY2UgKGJsYW5rcyBhbmQgdGFicyksIGFuZCBhdCBjZXJ0YWluIHNlcXVlbmNlcyBvZgorY2hhcmFjdGVycyB0aGF0IGFyZSBzcGVjaWFsIHRvIHRoZSBzaGVsbCBjYWxsZWQKKy5EcSBvcGVyYXRvcnMgLgorVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBvcGVyYXRvcnM6IGNvbnRyb2wgb3BlcmF0b3JzIGFuZCByZWRpcmVjdGlvbgorb3BlcmF0b3JzICh0aGVpciBtZWFuaW5nIGlzIGRpc2N1c3NlZCBsYXRlcikuCitGb2xsb3dpbmcgaXMgYSBsaXN0IG9mIG9wZXJhdG9yczoKKy5CbCAtb2hhbmcgLW9mZnNldCBpbmRlbnQKKy5JdCAiQ29udHJvbCBvcGVyYXRvcnM6IgorLkRsICYgICYmICBcJiggIFwmKSAgXCY7ICA7OyB8IHx8IFwqW0x0XW5ld2xpbmVcKltHdF0KKy5JdCAiUmVkaXJlY3Rpb24gb3BlcmF0b3JzOiIKKy5EbCBcKltMdF0gIFwqW0d0XSAgXCpbR3RdfCAgXCpbTHRdXCpbTHRdICBcKltHdF1cKltHdF0gIFwqW0x0XSYgIFwqW0d0XSYgIFwqW0x0XVwqW0x0XS0gIFwqW0x0XVwqW0d0XQorLkVsCisuU3MgUXVvdGluZworUXVvdGluZyBpcyB1c2VkIHRvIHJlbW92ZSB0aGUgc3BlY2lhbCBtZWFuaW5nIG9mIGNlcnRhaW4gY2hhcmFjdGVycyBvcgord29yZHMgdG8gdGhlIHNoZWxsLCBzdWNoIGFzIG9wZXJhdG9ycywgd2hpdGVzcGFjZSwgb3Iga2V5d29yZHMuCitUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgcXVvdGluZzogbWF0Y2hlZCBzaW5nbGUgcXVvdGVzLAorbWF0Y2hlZCBkb3VibGUgcXVvdGVzLCBhbmQgYmFja3NsYXNoLgorLlNzIEJhY2tzbGFzaAorQSBiYWNrc2xhc2ggcHJlc2VydmVzIHRoZSBsaXRlcmFsIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZworY2hhcmFjdGVyLCB3aXRoIHRoZSBleGNlcHRpb24gb2YKKy5BcSBuZXdsaW5lIC4KK0EgYmFja3NsYXNoIHByZWNlZGluZyBhCisuQXEgbmV3bGluZQoraXMgdHJlYXRlZCBhcyBhIGxpbmUgY29udGludWF0aW9uLgorLlNzIFNpbmdsZSBRdW90ZXMKK0VuY2xvc2luZyBjaGFyYWN0ZXJzIGluIHNpbmdsZSBxdW90ZXMgcHJlc2VydmVzIHRoZSBsaXRlcmFsIG1lYW5pbmcgb2YgYWxsCit0aGUgY2hhcmFjdGVycyAoZXhjZXB0IHNpbmdsZSBxdW90ZXMsIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIHB1dAorc2luZ2xlLXF1b3RlcyBpbiBhIHNpbmdsZS1xdW90ZWQgc3RyaW5nKS4KKy5TcyBEb3VibGUgUXVvdGVzCitFbmNsb3NpbmcgY2hhcmFjdGVycyB3aXRoaW4gZG91YmxlIHF1b3RlcyBwcmVzZXJ2ZXMgdGhlIGxpdGVyYWwKK21lYW5pbmcgb2YgYWxsIGNoYXJhY3RlcnMgZXhjZXB0IGRvbGxhcnNpZ24KKy5QcSAkICwKK2JhY2txdW90ZQorLlBxIGAgLAorYW5kIGJhY2tzbGFzaAorLlBxIFxlIC4KK1RoZSBiYWNrc2xhc2ggaW5zaWRlIGRvdWJsZSBxdW90ZXMgaXMgaGlzdG9yaWNhbGx5IHdlaXJkLCBhbmQgc2VydmVzIHRvCitxdW90ZSBvbmx5IHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKKy5EbCAkICBgICBcKnEgIFxlICBcKltMdF1uZXdsaW5lXCpbR3RdIC4KK090aGVyd2lzZSBpdCByZW1haW5zIGxpdGVyYWwuCisuU3MgUmVzZXJ2ZWQgV29yZHMKK1Jlc2VydmVkIHdvcmRzIGFyZSB3b3JkcyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIHRvIHRoZQorc2hlbGwgYW5kIGFyZSByZWNvZ25pemVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGFuZAorYWZ0ZXIgYSBjb250cm9sIG9wZXJhdG9yLgorVGhlIGZvbGxvd2luZyBhcmUgcmVzZXJ2ZWQgd29yZHM6CisuQmwgLWNvbHVtbiB3aGlsZSB3aGlsZSB3aGlsZSB3aGlsZSB3aGlsZSAtb2Zmc2V0IGluZGVudAorLkl0ICEgVGEgZWxpZiBUYSBmaSBUYSB3aGlsZSBUYSBjYXNlCisuSXQgZWxzZSBUYSBmb3IgVGEgdGhlbiBUYSB7IFRhIH0KKy5JdCBkbyBUYSBkb25lIFRhIHVudGlsIFRhIGlmIFRhIGVzYWMKKy5FbAorLlBwCitUaGVpciBtZWFuaW5nIGlzIGRpc2N1c3NlZCBsYXRlci4KKy5TcyBBbGlhc2VzCitBbiBhbGlhcyBpcyBhIG5hbWUgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWUgc2V0IHVzaW5nIHRoZQorLlhyIGFsaWFzIDEKK2J1aWx0aW4gY29tbWFuZC4KK1doZW5ldmVyIGEgcmVzZXJ2ZWQgd29yZCBtYXkgb2NjdXIgKHNlZSBhYm92ZSksCithbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIHJlc2VydmVkIHdvcmRzLCB0aGUgc2hlbGwKK2NoZWNrcyB0aGUgd29yZCB0byBzZWUgaWYgaXQgbWF0Y2hlcyBhbiBhbGlhcy4KK0lmIGl0IGRvZXMsIGl0IHJlcGxhY2VzIGl0IGluIHRoZSBpbnB1dCBzdHJlYW0gd2l0aCBpdHMgdmFsdWUuCitGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYW4gYWxpYXMgY2FsbGVkCisuRHEgbGYKK3dpdGggdGhlIHZhbHVlCisuRHEgImxzIC1GIiAsCit0aGVuIHRoZSBpbnB1dDoKKy5QcAorLkRsIGxmIGZvb2JhciBBcSByZXR1cm4KKy5QcAord291bGQgYmVjb21lCisuUHAKKy5EbCBscyAtRiBmb29iYXIgQXEgcmV0dXJuCisuUHAKK0FsaWFzZXMgcHJvdmlkZSBhIGNvbnZlbmllbnQgd2F5IGZvciBuYWl2ZSB1c2VycyB0byBjcmVhdGUgc2hvcnRoYW5kcyBmb3IKK2NvbW1hbmRzIHdpdGhvdXQgaGF2aW5nIHRvIGxlYXJuIGhvdyB0byBjcmVhdGUgZnVuY3Rpb25zIHdpdGggYXJndW1lbnRzLgorVGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBsZXhpY2FsbHkgb2JzY3VyZSBjb2RlLgorVGhpcyB1c2UgaXMgZGlzY291cmFnZWQuCisuU3MgQ29tbWFuZHMKK1RoZSBzaGVsbCBpbnRlcnByZXRzIHRoZSB3b3JkcyBpdCByZWFkcyBhY2NvcmRpbmcgdG8gYSBsYW5ndWFnZSwgdGhlCitzcGVjaWZpY2F0aW9uIG9mIHdoaWNoIGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgbWFuIHBhZ2UgKHJlZmVyIHRvIHRoZQorQk5GIGluIHRoZQorLlRuIFBPU0lYCisxMDAzLjIgZG9jdW1lbnQpLgorRXNzZW50aWFsbHkgdGhvdWdoLCBhIGxpbmUgaXMgcmVhZCBhbmQgaWYgdGhlIGZpcnN0Cit3b3JkIG9mIHRoZSBsaW5lIChvciBhZnRlciBhIGNvbnRyb2wgb3BlcmF0b3IpIGlzIG5vdCBhIHJlc2VydmVkIHdvcmQsCit0aGVuIHRoZSBzaGVsbCBoYXMgcmVjb2duaXplZCBhIHNpbXBsZSBjb21tYW5kLgorT3RoZXJ3aXNlLCBhIGNvbXBsZXgKK2NvbW1hbmQgb3Igc29tZSBvdGhlciBzcGVjaWFsIGNvbnN0cnVjdCBtYXkgaGF2ZSBiZWVuIHJlY29nbml6ZWQuCisuU3MgU2ltcGxlIENvbW1hbmRzCitJZiBhIHNpbXBsZSBjb21tYW5kIGhhcyBiZWVuIHJlY29nbml6ZWQsIHRoZSBzaGVsbCBwZXJmb3JtcwordGhlIGZvbGxvd2luZyBhY3Rpb25zOgorLkJsIC1lbnVtIC1vZmZzZXQgaW5kZW50CisuSXQKK0xlYWRpbmcgd29yZHMgb2YgdGhlIGZvcm0KKy5EcSBuYW1lPXZhbHVlCithcmUgc3RyaXBwZWQgb2ZmIGFuZCBhc3NpZ25lZCB0byB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHNpbXBsZSBjb21tYW5kLgorUmVkaXJlY3Rpb24gb3BlcmF0b3JzIGFuZCB0aGVpciBhcmd1bWVudHMgKGFzIGRlc2NyaWJlZCBiZWxvdykgYXJlCitzdHJpcHBlZCBvZmYgYW5kIHNhdmVkIGZvciBwcm9jZXNzaW5nLgorLkl0CitUaGUgcmVtYWluaW5nIHdvcmRzIGFyZSBleHBhbmRlZCBhcyBkZXNjcmliZWQgaW4KK3RoZSBzZWN0aW9uIGNhbGxlZAorLkRxIEV4cGFuc2lvbnMgLAorYW5kIHRoZSBmaXJzdCByZW1haW5pbmcgd29yZCBpcyBjb25zaWRlcmVkIHRoZSBjb21tYW5kIG5hbWUgYW5kIHRoZQorY29tbWFuZCBpcyBsb2NhdGVkLgorVGhlIHJlbWFpbmluZyB3b3JkcyBhcmUgY29uc2lkZXJlZCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjb21tYW5kLgorSWYgbm8gY29tbWFuZCBuYW1lIHJlc3VsdGVkLCB0aGVuIHRoZQorLkRxIG5hbWU9dmFsdWUKK3ZhcmlhYmxlIGFzc2lnbm1lbnRzIHJlY29nbml6ZWQgaW4gaXRlbSAxIGFmZmVjdCB0aGUgY3VycmVudCBzaGVsbC4KKy5JdAorUmVkaXJlY3Rpb25zIGFyZSBwZXJmb3JtZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCisuRWwKKy5TcyBSZWRpcmVjdGlvbnMKK1JlZGlyZWN0aW9ucyBhcmUgdXNlZCB0byBjaGFuZ2Ugd2hlcmUgYSBjb21tYW5kIHJlYWRzIGl0cyBpbnB1dCBvciBzZW5kcworaXRzIG91dHB1dC4KK0luIGdlbmVyYWwsIHJlZGlyZWN0aW9ucyBvcGVuLCBjbG9zZSwgb3IgZHVwbGljYXRlIGFuCitleGlzdGluZyByZWZlcmVuY2UgdG8gYSBmaWxlLgorVGhlIG92ZXJhbGwgZm9ybWF0IHVzZWQgZm9yIHJlZGlyZWN0aW9uIGlzOgorLlBwCisuRGwgW25dIFZhIHJlZGlyLW9wIEFyIGZpbGUKKy5QcAord2hlcmUKKy5WYSByZWRpci1vcAoraXMgb25lIG9mIHRoZSByZWRpcmVjdGlvbiBvcGVyYXRvcnMgbWVudGlvbmVkIHByZXZpb3VzbHkuCitGb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHRoZSBwb3NzaWJsZSByZWRpcmVjdGlvbnMuCitUaGUKKy5CcSBuCitpcyBhbiBvcHRpb25hbCBudW1iZXIsIGFzIGluCisuU3EgMworKG5vdAorLlNxIEJxIDMgLAordGhhdCByZWZlcnMgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisuQmwgLXRhZyAtd2lkdGggYWFhYnNmaWxlcyAtb2Zmc2V0IGluZGVudAorLkl0IFtuXSBOcyBcKltHdF0gZmlsZQorUmVkaXJlY3Qgc3RhbmRhcmQgb3V0cHV0IChvciBuKSB0byBmaWxlLgorLkl0IFtuXSBOcyBcKltHdF18IGZpbGUKK1NhbWUsIGJ1dCBvdmVycmlkZSB0aGUKKy5GbCBDCitvcHRpb24uCisuSXQgW25dIE5zIFwqW0d0XVwqW0d0XSBmaWxlCitBcHBlbmQgc3RhbmRhcmQgb3V0cHV0IChvciBuKSB0byBmaWxlLgorLkl0IFtuXSBOcyBcKltMdF0gZmlsZQorUmVkaXJlY3Qgc3RhbmRhcmQgaW5wdXQgKG9yIG4pIGZyb20gZmlsZS4KKy5JdCBbbjFdIE5zIFwqW0x0XSYgTnMgbjIKK0R1cGxpY2F0ZSBzdGFuZGFyZCBpbnB1dCAob3IgbjEpIGZyb20gZmlsZSBkZXNjcmlwdG9yIG4yLgorLkl0IFtuXSBOcyBcKltMdF0mLQorQ2xvc2Ugc3RhbmRhcmQgaW5wdXQgKG9yIG4pLgorLkl0IFtuMV0gTnMgXCpbR3RdJiBOcyBuMgorRHVwbGljYXRlIHN0YW5kYXJkIG91dHB1dCAob3IgbjEpIHRvIG4yLgorLkl0IFtuXSBOcyBcKltHdF0mLQorQ2xvc2Ugc3RhbmRhcmQgb3V0cHV0IChvciBuKS4KKy5JdCBbbl0gTnMgXCpbTHRdXCpbR3RdIGZpbGUKK09wZW4gZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBvbiBzdGFuZGFyZCBpbnB1dCAob3IgbikuCisuRWwKKy5QcAorVGhlIGZvbGxvd2luZyByZWRpcmVjdGlvbiBpcyBvZnRlbiBjYWxsZWQgYQorLkRxIGhlcmUtZG9jdW1lbnQgLgorLkJsIC1pdGVtIC1vZmZzZXQgaW5kZW50CisuSXQKKy5MaSBbbl1cKltMdF1cKltMdF0gZGVsaW1pdGVyCisuRGwgaGVyZS1kb2MtdGV4dCAuLi4KKy5MaSBkZWxpbWl0ZXIKKy5FbAorLlBwCitBbGwgdGhlIHRleHQgb24gc3VjY2Vzc2l2ZSBsaW5lcyB1cCB0byB0aGUgZGVsaW1pdGVyIGlzIHNhdmVkIGF3YXkgYW5kCittYWRlIGF2YWlsYWJsZSB0byB0aGUgY29tbWFuZCBvbiBzdGFuZGFyZCBpbnB1dCwgb3IgZmlsZSBkZXNjcmlwdG9yIG4gaWYKK2l0IGlzIHNwZWNpZmllZC4KK0lmIHRoZSBkZWxpbWl0ZXIgYXMgc3BlY2lmaWVkIG9uIHRoZSBpbml0aWFsIGxpbmUgaXMKK3F1b3RlZCwgdGhlbiB0aGUgaGVyZS1kb2MtdGV4dCBpcyB0cmVhdGVkIGxpdGVyYWxseSwgb3RoZXJ3aXNlIHRoZSB0ZXh0IGlzCitzdWJqZWN0ZWQgdG8gcGFyYW1ldGVyIGV4cGFuc2lvbiwgY29tbWFuZCBzdWJzdGl0dXRpb24sIGFuZCBhcml0aG1ldGljCitleHBhbnNpb24gKGFzIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiBvbgorLkRxIEV4cGFuc2lvbnMgKSAuCitJZiB0aGUgb3BlcmF0b3IgaXMKKy5EcSBcKltMdF1cKltMdF0tCitpbnN0ZWFkIG9mCisuRHEgXCpbTHRdXCpbTHRdICwKK3RoZW4gbGVhZGluZyB0YWJzIGluIHRoZSBoZXJlLWRvYy10ZXh0IGFyZSBzdHJpcHBlZC4KKy5TcyBTZWFyY2ggYW5kIEV4ZWN1dGlvbgorVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGNvbW1hbmRzOiBzaGVsbCBmdW5jdGlvbnMsIGJ1aWx0aW4gY29tbWFuZHMsIGFuZAorbm9ybWFsIHByb2dyYW1zIC0tIGFuZCB0aGUgY29tbWFuZCBpcyBzZWFyY2hlZCBmb3IgKGJ5IG5hbWUpIGluIHRoYXQgb3JkZXIuCitUaGV5IGVhY2ggYXJlIGV4ZWN1dGVkIGluIGEgZGlmZmVyZW50IHdheS4KKy5QcAorV2hlbiBhIHNoZWxsIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLCBhbGwgb2YgdGhlIHNoZWxsIHBvc2l0aW9uYWwgcGFyYW1ldGVycworKGV4Y2VwdCAkMCwgd2hpY2ggcmVtYWlucyB1bmNoYW5nZWQpIGFyZSBzZXQgdG8gdGhlIGFyZ3VtZW50cyBvZiB0aGUgc2hlbGwKK2Z1bmN0aW9uLgorVGhlIHZhcmlhYmxlcyB3aGljaCBhcmUgZXhwbGljaXRseSBwbGFjZWQgaW4gdGhlIGVudmlyb25tZW50IG9mCit0aGUgY29tbWFuZCAoYnkgcGxhY2luZyBhc3NpZ25tZW50cyB0byB0aGVtIGJlZm9yZSB0aGUgZnVuY3Rpb24gbmFtZSkgYXJlCittYWRlIGxvY2FsIHRvIHRoZSBmdW5jdGlvbiBhbmQgYXJlIHNldCB0byB0aGUgdmFsdWVzIGdpdmVuLgorVGhlbiB0aGUgY29tbWFuZCBnaXZlbiBpbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4KK1RoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHJlc3RvcmVkIHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcword2hlbiB0aGUgY29tbWFuZCBjb21wbGV0ZXMuCitUaGlzIGFsbCBvY2N1cnMgd2l0aGluIHRoZSBjdXJyZW50IHNoZWxsLgorLlBwCitTaGVsbCBidWlsdGlucyBhcmUgZXhlY3V0ZWQgaW50ZXJuYWxseSB0byB0aGUgc2hlbGwsIHdpdGhvdXQgc3Bhd25pbmcgYQorbmV3IHByb2Nlc3MuCisuUHAKK090aGVyd2lzZSwgaWYgdGhlIGNvbW1hbmQgbmFtZSBkb2Vzbid0IG1hdGNoIGEgZnVuY3Rpb24gb3IgYnVpbHRpbiwgdGhlCitjb21tYW5kIGlzIHNlYXJjaGVkIGZvciBhcyBhIG5vcm1hbCBwcm9ncmFtIGluIHRoZSBmaWxlIHN5c3RlbSAoYXMKK2Rlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKS4KK1doZW4gYSBub3JtYWwgcHJvZ3JhbSBpcyBleGVjdXRlZCwgdGhlIHNoZWxsIHJ1bnMgdGhlIHByb2dyYW0sCitwYXNzaW5nIHRoZSBhcmd1bWVudHMgYW5kIHRoZSBlbnZpcm9ubWVudCB0byB0aGUgcHJvZ3JhbS4KK0lmIHRoZSBwcm9ncmFtIGlzIG5vdCBhIG5vcm1hbCBleGVjdXRhYmxlIGZpbGUgKGkuZS4sIGlmIGl0IGRvZXMKK25vdCBiZWdpbiB3aXRoIHRoZSAibWFnaWMgbnVtYmVyIiB3aG9zZQorLlRuIEFTQ0lJCityZXByZXNlbnRhdGlvbiBpcyAiIyEiLCBzbworLlhyIGV4ZWN2ZSAyCityZXR1cm5zCisuRXIgRU5PRVhFQwordGhlbikgdGhlIHNoZWxsIHdpbGwgaW50ZXJwcmV0IHRoZSBwcm9ncmFtIGluIGEgc3Vic2hlbGwuCitUaGUgY2hpbGQgc2hlbGwgd2lsbCByZWluaXRpYWxpemUgaXRzZWxmIGluIHRoaXMgY2FzZSwKK3NvIHRoYXQgdGhlIGVmZmVjdCB3aWxsIGJlIGFzIGlmIGEKK25ldyBzaGVsbCBoYWQgYmVlbiBpbnZva2VkIHRvIGhhbmRsZSB0aGUgYWQtaG9jIHNoZWxsIHNjcmlwdCwgZXhjZXB0IHRoYXQKK3RoZSBsb2NhdGlvbiBvZiBoYXNoZWQgY29tbWFuZHMgbG9jYXRlZCBpbiB0aGUgcGFyZW50IHNoZWxsIHdpbGwgYmUKK3JlbWVtYmVyZWQgYnkgdGhlIGNoaWxkLgorLlBwCitOb3RlIHRoYXQgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBkb2N1bWVudCBhbmQgdGhlIHNvdXJjZSBjb2RlIGl0c2VsZgorbWlzbGVhZGluZ2x5IGFuZCBzcG9yYWRpY2FsbHkgcmVmZXIgdG8gYSBzaGVsbCBzY3JpcHQgd2l0aG91dCBhIG1hZ2ljCitudW1iZXIgYXMgYSAic2hlbGwgcHJvY2VkdXJlIi4KKy5TcyBQYXRoIFNlYXJjaAorV2hlbiBsb2NhdGluZyBhIGNvbW1hbmQsIHRoZSBzaGVsbCBmaXJzdCBsb29rcyB0byBzZWUgaWYgaXQgaGFzIGEgc2hlbGwKK2Z1bmN0aW9uIGJ5IHRoYXQgbmFtZS4KK1RoZW4gaXQgbG9va3MgZm9yIGEgYnVpbHRpbiBjb21tYW5kIGJ5IHRoYXQgbmFtZS4KK0lmIGEgYnVpbHRpbiBjb21tYW5kIGlzIG5vdCBmb3VuZCwgb25lIG9mIHR3byB0aGluZ3MgaGFwcGVuOgorLkJsIC1lbnVtCisuSXQKK0NvbW1hbmQgbmFtZXMgY29udGFpbmluZyBhIHNsYXNoIGFyZSBzaW1wbHkgZXhlY3V0ZWQgd2l0aG91dCBwZXJmb3JtaW5nCithbnkgc2VhcmNoZXMuCisuSXQKK1RoZSBzaGVsbCBzZWFyY2hlcyBlYWNoIGVudHJ5IGluCisuRXYgUEFUSAoraW4gdHVybiBmb3IgdGhlIGNvbW1hbmQuCitUaGUgdmFsdWUgb2YgdGhlCisuRXYgUEFUSAordmFyaWFibGUgc2hvdWxkIGJlIGEgc2VyaWVzIG9mIGVudHJpZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KK0VhY2ggZW50cnkgY29uc2lzdHMgb2YgYSBkaXJlY3RvcnkgbmFtZS4KK1RoZSBjdXJyZW50IGRpcmVjdG9yeSBtYXkgYmUgaW5kaWNhdGVkCitpbXBsaWNpdGx5IGJ5IGFuIGVtcHR5IGRpcmVjdG9yeSBuYW1lLCBvciBleHBsaWNpdGx5IGJ5IGEgc2luZ2xlIHBlcmlvZC4KKy5FbAorLlNzIENvbW1hbmQgRXhpdCBTdGF0dXMKK0VhY2ggY29tbWFuZCBoYXMgYW4gZXhpdCBzdGF0dXMgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZSBiZWhhdmlvdXIKK29mIG90aGVyIHNoZWxsIGNvbW1hbmRzLgorVGhlIHBhcmFkaWdtIGlzIHRoYXQgYSBjb21tYW5kIGV4aXRzCit3aXRoIHplcm8gZm9yIG5vcm1hbCBvciBzdWNjZXNzLCBhbmQgbm9uLXplcm8gZm9yIGZhaWx1cmUsCitlcnJvciwgb3IgYSBmYWxzZSBpbmRpY2F0aW9uLgorVGhlIG1hbiBwYWdlIGZvciBlYWNoIGNvbW1hbmQKK3Nob3VsZCBpbmRpY2F0ZSB0aGUgdmFyaW91cyBleGl0IGNvZGVzIGFuZCB3aGF0IHRoZXkgbWVhbi4KK0FkZGl0aW9uYWxseSwgdGhlIGJ1aWx0aW4gY29tbWFuZHMgcmV0dXJuIGV4aXQgY29kZXMsIGFzIGRvZXMKK2FuIGV4ZWN1dGVkIHNoZWxsIGZ1bmN0aW9uLgorLlBwCitJZiBhIGNvbW1hbmQgY29uc2lzdHMgZW50aXJlbHkgb2YgdmFyaWFibGUgYXNzaWdubWVudHMgdGhlbiB0aGUKK2V4aXQgc3RhdHVzIG9mIHRoZSBjb21tYW5kIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZCBzdWJzdGl0dXRpb24KK2lmIGFueSwgb3RoZXJ3aXNlIDAuCisuU3MgQ29tcGxleCBDb21tYW5kcworQ29tcGxleCBjb21tYW5kcyBhcmUgY29tYmluYXRpb25zIG9mIHNpbXBsZSBjb21tYW5kcyB3aXRoIGNvbnRyb2wKK29wZXJhdG9ycyBvciByZXNlcnZlZCB3b3JkcywgdG9nZXRoZXIgY3JlYXRpbmcgYSBsYXJnZXIgY29tcGxleCBjb21tYW5kLgorTW9yZSBnZW5lcmFsbHksIGEgY29tbWFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKy5CbCAtYnVsbGV0CisuSXQKK3NpbXBsZSBjb21tYW5kCisuSXQKK3BpcGVsaW5lCisuSXQKK2xpc3Qgb3IgY29tcG91bmQtbGlzdAorLkl0Citjb21wb3VuZCBjb21tYW5kCisuSXQKK2Z1bmN0aW9uIGRlZmluaXRpb24KKy5FbAorLlBwCitVbmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgdGhlIGV4aXQgc3RhdHVzIG9mIGEgY29tbWFuZCBpcyB0aGF0IG9mIHRoZSBsYXN0CitzaW1wbGUgY29tbWFuZCBleGVjdXRlZCBieSB0aGUgY29tbWFuZC4KKy5TcyBQaXBlbGluZXMKK0EgcGlwZWxpbmUgaXMgYSBzZXF1ZW5jZSBvZiBvbmUgb3IgbW9yZSBjb21tYW5kcyBzZXBhcmF0ZWQKK2J5IHRoZSBjb250cm9sIG9wZXJhdG9yIHwuCitUaGUgc3RhbmRhcmQgb3V0cHV0IG9mIGFsbCBidXQKK3RoZSBsYXN0IGNvbW1hbmQgaXMgY29ubmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBpbnB1dAorb2YgdGhlIG5leHQgY29tbWFuZC4KK1RoZSBzdGFuZGFyZCBvdXRwdXQgb2YgdGhlIGxhc3QKK2NvbW1hbmQgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHNoZWxsLCBhcyB1c3VhbC4KKy5QcAorVGhlIGZvcm1hdCBmb3IgYSBwaXBlbGluZSBpczoKKy5QcAorLkRsIFshXSBjb21tYW5kMSBbIHwgY29tbWFuZDIgLi4uXQorLlBwCitUaGUgc3RhbmRhcmQgb3V0cHV0IG9mIGNvbW1hbmQxIGlzIGNvbm5lY3RlZCB0byB0aGUgc3RhbmRhcmQgaW5wdXQgb2YKK2NvbW1hbmQyLgorVGhlIHN0YW5kYXJkIGlucHV0LCBzdGFuZGFyZCBvdXRwdXQsIG9yIGJvdGggb2YgYSBjb21tYW5kIGlzCitjb25zaWRlcmVkIHRvIGJlIGFzc2lnbmVkIGJ5IHRoZSBwaXBlbGluZSBiZWZvcmUgYW55IHJlZGlyZWN0aW9uIHNwZWNpZmllZAorYnkgcmVkaXJlY3Rpb24gb3BlcmF0b3JzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGNvbW1hbmQuCisuUHAKK0lmIHRoZSBwaXBlbGluZSBpcyBub3QgaW4gdGhlIGJhY2tncm91bmQgKGRpc2N1c3NlZCBsYXRlciksIHRoZSBzaGVsbAord2FpdHMgZm9yIGFsbCBjb21tYW5kcyB0byBjb21wbGV0ZS4KKy5QcAorSWYgdGhlIHJlc2VydmVkIHdvcmQgISBkb2VzIG5vdCBwcmVjZWRlIHRoZSBwaXBlbGluZSwgdGhlIGV4aXQgc3RhdHVzIGlzCit0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGxhc3QgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIHBpcGVsaW5lLgorT3RoZXJ3aXNlLCB0aGUgZXhpdCBzdGF0dXMgaXMgdGhlIGxvZ2ljYWwgTk9UIG9mIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUKK2xhc3QgY29tbWFuZC4KK1RoYXQgaXMsIGlmIHRoZSBsYXN0IGNvbW1hbmQgcmV0dXJucyB6ZXJvLCB0aGUgZXhpdCBzdGF0dXMKK2lzIDE7IGlmIHRoZSBsYXN0IGNvbW1hbmQgcmV0dXJucyBncmVhdGVyIHRoYW4gemVybywgdGhlIGV4aXQgc3RhdHVzIGlzCit6ZXJvLgorLlBwCitCZWNhdXNlIHBpcGVsaW5lIGFzc2lnbm1lbnQgb2Ygc3RhbmRhcmQgaW5wdXQgb3Igc3RhbmRhcmQgb3V0cHV0IG9yIGJvdGgKK3Rha2VzIHBsYWNlIGJlZm9yZSByZWRpcmVjdGlvbiwgaXQgY2FuIGJlIG1vZGlmaWVkIGJ5IHJlZGlyZWN0aW9uLgorRm9yIGV4YW1wbGU6CisuUHAKKy5EbCAkIGNvbW1hbmQxIDJcKltHdF0mMSB8IGNvbW1hbmQyCisuUHAKK3NlbmRzIGJvdGggdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgY29tbWFuZDEKK3RvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBjb21tYW5kMi4KKy5QcAorQSA7IG9yCisuQXEgbmV3bGluZQordGVybWluYXRvciBjYXVzZXMgdGhlIHByZWNlZGluZyBBTkQtT1ItbGlzdCAoZGVzY3JpYmVkCituZXh0KSB0byBiZSBleGVjdXRlZCBzZXF1ZW50aWFsbHk7IGEgJiBjYXVzZXMgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbiBvZgordGhlIHByZWNlZGluZyBBTkQtT1ItbGlzdC4KKy5QcAorTm90ZSB0aGF0IHVubGlrZSBzb21lIG90aGVyIHNoZWxscywgZWFjaCBwcm9jZXNzIGluIHRoZSBwaXBlbGluZSBpcyBhCitjaGlsZCBvZiB0aGUgaW52b2tpbmcgc2hlbGwgKHVubGVzcyBpdCBpcyBhIHNoZWxsIGJ1aWx0aW4sIGluIHdoaWNoIGNhc2UKK2l0IGV4ZWN1dGVzIGluIHRoZSBjdXJyZW50IHNoZWxsIC0tIGJ1dCBhbnkgZWZmZWN0IGl0IGhhcyBvbiB0aGUKK2Vudmlyb25tZW50IGlzIHdpcGVkKS4KKy5TcyBCYWNrZ3JvdW5kIENvbW1hbmRzIC0tICYKK0lmIGEgY29tbWFuZCBpcyB0ZXJtaW5hdGVkIGJ5IHRoZSBjb250cm9sIG9wZXJhdG9yIGFtcGVyc2FuZCAoJiksIHRoZQorc2hlbGwgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgYXN5bmNocm9ub3VzbHkgLS0gdGhhdCBpcywgdGhlIHNoZWxsIGRvZXMgbm90Cit3YWl0IGZvciB0aGUgY29tbWFuZCB0byBmaW5pc2ggYmVmb3JlIGV4ZWN1dGluZyB0aGUgbmV4dCBjb21tYW5kLgorLlBwCitUaGUgZm9ybWF0IGZvciBydW5uaW5nIGEgY29tbWFuZCBpbiBiYWNrZ3JvdW5kIGlzOgorLlBwCisuRGwgY29tbWFuZDEgJiBbY29tbWFuZDIgJiAuLi5dCisuUHAKK0lmIHRoZSBzaGVsbCBpcyBub3QgaW50ZXJhY3RpdmUsIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBhbiBhc3luY2hyb25vdXMKK2NvbW1hbmQgaXMgc2V0IHRvCisuUGEgL2Rldi9udWxsIC4KKy5TcyBMaXN0cyAtLSBHZW5lcmFsbHkgU3BlYWtpbmcKK0EgbGlzdCBpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBjb21tYW5kcyBzZXBhcmF0ZWQgYnkgbmV3bGluZXMsCitzZW1pY29sb25zLCBvciBhbXBlcnNhbmRzLCBhbmQgb3B0aW9uYWxseSB0ZXJtaW5hdGVkIGJ5IG9uZSBvZiB0aGVzZSB0aHJlZQorY2hhcmFjdGVycy4KK1RoZSBjb21tYW5kcyBpbiBhIGxpc3QgYXJlIGV4ZWN1dGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSB3cml0dGVuLgorSWYgY29tbWFuZCBpcyBmb2xsb3dlZCBieSBhbiBhbXBlcnNhbmQsIHRoZSBzaGVsbCBzdGFydHMgdGhlCitjb21tYW5kIGFuZCBpbW1lZGlhdGVseSBwcm9jZWVkIG9udG8gdGhlIG5leHQgY29tbWFuZDsgb3RoZXJ3aXNlIGl0IHdhaXRzCitmb3IgdGhlIGNvbW1hbmQgdG8gdGVybWluYXRlIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHRoZSBuZXh0IG9uZS4KKy5TcyBTaG9ydC1DaXJjdWl0IExpc3QgT3BlcmF0b3JzCisuRHEgJiYKK2FuZAorLkRxIHx8CithcmUgQU5ELU9SIGxpc3Qgb3BlcmF0b3JzLgorLkRxICYmCitleGVjdXRlcyB0aGUgZmlyc3QgY29tbWFuZCwgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlIHNlY29uZCBjb21tYW5kIGlmZiB0aGUKK2V4aXQgc3RhdHVzIG9mIHRoZSBmaXJzdCBjb21tYW5kIGlzIHplcm8uCisuRHEgfHwKK2lzIHNpbWlsYXIsIGJ1dCBleGVjdXRlcyB0aGUgc2Vjb25kIGNvbW1hbmQgaWZmIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgZmlyc3QKK2NvbW1hbmQgaXMgbm9uemVyby4KKy5EcSAmJgorYW5kCisuRHEgfHwKK2JvdGggaGF2ZSB0aGUgc2FtZSBwcmlvcml0eS4KKy5TcyBGbG93LUNvbnRyb2wgQ29uc3RydWN0cyAtLSBpZiwgd2hpbGUsIGZvciwgY2FzZQorVGhlIHN5bnRheCBvZiB0aGUgaWYgY29tbWFuZCBpcworLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitpZiBsaXN0Cit0aGVuIGxpc3QKK1sgZWxpZiBsaXN0Cit0aGVuICAgIGxpc3QgXSAuLi4KK1sgZWxzZSBsaXN0IF0KK2ZpCisuRWQKKy5QcAorVGhlIHN5bnRheCBvZiB0aGUgd2hpbGUgY29tbWFuZCBpcworLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50Cit3aGlsZSBsaXN0CitkbyAgIGxpc3QKK2RvbmUKKy5FZAorLlBwCitUaGUgdHdvIGxpc3RzIGFyZSBleGVjdXRlZCByZXBlYXRlZGx5IHdoaWxlIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUKK2ZpcnN0IGxpc3QgaXMgemVyby4KK1RoZSB1bnRpbCBjb21tYW5kIGlzIHNpbWlsYXIsIGJ1dCBoYXMgdGhlIHdvcmQKK3VudGlsIGluIHBsYWNlIG9mIHdoaWxlLCB3aGljaCBjYXVzZXMgaXQgdG8KK3JlcGVhdCB1bnRpbCB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGZpcnN0IGxpc3QgaXMgemVyby4KKy5QcAorVGhlIHN5bnRheCBvZiB0aGUgZm9yIGNvbW1hbmQgaXMKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IGluZGVudAorZm9yIHZhcmlhYmxlIGluIHdvcmQgLi4uCitkbyAgIGxpc3QKK2RvbmUKKy5FZAorLlBwCitUaGUgd29yZHMgYXJlIGV4cGFuZGVkLCBhbmQgdGhlbiB0aGUgbGlzdCBpcyBleGVjdXRlZCByZXBlYXRlZGx5IHdpdGggdGhlCit2YXJpYWJsZSBzZXQgdG8gZWFjaCB3b3JkIGluIHR1cm4uCitkbyBhbmQgZG9uZSBtYXkgYmUgcmVwbGFjZWQgd2l0aAorLkRxIHsKK2FuZAorLkRxIH0gLgorLlBwCitUaGUgc3ludGF4IG9mIHRoZSBicmVhayBhbmQgY29udGludWUgY29tbWFuZCBpcworLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CiticmVhayBbIG51bSBdCitjb250aW51ZSBbIG51bSBdCisuRWQKKy5QcAorQnJlYWsgdGVybWluYXRlcyB0aGUgbnVtIGlubmVybW9zdCBmb3Igb3Igd2hpbGUgbG9vcHMuCitDb250aW51ZSBjb250aW51ZXMgd2l0aCB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGlubmVybW9zdCBsb29wLgorVGhlc2UgYXJlIGltcGxlbWVudGVkIGFzIGJ1aWx0aW4gY29tbWFuZHMuCisuUHAKK1RoZSBzeW50YXggb2YgdGhlIGNhc2UgY29tbWFuZCBpcworLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitjYXNlIHdvcmQgaW4KK3BhdHRlcm4pIGxpc3QgOzsKK1wmLi4uCitlc2FjCisuRWQKKy5QcAorVGhlIHBhdHRlcm4gY2FuIGFjdHVhbGx5IGJlIG9uZSBvciBtb3JlIHBhdHRlcm5zIChzZWUKKy5TeCBTaGVsbCBQYXR0ZXJucworZGVzY3JpYmVkIGxhdGVyKSwgc2VwYXJhdGVkIGJ5CisuRHEgXCooQmEKK2NoYXJhY3RlcnMuCisuU3MgR3JvdXBpbmcgQ29tbWFuZHMgVG9nZXRoZXIKK0NvbW1hbmRzIG1heSBiZSBncm91cGVkIGJ5IHdyaXRpbmcgZWl0aGVyCisuUHAKKy5EbCAobGlzdCkKKy5QcAorb3IKKy5QcAorLkRsIHsgbGlzdDsgfQorLlBwCitUaGUgZmlyc3Qgb2YgdGhlc2UgZXhlY3V0ZXMgdGhlIGNvbW1hbmRzIGluIGEgc3Vic2hlbGwuCitCdWlsdGluIGNvbW1hbmRzIGdyb3VwZWQgaW50byBhIChsaXN0KSB3aWxsIG5vdCBhZmZlY3QgdGhlIGN1cnJlbnQgc2hlbGwuCitUaGUgc2Vjb25kIGZvcm0gZG9lcyBub3QgZm9yayBhbm90aGVyIHNoZWxsIHNvIGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50LgorR3JvdXBpbmcgY29tbWFuZHMgdG9nZXRoZXIgdGhpcyB3YXkgYWxsb3dzIHlvdSB0byByZWRpcmVjdAordGhlaXIgb3V0cHV0IGFzIHRob3VnaCB0aGV5IHdlcmUgb25lIHByb2dyYW06CisuUHAKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IGluZGVudAoreyBwcmludGYgXCpxIGhlbGxvIFwqcSA7IHByaW50ZiBcKnEgd29ybGRcXG4iIDsgfSBcKltHdF0gZ3JlZXRpbmcKKy5FZAorLlBwCitOb3RlIHRoYXQKKy5EcSB9CittdXN0IGZvbGxvdyBhIGNvbnRyb2wgb3BlcmF0b3IgKGhlcmUsCisuRHEgXCY7ICkKK3NvIHRoYXQgaXQgaXMgcmVjb2duaXplZCBhcyBhIHJlc2VydmVkIHdvcmQgYW5kIG5vdCBhcyBhbm90aGVyIGNvbW1hbmQgYXJndW1lbnQuCisuU3MgRnVuY3Rpb25zCitUaGUgc3ludGF4IG9mIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcworLlBwCisuRGwgbmFtZSAoICkgY29tbWFuZAorLlBwCitBIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQ7IHdoZW4gZXhlY3V0ZWQgaXQKK2luc3RhbGxzIGEgZnVuY3Rpb24gbmFtZWQgbmFtZSBhbmQgcmV0dXJucyBhbiBleGl0IHN0YXR1cyBvZiB6ZXJvLgorVGhlIGNvbW1hbmQgaXMgbm9ybWFsbHkgYSBsaXN0IGVuY2xvc2VkIGJldHdlZW4KKy5EcSB7CithbmQKKy5EcSB9IC4KKy5QcAorVmFyaWFibGVzIG1heSBiZSBkZWNsYXJlZCB0byBiZSBsb2NhbCB0byBhIGZ1bmN0aW9uIGJ5IHVzaW5nIGEgbG9jYWwKK2NvbW1hbmQuCitUaGlzIHNob3VsZCBhcHBlYXIgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIGZ1bmN0aW9uLCBhbmQgdGhlIHN5bnRheCBpcworLlBwCisuRGwgbG9jYWwgWyB2YXJpYWJsZSB8IC0gXSAuLi4KKy5QcAorTG9jYWwgaXMgaW1wbGVtZW50ZWQgYXMgYSBidWlsdGluIGNvbW1hbmQuCisuUHAKK1doZW4gYSB2YXJpYWJsZSBpcyBtYWRlIGxvY2FsLCBpdCBpbmhlcml0cyB0aGUgaW5pdGlhbCB2YWx1ZSBhbmQgZXhwb3J0ZWQKK2FuZCByZWFkb25seSBmbGFncyBmcm9tIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHN1cnJvdW5kaW5nCitzY29wZSwgaWYgdGhlcmUgaXMgb25lLgorT3RoZXJ3aXNlLCB0aGUgdmFyaWFibGUgaXMgaW5pdGlhbGx5IHVuc2V0LgorVGhlIHNoZWxsIHVzZXMgZHluYW1pYyBzY29waW5nLCBzbyB0aGF0IGlmIHlvdSBtYWtlIHRoZSB2YXJpYWJsZSB4IGxvY2FsIHRvCitmdW5jdGlvbiBmLCB3aGljaCB0aGVuIGNhbGxzIGZ1bmN0aW9uIGcsIHJlZmVyZW5jZXMgdG8gdGhlIHZhcmlhYmxlIHggbWFkZQoraW5zaWRlIGcgd2lsbCByZWZlciB0byB0aGUgdmFyaWFibGUgeCBkZWNsYXJlZCBpbnNpZGUgZiwgbm90IHRvIHRoZSBnbG9iYWwKK3ZhcmlhYmxlIG5hbWVkIHguCisuUHAKK1RoZSBvbmx5IHNwZWNpYWwgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIG1hZGUgbG9jYWwgaXMKKy5EcSAtIC4KK01ha2luZworLkRxIC0KK2xvY2FsIGFueSBzaGVsbCBvcHRpb25zIHRoYXQgYXJlIGNoYW5nZWQgdmlhIHRoZSBzZXQgY29tbWFuZCBpbnNpZGUgdGhlCitmdW5jdGlvbiB0byBiZSByZXN0b3JlZCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMgd2hlbiB0aGUgZnVuY3Rpb24KK3JldHVybnMuCisuUHAKK1RoZSBzeW50YXggb2YgdGhlIHJldHVybiBjb21tYW5kIGlzCisuUHAKKy5EbCByZXR1cm4gWyBleGl0c3RhdHVzIF0KKy5QcAorSXQgdGVybWluYXRlcyB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBmdW5jdGlvbi4KK1JldHVybiBpcyBpbXBsZW1lbnRlZCBhcyBhIGJ1aWx0aW4gY29tbWFuZC4KKy5TcyBWYXJpYWJsZXMgYW5kIFBhcmFtZXRlcnMKK1RoZSBzaGVsbCBtYWludGFpbnMgYSBzZXQgb2YgcGFyYW1ldGVycy4KK0EgcGFyYW1ldGVyIGRlbm90ZWQgYnkgYSBuYW1lIGlzIGNhbGxlZCBhIHZhcmlhYmxlLgorV2hlbiBzdGFydGluZyB1cCwgdGhlIHNoZWxsIHR1cm5zIGFsbCB0aGUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcyBpbnRvIHNoZWxsIHZhcmlhYmxlcy4KK05ldyB2YXJpYWJsZXMgY2FuIGJlIHNldCB1c2luZyB0aGUgZm9ybQorLlBwCisuRGwgbmFtZT12YWx1ZQorLlBwCitWYXJpYWJsZXMgc2V0IGJ5IHRoZSB1c2VyIG11c3QgaGF2ZSBhIG5hbWUgY29uc2lzdGluZyBzb2xlbHkgb2YKK2FscGhhYmV0aWNzLCBudW1lcmljcywgYW5kIHVuZGVyc2NvcmVzIC0gdGhlIGZpcnN0IG9mIHdoaWNoIG11c3Qgbm90IGJlCitudW1lcmljLgorQSBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgZGVub3RlZCBieSBhIG51bWJlciBvciBhIHNwZWNpYWwKK2NoYXJhY3RlciBhcyBleHBsYWluZWQgYmVsb3cuCisuU3MgUG9zaXRpb25hbCBQYXJhbWV0ZXJzCitBIHBvc2l0aW9uYWwgcGFyYW1ldGVyIGlzIGEgcGFyYW1ldGVyIGRlbm90ZWQgYnkgYSBudW1iZXIgKG4gXCpbR3RdIDApLgorVGhlIHNoZWxsIHNldHMgdGhlc2UgaW5pdGlhbGx5IHRvIHRoZSB2YWx1ZXMgb2YgaXRzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3RoYXQgZm9sbG93IHRoZSBuYW1lIG9mIHRoZSBzaGVsbCBzY3JpcHQuCitUaGUKKy5JYyBzZXQKK2J1aWx0aW4gY2FuIGFsc28gYmUgdXNlZCB0byBzZXQgb3IgcmVzZXQgdGhlbS4KKy5TcyBTcGVjaWFsIFBhcmFtZXRlcnMKK0Egc3BlY2lhbCBwYXJhbWV0ZXIgaXMgYSBwYXJhbWV0ZXIgZGVub3RlZCBieSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzcGVjaWFsCitjaGFyYWN0ZXJzLgorVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgaXMgbGlzdGVkIG5leHQgdG8gaXRzIGNoYXJhY3Rlci4KKy5CbCAtdGFnIC13aWR0aCB0aGluaHlwaGVuYQorLkl0ICoKK0V4cGFuZHMgdG8gdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc3RhcnRpbmcgZnJvbSBvbmUuCitXaGVuIHRoZQorZXhwYW5zaW9uIG9jY3VycyB3aXRoaW4gYSBkb3VibGUtcXVvdGVkIHN0cmluZyBpdCBleHBhbmRzIHRvIGEgc2luZ2xlCitmaWVsZCB3aXRoIHRoZSB2YWx1ZSBvZiBlYWNoIHBhcmFtZXRlciBzZXBhcmF0ZWQgYnkgdGhlIGZpcnN0IGNoYXJhY3RlciBvZgordGhlCisuRXYgSUZTCit2YXJpYWJsZSwgb3IgYnkgYQorLkFxIHNwYWNlCitpZgorLkV2IElGUworaXMgdW5zZXQuCisuSXQgQAorRXhwYW5kcyB0byB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzdGFydGluZyBmcm9tIG9uZS4KK1doZW4gdGhlIGV4cGFuc2lvbiBvY2N1cnMgd2l0aGluIGRvdWJsZS1xdW90ZXMsIGVhY2ggcG9zaXRpb25hbAorcGFyYW1ldGVyIGV4cGFuZHMgYXMgYSBzZXBhcmF0ZSBhcmd1bWVudC4KK0lmIHRoZXJlIGFyZSBubyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHRoZQorZXhwYW5zaW9uIG9mIEAgZ2VuZXJhdGVzIHplcm8gYXJndW1lbnRzLCBldmVuIHdoZW4gQCBpcworZG91YmxlLXF1b3RlZC4KK1doYXQgdGhpcyBiYXNpY2FsbHkgbWVhbnMsIGZvciBleGFtcGxlLCBpcworaWYgJDEgaXMKKy5EcSBhYmMKK2FuZCAkMiBpcworLkRxIGRlZiBnaGkgLAordGhlbgorLlFxICRACitleHBhbmRzIHRvCit0aGUgdHdvIGFyZ3VtZW50czoKKy5QcAorLlNtIG9mZgorLkRsIFwqcSBhYmMgXCpxIFwgIFwqcSBkZWZcIGdoaSBcKnEKKy5TbSBvbgorLkl0ICMKK0V4cGFuZHMgdG8gdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCisuSXQgPworRXhwYW5kcyB0byB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIG1vc3QgcmVjZW50IHBpcGVsaW5lLgorLkl0IC0gKEh5cGhlbi4pCitFeHBhbmRzIHRvIHRoZSBjdXJyZW50IG9wdGlvbiBmbGFncyAodGhlIHNpbmdsZS1sZXR0ZXIKK29wdGlvbiBuYW1lcyBjb25jYXRlbmF0ZWQgaW50byBhIHN0cmluZykgYXMgc3BlY2lmaWVkIG9uCitpbnZvY2F0aW9uLCBieSB0aGUgc2V0IGJ1aWx0aW4gY29tbWFuZCwgb3IgaW1wbGljaXRseQorYnkgdGhlIHNoZWxsLgorLkl0ICQKK0V4cGFuZHMgdG8gdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGludm9rZWQgc2hlbGwuCitBIHN1YnNoZWxsIHJldGFpbnMgdGhlIHNhbWUgdmFsdWUgb2YgJCBhcyBpdHMgcGFyZW50LgorLkl0ICEKK0V4cGFuZHMgdG8gdGhlIHByb2Nlc3MgSUQgb2YgdGhlIG1vc3QgcmVjZW50IGJhY2tncm91bmQKK2NvbW1hbmQgZXhlY3V0ZWQgZnJvbSB0aGUgY3VycmVudCBzaGVsbC4KK0ZvciBhIHBpcGVsaW5lLCB0aGUgcHJvY2VzcyBJRCBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHBpcGVsaW5lLgorLkl0IDAgKFplcm8uKQorRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgc2hlbGwgb3Igc2hlbGwgc2NyaXB0LgorLkVsCisuU3MgV29yZCBFeHBhbnNpb25zCitUaGlzIGNsYXVzZSBkZXNjcmliZXMgdGhlIHZhcmlvdXMgZXhwYW5zaW9ucyB0aGF0IGFyZSBwZXJmb3JtZWQgb24gd29yZHMuCitOb3QgYWxsIGV4cGFuc2lvbnMgYXJlIHBlcmZvcm1lZCBvbiBldmVyeSB3b3JkLCBhcyBleHBsYWluZWQgbGF0ZXIuCisuUHAKK1RpbGRlIGV4cGFuc2lvbnMsIHBhcmFtZXRlciBleHBhbnNpb25zLCBjb21tYW5kIHN1YnN0aXR1dGlvbnMsIGFyaXRobWV0aWMKK2V4cGFuc2lvbnMsIGFuZCBxdW90ZSByZW1vdmFscyB0aGF0IG9jY3VyIHdpdGhpbiBhIHNpbmdsZSB3b3JkIGV4cGFuZCB0byBhCitzaW5nbGUgZmllbGQuCitJdCBpcyBvbmx5IGZpZWxkIHNwbGl0dGluZyBvciBwYXRobmFtZSBleHBhbnNpb24gdGhhdCBjYW4KK2NyZWF0ZSBtdWx0aXBsZSBmaWVsZHMgZnJvbSBhIHNpbmdsZSB3b3JkLgorVGhlIHNpbmdsZSBleGNlcHRpb24gdG8gdGhpcworcnVsZSBpcyB0aGUgZXhwYW5zaW9uIG9mIHRoZSBzcGVjaWFsIHBhcmFtZXRlciBAIHdpdGhpbiBkb3VibGUtcXVvdGVzLCBhcword2FzIGRlc2NyaWJlZCBhYm92ZS4KKy5QcAorVGhlIG9yZGVyIG9mIHdvcmQgZXhwYW5zaW9uIGlzOgorLkJsIC1lbnVtCisuSXQKK1RpbGRlIEV4cGFuc2lvbiwgUGFyYW1ldGVyIEV4cGFuc2lvbiwgQ29tbWFuZCBTdWJzdGl0dXRpb24sCitBcml0aG1ldGljIEV4cGFuc2lvbiAodGhlc2UgYWxsIG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUpLgorLkl0CitGaWVsZCBTcGxpdHRpbmcgaXMgcGVyZm9ybWVkIG9uIGZpZWxkcworZ2VuZXJhdGVkIGJ5IHN0ZXAgKDEpIHVubGVzcyB0aGUKKy5FdiBJRlMKK3ZhcmlhYmxlIGlzIG51bGwuCisuSXQKK1BhdGhuYW1lIEV4cGFuc2lvbiAodW5sZXNzIHNldAorLkZsIGYKK2lzIGluIGVmZmVjdCkuCisuSXQKK1F1b3RlIFJlbW92YWwuCisuRWwKKy5QcAorVGhlICQgY2hhcmFjdGVyIGlzIHVzZWQgdG8gaW50cm9kdWNlIHBhcmFtZXRlciBleHBhbnNpb24sIGNvbW1hbmQKK3N1YnN0aXR1dGlvbiwgb3IgYXJpdGhtZXRpYyBldmFsdWF0aW9uLgorLlNzIFRpbGRlIEV4cGFuc2lvbiAoc3Vic3RpdHV0aW5nIGEgdXNlcidzIGhvbWUgZGlyZWN0b3J5KQorQSB3b3JkIGJlZ2lubmluZyB3aXRoIGFuIHVucXVvdGVkIHRpbGRlIGNoYXJhY3RlciAofikgaXMKK3N1YmplY3RlZCB0byB0aWxkZSBleHBhbnNpb24uCitBbGwgdGhlIGNoYXJhY3RlcnMgdXAgdG8KK2Egc2xhc2ggKC8pIG9yIHRoZSBlbmQgb2YgdGhlIHdvcmQgYXJlIHRyZWF0ZWQgYXMgYSB1c2VybmFtZQorYW5kIGFyZSByZXBsYWNlZCB3aXRoIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCitJZiB0aGUgdXNlcm5hbWUgaXMgbWlzc2luZyAoYXMgaW4KKy5QYSB+L2Zvb2JhciApICwKK3RoZSB0aWxkZSBpcyByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKKy5WYSBIT01FCit2YXJpYWJsZSAodGhlIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5KS4KKy5TcyBQYXJhbWV0ZXIgRXhwYW5zaW9uCitUaGUgZm9ybWF0IGZvciBwYXJhbWV0ZXIgZXhwYW5zaW9uIGlzIGFzIGZvbGxvd3M6CisuUHAKKy5EbCAke2V4cHJlc3Npb259CisuUHAKK3doZXJlIGV4cHJlc3Npb24gY29uc2lzdHMgb2YgYWxsIGNoYXJhY3RlcnMgdW50aWwgdGhlIG1hdGNoaW5nCisuRHEgfSAuCitBbnkKKy5EcSB9Citlc2NhcGVkIGJ5IGEgYmFja3NsYXNoIG9yIHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcsIGFuZCBjaGFyYWN0ZXJzIGluCitlbWJlZGRlZCBhcml0aG1ldGljIGV4cGFuc2lvbnMsIGNvbW1hbmQgc3Vic3RpdHV0aW9ucywgYW5kIHZhcmlhYmxlCitleHBhbnNpb25zLCBhcmUgbm90IGV4YW1pbmVkIGluIGRldGVybWluaW5nIHRoZSBtYXRjaGluZworLkRxIH0gLgorLlBwCitUaGUgc2ltcGxlc3QgZm9ybSBmb3IgcGFyYW1ldGVyIGV4cGFuc2lvbiBpczoKKy5QcAorLkRsICR7cGFyYW1ldGVyfQorLlBwCitUaGUgdmFsdWUsIGlmIGFueSwgb2YgcGFyYW1ldGVyIGlzIHN1YnN0aXR1dGVkLgorLlBwCitUaGUgcGFyYW1ldGVyIG5hbWUgb3Igc3ltYm9sIGNhbiBiZSBlbmNsb3NlZCBpbiBicmFjZXMsIHdoaWNoIGFyZQorb3B0aW9uYWwgZXhjZXB0IGZvciBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2l0aCBtb3JlIHRoYW4gb25lIGRpZ2l0IG9yCit3aGVuIHBhcmFtZXRlciBpcyBmb2xsb3dlZCBieSBhIGNoYXJhY3RlciB0aGF0IGNvdWxkIGJlIGludGVycHJldGVkIGFzCitwYXJ0IG9mIHRoZSBuYW1lLgorSWYgYSBwYXJhbWV0ZXIgZXhwYW5zaW9uIG9jY3VycyBpbnNpZGUgZG91YmxlLXF1b3RlczoKKy5CbCAtZW51bQorLkl0CitQYXRobmFtZSBleHBhbnNpb24gaXMgbm90IHBlcmZvcm1lZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGUgZXhwYW5zaW9uLgorLkl0CitGaWVsZCBzcGxpdHRpbmcgaXMgbm90IHBlcmZvcm1lZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGUKK2V4cGFuc2lvbiwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIEAuCisuRWwKKy5QcAorSW4gYWRkaXRpb24sIGEgcGFyYW1ldGVyIGV4cGFuc2lvbiBjYW4gYmUgbW9kaWZpZWQgYnkgdXNpbmcgb25lIG9mIHRoZQorZm9sbG93aW5nIGZvcm1hdHMuCisuQmwgLXRhZyAtd2lkdGggYWFwYXJhbWV0ZXJ3b3JkYWFhYWEKKy5JdCAke3BhcmFtZXRlcjotd29yZH0KK1VzZSBEZWZhdWx0IFZhbHVlcy4KK0lmIHBhcmFtZXRlciBpcyB1bnNldCBvciBudWxsLCB0aGUgZXhwYW5zaW9uIG9mIHdvcmQKK2lzIHN1YnN0aXR1dGVkOyBvdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBwYXJhbWV0ZXIgaXMgc3Vic3RpdHV0ZWQuCisuSXQgJHtwYXJhbWV0ZXI6PXdvcmR9CitBc3NpZ24gRGVmYXVsdCBWYWx1ZXMuCitJZiBwYXJhbWV0ZXIgaXMgdW5zZXQgb3IgbnVsbCwgdGhlIGV4cGFuc2lvbiBvZgord29yZCBpcyBhc3NpZ25lZCB0byBwYXJhbWV0ZXIuCitJbiBhbGwgY2FzZXMsIHRoZSBmaW5hbCB2YWx1ZSBvZiBwYXJhbWV0ZXIgaXMgc3Vic3RpdHV0ZWQuCitPbmx5IHZhcmlhYmxlcywgbm90IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBvciBzcGVjaWFsCitwYXJhbWV0ZXJzLCBjYW4gYmUgYXNzaWduZWQgaW4gdGhpcyB3YXkuCisuSXQgJHtwYXJhbWV0ZXI6P1t3b3JkXX0KK0luZGljYXRlIEVycm9yIGlmIE51bGwgb3IgVW5zZXQuCitJZiBwYXJhbWV0ZXIgaXMgdW5zZXQgb3IgbnVsbCwgdGhlCitleHBhbnNpb24gb2Ygd29yZCAob3IgYSBtZXNzYWdlIGluZGljYXRpbmcgaXQgaXMgdW5zZXQgaWYgd29yZCBpcyBvbWl0dGVkKQoraXMgd3JpdHRlbiB0byBzdGFuZGFyZCBlcnJvciBhbmQgdGhlIHNoZWxsIGV4aXRzIHdpdGggYSBub256ZXJvIGV4aXQgc3RhdHVzLgorT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyIGlzIHN1YnN0aXR1dGVkLgorQW4gaW50ZXJhY3RpdmUgc2hlbGwgbmVlZCBub3QgZXhpdC4KKy5JdCAke3BhcmFtZXRlcjord29yZH0KK1VzZSBBbHRlcm5hdGl2ZSBWYWx1ZS4KK0lmIHBhcmFtZXRlciBpcyB1bnNldCBvciBudWxsLCBudWxsIGlzCitzdWJzdGl0dXRlZDsgb3RoZXJ3aXNlLCB0aGUgZXhwYW5zaW9uIG9mIHdvcmQgaXMgc3Vic3RpdHV0ZWQuCisuRWwKKy5QcAorSW4gdGhlIHBhcmFtZXRlciBleHBhbnNpb25zIHNob3duIHByZXZpb3VzbHksIHVzZSBvZiB0aGUgY29sb24gaW4gdGhlCitmb3JtYXQgcmVzdWx0cyBpbiBhIHRlc3QgZm9yIGEgcGFyYW1ldGVyIHRoYXQgaXMgdW5zZXQgb3IgbnVsbDsgb21pc3Npb24KK29mIHRoZSBjb2xvbiByZXN1bHRzIGluIGEgdGVzdCBmb3IgYSBwYXJhbWV0ZXIgdGhhdCBpcyBvbmx5IHVuc2V0LgorLkJsIC10YWcgLXdpZHRoIGFhcGFyYW1ldGVyd29yZGFhYWFhCisuSXQgJHsjcGFyYW1ldGVyfQorU3RyaW5nIExlbmd0aC4KK1RoZSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyLgorLkVsCisuUHAKK1RoZSBmb2xsb3dpbmcgZm91ciB2YXJpZXRpZXMgb2YgcGFyYW1ldGVyIGV4cGFuc2lvbiBwcm92aWRlIGZvciBzdWJzdHJpbmcKK3Byb2Nlc3NpbmcuCitJbiBlYWNoIGNhc2UsIHBhdHRlcm4gbWF0Y2hpbmcgbm90YXRpb24gKHNlZQorLlN4IFNoZWxsIFBhdHRlcm5zICkgLAorcmF0aGVyIHRoYW4gcmVndWxhciBleHByZXNzaW9uIG5vdGF0aW9uLCBpcyB1c2VkIHRvIGV2YWx1YXRlIHRoZSBwYXR0ZXJucy4KK0lmIHBhcmFtZXRlciBpcyAqIG9yIEAsIHRoZSByZXN1bHQgb2YgdGhlIGV4cGFuc2lvbiBpcyB1bnNwZWNpZmllZC4KK0VuY2xvc2luZyB0aGUgZnVsbCBwYXJhbWV0ZXIgZXhwYW5zaW9uIHN0cmluZyBpbiBkb3VibGUtcXVvdGVzIGRvZXMgbm90CitjYXVzZSB0aGUgZm9sbG93aW5nIGZvdXIgdmFyaWV0aWVzIG9mIHBhdHRlcm4gY2hhcmFjdGVycyB0byBiZSBxdW90ZWQsCit3aGVyZWFzIHF1b3RpbmcgY2hhcmFjdGVycyB3aXRoaW4gdGhlIGJyYWNlcyBoYXMgdGhpcyBlZmZlY3QuCisuQmwgLXRhZyAtd2lkdGggYWFwYXJhbWV0ZXJ3b3JkYWFhYWEKKy5JdCAke3BhcmFtZXRlciV3b3JkfQorUmVtb3ZlIFNtYWxsZXN0IFN1ZmZpeCBQYXR0ZXJuLgorVGhlIHdvcmQgaXMgZXhwYW5kZWQgdG8gcHJvZHVjZSBhIHBhdHRlcm4uCitUaGUgcGFyYW1ldGVyIGV4cGFuc2lvbiB0aGVuIHJlc3VsdHMgaW4gcGFyYW1ldGVyLCB3aXRoIHRoZQorc21hbGxlc3QgcG9ydGlvbiBvZiB0aGUgc3VmZml4IG1hdGNoZWQgYnkgdGhlIHBhdHRlcm4gZGVsZXRlZC4KKy5JdCAke3BhcmFtZXRlciUld29yZH0KK1JlbW92ZSBMYXJnZXN0IFN1ZmZpeCBQYXR0ZXJuLgorVGhlIHdvcmQgaXMgZXhwYW5kZWQgdG8gcHJvZHVjZSBhIHBhdHRlcm4uCitUaGUgcGFyYW1ldGVyIGV4cGFuc2lvbiB0aGVuIHJlc3VsdHMgaW4gcGFyYW1ldGVyLCB3aXRoIHRoZSBsYXJnZXN0Citwb3J0aW9uIG9mIHRoZSBzdWZmaXggbWF0Y2hlZCBieSB0aGUgcGF0dGVybiBkZWxldGVkLgorLkl0ICR7cGFyYW1ldGVyI3dvcmR9CitSZW1vdmUgU21hbGxlc3QgUHJlZml4IFBhdHRlcm4uCitUaGUgd29yZCBpcyBleHBhbmRlZCB0byBwcm9kdWNlIGEgcGF0dGVybi4KK1RoZSBwYXJhbWV0ZXIgZXhwYW5zaW9uIHRoZW4gcmVzdWx0cyBpbiBwYXJhbWV0ZXIsIHdpdGggdGhlCitzbWFsbGVzdCBwb3J0aW9uIG9mIHRoZSBwcmVmaXggbWF0Y2hlZCBieSB0aGUgcGF0dGVybiBkZWxldGVkLgorLkl0ICR7cGFyYW1ldGVyIyN3b3JkfQorUmVtb3ZlIExhcmdlc3QgUHJlZml4IFBhdHRlcm4uCitUaGUgd29yZCBpcyBleHBhbmRlZCB0byBwcm9kdWNlIGEgcGF0dGVybi4KK1RoZSBwYXJhbWV0ZXIgZXhwYW5zaW9uIHRoZW4gcmVzdWx0cyBpbiBwYXJhbWV0ZXIsIHdpdGggdGhlIGxhcmdlc3QKK3BvcnRpb24gb2YgdGhlIHByZWZpeCBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuIGRlbGV0ZWQuCisuRWwKKy5TcyBDb21tYW5kIFN1YnN0aXR1dGlvbgorQ29tbWFuZCBzdWJzdGl0dXRpb24gYWxsb3dzIHRoZSBvdXRwdXQgb2YgYSBjb21tYW5kIHRvIGJlIHN1YnN0aXR1dGVkIGluCitwbGFjZSBvZiB0aGUgY29tbWFuZCBuYW1lIGl0c2VsZi4KK0NvbW1hbmQgc3Vic3RpdHV0aW9uIG9jY3VycyB3aGVuIHRoZSBjb21tYW5kIGlzIGVuY2xvc2VkIGFzIGZvbGxvd3M6CisuUHAKKy5EbCAkKGNvbW1hbmQpCisuUHAKK29yCisuUG8KKy5EcSBiYWNrcXVvdGVkCit2ZXJzaW9uCisuUGMgOgorLlBwCisuRGwgYGNvbW1hbmRgCisuUHAKK1RoZSBzaGVsbCBleHBhbmRzIHRoZSBjb21tYW5kIHN1YnN0aXR1dGlvbiBieSBleGVjdXRpbmcgY29tbWFuZCBpbiBhCitzdWJzaGVsbCBlbnZpcm9ubWVudCBhbmQgcmVwbGFjaW5nIHRoZSBjb21tYW5kIHN1YnN0aXR1dGlvbiB3aXRoIHRoZQorc3RhbmRhcmQgb3V0cHV0IG9mIHRoZSBjb21tYW5kLCByZW1vdmluZyBzZXF1ZW5jZXMgb2Ygb25lIG9yIG1vcmUKKy5BbyBuZXdsaW5lIEFjIE5zIHMKK2F0IHRoZSBlbmQgb2YgdGhlIHN1YnN0aXR1dGlvbi4KKyhFbWJlZGRlZAorLkFvIG5ld2xpbmUgQWMgTnMgcworYmVmb3JlCit0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYXJlIG5vdCByZW1vdmVkOyBob3dldmVyLCBkdXJpbmcgZmllbGQgc3BsaXR0aW5nLAordGhleSBtYXkgYmUgdHJhbnNsYXRlZCBpbnRvCisuQW8gc3BhY2UgQWMgTnMgcyAsCitkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mCisuRXYgSUZTCithbmQgcXVvdGluZyB0aGF0IGlzIGluIGVmZmVjdC4pCisuU3MgQXJpdGhtZXRpYyBFeHBhbnNpb24KK0FyaXRobWV0aWMgZXhwYW5zaW9uIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBldmFsdWF0aW5nIGFuIGFyaXRobWV0aWMKK2V4cHJlc3Npb24gYW5kIHN1YnN0aXR1dGluZyBpdHMgdmFsdWUuCitUaGUgZm9ybWF0IGZvciBhcml0aG1ldGljIGV4cGFuc2lvbiBpcyBhcyBmb2xsb3dzOgorLlBwCisuRGwgJCgoZXhwcmVzc2lvbikpCisuUHAKK1RoZSBleHByZXNzaW9uIGlzIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBpbiBkb3VibGUtcXVvdGVzLCBleGNlcHQKK3RoYXQgYSBkb3VibGUtcXVvdGUgaW5zaWRlIHRoZSBleHByZXNzaW9uIGlzIG5vdCB0cmVhdGVkIHNwZWNpYWxseS4KK1RoZSBzaGVsbCBleHBhbmRzIGFsbCB0b2tlbnMgaW4gdGhlIGV4cHJlc3Npb24gZm9yIHBhcmFtZXRlciBleHBhbnNpb24sCitjb21tYW5kIHN1YnN0aXR1dGlvbiwgYW5kIHF1b3RlIHJlbW92YWwuCisuUHAKK05leHQsIHRoZSBzaGVsbCB0cmVhdHMgdGhpcyBhcyBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24gYW5kCitzdWJzdGl0dXRlcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uCisuU3MgV2hpdGUgU3BhY2UgU3BsaXR0aW5nIChGaWVsZCBTcGxpdHRpbmcpCitBZnRlciBwYXJhbWV0ZXIgZXhwYW5zaW9uLCBjb21tYW5kIHN1YnN0aXR1dGlvbiwgYW5kCithcml0aG1ldGljIGV4cGFuc2lvbiB0aGUgc2hlbGwgc2NhbnMgdGhlIHJlc3VsdHMgb2YKK2V4cGFuc2lvbnMgYW5kIHN1YnN0aXR1dGlvbnMgdGhhdCBkaWQgbm90IG9jY3VyIGluIGRvdWJsZS1xdW90ZXMgZm9yCitmaWVsZCBzcGxpdHRpbmcgYW5kIG11bHRpcGxlIGZpZWxkcyBjYW4gcmVzdWx0LgorLlBwCitUaGUgc2hlbGwgdHJlYXRzIGVhY2ggY2hhcmFjdGVyIG9mIHRoZQorLkV2IElGUworYXMgYSBkZWxpbWl0ZXIgYW5kIHVzZXMgdGhlIGRlbGltaXRlcnMgdG8gc3BsaXQgdGhlIHJlc3VsdHMgb2YgcGFyYW1ldGVyCitleHBhbnNpb24gYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGludG8gZmllbGRzLgorLlNzIFBhdGhuYW1lIEV4cGFuc2lvbiAoRmlsZSBOYW1lIEdlbmVyYXRpb24pCitVbmxlc3MgdGhlCisuRmwgZgorZmxhZyBpcyBzZXQsIGZpbGUgbmFtZSBnZW5lcmF0aW9uIGlzIHBlcmZvcm1lZCBhZnRlciB3b3JkIHNwbGl0dGluZyBpcworY29tcGxldGUuCitFYWNoIHdvcmQgaXMgdmlld2VkIGFzIGEgc2VyaWVzIG9mIHBhdHRlcm5zLCBzZXBhcmF0ZWQgYnkgc2xhc2hlcy4KK1RoZSBwcm9jZXNzIG9mIGV4cGFuc2lvbiByZXBsYWNlcyB0aGUgd29yZCB3aXRoIHRoZSBuYW1lcyBvZiBhbGwKK2V4aXN0aW5nIGZpbGVzIHdob3NlIG5hbWVzIGNhbiBiZSBmb3JtZWQgYnkgcmVwbGFjaW5nIGVhY2ggcGF0dGVybiB3aXRoIGEKK3N0cmluZyB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLgorVGhlcmUgYXJlIHR3byByZXN0cmljdGlvbnMgb24KK3RoaXM6IGZpcnN0LCBhIHBhdHRlcm4gY2Fubm90IG1hdGNoIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzbGFzaCwgYW5kCitzZWNvbmQsIGEgcGF0dGVybiBjYW5ub3QgbWF0Y2ggYSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhIHBlcmlvZCB1bmxlc3MgdGhlCitmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHBhdHRlcm4gaXMgYSBwZXJpb2QuCitUaGUgbmV4dCBzZWN0aW9uIGRlc2NyaWJlcyB0aGUKK3BhdHRlcm5zIHVzZWQgZm9yIGJvdGggUGF0aG5hbWUgRXhwYW5zaW9uIGFuZCB0aGUKKy5JYyBjYXNlCitjb21tYW5kLgorLlNzIFNoZWxsIFBhdHRlcm5zCitBIHBhdHRlcm4gY29uc2lzdHMgb2Ygbm9ybWFsIGNoYXJhY3RlcnMsIHdoaWNoIG1hdGNoIHRoZW1zZWx2ZXMsCithbmQgbWV0YS1jaGFyYWN0ZXJzLgorVGhlIG1ldGEtY2hhcmFjdGVycyBhcmUKKy5EcSBcJiEgLAorLkRxICogLAorLkRxIFwmPyAsCithbmQKKy5EcSBcJlsgLgorVGhlc2UgY2hhcmFjdGVycyBsb3NlIHRoZWlyIHNwZWNpYWwgbWVhbmluZ3MgaWYgdGhleSBhcmUgcXVvdGVkLgorV2hlbiBjb21tYW5kIG9yIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpcyBwZXJmb3JtZWQKK2FuZCB0aGUgZG9sbGFyIHNpZ24gb3IgYmFjayBxdW90ZXMgYXJlIG5vdCBkb3VibGUgcXVvdGVkLAordGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBvciB0aGUgb3V0cHV0IG9mCit0aGUgY29tbWFuZCBpcyBzY2FubmVkIGZvciB0aGVzZSBjaGFyYWN0ZXJzIGFuZCB0aGV5IGFyZSB0dXJuZWQgaW50bworbWV0YS1jaGFyYWN0ZXJzLgorLlBwCitBbiBhc3RlcmlzaworLlBxIERxICoKK21hdGNoZXMgYW55IHN0cmluZyBvZiBjaGFyYWN0ZXJzLgorQSBxdWVzdGlvbiBtYXJrIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuCitBIGxlZnQgYnJhY2tldAorLlBxIERxIFwmWworaW50cm9kdWNlcyBhIGNoYXJhY3RlciBjbGFzcy4KK1RoZSBlbmQgb2YgdGhlIGNoYXJhY3RlciBjbGFzcyBpcyBpbmRpY2F0ZWQgYnkgYQorLlBxIERxIFwmXSA7CitpZiB0aGUKKy5EcSBcJl0KK2lzIG1pc3NpbmcgdGhlbiB0aGUKKy5EcSBcJlsKK21hdGNoZXMgYQorLkRxIFwmWworcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgYSBjaGFyYWN0ZXIgY2xhc3MuCitBIGNoYXJhY3RlciBjbGFzcyBtYXRjaGVzIGFueSBvZiB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSBzcXVhcmUgYnJhY2tldHMuCitBIHJhbmdlIG9mIGNoYXJhY3RlcnMgbWF5IGJlIHNwZWNpZmllZCB1c2luZyBhIG1pbnVzIHNpZ24uCitUaGUgY2hhcmFjdGVyIGNsYXNzIG1heSBiZSBjb21wbGVtZW50ZWQKK2J5IG1ha2luZyBhbiBleGNsYW1hdGlvbiBwb2ludCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBjaGFyYWN0ZXIgY2xhc3MuCisuUHAKK1RvIGluY2x1ZGUgYQorLkRxIFwmXQoraW4gYSBjaGFyYWN0ZXIgY2xhc3MsIG1ha2UgaXQgdGhlIGZpcnN0IGNoYXJhY3RlciBsaXN0ZWQgKGFmdGVyIHRoZQorLkRxIFwmISAsCitpZiBhbnkpLgorVG8gaW5jbHVkZSBhIG1pbnVzIHNpZ24sIG1ha2UgaXQgdGhlIGZpcnN0IG9yIGxhc3QgY2hhcmFjdGVyIGxpc3RlZC4KKy5TcyBCdWlsdGlucworVGhpcyBzZWN0aW9uIGxpc3RzIHRoZSBidWlsdGluIGNvbW1hbmRzIHdoaWNoIGFyZSBidWlsdGluIGJlY2F1c2UgdGhleQorbmVlZCB0byBwZXJmb3JtIHNvbWUgb3BlcmF0aW9uIHRoYXQgY2FuJ3QgYmUgcGVyZm9ybWVkIGJ5IGEgc2VwYXJhdGUKK3Byb2Nlc3MuCitJbiBhZGRpdGlvbiB0byB0aGVzZSwgdGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgY29tbWFuZHMgdGhhdCBtYXkKK2JlIGJ1aWx0aW4gZm9yIGVmZmljaWVuY3kgKGUuZy4KKy5YciBwcmludGYgMSAsCisuWHIgZWNobyAxICwKKy5YciB0ZXN0IDEgLAorZXRjKS4KKy5CbCAtdGFnIC13aWR0aCA1bgorLkl0IDoKKy5JdCB0cnVlCitBIG51bGwgY29tbWFuZCB0aGF0IHJldHVybnMgYSAwICh0cnVlKSBleGl0IHZhbHVlLgorLkl0IFwmLiBmaWxlCitUaGUgY29tbWFuZHMgaW4gdGhlIHNwZWNpZmllZCBmaWxlIGFyZSByZWFkIGFuZCBleGVjdXRlZCBieSB0aGUgc2hlbGwuCisuSXQgYWxpYXMgT3AgQXIgbmFtZSBOcyBPcCBBciAiPXN0cmluZyAuLi4iCitJZgorLkFyIG5hbWU9c3RyaW5nCitpcyBzcGVjaWZpZWQsIHRoZSBzaGVsbCBkZWZpbmVzIHRoZSBhbGlhcworLkFyIG5hbWUKK3dpdGggdmFsdWUKKy5BciBzdHJpbmcgLgorSWYganVzdAorLkFyIG5hbWUKK2lzIHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoZSBhbGlhcworLkFyIG5hbWUKK2lzIHByaW50ZWQuCitXaXRoIG5vIGFyZ3VtZW50cywgdGhlCisuSWMgYWxpYXMKK2J1aWx0aW4gcHJpbnRzIHRoZQorbmFtZXMgYW5kIHZhbHVlcyBvZiBhbGwgZGVmaW5lZCBhbGlhc2VzIChzZWUKKy5JYyB1bmFsaWFzICkgLgorLkl0IGJnIFsgQXIgam9iIF0gLi4uCitDb250aW51ZSB0aGUgc3BlY2lmaWVkIGpvYnMgKG9yIHRoZSBjdXJyZW50IGpvYiBpZiBubworam9icyBhcmUgZ2l2ZW4pIGluIHRoZSBiYWNrZ3JvdW5kLgorLkl0IFhvIGNvbW1hbmQKKy5PcCBGbCBwCisuT3AgRmwgdgorLk9wIEZsIFYKKy5BciBjb21tYW5kCisuT3AgQXIgYXJnIC4uLgorLlhjCitFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBidXQgaWdub3JlIHNoZWxsIGZ1bmN0aW9ucyB3aGVuIHNlYXJjaGluZworZm9yIGl0LgorKFRoaXMgaXMgdXNlZnVsIHdoZW4geW91CitoYXZlIGEgc2hlbGwgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgYnVpbHRpbiBjb21tYW5kLikKKy5CbCAtdGFnIC13aWR0aCA1bgorLkl0IEZsIHAKK3NlYXJjaCBmb3IgY29tbWFuZCB1c2luZyBhCisuRXYgUEFUSAordGhhdCBndWFyYW50ZWVzIHRvIGZpbmQgYWxsIHRoZSBzdGFuZGFyZCB1dGlsaXRpZXMuCisuSXQgRmwgVgorRG8gbm90IGV4ZWN1dGUgdGhlIGNvbW1hbmQgYnV0CitzZWFyY2ggZm9yIHRoZSBjb21tYW5kIGFuZCBwcmludCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUKK2NvbW1hbmQgc2VhcmNoLgorVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgdHlwZSBidWlsdGluLgorLkl0IEZsIHYKK0RvIG5vdCBleGVjdXRlIHRoZSBjb21tYW5kIGJ1dAorc2VhcmNoIGZvciB0aGUgY29tbWFuZCBhbmQgcHJpbnQgdGhlIGFic29sdXRlIHBhdGhuYW1lCitvZiB1dGlsaXRpZXMsIHRoZSBuYW1lIGZvciBidWlsdGlucyBvciB0aGUgZXhwYW5zaW9uIG9mIGFsaWFzZXMuCisuRWwKKy5JdCBjZCBBciAtCisuSXQgWG8gY2QgT3AgRmwgTFAKKy5PcCBBciBkaXJlY3RvcnkKKy5YYworU3dpdGNoIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IChkZWZhdWx0CisuRXYgSE9NRSApIC4KK0lmIGFuIGVudHJ5IGZvcgorLkV2IENEUEFUSAorYXBwZWFycyBpbiB0aGUgZW52aXJvbm1lbnQgb2YgdGhlCisuSWMgY2QKK2NvbW1hbmQgb3IgdGhlIHNoZWxsIHZhcmlhYmxlCisuRXYgQ0RQQVRICitpcyBzZXQgYW5kIHRoZSBkaXJlY3RvcnkgbmFtZSBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgc2xhc2gsIHRoZW4gdGhlCitkaXJlY3RvcmllcyBsaXN0ZWQgaW4KKy5FdiBDRFBBVEgKK3dpbGwgYmUgc2VhcmNoZWQgZm9yIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorVGhlIGZvcm1hdCBvZgorLkV2IENEUEFUSAoraXMgdGhlIHNhbWUgYXMgdGhhdCBvZgorLkV2IFBBVEggLgorSWYgYSBzaW5nbGUgZGFzaCBpcyBzcGVjaWZpZWQgYXMgdGhlIGFyZ3VtZW50LCBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQordmFsdWUgb2YKKy5FdiBPTERQV0QgLgorVGhlCisuSWMgY2QKK2NvbW1hbmQgd2lsbCBwcmludCBvdXQgdGhlIG5hbWUgb2YgdGhlCitkaXJlY3RvcnkgdGhhdCBpdCBhY3R1YWxseSBzd2l0Y2hlZCB0byBpZiB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuYW1lCit0aGF0IHRoZSB1c2VyIGdhdmUuCitUaGVzZSBtYXkgYmUgZGlmZmVyZW50IGVpdGhlciBiZWNhdXNlIHRoZQorLkV2IENEUEFUSAorbWVjaGFuaXNtIHdhcyB1c2VkIG9yIGJlY2F1c2UgdGhlIGFyZ3VtZW50IGlzIGEgc2luZ2xlIGRhc2guCitUaGUKKy5GbCBQCitvcHRpb24gY2F1c2VzIHRoZSBwaHlzaWNhbCBkaXJlY3Rvcnkgc3RydWN0dXJlIHRvIGJlIHVzZWQsIHRoYXQgaXMsIGFsbAorc3ltYm9saWMgbGlua3MgYXJlIHJlc29sdmVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzLiAgVGhlCisuRmwgTAorb3B0aW9uIHR1cm5zIG9mZiB0aGUgZWZmZWN0IG9mIGFueSBwcmVjZWRpbmcKKy5GbCBQCitvcHRpb25zLgorLkl0IFhvIGVjaG8gT3AgRmwgbgorLkFyIGFyZ3MuLi4KKy5YYworUHJpbnQgdGhlIGFyZ3VtZW50cyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorVW5sZXNzIHRoZQorLkZsIG4KK29wdGlvbiBpcyBwcmVzZW50LCBhIG5ld2xpbmUgaXMgb3V0cHV0IGZvbGxvd2luZyB0aGUgYXJndW1lbnRzLgorLlBwCitJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyBpcyBlbmNvdW50ZXJlZCBkdXJpbmcKK291dHB1dCwgdGhlIHNlcXVlbmNlIGlzIG5vdCBvdXRwdXQuICBJbnN0ZWFkLCB0aGUgc3BlY2lmaWVkIGFjdGlvbiBpcworcGVyZm9ybWVkOgorLkJsIC10YWcgLXdpZHRoIGluZGVudAorLkl0IExpIFxlYgorQSBiYWNrc3BhY2UgY2hhcmFjdGVyIGlzIG91dHB1dC4KKy5JdCBMaSBcZWMKK1N1YnNlcXVlbnQgb3V0cHV0IGlzIHN1cHByZXNzZWQuICBUaGlzIGlzIG5vcm1hbGx5IHVzZWQgYXQgdGhlIGVuZCBvZiB0aGUKK2xhc3QgYXJndW1lbnQgdG8gc3VwcHJlc3MgdGhlIHRyYWlsaW5nIG5ld2xpbmUgdGhhdAorLkljIGVjaG8KK3dvdWxkIG90aGVyd2lzZSBvdXRwdXQuCisuSXQgTGkgXGVmCitPdXRwdXQgYSBmb3JtIGZlZWQuCisuSXQgTGkgXGVuCitPdXRwdXQgYSBuZXdsaW5lIGNoYXJhY3Rlci4KKy5JdCBMaSBcZXIKK091dHB1dCBhIGNhcnJpYWdlIHJldHVybi4KKy5JdCBMaSBcZXQKK091dHB1dCBhIChob3Jpem9udGFsKSB0YWIgY2hhcmFjdGVyLgorLkl0IExpIFxldgorT3V0cHV0IGEgdmVydGljYWwgdGFiLgorLkl0IExpIFxlMCBOcyBBciBkaWdpdHMKK091dHB1dCB0aGUgY2hhcmFjdGVyIHdob3NlIHZhbHVlIGlzIGdpdmVuIGJ5IHplcm8gdG8gdGhyZWUgb2N0YWwgZGlnaXRzLgorSWYgdGhlcmUgYXJlIHplcm8gZGlnaXRzLCBhIG51bCBjaGFyYWN0ZXIgaXMgb3V0cHV0LgorLkl0IExpIFxlXGUKK091dHB1dCBhIGJhY2tzbGFzaC4KKy5FbAorLlBwCitBbGwgb3RoZXIgYmFja3NsYXNoIHNlcXVlbmNlcyBlbGljaXQgdW5kZWZpbmVkIGJlaGF2aW91ci4KKy5JdCBldmFsIEFyIHN0cmluZyAuLi4KK0NvbmNhdGVuYXRlIGFsbCB0aGUgYXJndW1lbnRzIHdpdGggc3BhY2VzLgorVGhlbiByZS1wYXJzZSBhbmQgZXhlY3V0ZSB0aGUgY29tbWFuZC4KKy5JdCBleGVjIE9wIEFyIGNvbW1hbmQgYXJnIC4uLgorVW5sZXNzIGNvbW1hbmQgaXMgb21pdHRlZCwgdGhlIHNoZWxsIHByb2Nlc3MgaXMgcmVwbGFjZWQgd2l0aCB0aGUKK3NwZWNpZmllZCBwcm9ncmFtICh3aGljaCBtdXN0IGJlIGEgcmVhbCBwcm9ncmFtLCBub3QgYSBzaGVsbCBidWlsdGluIG9yCitmdW5jdGlvbikuCitBbnkgcmVkaXJlY3Rpb25zIG9uIHRoZQorLkljIGV4ZWMKK2NvbW1hbmQgYXJlIG1hcmtlZCBhcyBwZXJtYW5lbnQsIHNvIHRoYXQgdGhleSBhcmUgbm90IHVuZG9uZSB3aGVuIHRoZQorLkljIGV4ZWMKK2NvbW1hbmQgZmluaXNoZXMuCisuSXQgZXhpdCBPcCBBciBleGl0c3RhdHVzCitUZXJtaW5hdGUgdGhlIHNoZWxsIHByb2Nlc3MuCitJZgorLkFyIGV4aXRzdGF0dXMKK2lzIGdpdmVuIGl0IGlzIHVzZWQgYXMgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBzaGVsbDsgb3RoZXJ3aXNlIHRoZQorZXhpdCBzdGF0dXMgb2YgdGhlIHByZWNlZGluZyBjb21tYW5kIGlzIHVzZWQuCisuSXQgZXhwb3J0IEFyIG5hbWUgLi4uCisuSXQgZXhwb3J0IEZsIHAKK1RoZSBzcGVjaWZpZWQgbmFtZXMgYXJlIGV4cG9ydGVkIHNvIHRoYXQgdGhleSB3aWxsIGFwcGVhciBpbiB0aGUKK2Vudmlyb25tZW50IG9mIHN1YnNlcXVlbnQgY29tbWFuZHMuCitUaGUgb25seSB3YXkgdG8gdW4tZXhwb3J0IGEgdmFyaWFibGUgaXMgdG8gdW5zZXQgaXQuCitUaGUgc2hlbGwgYWxsb3dzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIHRvIGJlIHNldCBhdCB0aGUKK3NhbWUgdGltZSBpdCBpcyBleHBvcnRlZCBieSB3cml0aW5nCisuUHAKKy5EbCBleHBvcnQgbmFtZT12YWx1ZQorLlBwCitXaXRoIG5vIGFyZ3VtZW50cyB0aGUgZXhwb3J0IGNvbW1hbmQgbGlzdHMgdGhlIG5hbWVzIG9mIGFsbCBleHBvcnRlZCB2YXJpYWJsZXMuCitXaXRoIHRoZQorLkZsIHAKK29wdGlvbiBzcGVjaWZpZWQgdGhlIG91dHB1dCB3aWxsIGJlIGZvcm1hdHRlZCBzdWl0YWJseSBmb3Igbm9uLWludGVyYWN0aXZlIHVzZS4KKy5JdCBYbyBmYyBPcCBGbCBlIEFyIGVkaXRvcgorLk9wIEFyIGZpcnN0IE9wIEFyIGxhc3QKKy5YYworLkl0IFhvIGZjIEZsIGwKKy5PcCBGbCBucgorLk9wIEFyIGZpcnN0IE9wIEFyIGxhc3QKKy5YYworLkl0IFhvIGZjIEZsIHMgT3AgQXIgb2xkPW5ldworLk9wIEFyIGZpcnN0CisuWGMKK1RoZQorLkljIGZjCitidWlsdGluIGxpc3RzLCBvciBlZGl0cyBhbmQgcmUtZXhlY3V0ZXMsIGNvbW1hbmRzIHByZXZpb3VzbHkgZW50ZXJlZAordG8gYW4gaW50ZXJhY3RpdmUgc2hlbGwuCisuQmwgLXRhZyAtd2lkdGggNW4KKy5JdCBGbCBlIE5vIGVkaXRvcgorVXNlIHRoZSBlZGl0b3IgbmFtZWQgYnkgZWRpdG9yIHRvIGVkaXQgdGhlIGNvbW1hbmRzLgorVGhlIGVkaXRvciBzdHJpbmcgaXMgYSBjb21tYW5kIG5hbWUsIHN1YmplY3QgdG8gc2VhcmNoIHZpYSB0aGUKKy5FdiBQQVRICit2YXJpYWJsZS4KK1RoZSB2YWx1ZSBpbiB0aGUKKy5FdiBGQ0VESVQKK3ZhcmlhYmxlIGlzIHVzZWQgYXMgYSBkZWZhdWx0IHdoZW4KKy5GbCBlCitpcyBub3Qgc3BlY2lmaWVkLgorSWYKKy5FdiBGQ0VESVQKK2lzIG51bGwgb3IgdW5zZXQsIHRoZSB2YWx1ZSBvZiB0aGUKKy5FdiBFRElUT1IKK3ZhcmlhYmxlIGlzIHVzZWQuCitJZgorLkV2IEVESVRPUgoraXMgbnVsbCBvciB1bnNldCwKKy5YciBlZCAxCitpcyB1c2VkIGFzIHRoZSBlZGl0b3IuCisuSXQgRmwgbCBObyAoZWxsKQorTGlzdCB0aGUgY29tbWFuZHMgcmF0aGVyIHRoYW4gaW52b2tpbmcgYW4gZWRpdG9yIG9uIHRoZW0uCitUaGUgY29tbWFuZHMgYXJlIHdyaXR0ZW4gaW4gdGhlIHNlcXVlbmNlIGluZGljYXRlZCBieQordGhlIGZpcnN0IGFuZCBsYXN0IG9wZXJhbmRzLCBhcyBhZmZlY3RlZCBieQorLkZsIHIgLAord2l0aCBlYWNoIGNvbW1hbmQgcHJlY2VkZWQgYnkgdGhlIGNvbW1hbmQgbnVtYmVyLgorLkl0IEZsIG4KK1N1cHByZXNzIGNvbW1hbmQgbnVtYmVycyB3aGVuIGxpc3Rpbmcgd2l0aCAtbC4KKy5JdCBGbCByCitSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgY29tbWFuZHMgbGlzdGVkICh3aXRoCisuRmwgbCApCitvciBlZGl0ZWQgKHdpdGggbmVpdGhlcgorLkZsIGwKK25vcgorLkZsIHMgKSAuCisuSXQgRmwgcworUmUtZXhlY3V0ZSB0aGUgY29tbWFuZCB3aXRob3V0IGludm9raW5nIGFuIGVkaXRvci4KKy5JdCBmaXJzdAorLkl0IGxhc3QKK1NlbGVjdCB0aGUgY29tbWFuZHMgdG8gbGlzdCBvciBlZGl0LgorVGhlIG51bWJlciBvZiBwcmV2aW91cyBjb21tYW5kcyB0aGF0CitjYW4gYmUgYWNjZXNzZWQgYXJlIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIHRoZQorLkV2IEhJU1RTSVpFCit2YXJpYWJsZS4KK1RoZSB2YWx1ZSBvZiBmaXJzdCBvciBsYXN0IG9yIGJvdGggYXJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorLkJsIC10YWcgLXdpZHRoIDVuCisuSXQgWytdbnVtYmVyCitBIHBvc2l0aXZlIG51bWJlciByZXByZXNlbnRpbmcgYSBjb21tYW5kIG51bWJlcjsgY29tbWFuZCBudW1iZXJzIGNhbiBiZQorZGlzcGxheWVkIHdpdGggdGhlCisuRmwgbAorb3B0aW9uLgorLkl0IEZsIG51bWJlcgorQSBuZWdhdGl2ZSBkZWNpbWFsIG51bWJlciByZXByZXNlbnRpbmcgdGhlIGNvbW1hbmQgdGhhdCB3YXMgZXhlY3V0ZWQKK251bWJlciBvZiBjb21tYW5kcyBwcmV2aW91c2x5LgorRm9yIGV4YW1wbGUsIFwtMSBpcyB0aGUgaW1tZWRpYXRlbHkgcHJldmlvdXMgY29tbWFuZC4KKy5FbAorLkl0IHN0cmluZworQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbW9zdCByZWNlbnRseSBlbnRlcmVkIGNvbW1hbmQgdGhhdCBiZWdpbnMgd2l0aAordGhhdCBzdHJpbmcuCitJZiB0aGUgb2xkPW5ldyBvcGVyYW5kIGlzIG5vdCBhbHNvIHNwZWNpZmllZCB3aXRoCisuRmwgcyAsCit0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIGZpcnN0IG9wZXJhbmQgY2Fubm90IGNvbnRhaW4gYW4gZW1iZWRkZWQgZXF1YWwgc2lnbi4KKy5FbAorLlBwCitUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhZmZlY3QgdGhlIGV4ZWN1dGlvbiBvZiBmYzoKKy5CbCAtdGFnIC13aWR0aCBISVNUU0laRQorLkl0IEV2IEZDRURJVAorTmFtZSBvZiB0aGUgZWRpdG9yIHRvIHVzZS4KKy5JdCBFdiBISVNUU0laRQorVGhlIG51bWJlciBvZiBwcmV2aW91cyBjb21tYW5kcyB0aGF0IGFyZSBhY2Nlc3NpYmxlLgorLkVsCisuSXQgZmcgT3AgQXIgam9iCitNb3ZlIHRoZSBzcGVjaWZpZWQgam9iIG9yIHRoZSBjdXJyZW50IGpvYiB0byB0aGUgZm9yZWdyb3VuZC4KKy5JdCBnZXRvcHRzIEFyIG9wdHN0cmluZyB2YXIKK1RoZQorLlRuIFBPU0lYCisuSWMgZ2V0b3B0cworY29tbWFuZCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggdGhlCisuRW0gQmVsbCBMYWJzCistZGVyaXZlZAorLlhyIGdldG9wdCAxIC4KKy5QcAorVGhlIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhIHNlcmllcyBvZiBsZXR0ZXJzLCBlYWNoIG9mIHdoaWNoIG1heSBiZQorb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGNvbG9uIHRvIGluZGljYXRlIHRoYXQgdGhlIG9wdGlvbiByZXF1aXJlcyBhbgorYXJndW1lbnQuCitUaGUgdmFyaWFibGUgc3BlY2lmaWVkIGlzIHNldCB0byB0aGUgcGFyc2VkIG9wdGlvbi4KKy5QcAorVGhlCisuSWMgZ2V0b3B0cworY29tbWFuZCBkZXByZWNhdGVzIHRoZSBvbGRlcgorLlhyIGdldG9wdCAxCit1dGlsaXR5IGR1ZSB0byBpdHMgaGFuZGxpbmcgb2YgYXJndW1lbnRzIGNvbnRhaW5pbmcgd2hpdGVzcGFjZS4KKy5QcAorVGhlCisuSWMgZ2V0b3B0cworYnVpbHRpbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gb3B0aW9ucyBhbmQgdGhlaXIgYXJndW1lbnRzCitmcm9tIGEgbGlzdCBvZiBwYXJhbWV0ZXJzLgorV2hlbiBpbnZva2VkLAorLkljIGdldG9wdHMKK3BsYWNlcyB0aGUgdmFsdWUgb2YgdGhlIG5leHQgb3B0aW9uIGZyb20gdGhlIG9wdGlvbiBzdHJpbmcgaW4gdGhlIGxpc3QgaW4KK3RoZSBzaGVsbCB2YXJpYWJsZSBzcGVjaWZpZWQgYnkKKy5WYSB2YXIKK2FuZCBpdHMgaW5kZXggaW4gdGhlIHNoZWxsIHZhcmlhYmxlCisuRXYgT1BUSU5EIC4KK1doZW4gdGhlIHNoZWxsIGlzIGludm9rZWQsCisuRXYgT1BUSU5ECitpcyBpbml0aWFsaXplZCB0byAxLgorRm9yIGVhY2ggb3B0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQsIHRoZQorLkljIGdldG9wdHMKK2J1aWx0aW4gd2lsbCBwbGFjZSBpdCBpbiB0aGUgc2hlbGwgdmFyaWFibGUKKy5FdiBPUFRBUkcgLgorSWYgYW4gb3B0aW9uIGlzIG5vdCBhbGxvd2VkIGZvciBpbiB0aGUKKy5WYSBvcHRzdHJpbmcgLAordGhlbgorLkV2IE9QVEFSRword2lsbCBiZSB1bnNldC4KKy5QcAorLlZhIG9wdHN0cmluZworaXMgYSBzdHJpbmcgb2YgcmVjb2duaXplZCBvcHRpb24gbGV0dGVycyAoc2VlCisuWHIgZ2V0b3B0IDMgKSAuCitJZiBhIGxldHRlciBpcyBmb2xsb3dlZCBieSBhIGNvbG9uLCB0aGUgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGhhdmUgYW4KK2FyZ3VtZW50IHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHNlcGFyYXRlZCBmcm9tIGl0IGJ5IHdoaXRlIHNwYWNlLgorSWYgYW4gb3B0aW9uIGNoYXJhY3RlciBpcyBub3QgZm91bmQgd2hlcmUgZXhwZWN0ZWQsCisuSWMgZ2V0b3B0cword2lsbCBzZXQgdGhlIHZhcmlhYmxlCisuVmEgdmFyCit0byBhCisuRHEgXCY/IDsKKy5JYyBnZXRvcHRzCit3aWxsIHRoZW4gdW5zZXQKKy5FdiBPUFRBUkcKK2FuZCB3cml0ZSBvdXRwdXQgdG8gc3RhbmRhcmQgZXJyb3IuCitCeSBzcGVjaWZ5aW5nIGEgY29sb24gYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZgorLlZhIG9wdHN0cmluZworYWxsIGVycm9ycyB3aWxsIGJlIGlnbm9yZWQuCisuUHAKK0Egbm9uemVybyB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIHRoZSBsYXN0IG9wdGlvbiBpcyByZWFjaGVkLgorSWYgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBhcmd1bWVudHMsCisuSWMgZ2V0b3B0cword2lsbCBzZXQKKy5WYSB2YXIKK3RvIHRoZSBzcGVjaWFsIG9wdGlvbiwKKy5EcSAtLSAsCitvdGhlcndpc2UsIGl0IHdpbGwgc2V0CisuVmEgdmFyCit0bworLkRxIFwmPyAuCisuUHAKK1RoZSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudCBzaG93cyBob3cgb25lIG1pZ2h0IHByb2Nlc3MgdGhlIGFyZ3VtZW50cworZm9yIGEgY29tbWFuZCB0aGF0IGNhbiB0YWtlIHRoZSBvcHRpb25zCisuT3AgYQorYW5kCisuT3AgYiAsCithbmQgdGhlIG9wdGlvbgorLk9wIGMgLAord2hpY2ggcmVxdWlyZXMgYW4gYXJndW1lbnQuCisuUHAKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IGluZGVudAord2hpbGUgZ2V0b3B0cyBhYmM6IGYKK2RvCisJY2FzZSAkZiBpbgorCWEgfCBiKQlmbGFnPSRmOzsKKwljKQljYXJnPSRPUFRBUkc7OworCVxcPykJZWNobyAkVVNBR0U7IGV4aXQgMTs7CisJZXNhYworZG9uZQorc2hpZnQgYGV4cHIgJE9QVElORCAtIDFgCisuRWQKKy5QcAorVGhpcyBjb2RlIHdpbGwgYWNjZXB0IGFueSBvZiB0aGUgZm9sbG93aW5nIGFzIGVxdWl2YWxlbnQ6CisuUHAKKy5CZCAtbGl0ZXJhbCAtb2Zmc2V0IGluZGVudAorY21kIFwtYWNhcmcgZmlsZSBmaWxlCitjbWQgXC1hIFwtYyBhcmcgZmlsZSBmaWxlCitjbWQgXC1jYXJnIC1hIGZpbGUgZmlsZQorY21kIFwtYSBcLWNhcmcgXC1cLSBmaWxlIGZpbGUKKy5FZAorLkl0IGhhc2ggRmwgcnYgQXIgY29tbWFuZCAuLi4KK1RoZSBzaGVsbCBtYWludGFpbnMgYSBoYXNoIHRhYmxlIHdoaWNoIHJlbWVtYmVycyB0aGUKK2xvY2F0aW9ucyBvZiBjb21tYW5kcy4KK1dpdGggbm8gYXJndW1lbnRzIHdoYXRzb2V2ZXIsCit0aGUKKy5JYyBoYXNoCitjb21tYW5kIHByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFibGUuCitFbnRyaWVzIHdoaWNoIGhhdmUgbm90IGJlZW4gbG9va2VkIGF0IHNpbmNlIHRoZSBsYXN0CisuSWMgY2QKK2NvbW1hbmQgYXJlIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrOyBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlc2UgZW50cmllcwordG8gYmUgaW52YWxpZC4KKy5QcAorV2l0aCBhcmd1bWVudHMsIHRoZQorLkljIGhhc2gKK2NvbW1hbmQgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmRzIGZyb20gdGhlIGhhc2ggdGFibGUgKHVubGVzcwordGhleSBhcmUgZnVuY3Rpb25zKSBhbmQgdGhlbiBsb2NhdGVzIHRoZW0uCitXaXRoIHRoZQorLkZsIHYKK29wdGlvbiwgaGFzaCBwcmludHMgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY29tbWFuZHMgYXMgaXQgZmluZHMgdGhlbS4KK1RoZQorLkZsIHIKK29wdGlvbiBjYXVzZXMgdGhlIGhhc2ggY29tbWFuZCB0byBkZWxldGUgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlCitleGNlcHQgZm9yIGZ1bmN0aW9ucy4KKy5JdCBwd2QgT3AgRmwgTFAKK2J1aWx0aW4gY29tbWFuZCByZW1lbWJlcnMgd2hhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkKK2lzIHJhdGhlciB0aGFuIHJlY29tcHV0aW5nIGl0IGVhY2ggdGltZS4KK1RoaXMgbWFrZXMgaXQgZmFzdGVyLgorSG93ZXZlciwgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHJlbmFtZWQsIHRoZSBidWlsdGluIHZlcnNpb24gb2YKKy5JYyBwd2QKK3dpbGwgY29udGludWUgdG8gcHJpbnQgdGhlIG9sZCBuYW1lIGZvciB0aGUgZGlyZWN0b3J5LgorVGhlCisuRmwgUAorb3B0aW9uIGNhdXNlcyB0aGUgcGh5c2ljYWwgdmFsdWUgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgc2hvd24sCit0aGF0IGlzLCBhbGwgc3ltYm9saWMgbGlua3MgYXJlIHJlc29sdmVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzLiAgVGhlCisuRmwgTAorb3B0aW9uIHR1cm5zIG9mZiB0aGUgZWZmZWN0IG9mIGFueSBwcmVjZWRpbmcKKy5GbCBQCitvcHRpb25zLgorLkl0IFhvIHJlYWQgT3AgRmwgcCBBciBwcm9tcHQKKy5PcCBGbCByCisuQXIgdmFyaWFibGUKKy5PcCBBciAuLi4KKy5YYworVGhlIHByb21wdCBpcyBwcmludGVkIGlmIHRoZQorLkZsIHAKK29wdGlvbiBpcyBzcGVjaWZpZWQgYW5kIHRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhIHRlcm1pbmFsLgorVGhlbiBhIGxpbmUgaXMgcmVhZCBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KK1RoZSB0cmFpbGluZyBuZXdsaW5lIGlzIGRlbGV0ZWQgZnJvbSB0aGUKK2xpbmUgYW5kIHRoZSBsaW5lIGlzIHNwbGl0IGFzIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiBvbiB3b3JkIHNwbGl0dGluZworYWJvdmUsIGFuZCB0aGUgcGllY2VzIGFyZSBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGVzIGluIG9yZGVyLgorQXQgbGVhc3Qgb25lIHZhcmlhYmxlIG11c3QgYmUgc3BlY2lmaWVkLgorSWYgdGhlcmUgYXJlIG1vcmUgcGllY2VzIHRoYW4gdmFyaWFibGVzLCB0aGUgcmVtYWluaW5nIHBpZWNlcworKGFsb25nIHdpdGggdGhlIGNoYXJhY3RlcnMgaW4KKy5FdiBJRlMKK3RoYXQgc2VwYXJhdGVkIHRoZW0pIGFyZSBhc3NpZ25lZCB0byB0aGUgbGFzdCB2YXJpYWJsZS4KK0lmIHRoZXJlIGFyZSBtb3JlIHZhcmlhYmxlcyB0aGFuIHBpZWNlcywKK3RoZSByZW1haW5pbmcgdmFyaWFibGVzIGFyZSBhc3NpZ25lZCB0aGUgbnVsbCBzdHJpbmcuCitUaGUKKy5JYyByZWFkCitidWlsdGluIHdpbGwgaW5kaWNhdGUgc3VjY2VzcyB1bmxlc3MgRU9GIGlzIGVuY291bnRlcmVkIG9uIGlucHV0LCBpbgord2hpY2ggY2FzZSBmYWlsdXJlIGlzIHJldHVybmVkLgorLlBwCitCeSBkZWZhdWx0LCB1bmxlc3MgdGhlCisuRmwgcgorb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGJhY2tzbGFzaAorLkRxIFxlCithY3RzIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIsIGNhdXNpbmcgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgdG8gYmUgdHJlYXRlZAorbGl0ZXJhbGx5LgorSWYgYSBiYWNrc2xhc2ggaXMgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLCB0aGUgYmFja3NsYXNoIGFuZCB0aGUKK25ld2xpbmUgd2lsbCBiZSBkZWxldGVkLgorLkl0IHJlYWRvbmx5IEFyIG5hbWUgLi4uCisuSXQgcmVhZG9ubHkgRmwgcAorVGhlIHNwZWNpZmllZCBuYW1lcyBhcmUgbWFya2VkIGFzIHJlYWQgb25seSwgc28gdGhhdCB0aGV5IGNhbm5vdCBiZQorc3Vic2VxdWVudGx5IG1vZGlmaWVkIG9yIHVuc2V0LgorVGhlIHNoZWxsIGFsbG93cyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZQordG8gYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgaXQgaXMgbWFya2VkIHJlYWQgb25seSBieSB3cml0aW5nCisuUHAKKy5EbCByZWFkb25seSBuYW1lPXZhbHVlCisuUHAKK1dpdGggbm8gYXJndW1lbnRzIHRoZSByZWFkb25seSBjb21tYW5kIGxpc3RzIHRoZSBuYW1lcyBvZiBhbGwgcmVhZCBvbmx5Cit2YXJpYWJsZXMuCitXaXRoIHRoZQorLkZsIHAKK29wdGlvbiBzcGVjaWZpZWQgdGhlIG91dHB1dCB3aWxsIGJlIGZvcm1hdHRlZCBzdWl0YWJseSBmb3Igbm9uLWludGVyYWN0aXZlIHVzZS4KKy5QcAorLkl0IFhvIHByaW50ZiBBciBmb3JtYXQKKy5PcCBBciBhcmd1bWVudHMgIC4uLgorLlhjCisuSWMgcHJpbnRmCitmb3JtYXRzIGFuZCBwcmludHMgaXRzIGFyZ3VtZW50cywgYWZ0ZXIgdGhlIGZpcnN0LCB1bmRlciBjb250cm9sCitvZiB0aGUKKy5BciBmb3JtYXQgIC4KK1RoZQorLkFyIGZvcm1hdAoraXMgYSBjaGFyYWN0ZXIgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRocmVlIHR5cGVzIG9mIG9iamVjdHM6IHBsYWluIGNoYXJhY3RlcnMsCit3aGljaCBhcmUgc2ltcGx5IGNvcGllZCB0byBzdGFuZGFyZCBvdXRwdXQsIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIHdoaWNoCithcmUgY29udmVydGVkIGFuZCBjb3BpZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgYW5kIGZvcm1hdCBzcGVjaWZpY2F0aW9ucywKK2VhY2ggb2Ygd2hpY2ggY2F1c2VzIHByaW50aW5nIG9mIHRoZSBuZXh0IHN1Y2Nlc3NpdmUKKy5BciBhcmd1bWVudCAgLgorLlBwCitUaGUKKy5BciBhcmd1bWVudHMKK2FmdGVyIHRoZSBmaXJzdCBhcmUgdHJlYXRlZCBhcyBzdHJpbmdzIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBpcworZWl0aGVyCisuQ20gYiAsCisuQ20gYworb3IKKy5DbSBzIDsKK290aGVyd2lzZSBpdCBpcyBldmFsdWF0ZWQgYXMgYSBDIGNvbnN0YW50LCB3aXRoIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uczoKKy5QcAorLkJsIC1idWxsZXQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKKy5JdAorQSBsZWFkaW5nIHBsdXMgb3IgbWludXMgc2lnbiBpcyBhbGxvd2VkLgorLkl0CitJZiB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgYSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlLCB0aGUgdmFsdWUgaXMgdGhlCisuVG4gQVNDSUkKK2NvZGUgb2YgdGhlIG5leHQgY2hhcmFjdGVyLgorLkVsCisuUHAKK1RoZSBmb3JtYXQgc3RyaW5nIGlzIHJldXNlZCBhcyBvZnRlbiBhcyBuZWNlc3NhcnkgdG8gc2F0aXNmeSB0aGUKKy5BciBhcmd1bWVudHMgIC4KK0FueSBleHRyYSBmb3JtYXQgc3BlY2lmaWNhdGlvbnMgYXJlIGV2YWx1YXRlZCB3aXRoIHplcm8gb3IgdGhlIG51bGwKK3N0cmluZy4KKy5QcAorQ2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGluIGJhY2tzbGFzaCBub3RhdGlvbiBhcyBkZWZpbmVkIGluCisuU3QgLWFuc2lDIC4KK1RoZSBjaGFyYWN0ZXJzIGFuZCB0aGVpciBtZWFuaW5ncyBhcmUgYXMgZm9sbG93czoKKy5CbCAtdGFnIC13aWR0aCBEcyAtb2Zmc2V0IGluZGVudAorLkl0IENtIFxlYQorV3JpdGUgYSBcKltMdF1iZWxsXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZWIKK1dyaXRlIGEgXCpbTHRdYmFja3NwYWNlXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZWYKK1dyaXRlIGEgXCpbTHRdZm9ybS1mZWVkXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZW4KK1dyaXRlIGEgXCpbTHRdbmV3LWxpbmVcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlcgorV3JpdGUgYSBcKltMdF1jYXJyaWFnZSByZXR1cm5cKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxldAorV3JpdGUgYSBcKltMdF10YWJcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxldgorV3JpdGUgYSBcKltMdF12ZXJ0aWNhbCB0YWJcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlXGUKK1dyaXRlIGEgYmFja3NsYXNoIGNoYXJhY3Rlci4KKy5JdCBDbSBcZSBOcyBBciBudW0KK1dyaXRlIGFuIDhcLWJpdCBjaGFyYWN0ZXIgd2hvc2UKKy5UbiBBU0NJSQordmFsdWUgaXMgdGhlIDFcLSwgMlwtLCBvciAzXC1kaWdpdAorb2N0YWwgbnVtYmVyCisuQXIgbnVtIC4KKy5FbAorLlBwCitFYWNoIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIGludHJvZHVjZWQgYnkgdGhlIHBlcmNlbnQgY2hhcmFjdGVyCisoYGAlJycpLgorVGhlIHJlbWFpbmRlciBvZiB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaW5jbHVkZXMsCitpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgIlplcm8gb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOiIKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IENtICMKK0EgYCMnIGNoYXJhY3Rlcgorc3BlY2lmeWluZyB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUgcHJpbnRlZCBpbiBhbiBgYGFsdGVybmF0aXZlIGZvcm0nJy4KK0ZvcgorLkNtIGIgLAorLkNtIGMgLAorLkNtIGQgLAorYW5kCisuQ20gcworZm9ybWF0cywgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4KK0ZvciB0aGUKKy5DbSBvCitmb3JtYXQgdGhlIHByZWNpc2lvbiBvZiB0aGUgbnVtYmVyIGlzIGluY3JlYXNlZCB0byBmb3JjZSB0aGUgZmlyc3QKK2NoYXJhY3RlciBvZiB0aGUgb3V0cHV0IHN0cmluZyB0byBhIHplcm8uCitGb3IgdGhlCisuQ20geAorLlBxIENtIFgKK2Zvcm1hdCwgYSBub24temVybyByZXN1bHQgaGFzIHRoZSBzdHJpbmcKKy5MaSAweAorLlBxIExpIDBYCitwcmVwZW5kZWQgdG8gaXQuCitGb3IKKy5DbSBlICAsCisuQ20gRSAsCisuQ20gZiAgLAorLkNtIGcgLAorYW5kCisuQ20gRworZm9ybWF0cywgdGhlIHJlc3VsdCB3aWxsIGFsd2F5cyBjb250YWluIGEgZGVjaW1hbCBwb2ludCwgZXZlbiBpZiBubworZGlnaXRzIGZvbGxvdyB0aGUgcG9pbnQgKG5vcm1hbGx5LCBhIGRlY2ltYWwgcG9pbnQgb25seSBhcHBlYXJzIGluIHRoZQorcmVzdWx0cyBvZiB0aG9zZSBmb3JtYXRzIGlmIGEgZGlnaXQgZm9sbG93cyB0aGUgZGVjaW1hbCBwb2ludCkuCitGb3IKKy5DbSBnCithbmQKKy5DbSBHCitmb3JtYXRzLCB0cmFpbGluZyB6ZXJvcyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgcmVzdWx0IGFzIHRoZXkKK3dvdWxkIG90aGVyd2lzZSBiZS4KKy5JdCBDbSBcJlwtCitBIG1pbnVzIHNpZ24gYFwtJyB3aGljaCBzcGVjaWZpZXMKKy5FbSBsZWZ0IGFkanVzdG1lbnQKK29mIHRoZSBvdXRwdXQgaW4gdGhlIGluZGljYXRlZCBmaWVsZDsKKy5JdCBDbSBcJisKK0EgYCsnIGNoYXJhY3RlciBzcGVjaWZ5aW5nIHRoYXQgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZQorYSBzaWduIHBsYWNlZCBiZWZvcmUgdGhlIG51bWJlciB3aGVuIHVzaW5nIHNpZ25lZCBmb3JtYXRzLgorLkl0IFNxIFwmXCBcJgorQSBzcGFjZSBzcGVjaWZ5aW5nIHRoYXQgYSBibGFuayBzaG91bGQgYmUgbGVmdCBiZWZvcmUgYSBwb3NpdGl2ZSBudW1iZXIKK2ZvciBhIHNpZ25lZCBmb3JtYXQuCitBIGArJyBvdmVycmlkZXMgYSBzcGFjZSBpZiBib3RoIGFyZSB1c2VkOworLkl0IENtIFwmMAorQSB6ZXJvIGAwJyBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGF0IHplcm8tcGFkZGluZyBzaG91bGQgYmUgdXNlZAorcmF0aGVyIHRoYW4gYmxhbmstcGFkZGluZy4KK0EgYFwtJyBvdmVycmlkZXMgYSBgMCcgaWYgYm90aCBhcmUgdXNlZDsKKy5FbAorLkl0ICJGaWVsZCBXaWR0aDoiCitBbiBvcHRpb25hbCBkaWdpdCBzdHJpbmcgc3BlY2lmeWluZyBhCisuRW0gZmllbGQgd2lkdGggOworaWYgdGhlIG91dHB1dCBzdHJpbmcgaGFzIGZld2VyIGNoYXJhY3RlcnMgdGhhbiB0aGUgZmllbGQgd2lkdGggaXQgd2lsbAorYmUgYmxhbmstcGFkZGVkIG9uIHRoZSBsZWZ0IChvciByaWdodCwgaWYgdGhlIGxlZnQtYWRqdXN0bWVudCBpbmRpY2F0b3IKK2hhcyBiZWVuIGdpdmVuKSB0byBtYWtlIHVwIHRoZSBmaWVsZCB3aWR0aCAobm90ZSB0aGF0IGEgbGVhZGluZyB6ZXJvCitpcyBhIGZsYWcsIGJ1dCBhbiBlbWJlZGRlZCB6ZXJvIGlzIHBhcnQgb2YgYSBmaWVsZCB3aWR0aCk7CisuSXQgUHJlY2lzaW9uIDoKK0FuIG9wdGlvbmFsIHBlcmlvZCwKKy5TcSBDbSBcJi5cJiAsCitmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBkaWdpdCBzdHJpbmcgZ2l2aW5nIGEKKy5FbSBwcmVjaXNpb24KK3doaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0byBhcHBlYXIgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQsCitmb3IKKy5DbSBlCithbmQKKy5DbSBmCitmb3JtYXRzLCBvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBwcmludGVkCitmcm9tIGEgc3RyaW5nCisuU20gb2ZmCisuUGYgKCBDbSBiCisuU20gb24KK2FuZAorLkNtIHMKK2Zvcm1hdHMpOyBpZiB0aGUgZGlnaXQgc3RyaW5nIGlzIG1pc3NpbmcsIHRoZSBwcmVjaXNpb24gaXMgdHJlYXRlZAorYXMgemVybzsKKy5JdCBGb3JtYXQgOgorQSBjaGFyYWN0ZXIgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGZvcm1hdCB0byB1c2UgKG9uZSBvZgorLkNtIGRpb3V4WGZ3RWdHYmNzICkgLgorLkVsCisuUHAKK0EgZmllbGQgd2lkdGggb3IgcHJlY2lzaW9uIG1heSBiZQorLlNxIENtIFwmKgoraW5zdGVhZCBvZiBhIGRpZ2l0IHN0cmluZy4KK0luIHRoaXMgY2FzZSBhbgorLkFyIGFyZ3VtZW50CitzdXBwbGllcyB0aGUgZmllbGQgd2lkdGggb3IgcHJlY2lzaW9uLgorLlBwCitUaGUgZm9ybWF0IGNoYXJhY3RlcnMgYW5kIHRoZWlyIG1lYW5pbmdzIGFyZToKKy5CbCAtdGFnIC13aWR0aCBGbAorLkl0IENtIGRpb3VYeAorVGhlCisuQXIgYXJndW1lbnQKK2lzIHByaW50ZWQgYXMgYSBzaWduZWQgZGVjaW1hbCAoZCBvciBpKSwgdW5zaWduZWQgb2N0YWwsIHVuc2lnbmVkIGRlY2ltYWwsCitvciB1bnNpZ25lZCBoZXhhZGVjaW1hbCAoWCBvciB4KSwgcmVzcGVjdGl2ZWx5LgorLkl0IENtIGYKK1RoZQorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkIGluIHRoZSBzdHlsZQorLlNtIG9mZgorLlBmIFtcLV1kZGQgQ20gXCYuIE5vIGRkZAorLlNtIG9uCit3aGVyZSB0aGUgbnVtYmVyIG9mIGQncworYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgaXMgZXF1YWwgdG8gdGhlIHByZWNpc2lvbiBzcGVjaWZpY2F0aW9uIGZvcgordGhlIGFyZ3VtZW50LgorSWYgdGhlIHByZWNpc2lvbiBpcyBtaXNzaW5nLCA2IGRpZ2l0cyBhcmUgZ2l2ZW47IGlmIHRoZSBwcmVjaXNpb24KK2lzIGV4cGxpY2l0bHkgMCwgbm8gZGlnaXRzIGFuZCBubyBkZWNpbWFsIHBvaW50IGFyZSBwcmludGVkLgorLkl0IENtIGVFCitUaGUKKy5BciBhcmd1bWVudAoraXMgcHJpbnRlZCBpbiB0aGUgc3R5bGUKKy5TbSBvZmYKKy5QZiBbXC1dZCBDbSBcJi4gTm8gZGRkIENtIGUgTm8gXFwqKFBtZGQKKy5TbSBvbgord2hlcmUgdGhlcmUKK2lzIG9uZSBkaWdpdCBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQgYW5kIHRoZSBudW1iZXIgYWZ0ZXIgaXMgZXF1YWwgdG8KK3RoZSBwcmVjaXNpb24gc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGFyZ3VtZW50OyB3aGVuIHRoZSBwcmVjaXNpb24gaXMKK21pc3NpbmcsIDYgZGlnaXRzIGFyZSBwcm9kdWNlZC4KK0FuIHVwcGVyLWNhc2UgRSBpcyB1c2VkIGZvciBhbiBgRScgZm9ybWF0LgorLkl0IENtIGdHCitUaGUKKy5BciBhcmd1bWVudAoraXMgcHJpbnRlZCBpbiBzdHlsZQorLkNtIGYKK29yIGluIHN0eWxlCisuQ20gZQorLlBxIENtIEUKK3doaWNoZXZlciBnaXZlcyBmdWxsIHByZWNpc2lvbiBpbiBtaW5pbXVtIHNwYWNlLgorLkl0IENtIGIKK0NoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nCisuQXIgYXJndW1lbnQKK2FyZSBwcmludGVkIHdpdGggYmFja3NsYXNoLWVzY2FwZSBzZXF1ZW5jZXMgZXhwYW5kZWQuCisuYnIKK1RoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBiYWNrc2xhc2gtZXNjYXBlIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkOgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgQ20gXGVjCitDYXVzZXMKKy5ObQordG8gaWdub3JlIGFueSByZW1haW5pbmcgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIG9wZXJhbmQgY29udGFpbmluZyBpdCwKK2FueSByZW1haW5pbmcgc3RyaW5nIG9wZXJhbmRzLCBhbmQgYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycyBpbgordGhlIGZvcm1hdCBvcGVyYW5kLgorLkl0IENtIFxlMCBOcyBBciBudW0KK1dyaXRlIGFuIDhcLWJpdCBjaGFyYWN0ZXIgd2hvc2UKKy5UbiBBU0NJSQordmFsdWUgaXMgdGhlIDFcLSwgMlwtLCBvciAzXC1kaWdpdAorb2N0YWwgbnVtYmVyCisuQXIgbnVtIC4KKy5FbAorLkl0IENtIGMKK1RoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKy5BciBhcmd1bWVudAoraXMgcHJpbnRlZC4KKy5JdCBDbSBzCitDaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZworLkFyIGFyZ3VtZW50CithcmUgcHJpbnRlZCB1bnRpbCB0aGUgZW5kIGlzIHJlYWNoZWQgb3IgdW50aWwgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCitpbmRpY2F0ZWQgYnkgdGhlIHByZWNpc2lvbiBzcGVjaWZpY2F0aW9uIGlzIHJlYWNoZWQ7IGlmIHRoZQorcHJlY2lzaW9uIGlzIG9taXR0ZWQsIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHByaW50ZWQuCisuSXQgQ20gXCYlCitQcmludCBhIGAlJzsgbm8gYXJndW1lbnQgaXMgdXNlZC4KKy5FbAorLlBwCitJbiBubyBjYXNlIGRvZXMgYSBub24tZXhpc3RlbnQgb3Igc21hbGwgZmllbGQgd2lkdGggY2F1c2UgdHJ1bmNhdGlvbiBvZgorYSBmaWVsZDsgcGFkZGluZyB0YWtlcyBwbGFjZSBvbmx5IGlmIHRoZSBzcGVjaWZpZWQgZmllbGQgd2lkdGggZXhjZWVkcwordGhlIGFjdHVhbCB3aWR0aC4KKy5JdCBYbyBzZXQKKy5PbyB7CisuRmwgb3B0aW9ucyB8IENtICtvcHRpb25zIHwgQ20gLS0gfQorLk9jIEFyIGFyZyAuLi4KKy5YYworVGhlCisuSWMgc2V0Citjb21tYW5kIHBlcmZvcm1zIHRocmVlIGRpZmZlcmVudCBmdW5jdGlvbnMuCisuUHAKK1dpdGggbm8gYXJndW1lbnRzLCBpdCBsaXN0cyB0aGUgdmFsdWVzIG9mIGFsbCBzaGVsbCB2YXJpYWJsZXMuCisuUHAKK0lmIG9wdGlvbnMgYXJlIGdpdmVuLCBpdCBzZXRzIHRoZSBzcGVjaWZpZWQgb3B0aW9uCitmbGFncywgb3IgY2xlYXJzIHRoZW0gYXMgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIGNhbGxlZAorLlN4IEFyZ3VtZW50IExpc3QgUHJvY2Vzc2luZyAuCisuUHAKK1RoZSB0aGlyZCB1c2Ugb2YgdGhlIHNldCBjb21tYW5kIGlzIHRvIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBzaGVsbCdzCitwb3NpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIHNwZWNpZmllZCBhcmdzLgorVG8gY2hhbmdlIHRoZSBwb3NpdGlvbmFsCitwYXJhbWV0ZXJzIHdpdGhvdXQgY2hhbmdpbmcgYW55IG9wdGlvbnMsIHVzZQorLkRxIC0tCithcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc2V0LgorSWYgbm8gYXJncyBhcmUgcHJlc2VudCwgdGhlIHNldCBjb21tYW5kCit3aWxsIGNsZWFyIGFsbCB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIChlcXVpdmFsZW50IHRvIGV4ZWN1dGluZworLkRxIHNoaWZ0ICQjIC4gKQorLkl0IHNoaWZ0IE9wIEFyIG4KK1NoaWZ0IHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgbiB0aW1lcy4KK0EKKy5JYyBzaGlmdAorc2V0cyB0aGUgdmFsdWUgb2YKKy5WYSAkMQordG8gdGhlIHZhbHVlIG9mCisuVmEgJDIgLAordGhlIHZhbHVlIG9mCisuVmEgJDIKK3RvIHRoZSB2YWx1ZSBvZgorLlZhICQzICwKK2FuZCBzbyBvbiwgZGVjcmVhc2luZwordGhlIHZhbHVlIG9mCisuVmEgJCMKK2J5IG9uZS4KK0lmIG4gaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLAorLkljIHNoaWZ0Cit3aWxsIGlzc3VlIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCBleGl0IHdpdGggcmV0dXJuIHN0YXR1cyAyLgorLkl0IHRlc3QgQXIgZXhwcmVzc2lvbgorLkl0IFwmWyBBciBleHByZXNzaW9uIENtIF0KK1RoZQorLkljIHRlc3QKK3V0aWxpdHkgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgZXZhbHVhdGVzCit0byB0cnVlLCByZXR1cm5zIGEgemVybyAodHJ1ZSkgZXhpdCBzdGF0dXM7IG90aGVyd2lzZQoraXQgcmV0dXJucyAxIChmYWxzZSkuCitJZiB0aGVyZSBpcyBubyBleHByZXNzaW9uLCB0ZXN0IGFsc28KK3JldHVybnMgMSAoZmFsc2UpLgorLlBwCitBbGwgb3BlcmF0b3JzIGFuZCBmbGFncyBhcmUgc2VwYXJhdGUgYXJndW1lbnRzIHRvIHRoZQorLkljIHRlc3QKK3V0aWxpdHkuCisuUHAKK1RoZSBmb2xsb3dpbmcgcHJpbWFyaWVzIGFyZSB1c2VkIHRvIGNvbnN0cnVjdCBleHByZXNzaW9uOgorLkJsIC10YWcgLXdpZHRoIEFyCisuSXQgRmwgYiBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIGJsb2NrIHNwZWNpYWwKK2ZpbGUuCisuSXQgRmwgYyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIGNoYXJhY3Rlcgorc3BlY2lhbCBmaWxlLgorLkl0IEZsIGQgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkuCisuSXQgRmwgZSBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIChyZWdhcmRsZXNzIG9mIHR5cGUpLgorLkl0IEZsIGYgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSByZWd1bGFyIGZpbGUuCisuSXQgRmwgZyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpdHMgc2V0IGdyb3VwIElEIGZsYWcKK2lzIHNldC4KKy5JdCBGbCBoIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgc3ltYm9saWMgbGluay4KKy5JdCBGbCBrIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBzdGlja3kgYml0IGlzIHNldC4KKy5JdCBGbCBuIEFyIHN0cmluZworVHJ1ZSBpZiB0aGUgbGVuZ3RoIG9mCisuQXIgc3RyaW5nCitpcyBub256ZXJvLgorLkl0IEZsIHAgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2lzIGEgbmFtZWQgcGlwZQorLlBvIFRuIEZJRk8gUGMgLgorLkl0IEZsIHIgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgcmVhZGFibGUuCisuSXQgRmwgcyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBoYXMgYSBzaXplIGdyZWF0ZXIKK3RoYW4gemVyby4KKy5JdCBGbCB0IEFyIGZpbGVfZGVzY3JpcHRvcgorVHJ1ZSBpZiB0aGUgZmlsZSB3aG9zZSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyCitpcworLkFyIGZpbGVfZGVzY3JpcHRvcgoraXMgb3BlbiBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdGVybWluYWwuCisuSXQgRmwgdSBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpdHMgc2V0IHVzZXIgSUQgZmxhZworaXMgc2V0LgorLkl0IEZsIHcgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgd3JpdGFibGUuCitUcnVlCitpbmRpY2F0ZXMgb25seSB0aGF0IHRoZSB3cml0ZSBmbGFnIGlzIG9uLgorVGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlIG9uIGEgcmVhZC1vbmx5IGZpbGUKK3N5c3RlbSBldmVuIGlmIHRoaXMgdGVzdCBpbmRpY2F0ZXMgdHJ1ZS4KKy5JdCBGbCB4IEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUuCitUcnVlCitpbmRpY2F0ZXMgb25seSB0aGF0IHRoZSBleGVjdXRlIGZsYWcgaXMgb24uCitJZgorLkFyIGZpbGUKK2lzIGEgZGlyZWN0b3J5LCB0cnVlIGluZGljYXRlcyB0aGF0CisuQXIgZmlsZQorY2FuIGJlIHNlYXJjaGVkLgorLkl0IEZsIHogQXIgc3RyaW5nCitUcnVlIGlmIHRoZSBsZW5ndGggb2YKKy5BciBzdHJpbmcKK2lzIHplcm8uCisuSXQgRmwgTCBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIHN5bWJvbGljIGxpbmsuCitUaGlzIG9wZXJhdG9yIGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YKK3RoaXMgcHJvZ3JhbS4KK0RvIG5vdCByZWx5IG9uIGl0cyBleGlzdGVuY2U7IHVzZQorLkZsIGgKK2luc3RlYWQuCisuSXQgRmwgTyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpdHMgb3duZXIgbWF0Y2hlcyB0aGUgZWZmZWN0aXZlIHVzZXIgaWQgb2YgdGhpcyBwcm9jZXNzLgorLkl0IEZsIEcgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXRzIGdyb3VwIG1hdGNoZXMgdGhlIGVmZmVjdGl2ZSBncm91cCBpZCBvZiB0aGlzIHByb2Nlc3MuCisuSXQgRmwgUyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIHNvY2tldC4KKy5JdCBBciBmaWxlMSBGbCBudCBBciBmaWxlMgorVHJ1ZSBpZgorLkFyIGZpbGUxCitleGlzdHMgYW5kIGlzIG5ld2VyIHRoYW4KKy5BciBmaWxlMiAuCisuSXQgQXIgZmlsZTEgRmwgb3QgQXIgZmlsZTIKK1RydWUgaWYKKy5BciBmaWxlMQorZXhpc3RzIGFuZCBpcyBvbGRlciB0aGFuCisuQXIgZmlsZTIgLgorLkl0IEFyIGZpbGUxIEZsIGVmIEFyIGZpbGUyCitUcnVlIGlmCisuQXIgZmlsZTEKK2FuZAorLkFyIGZpbGUyCitleGlzdCBhbmQgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KKy5JdCBBciBzdHJpbmcKK1RydWUgaWYKKy5BciBzdHJpbmcKK2lzIG5vdCB0aGUgbnVsbAorc3RyaW5nLgorLkl0IEFyIFwmc1wmMSBDbSBcJj0gQXIgXCZzXCYyCitUcnVlIGlmIHRoZSBzdHJpbmdzCisuQXIgXCZzXCYxCithbmQKKy5BciBcJnNcJjIKK2FyZSBpZGVudGljYWwuCisuSXQgQXIgXCZzXCYxIENtIFwmIT0gQXIgXCZzXCYyCitUcnVlIGlmIHRoZSBzdHJpbmdzCisuQXIgXCZzXCYxCithbmQKKy5BciBcJnNcJjIKK2FyZSBub3QgaWRlbnRpY2FsLgorLkl0IEFyIFwmc1wmMSBDbSBcJlwqW0x0XSBBciBcJnNcJjIKK1RydWUgaWYgc3RyaW5nCisuQXIgXCZzXCYxCitjb21lcyBiZWZvcmUKKy5BciBcJnNcJjIKK2Jhc2VkIG9uIHRoZSBBU0NJSSB2YWx1ZSBvZiB0aGVpciBjaGFyYWN0ZXJzLgorLkl0IEFyIFwmc1wmMSBDbSBcJlwqW0d0XSBBciBcJnNcJjIKK1RydWUgaWYgc3RyaW5nCisuQXIgXCZzXCYxCitjb21lcyBhZnRlcgorLkFyIFwmc1wmMgorYmFzZWQgb24gdGhlIEFTQ0lJIHZhbHVlIG9mIHRoZWlyIGNoYXJhY3RlcnMuCisuSXQgQXIgXCZuXCYxIEZsIFwmZXEgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VycworLkFyIFwmblwmMQorYW5kCisuQXIgXCZuXCYyCithcmUgYWxnZWJyYWljYWxseQorZXF1YWwuCisuSXQgQXIgXCZuXCYxIEZsIFwmbmUgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VycworLkFyIFwmblwmMQorYW5kCisuQXIgXCZuXCYyCithcmUgbm90CithbGdlYnJhaWNhbGx5IGVxdWFsLgorLkl0IEFyIFwmblwmMSBGbCBcJmd0IEFyIFwmblwmMgorVHJ1ZSBpZiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMQoraXMgYWxnZWJyYWljYWxseQorZ3JlYXRlciB0aGFuIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYyIC4KKy5JdCBBciBcJm5cJjEgRmwgXCZnZSBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXIKKy5BciBcJm5cJjEKK2lzIGFsZ2VicmFpY2FsbHkKK2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgaW50ZWdlcgorLkFyIFwmblwmMiAuCisuSXQgQXIgXCZuXCYxIEZsIFwmbHQgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYxCitpcyBhbGdlYnJhaWNhbGx5IGxlc3MKK3RoYW4gdGhlIGludGVnZXIKKy5BciBcJm5cJjIgLgorLkl0IEFyIFwmblwmMSBGbCBcJmxlIEFyIFwmblwmMgorVHJ1ZSBpZiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMQoraXMgYWxnZWJyYWljYWxseSBsZXNzCit0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYyIC4KKy5FbAorLlBwCitUaGVzZSBwcmltYXJpZXMgY2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBvcGVyYXRvcnM6CisuQmwgLXRhZyAtd2lkdGggQXIKKy5JdCBDbSBcJiEgQXIgZXhwcmVzc2lvbgorVHJ1ZSBpZgorLkFyIGV4cHJlc3Npb24KK2lzIGZhbHNlLgorLkl0IEFyIGV4cHJlc3Npb24xIEZsIGEgQXIgZXhwcmVzc2lvbjIKK1RydWUgaWYgYm90aAorLkFyIGV4cHJlc3Npb24xCithbmQKKy5BciBleHByZXNzaW9uMgorYXJlIHRydWUuCisuSXQgQXIgZXhwcmVzc2lvbjEgRmwgbyBBciBleHByZXNzaW9uMgorVHJ1ZSBpZiBlaXRoZXIKKy5BciBleHByZXNzaW9uMQorb3IKKy5BciBleHByZXNzaW9uMgorYXJlIHRydWUuCisuSXQgQ20gXCYoIE5zIEFyIGV4cHJlc3Npb24gTnMgQ20gXCYpCitUcnVlIGlmIGV4cHJlc3Npb24gaXMgdHJ1ZS4KKy5FbAorLlBwCitUaGUKKy5GbCBhCitvcGVyYXRvciBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiB0aGUKKy5GbCBvCitvcGVyYXRvci4KKy5JdCB0aW1lcworUHJpbnQgdGhlIGFjY3VtdWxhdGVkIHVzZXIgYW5kIHN5c3RlbSB0aW1lcyBmb3IgdGhlIHNoZWxsIGFuZCBmb3IgcHJvY2Vzc2VzCitydW4gZnJvbSB0aGUgc2hlbGwuICBUaGUgcmV0dXJuIHN0YXR1cyBpcyAwLgorLkl0IFhvIHRyYXAKKy5PcCBBciBhY3Rpb24gQXIgc2lnbmFsIC4uLgorLlhjCitDYXVzZSB0aGUgc2hlbGwgdG8gcGFyc2UgYW5kIGV4ZWN1dGUgYWN0aW9uIHdoZW4gYW55IG9mIHRoZSBzcGVjaWZpZWQKK3NpZ25hbHMgYXJlIHJlY2VpdmVkLgorVGhlIHNpZ25hbHMgYXJlIHNwZWNpZmllZCBieSBzaWduYWwgbnVtYmVyIG9yIGFzIHRoZSBuYW1lIG9mIHRoZSBzaWduYWwuCitJZgorLkFyIHNpZ25hbAoraXMKKy5MaSAwICwKK3RoZSBhY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0aGUgc2hlbGwgZXhpdHMuCisuQXIgYWN0aW9uCittYXkgYmUgbnVsbCwgd2hpY2ggY2F1c2UgdGhlIHNwZWNpZmllZCBzaWduYWxzIHRvIGJlIGlnbm9yZWQuCitXaXRoCisuQXIgYWN0aW9uCitvbWl0dGVkIG9yIHNldCB0byBgLScgdGhlIHNwZWNpZmllZCBzaWduYWxzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCBhY3Rpb24uCitXaGVuIHRoZSBzaGVsbCBmb3JrcyBvZmYgYSBzdWJzaGVsbCwgaXQgcmVzZXRzIHRyYXBwZWQgKGJ1dCBub3QgaWdub3JlZCkKK3NpZ25hbHMgdG8gdGhlIGRlZmF1bHQgYWN0aW9uLgorVGhlCisuSWMgdHJhcAorY29tbWFuZCBoYXMgbm8gZWZmZWN0IG9uIHNpZ25hbHMgdGhhdCB3ZXJlCitpZ25vcmVkIG9uIGVudHJ5IHRvIHRoZSBzaGVsbC4KKy5JYyB0cmFwCit3aXRob3V0IGFueSBhcmd1bWVudHMgY2F1c2UgaXQgdG8gd3JpdGUgYSBsaXN0IG9mIHNpZ25hbHMgYW5kIHRoZWlyCithc3NvY2lhdGVkIGFjdGlvbiB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGluIGEgZm9ybWF0IHRoYXQgaXMgc3VpdGFibGUKK2FzIGFuIGlucHV0IHRvIHRoZSBzaGVsbCB0aGF0IGFjaGlldmVzIHRoZSBzYW1lIHRyYXBwaW5nIHJlc3VsdHMuCisuUHAKK0V4YW1wbGVzOgorLlBwCisuRGwgdHJhcAorLlBwCitMaXN0IHRyYXBwZWQgc2lnbmFscyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBhY3Rpb24KKy5QcAorLkRsIHRyYXAgJycgSU5UIFFVSVQgdHN0cCAzMAorLlBwCitJZ25vcmUgc2lnbmFscyBJTlQgUVVJVCBUU1RQIFVTUjEKKy5QcAorLkRsIHRyYXAgZGF0ZSBJTlQKKy5QcAorUHJpbnQgZGF0ZSB1cG9uIHJlY2VpdmluZyBzaWduYWwgSU5UCisuSXQgdHlwZSBPcCBBciBuYW1lIC4uLgorSW50ZXJwcmV0IGVhY2ggbmFtZSBhcyBhIGNvbW1hbmQgYW5kIHByaW50IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjb21tYW5kCitzZWFyY2guCitQb3NzaWJsZSByZXNvbHV0aW9ucyBhcmU6CitzaGVsbCBrZXl3b3JkLCBhbGlhcywgc2hlbGwgYnVpbHRpbiwKK2NvbW1hbmQsIHRyYWNrZWQgYWxpYXMgYW5kIG5vdCBmb3VuZC4KK0ZvciBhbGlhc2VzIHRoZSBhbGlhcyBleHBhbnNpb24gaXMKK3ByaW50ZWQ7IGZvciBjb21tYW5kcyBhbmQgdHJhY2tlZCBhbGlhc2VzIHRoZSBjb21wbGV0ZSBwYXRobmFtZSBvZiB0aGUKK2NvbW1hbmQgaXMgcHJpbnRlZC4KKy5JdCB1bGltaXQgWG8KKy5PcCBGbCBIIFwqKEJhIEZsIFMKKy5PcCBGbCBhIFwqKEJhIEZsIHRmZHNjbWxwbiBPcCBBciB2YWx1ZQorLlhjCitJbnF1aXJlIGFib3V0IG9yIHNldCB0aGUgaGFyZCBvciBzb2Z0IGxpbWl0cyBvbiBwcm9jZXNzZXMgb3Igc2V0IG5ldworbGltaXRzLgorVGhlIGNob2ljZSBiZXR3ZWVuIGhhcmQgbGltaXQgKHdoaWNoIG5vIHByb2Nlc3MgaXMgYWxsb3dlZCB0bwordmlvbGF0ZSwgYW5kIHdoaWNoIG1heSBub3QgYmUgcmFpc2VkIG9uY2UgaXQgaGFzIGJlZW4gbG93ZXJlZCkgYW5kIHNvZnQKK2xpbWl0ICh3aGljaCBjYXVzZXMgcHJvY2Vzc2VzIHRvIGJlIHNpZ25hbGVkIGJ1dCBub3QgbmVjZXNzYXJpbHkga2lsbGVkLAorYW5kIHdoaWNoIG1heSBiZSByYWlzZWQpIGlzIG1hZGUgd2l0aCB0aGVzZSBmbGFnczoKKy5CbCAtdGFnIC13aWR0aCBGbAorLkl0IEZsIEgKK3NldCBvciBpbnF1aXJlIGFib3V0IGhhcmQgbGltaXRzCisuSXQgRmwgUworc2V0IG9yIGlucXVpcmUgYWJvdXQgc29mdCBsaW1pdHMuCitJZiBuZWl0aGVyCisuRmwgSAorbm9yCisuRmwgUworaXMgc3BlY2lmaWVkLCB0aGUgc29mdCBsaW1pdCBpcyBkaXNwbGF5ZWQgb3IgYm90aCBsaW1pdHMgYXJlIHNldC4KK0lmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIGxhc3Qgb25lIHdpbnMuCisuRWwKKy5QcAorLkJsIC10YWcgLXdpZHRoIEZsCitUaGUgbGltaXQgdG8gYmUgaW50ZXJyb2dhdGVkIG9yIHNldCwgdGhlbiwgaXMgY2hvc2VuIGJ5IHNwZWNpZnlpbmcKK2FueSBvbmUgb2YgdGhlc2UgZmxhZ3M6CisuSXQgRmwgYQorc2hvdyBhbGwgdGhlIGN1cnJlbnQgbGltaXRzCisuSXQgRmwgdAorc2hvdyBvciBzZXQgdGhlIGxpbWl0IG9uIENQVSB0aW1lIChpbiBzZWNvbmRzKQorLkl0IEZsIGYKK3Nob3cgb3Igc2V0IHRoZSBsaW1pdCBvbiB0aGUgbGFyZ2VzdCBmaWxlIHRoYXQgY2FuIGJlIGNyZWF0ZWQKKyhpbiA1MTItYnl0ZSBibG9ja3MpCisuSXQgRmwgZAorc2hvdyBvciBzZXQgdGhlIGxpbWl0IG9uIHRoZSBkYXRhIHNlZ21lbnQgc2l6ZSBvZiBhIHByb2Nlc3MgKGluIGtpbG9ieXRlcykKKy5JdCBGbCBzCitzaG93IG9yIHNldCB0aGUgbGltaXQgb24gdGhlIHN0YWNrIHNpemUgb2YgYSBwcm9jZXNzIChpbiBraWxvYnl0ZXMpCisuSXQgRmwgYworc2hvdyBvciBzZXQgdGhlIGxpbWl0IG9uIHRoZSBsYXJnZXN0IGNvcmUgZHVtcCBzaXplIHRoYXQgY2FuIGJlIHByb2R1Y2VkCisoaW4gNTEyLWJ5dGUgYmxvY2tzKQorLkl0IEZsIG0KK3Nob3cgb3Igc2V0IHRoZSBsaW1pdCBvbiB0aGUgdG90YWwgcGh5c2ljYWwgbWVtb3J5IHRoYXQgY2FuIGJlCitpbiB1c2UgYnkgYSBwcm9jZXNzIChpbiBraWxvYnl0ZXMpCisuSXQgRmwgbAorc2hvdyBvciBzZXQgdGhlIGxpbWl0IG9uIGhvdyBtdWNoIG1lbW9yeSBhIHByb2Nlc3MgY2FuIGxvY2sgd2l0aAorLlhyIG1sb2NrIDIKKyhpbiBraWxvYnl0ZXMpCisuSXQgRmwgcAorc2hvdyBvciBzZXQgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIHRoaXMgdXNlciBjYW4KK2hhdmUgYXQgb25lIHRpbWUKKy5JdCBGbCBuCitzaG93IG9yIHNldCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBmaWxlcyBhIHByb2Nlc3MgY2FuIGhhdmUgb3BlbiBhdCBvbmNlCisuRWwKKy5QcAorSWYgbm9uZSBvZiB0aGVzZSBpcyBzcGVjaWZpZWQsIGl0IGlzIHRoZSBsaW1pdCBvbiBmaWxlIHNpemUgdGhhdCBpcyBzaG93bgorb3Igc2V0LgorSWYgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgbGltaXQgaXMgc2V0IHRvIHRoYXQgbnVtYmVyOyBvdGhlcndpc2UKK3RoZSBjdXJyZW50IGxpbWl0IGlzIGRpc3BsYXllZC4KKy5QcAorTGltaXRzIG9mIGFuIGFyYml0cmFyeSBwcm9jZXNzIGNhbiBiZSBkaXNwbGF5ZWQgb3Igc2V0IHVzaW5nIHRoZQorLlhyIHN5c2N0bCA4Cit1dGlsaXR5LgorLlBwCisuSXQgdW1hc2sgT3AgQXIgbWFzaworU2V0IHRoZSB2YWx1ZSBvZiB1bWFzayAoc2VlCisuWHIgdW1hc2sgMiApCit0byB0aGUgc3BlY2lmaWVkIG9jdGFsIHZhbHVlLgorSWYgdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQsIHRoZSB1bWFzayB2YWx1ZSBpcyBwcmludGVkLgorLkl0IHVuYWxpYXMgWG8KKy5PcCBGbCBhCisuT3AgQXIgbmFtZQorLlhjCitJZgorLkFyIG5hbWUKK2lzIHNwZWNpZmllZCwgdGhlIHNoZWxsIHJlbW92ZXMgdGhhdCBhbGlhcy4KK0lmCisuRmwgYQoraXMgc3BlY2lmaWVkLCBhbGwgYWxpYXNlcyBhcmUgcmVtb3ZlZC4KKy5JdCB1bnNldCBYbworLk9wIEZsIGZ2CisuQXIgbmFtZSAuLi4KKy5YYworVGhlIHNwZWNpZmllZCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBhcmUgdW5zZXQgYW5kIHVuZXhwb3J0ZWQuCitJZgorLkZsIGYKK29yCisuRmwgdgoraXMgc3BlY2lmaWVkLCB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBvciB2YXJpYWJsZSBpcyB1bnNldCwgcmVzcGVjdGl2ZWx5LgorSWYgYSBnaXZlbiBuYW1lIGNvcnJlc3BvbmRzIHRvIGJvdGggYSB2YXJpYWJsZSBhbmQgYSBmdW5jdGlvbiwgYW5kIG5vCitvcHRpb25zIGFyZSBnaXZlbiwgb25seSB0aGUgdmFyaWFibGUgaXMgdW5zZXQuCisuSXQgd2FpdCBPcCBBciBqb2IKK1dhaXQgZm9yIHRoZSBzcGVjaWZpZWQgam9iIHRvIGNvbXBsZXRlIGFuZCByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZQorbGFzdCBwcm9jZXNzIGluIHRoZSBqb2IuCitJZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCwgd2FpdCBmb3IgYWxsIGpvYnMgdG8KK2NvbXBsZXRlIGFuZCB0aGUgcmV0dXJuIGFuIGV4aXQgc3RhdHVzIG9mIHplcm8uCisuRWwKKy5TcyBDb21tYW5kIExpbmUgRWRpdGluZworV2hlbgorLk5tCitpcyBiZWluZyB1c2VkIGludGVyYWN0aXZlbHkgZnJvbSBhIHRlcm1pbmFsLCB0aGUgY3VycmVudCBjb21tYW5kCithbmQgdGhlIGNvbW1hbmQgaGlzdG9yeSAoc2VlCisuSWMgZmMKK2luCisuU3ggQnVpbHRpbnMgKQorY2FuIGJlIGVkaXRlZCB1c2luZyB2aS1tb2RlIGNvbW1hbmQtbGluZSBlZGl0aW5nLgorVGhpcyBtb2RlIHVzZXMgY29tbWFuZHMsIGRlc2NyaWJlZCBiZWxvdywKK3NpbWlsYXIgdG8gYSBzdWJzZXQgb2YgdGhvc2UgZGVzY3JpYmVkIGluIHRoZSB2aSBtYW4gcGFnZS4KK1RoZSBjb21tYW5kCisuUWwgc2V0IC1vIHZpCitlbmFibGVzIHZpLW1vZGUgZWRpdGluZyBhbmQgcGxhY2Ugc2ggaW50byB2aSBpbnNlcnQgbW9kZS4KK1dpdGggdmktbW9kZQorZW5hYmxlZCwgc2ggY2FuIGJlIHN3aXRjaGVkIGJldHdlZW4gaW5zZXJ0IG1vZGUgYW5kIGNvbW1hbmQgbW9kZS4KK1RoZSBlZGl0b3IgaXMgbm90IGRlc2NyaWJlZCBpbiBmdWxsIGhlcmUsIGJ1dCB3aWxsIGJlIGluIGEgbGF0ZXIgZG9jdW1lbnQuCitJdCdzIHNpbWlsYXIgdG8gdmk6IHR5cGluZworLkFxIEVTQword2lsbCB0aHJvdyB5b3UgaW50byBjb21tYW5kIFZJIGNvbW1hbmQgbW9kZS4KK0hpdHRpbmcKKy5BcSByZXR1cm4KK3doaWxlIGluIGNvbW1hbmQgbW9kZSB3aWxsIHBhc3MgdGhlIGxpbmUgdG8gdGhlIHNoZWxsLgorLlNoIEVYSVQgU1RBVFVTCitFcnJvcnMgdGhhdCBhcmUgZGV0ZWN0ZWQgYnkgdGhlIHNoZWxsLCBzdWNoIGFzIGEgc3ludGF4IGVycm9yLCB3aWxsIGNhdXNlIHRoZQorc2hlbGwgdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMuCitJZiB0aGUgc2hlbGwgaXMgbm90IGFuCitpbnRlcmFjdGl2ZSBzaGVsbCwgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc2hlbGwgZmlsZSB3aWxsIGJlIGFib3J0ZWQuCitPdGhlcndpc2UKK3RoZSBzaGVsbCB3aWxsIHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGxhc3QgY29tbWFuZCBleGVjdXRlZCwgb3IKK2lmIHRoZSBleGl0IGJ1aWx0aW4gaXMgdXNlZCB3aXRoIGEgbnVtZXJpYyBhcmd1bWVudCwgaXQgd2lsbCByZXR1cm4gdGhlCithcmd1bWVudC4KKy5TaCBFTlZJUk9OTUVOVAorLkJsIC10YWcgLXdpZHRoIE1BSUxDSEVDSworLkl0IEV2IEhPTUUKK1NldCBhdXRvbWF0aWNhbGx5IGJ5CisuWHIgbG9naW4gMQorZnJvbSB0aGUgdXNlcidzIGxvZ2luIGRpcmVjdG9yeSBpbiB0aGUgcGFzc3dvcmQgZmlsZQorLlBxIFhyIHBhc3N3ZCA0IC4KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgYWxzbyBmdW5jdGlvbnMgYXMgdGhlIGRlZmF1bHQgYXJndW1lbnQgZm9yIHRoZQorY2QgYnVpbHRpbi4KKy5JdCBFdiBQQVRICitUaGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgZXhlY3V0YWJsZXMuCitTZWUgdGhlIGFib3ZlIHNlY3Rpb24KKy5TeCBQYXRoIFNlYXJjaCAuCisuSXQgRXYgQ0RQQVRICitUaGUgc2VhcmNoIHBhdGggdXNlZCB3aXRoIHRoZSBjZCBidWlsdGluLgorLkl0IEV2IE1BSUwKK1RoZSBuYW1lIG9mIGEgbWFpbCBmaWxlLCB0aGF0IHdpbGwgYmUgY2hlY2tlZCBmb3IgdGhlIGFycml2YWwgb2YgbmV3IG1haWwuCitPdmVycmlkZGVuIGJ5CisuRXYgTUFJTFBBVEggLgorLkl0IEV2IE1BSUxDSEVDSworVGhlIGZyZXF1ZW5jeSBpbiBzZWNvbmRzIHRoYXQgdGhlIHNoZWxsIGNoZWNrcyBmb3IgdGhlIGFycml2YWwgb2YgbWFpbAoraW4gdGhlIGZpbGVzIHNwZWNpZmllZCBieSB0aGUKKy5FdiBNQUlMUEFUSAorb3IgdGhlCisuRXYgTUFJTAorZmlsZS4KK0lmIHNldCB0byAwLCB0aGUgY2hlY2sgd2lsbCBvY2N1ciBhdCBlYWNoIHByb21wdC4KKy5JdCBFdiBNQUlMUEFUSAorQSBjb2xvbgorLkRxIFwmOgorc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBuYW1lcywgZm9yIHRoZSBzaGVsbCB0byBjaGVjayBmb3IgaW5jb21pbmcgbWFpbC4KK1RoaXMgZW52aXJvbm1lbnQgc2V0dGluZyBvdmVycmlkZXMgdGhlCisuRXYgTUFJTAorc2V0dGluZy4KK1RoZXJlIGlzIGEgbWF4aW11bSBvZiAxMCBtYWlsYm94ZXMgdGhhdCBjYW4gYmUgbW9uaXRvcmVkIGF0IG9uY2UuCisuSXQgRXYgUFMxCitUaGUgcHJpbWFyeSBwcm9tcHQgc3RyaW5nLCB3aGljaCBkZWZhdWx0cyB0bworLkRxICQgXCAgLAordW5sZXNzIHlvdSBhcmUgdGhlIHN1cGVydXNlciwgaW4gd2hpY2ggY2FzZSBpdCBkZWZhdWx0cyB0bworLkRxICMgXCAgLgorLkl0IEV2IFBTMgorVGhlIHNlY29uZGFyeSBwcm9tcHQgc3RyaW5nLCB3aGljaCBkZWZhdWx0cyB0bworLkRxIFwqW0d0XSBcICAuCisuSXQgRXYgUFM0CitPdXRwdXQgYmVmb3JlIGVhY2ggbGluZSB3aGVuIGV4ZWN1dGlvbiB0cmFjZSAoc2V0IC14KSBpcyBlbmFibGVkLAorZGVmYXVsdHMgdG8KKy5EcSArIFwgIC4KKy5JdCBFdiBJRlMKK0lucHV0IEZpZWxkIFNlcGFyYXRvcnMuCitUaGlzIGlzIG5vcm1hbGx5IHNldCB0bworLkFxIHNwYWNlICwKKy5BcSB0YWIgLAorYW5kCisuQXEgbmV3bGluZSAuCitTZWUgdGhlCisuU3ggV2hpdGUgU3BhY2UgU3BsaXR0aW5nCitzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMuCisuSXQgRXYgVEVSTQorVGhlIGRlZmF1bHQgdGVybWluYWwgc2V0dGluZyBmb3IgdGhlIHNoZWxsLgorVGhpcyBpcyBpbmhlcml0ZWQgYnkKK2NoaWxkcmVuIG9mIHRoZSBzaGVsbCwgYW5kIGlzIHVzZWQgaW4gdGhlIGhpc3RvcnkgZWRpdGluZyBtb2Rlcy4KKy5JdCBFdiBISVNUU0laRQorVGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgaGlzdG9yeSBidWZmZXIgZm9yIHRoZSBzaGVsbC4KKy5JdCBFdiBQV0QKK1RoZSBsb2dpY2FsIHZhbHVlIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgVGhpcyBpcyBzZXQgYnkgdGhlCisuSWMgY2QKK2NvbW1hbmQuCisuSXQgRXYgT0xEUFdECitUaGUgcHJldmlvdXMgbG9naWNhbCB2YWx1ZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIFRoaXMgaXMgc2V0IGJ5Cit0aGUKKy5JYyBjZAorY29tbWFuZC4KKy5JdCBFdiBQUElECitUaGUgcHJvY2VzcyBJRCBvZiB0aGUgcGFyZW50IHByb2Nlc3Mgb2YgdGhlIHNoZWxsLgorLkVsCisuU2ggRklMRVMKKy5CbCAtaXRlbSAtd2lkdGggSE9NRXByb2ZpbGV4eHh4CisuSXQKKy5QYSAkSE9NRS8ucHJvZmlsZQorLkl0CisuUGEgL2V0Yy9wcm9maWxlCisuRWwKKy5TaCBTRUUgQUxTTworLlhyIGNzaCAxICwKKy5YciBlY2hvIDEgLAorLlhyIGdldG9wdCAxICwKKy5YciBrc2ggMSAsCisuWHIgbG9naW4gMSAsCisuWHIgcHJpbnRmIDEgLAorLlhyIHRlc3QgMSAsCisuWHIgZ2V0b3B0IDMgLAorLlhyIHBhc3N3ZCA1ICwKKy5cIiAuWHIgcHJvZmlsZSA0ICwKKy5YciBlbnZpcm9uIDcgLAorLlhyIHN5c2N0bCA4CisuU2ggSElTVE9SWQorQQorLk5tCitjb21tYW5kIGFwcGVhcmVkIGluCisuQXQgdjEgLgorSXQgd2FzLCBob3dldmVyLCB1bm1haW50YWluYWJsZSBzbyB3ZSB3cm90ZSB0aGlzIG9uZS4KKy5TaCBCVUdTCitTZXR1aWQgc2hlbGwgc2NyaXB0cyBzaG91bGQgYmUgYXZvaWRlZCBhdCBhbGwgY29zdHMsIGFzIHRoZXkgYXJlIGEKK3NpZ25pZmljYW50IHNlY3VyaXR5IHJpc2suCisuUHAKK1BTMSwgUFMyLCBhbmQgUFM0IHNob3VsZCBiZSBzdWJqZWN0IHRvIHBhcmFtZXRlciBleHBhbnNpb24gYmVmb3JlCitiZWluZyBkaXNwbGF5ZWQuCmRpZmYgLS1naXQgYS91c3IvZGFzaC9zaGVsbC5oIGIvdXNyL2Rhc2gvc2hlbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY3Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvc2hlbGwuaApAQCAtMCwwICsxLDk0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXNoZWxsLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3cgc2hvdWxkIGJlIHNldCB0byByZWZsZWN0IHRoZSB0eXBlIG9mIHN5c3RlbSB5b3UgaGF2ZToKKyAqCUpPQlMgLT4gMSBpZiB5b3UgaGF2ZSBCZXJrZWxleSBqb2IgY29udHJvbCwgMCBvdGhlcndpc2UuCisgKglTSE9SVE5BTUVTIC0+IDEgaWYgeW91ciBsaW5rZXIgY2Fubm90IGhhbmRsZSBsb25nIG5hbWVzLgorICoJZGVmaW5lIEJTRCBpZiB5b3UgYXJlIHJ1bm5pbmcgNC4yIEJTRCBvciBsYXRlci4KKyAqCWRlZmluZSBTWVNWIGlmIHlvdSBhcmUgcnVubmluZyB1bmRlciBTeXN0ZW0gVi4KKyAqCWRlZmluZSBERUJVRz0xIHRvIGNvbXBpbGUgaW4gZGVidWdnaW5nICgnc2V0IC1vIGRlYnVnJyB0byB0dXJuIG9uKQorICoJZGVmaW5lIERFQlVHPTIgdG8gY29tcGlsZSBpbiBhbmQgdHVybiBvbiBkZWJ1Z2dpbmcuCisgKglkZWZpbmUgRE9fU0hBUkVEVkZPUksgdG8gaW5kaWNhdGUgdGhhdCB2Zm9yaygyKSBzaGFyZXMgaXRzIGFkZHJlc3MKKyAqCSAgICAgICB3aXRoIGl0cyBwYXJlbnQuCisgKgorICogV2hlbiBkZWJ1Z2dpbmcgaXMgb24sIGRlYnVnZ2luZyBpbmZvIHdpbGwgYmUgd3JpdHRlbiB0byAuL3RyYWNlIGFuZAorICogYSBxdWl0IHNpZ25hbCB3aWxsIGdlbmVyYXRlIGEgY29yZSBkdW1wLgorICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2lmbmRlZiBKT0JTCisjZGVmaW5lIEpPQlMgMQorI2VuZGlmCisjaWZuZGVmIEJTRAorI2RlZmluZSBCU0QgMQorI2VuZGlmCisKKyNpZm5kZWYgRE9fU0hBUkVEVkZPUksKKyNpZiBfX05ldEJTRF9WZXJzaW9uX18gPj0gMTA0MDAwMDAwCisjZGVmaW5lIERPX1NIQVJFRFZGT1JLCisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKnBvaW50ZXI7CisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAodm9pZCAqKTAKKyNlbmRpZgorI2RlZmluZSBTVEFUSUMgc3RhdGljCisjZGVmaW5lIE1LSU5JVAkvKiBlbXB0eSAqLworCitleHRlcm4gY2hhciBudWxsc3RyWzFdOwkJLyogbnVsbCBzdHJpbmcgKi8KKworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgVFJBQ0UocGFyYW0pCXRyYWNlIHBhcmFtCisjZGVmaW5lIFRSQUNFVihwYXJhbSkJdHJhY2V2IHBhcmFtCisjZWxzZQorI2RlZmluZSBUUkFDRShwYXJhbSkKKyNkZWZpbmUgVFJBQ0VWKHBhcmFtKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA8IDMKKyNkZWZpbmUgdmFfY29weSBfX3ZhX2NvcHkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgOTYpCisjZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoeCwgZXhwZWN0ZWRfdmFsdWUpICh4KQorI2VuZGlmCisKKyNkZWZpbmUgbGlrZWx5KHgpCV9fYnVpbHRpbl9leHBlY3QoISEoeCksMSkKKyNkZWZpbmUgdW5saWtlbHkoeCkJX19idWlsdGluX2V4cGVjdCghISh4KSwwKQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvc2hvdy5jIGIvdXNyL2Rhc2gvc2hvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNThkZTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9zaG93LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAibm9kZXMuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgInNob3cuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBzaHRyZWUodW5pb24gbm9kZSAqLCBpbnQsIGNoYXIgKiwgRklMRSopOworc3RhdGljIHZvaWQgc2hjbWQodW5pb24gbm9kZSAqLCBGSUxFICopOworc3RhdGljIHZvaWQgc2hhcmcodW5pb24gbm9kZSAqLCBGSUxFICopOworc3RhdGljIHZvaWQgaW5kZW50KGludCwgY2hhciAqLCBGSUxFICopOworc3RhdGljIHZvaWQgdHJzdHJpbmcoY2hhciAqKTsKKworCit2b2lkCitzaG93dHJlZSh1bmlvbiBub2RlICpuKQoreworCXRycHV0cygic2hvd3RyZWUgY2FsbGVkXG4iKTsKKwlzaHRyZWUobiwgMSwgTlVMTCwgc3Rkb3V0KTsKK30KKworCitzdGF0aWMgdm9pZAorc2h0cmVlKHVuaW9uIG5vZGUgKm4sIGludCBpbmQsIGNoYXIgKnBmeCwgRklMRSAqZnApCit7CisJc3RydWN0IG5vZGVsaXN0ICpscDsKKwljb25zdCBjaGFyICpzOworCisJaWYgKG4gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaW5kZW50KGluZCwgcGZ4LCBmcCk7CisJc3dpdGNoKG4tPnR5cGUpIHsKKwljYXNlIE5TRU1JOgorCQlzID0gIjsgIjsKKwkJZ290byBiaW5vcDsKKwljYXNlIE5BTkQ6CisJCXMgPSAiICYmICI7CisJCWdvdG8gYmlub3A7CisJY2FzZSBOT1I6CisJCXMgPSAiIHx8ICI7CitiaW5vcDoKKwkJc2h0cmVlKG4tPm5iaW5hcnkuY2gxLCBpbmQsIE5VTEwsIGZwKTsKKwkgICAvKiAgICBpZiAoaW5kIDwgMCkgKi8KKwkJCWZwdXRzKHMsIGZwKTsKKwkJc2h0cmVlKG4tPm5iaW5hcnkuY2gyLCBpbmQsIE5VTEwsIGZwKTsKKwkJYnJlYWs7CisJY2FzZSBOQ01EOgorCQlzaGNtZChuLCBmcCk7CisJCWlmIChpbmQgPj0gMCkKKwkJCXB1dGMoJ1xuJywgZnApOworCQlicmVhazsKKwljYXNlIE5QSVBFOgorCQlmb3IgKGxwID0gbi0+bnBpcGUuY21kbGlzdCA7IGxwIDsgbHAgPSBscC0+bmV4dCkgeworCQkJc2hjbWQobHAtPm4sIGZwKTsKKwkJCWlmIChscC0+bmV4dCkKKwkJCQlmcHV0cygiIHwgIiwgZnApOworCQl9CisJCWlmIChuLT5ucGlwZS5iYWNrZ25kKQorCQkJZnB1dHMoIiAmIiwgZnApOworCQlpZiAoaW5kID49IDApCisJCQlwdXRjKCdcbicsIGZwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihmcCwgIjxub2RlIHR5cGUgJWQ+Iiwgbi0+dHlwZSk7CisJCWlmIChpbmQgPj0gMCkKKwkJCXB1dGMoJ1xuJywgZnApOworCQlicmVhazsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZAorc2hjbWQodW5pb24gbm9kZSAqY21kLCBGSUxFICpmcCkKK3sKKwl1bmlvbiBub2RlICpucDsKKwlpbnQgZmlyc3Q7CisJY29uc3QgY2hhciAqczsKKwlpbnQgZGZ0ZmQ7CisKKwlmaXJzdCA9IDE7CisJZm9yIChucCA9IGNtZC0+bmNtZC5hcmdzIDsgbnAgOyBucCA9IG5wLT5uYXJnLm5leHQpIHsKKwkJaWYgKCEgZmlyc3QpCisJCQlwdXRjaGFyKCcgJyk7CisJCXNoYXJnKG5wLCBmcCk7CisJCWZpcnN0ID0gMDsKKwl9CisJZm9yIChucCA9IGNtZC0+bmNtZC5yZWRpcmVjdCA7IG5wIDsgbnAgPSBucC0+bmZpbGUubmV4dCkgeworCQlpZiAoISBmaXJzdCkKKwkJCXB1dGNoYXIoJyAnKTsKKwkJc3dpdGNoIChucC0+bmZpbGUudHlwZSkgeworCQkJY2FzZSBOVE86CXMgPSAiPiI7ICBkZnRmZCA9IDE7IGJyZWFrOworCQkJY2FzZSBOQ0xPQkJFUjoJcyA9ICI+fCI7IGRmdGZkID0gMTsgYnJlYWs7CisJCQljYXNlIE5BUFBFTkQ6CXMgPSAiPj4iOyBkZnRmZCA9IDE7IGJyZWFrOworCQkJY2FzZSBOVE9GRDoJcyA9ICI+JiI7IGRmdGZkID0gMTsgYnJlYWs7CisJCQljYXNlIE5GUk9NOglzID0gIjwiOyAgZGZ0ZmQgPSAwOyBicmVhazsKKwkJCWNhc2UgTkZST01GRDoJcyA9ICI8JiI7IGRmdGZkID0gMDsgYnJlYWs7CisJCQljYXNlIE5GUk9NVE86CXMgPSAiPD4iOyBkZnRmZCA9IDA7IGJyZWFrOworCQkJZGVmYXVsdDogIAlzID0gIiplcnJvcioiOyBkZnRmZCA9IDA7IGJyZWFrOworCQl9CisJCWlmIChucC0+bmZpbGUuZmQgIT0gZGZ0ZmQpCisJCQlmcHJpbnRmKGZwLCAiJWQiLCBucC0+bmZpbGUuZmQpOworCQlmcHV0cyhzLCBmcCk7CisJCWlmIChucC0+bmZpbGUudHlwZSA9PSBOVE9GRCB8fCBucC0+bmZpbGUudHlwZSA9PSBORlJPTUZEKSB7CisJCQlmcHJpbnRmKGZwLCAiJWQiLCBucC0+bmR1cC5kdXBmZCk7CisJCX0gZWxzZSB7CisJCQlzaGFyZyhucC0+bmZpbGUuZm5hbWUsIGZwKTsKKwkJfQorCQlmaXJzdCA9IDA7CisJfQorfQorCisKKworc3RhdGljIHZvaWQKK3NoYXJnKHVuaW9uIG5vZGUgKmFyZywgRklMRSAqZnApCit7CisJY2hhciAqcDsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmJxbGlzdDsKKwlpbnQgc3VidHlwZTsKKworCWlmIChhcmctPnR5cGUgIT0gTkFSRykgeworCQlwcmludGYoIjxub2RlIHR5cGUgJWQ+XG4iLCBhcmctPnR5cGUpOworCQlhYm9ydCgpOworCX0KKwlicWxpc3QgPSBhcmctPm5hcmcuYmFja3F1b3RlOworCWZvciAocCA9IGFyZy0+bmFyZy50ZXh0IDsgKnAgOyBwKyspIHsKKwkJc3dpdGNoICgoc2lnbmVkIGNoYXIpKnApIHsKKwkJY2FzZSBDVExFU0M6CisJCQlwdXRjKCorK3AsIGZwKTsKKwkJCWJyZWFrOworCQljYXNlIENUTFZBUjoKKwkJCXB1dGMoJyQnLCBmcCk7CisJCQlwdXRjKCd7JywgZnApOworCQkJc3VidHlwZSA9ICorK3A7CisJCQlpZiAoc3VidHlwZSA9PSBWU0xFTkdUSCkKKwkJCQlwdXRjKCcjJywgZnApOworCisJCQl3aGlsZSAoKnAgIT0gJz0nKQorCQkJCXB1dGMoKnArKywgZnApOworCisJCQlpZiAoc3VidHlwZSAmIFZTTlVMKQorCQkJCXB1dGMoJzonLCBmcCk7CisKKwkJCXN3aXRjaCAoc3VidHlwZSAmIFZTVFlQRSkgeworCQkJY2FzZSBWU05PUk1BTDoKKwkJCQlwdXRjKCd9JywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU01JTlVTOgorCQkJCXB1dGMoJy0nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTUExVUzoKKwkJCQlwdXRjKCcrJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU1FVRVNUSU9OOgorCQkJCXB1dGMoJz8nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTQVNTSUdOOgorCQkJCXB1dGMoJz0nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTVFJJTUxFRlQ6CisJCQkJcHV0YygnIycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNTEVGVE1BWDoKKwkJCQlwdXRjKCcjJywgZnApOworCQkJCXB1dGMoJyMnLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTVFJJTVJJR0hUOgorCQkJCXB1dGMoJyUnLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTVFJJTVJJR0hUTUFYOgorCQkJCXB1dGMoJyUnLCBmcCk7CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNMRU5HVEg6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiPHN1YnR5cGUgJWQ+Iiwgc3VidHlwZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVExFTkRWQVI6CisJCSAgICAgcHV0YygnfScsIGZwKTsKKwkJICAgICBicmVhazsKKwkJY2FzZSBDVExCQUNLUToKKwkJY2FzZSBDVExCQUNLUXxDVExRVU9URToKKwkJCXB1dGMoJyQnLCBmcCk7CisJCQlwdXRjKCcoJywgZnApOworCQkJc2h0cmVlKGJxbGlzdC0+biwgLTEsIE5VTEwsIGZwKTsKKwkJCXB1dGMoJyknLCBmcCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXB1dGMoKnAsIGZwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitpbmRlbnQoaW50IGFtb3VudCwgY2hhciAqcGZ4LCBGSUxFICpmcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgYW1vdW50IDsgaSsrKSB7CisJCWlmIChwZnggJiYgaSA9PSBhbW91bnQgLSAxKQorCQkJZnB1dHMocGZ4LCBmcCk7CisJCXB1dGMoJ1x0JywgZnApOworCX0KK30KKworCisKKy8qCisgKiBEZWJ1Z2dpbmcgc3R1ZmYuCisgKi8KKworCitGSUxFICp0cmFjZWZpbGU7CisKKwordm9pZAordHJwdXRjKGludCBjKQoreworCWlmIChkZWJ1ZyAhPSAxKQorCQlyZXR1cm47CisJcHV0YyhjLCB0cmFjZWZpbGUpOworfQorCit2b2lkCit0cmFjZShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwkodm9pZCkgdmZwcmludGYodHJhY2VmaWxlLCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworfQorCit2b2lkCit0cmFjZXYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhKQoreworCWlmIChkZWJ1ZyAhPSAxKQorCQlyZXR1cm47CisJKHZvaWQpIHZmcHJpbnRmKHRyYWNlZmlsZSwgZm10LCB2YSk7Cit9CisKKwordm9pZAordHJwdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlmcHV0cyhzLCB0cmFjZWZpbGUpOworfQorCisKK3N0YXRpYyB2b2lkCit0cnN0cmluZyhjaGFyICpzKQoreworCWNoYXIgKnA7CisJY2hhciBjOworCisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlwdXRjKCciJywgdHJhY2VmaWxlKTsKKwlmb3IgKHAgPSBzIDsgKnAgOyBwKyspIHsKKwkJc3dpdGNoICgoc2lnbmVkIGNoYXIpKnApIHsKKwkJY2FzZSAnXG4nOiAgYyA9ICduJzsgIGdvdG8gYmFja3NsYXNoOworCQljYXNlICdcdCc6ICBjID0gJ3QnOyAgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1xyJzogIGMgPSAncic7ICBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnIic6ICBjID0gJyInOyAgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1xcJzogIGMgPSAnXFwnOyAgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMRVNDOiAgYyA9ICdlJzsgIGdvdG8gYmFja3NsYXNoOworCQljYXNlIENUTFZBUjogIGMgPSAndic7ICBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExWQVIrQ1RMUVVPVEU6ICBjID0gJ1YnOyAgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMQkFDS1E6ICBjID0gJ3EnOyAgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMQkFDS1ErQ1RMUVVPVEU6ICBjID0gJ1EnOyAgZ290byBiYWNrc2xhc2g7CitiYWNrc2xhc2g6CSAgcHV0YygnXFwnLCB0cmFjZWZpbGUpOworCQkJcHV0YyhjLCB0cmFjZWZpbGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoKnAgPj0gJyAnICYmICpwIDw9ICd+JykKKwkJCQlwdXRjKCpwLCB0cmFjZWZpbGUpOworCQkJZWxzZSB7CisJCQkJcHV0YygnXFwnLCB0cmFjZWZpbGUpOworCQkJCXB1dGMoKnAgPj4gNiAmIDAzLCB0cmFjZWZpbGUpOworCQkJCXB1dGMoKnAgPj4gMyAmIDA3LCB0cmFjZWZpbGUpOworCQkJCXB1dGMoKnAgJiAwNywgdHJhY2VmaWxlKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXB1dGMoJyInLCB0cmFjZWZpbGUpOworfQorCisKK3ZvaWQKK3RyYXJncyhjaGFyICoqYXApCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwl3aGlsZSAoKmFwKSB7CisJCXRyc3RyaW5nKCphcCsrKTsKKwkJaWYgKCphcCkKKwkJCXB1dGMoJyAnLCB0cmFjZWZpbGUpOworCQllbHNlCisJCQlwdXRjKCdcbicsIHRyYWNlZmlsZSk7CisJfQorfQorCisKK3ZvaWQKK29wZW50cmFjZSh2b2lkKQoreworCWNoYXIgc1sxMDBdOworI2lmZGVmIE9fQVBQRU5ECisJaW50IGZsYWdzOworI2VuZGlmCisKKwlpZiAoZGVidWcgIT0gMSkgeworCQlpZiAodHJhY2VmaWxlKQorCQkJZmZsdXNoKHRyYWNlZmlsZSk7CisJCS8qIGxlYXZlIG9wZW4gYmVjYXVzZSBsaWJlZGl0IG1pZ2h0IGJlIHVzaW5nIGl0ICovCisJCXJldHVybjsKKwl9CisjaWZkZWYgbm90X3RoaXNfd2F5CisJeworCQljaGFyICpwOworCQlpZiAoKHAgPSBnZXRlbnYoaG9tZXN0cikpID09IE5VTEwpIHsKKwkJCWlmIChnZXRldWlkKCkgPT0gMCkKKwkJCQlwID0gIi8iOworCQkJZWxzZQorCQkJCXAgPSAiL3RtcCI7CisJCX0KKwkJc2NvcHkocCwgcyk7CisJCXN0cmNhdChzLCAiL3RyYWNlIik7CisJfQorI2Vsc2UKKwlzY29weSgiLi90cmFjZSIsIHMpOworI2VuZGlmIC8qIG5vdF90aGlzX3dheSAqLworCWlmICh0cmFjZWZpbGUpIHsKKwkJaWYgKCFmcmVvcGVuKHMsICJhIiwgdHJhY2VmaWxlKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCByZS1vcGVuICVzXG4iLCBzKTsKKwkJCWRlYnVnID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgodHJhY2VmaWxlID0gZm9wZW4ocywgImEiKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuICVzXG4iLCBzKTsKKwkJCWRlYnVnID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNpZmRlZiBPX0FQUEVORAorCWlmICgoZmxhZ3MgPSBmY250bChmaWxlbm8odHJhY2VmaWxlKSwgRl9HRVRGTCwgMCkpID49IDApCisJCWZjbnRsKGZpbGVubyh0cmFjZWZpbGUpLCBGX1NFVEZMLCBmbGFncyB8IE9fQVBQRU5EKTsKKyNlbmRpZgorCXNldGxpbmVidWYodHJhY2VmaWxlKTsKKwlmcHV0cygiXG5UcmFjaW5nIHN0YXJ0ZWQuXG4iLCB0cmFjZWZpbGUpOworfQorI2VuZGlmIC8qIERFQlVHICovCmRpZmYgLS1naXQgYS91c3IvZGFzaC9zaG93LmggYi91c3IvZGFzaC9zaG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjY2FjNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL3Nob3cuaApAQCAtMCwwICsxLDQ1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NQorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXNob3cuaAkxLjEgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBERUJVRwordW5pb24gbm9kZTsKK3ZvaWQgc2hvd3RyZWUodW5pb24gbm9kZSAqKTsKK3ZvaWQgdHJhY2UoY29uc3QgY2hhciAqLCAuLi4pOwordm9pZCB0cmFjZXYoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK3ZvaWQgdHJhcmdzKGNoYXIgKiopOwordm9pZCB0cnB1dGMoaW50KTsKK3ZvaWQgdHJwdXRzKGNvbnN0IGNoYXIgKik7Cit2b2lkIG9wZW50cmFjZSh2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvc3lzdGVtLmMgYi91c3IvZGFzaC9zeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWJjZGRjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvc3lzdGVtLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSEFWRV9JU0FMUEhBCisjZGVmaW5lIGlzYWxudW0gX2lzYWxudW0KKyNkZWZpbmUgaXNjbnRybCBfaXNjbnRybAorI2RlZmluZSBpc2xvd2VyIF9pc2xvd2VyCisjZGVmaW5lIGlzc3BhY2UgX2lzc3BhY2UKKyNkZWZpbmUgaXNhbHBoYSBfaXNhbHBoYQorI2RlZmluZSBpc2RpZ2l0IF9pc2RpZ2l0CisjZGVmaW5lIGlzcHJpbnQgX2lzcHJpbnQKKyNkZWZpbmUgaXN1cHBlciBfaXN1cHBlcgorI2RlZmluZSBpc2JsYW5rIF9pc2JsYW5rCisjZGVmaW5lIGlzZ3JhcGggX2lzZ3JhcGgKKyNkZWZpbmUgaXNwdW5jdCBfaXNwdW5jdAorI2RlZmluZSBpc3hkaWdpdCBfaXN4ZGlnaXQKKyNpbmNsdWRlIDxjdHlwZS5oPgorI3VuZGVmIGlzYWxudW0KKyN1bmRlZiBpc2NudHJsCisjdW5kZWYgaXNsb3dlcgorI3VuZGVmIGlzc3BhY2UKKyN1bmRlZiBpc2FscGhhCisjdW5kZWYgaXNkaWdpdAorI3VuZGVmIGlzcHJpbnQKKyN1bmRlZiBpc3VwcGVyCisjdW5kZWYgaXNibGFuaworI3VuZGVmIGlzZ3JhcGgKKyN1bmRlZiBpc3B1bmN0CisjdW5kZWYgaXN4ZGlnaXQKKyNlbmRpZgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisjaWZuZGVmIEhBVkVfTUVNUENQWQordm9pZCAqbWVtcGNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCXJldHVybiBtZW1jcHkoZGVzdCwgc3JjLCBuKSArIG47Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUENQWQorY2hhciAqc3RwY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKHNyYyk7CisJZGVzdFtsZW5dID0gMDsKKwlyZXR1cm4gbWVtcGNweShkZXN0LCBzcmMsIGxlbik7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkNIUk5VTAorY2hhciAqc3RyY2hybnVsKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworCWNoYXIgKnAgPSBzdHJjaHIocywgYyk7CisJaWYgKCFwKQorCQlwID0gKGNoYXIgKilzICsgc3RybGVuKHMpOworCXJldHVybiBwOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKK2NoYXIgKnN0cnNpZ25hbChpbnQgc2lnKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxOV07CisKKwlpZiAoKHVuc2lnbmVkKXNpZyA8IE5TSUcgJiYgc3lzX3NpZ2xpc3Rbc2lnXSkKKwkJcmV0dXJuIChjaGFyICopc3lzX3NpZ2xpc3Rbc2lnXTsKKwlmbXRzdHIoYnVmLCBzaXplb2YoYnVmKSwgIlNpZ25hbCAlZCIsIHNpZyk7CisJcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQlNFQVJDSAordm9pZCAqYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwKKwkgICAgICBzaXplX3Qgc2l6ZSwgaW50ICgqY21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpCit7CisJd2hpbGUgKG5tZW1iKSB7CisJCXNpemVfdCBtaWRpZHggPSBubWVtYiAvIDI7CisJCWNvbnN0IHZvaWQgKm1pZG9iaiA9IGJhc2UgKyBtaWRpZHggKiBzaXplOworCQlpbnQgZGlmZiA9IGNtcChrZXksIG1pZG9iaik7CisKKwkJaWYgKGRpZmYgPT0gMCkKKwkJCXJldHVybiAodm9pZCAqKW1pZG9iajsKKworCQlpZiAoZGlmZiA+IDApIHsKKwkJCWJhc2UgPSBtaWRvYmogKyBzaXplOworCQkJbm1lbWIgLT0gbWlkaWR4ICsgMTsKKwkJfSBlbHNlCisJCQlubWVtYiA9IG1pZGlkeDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1lTQ09ORgorbG9uZyBzeXNjb25mKGludCBuYW1lKQoreworCXNoX2Vycm9yKCJubyBzeXNjb25mIGZvcjogJWQiLCBuYW1lKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSVNBTFBIQQoraW50IGlzYWxudW0oaW50IGMpIHsKKwlyZXR1cm4gX2lzYWxudW0oYyk7Cit9CisKKworaW50IGlzY250cmwoaW50IGMpIHsKKwlyZXR1cm4gX2lzY250cmwoYyk7Cit9CisKKworaW50IGlzbG93ZXIoaW50IGMpIHsKKwlyZXR1cm4gX2lzbG93ZXIoYyk7Cit9CisKKworaW50IGlzc3BhY2UoaW50IGMpIHsKKwlyZXR1cm4gX2lzc3BhY2UoYyk7Cit9CisKKworaW50IGlzYWxwaGEoaW50IGMpIHsKKwlyZXR1cm4gX2lzYWxwaGEoYyk7Cit9CisKKworaW50IGlzZGlnaXQoaW50IGMpIHsKKwlyZXR1cm4gX2lzZGlnaXQoYyk7Cit9CisKKworaW50IGlzcHJpbnQoaW50IGMpIHsKKwlyZXR1cm4gX2lzcHJpbnQoYyk7Cit9CisKKworaW50IGlzdXBwZXIoaW50IGMpIHsKKwlyZXR1cm4gX2lzdXBwZXIoYyk7Cit9CisKKworaW50IGlzYmxhbmsoaW50IGMpIHsKKwlyZXR1cm4gX2lzYmxhbmsoYyk7Cit9CisKKworaW50IGlzZ3JhcGgoaW50IGMpIHsKKwlyZXR1cm4gX2lzZ3JhcGgoYyk7Cit9CisKKworaW50IGlzcHVuY3QoaW50IGMpIHsKKwlyZXR1cm4gX2lzcHVuY3QoYyk7Cit9CisKKworaW50IGlzeGRpZ2l0KGludCBjKSB7CisJcmV0dXJuIF9pc3hkaWdpdChjKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvc3lzdGVtLmggYi91c3IvZGFzaC9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhlZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvc3lzdGVtLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNAorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZuZGVmIFNTSVpFX01BWAorI2RlZmluZSBTU0laRV9NQVggKChzc2l6ZV90KSgoc2l6ZV90KS0xID4+IDEpKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaWdjbGVhcm1hc2sodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NJR1NFVE1BU0sKKwlzaWdzZXRtYXNrKDApOworI2Vsc2UKKwlzaWdzZXRfdCBzZXQ7CisJc2lnZW1wdHlzZXQoJnNldCk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzZXQsIDApOworI2VuZGlmCit9CisKKyNpZm5kZWYgSEFWRV9NRU1QQ1BZCit2b2lkICptZW1wY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFBDUFkKK2NoYXIgKnN0cGNweShjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkNIUk5VTAorY2hhciAqc3RyY2hybnVsKGNvbnN0IGNoYXIgKiwgaW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSU0lHTkFMCitjaGFyICpzdHJzaWduYWwoaW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSVE9JTUFYCisjZGVmaW5lIHN0cnRvaW1heCBzdHJ0b2xsCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlRPVU1BWAorI2RlZmluZSBzdHJ0b3VtYXggc3RydG91bGwKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQlNFQVJDSAordm9pZCAqYnNlYXJjaChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsCisJICAgICAgaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9LSUxMUEcKK3N0YXRpYyBpbmxpbmUgaW50IGtpbGxwZyhwaWRfdCBwaWQsIGludCBzaWduYWwpCit7CisjaWZkZWYgREVCVUcKKwlpZiAocGlkIDwgMCkKKwkJYWJvcnQoKTsKKyNlbmRpZgorCXJldHVybiBraWxsKC1waWQsIHNpZ25hbCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NZU0NPTkYKKyNkZWZpbmUgX1NDX0NMS19UQ0sgMgorbG9uZyBzeXNjb25mKGludCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3RyYXAuYyBiL3Vzci9kYXNoL3RyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUxZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvdHJhcC5jCkBAIC0wLDAgKzEsNDQzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJub2Rlcy5oIgkvKiBmb3Igb3RoZXIgaGVhZGVycyAqLworI2luY2x1ZGUgImV2YWwuaCIKKyNpbmNsdWRlICJqb2JzLmgiCisjaW5jbHVkZSAic2hvdy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAidHJhcC5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisKKyNpZmRlZiBIRVRJTworI2luY2x1ZGUgImhldGlvLmgiCisjZW5kaWYKKworLyoKKyAqIFNpZ21vZGUgcmVjb3JkcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2lnbmFsIGhhbmRsZXJzIGZvciB0aGUgdmFyaW91cworICogbW9kZXMuICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhhdCB0aGUgY3VycmVudCBoYW5kbGVyIGlzIG5vdCBrbm93bi4KKyAqIFNfSEFSRF9JR04gaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ25hbCB3YXMgaWdub3JlZCBvbiBlbnRyeSB0byB0aGUgc2hlbGwsCisgKi8KKworI2RlZmluZSBTX0RGTCAxCQkJLyogZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcgKFNJR19ERkwpICovCisjZGVmaW5lIFNfQ0FUQ0ggMgkJLyogc2lnbmFsIGlzIGNhdWdodCAqLworI2RlZmluZSBTX0lHTiAzCQkJLyogc2lnbmFsIGlzIGlnbm9yZWQgKFNJR19JR04pICovCisjZGVmaW5lIFNfSEFSRF9JR04gNAkJLyogc2lnbmFsIGlzIGlnbm9yZWQgcGVybWVuYW50bHkgKi8KKyNkZWZpbmUgU19SRVNFVCA1CQkvKiB0ZW1wb3JhcnkgLSB0byByZXNldCBhIGhhcmQgaWdub3JlZCBzaWcgKi8KKworCisvKiB0cmFwIGhhbmRsZXIgY29tbWFuZHMgKi8KK2NoYXIgKnRyYXBbTlNJR107CisvKiBjdXJyZW50IHZhbHVlIG9mIHNpZ25hbCAqLworc3RhdGljIGNoYXIgc2lnbW9kZVtOU0lHIC0gMV07CisvKiBpbmRpY2F0ZXMgc3BlY2lmaWVkIHNpZ25hbCByZWNlaXZlZCAqLworY2hhciBnb3RzaWdbTlNJRyAtIDFdOworLyogbGFzdCBwZW5kaW5nIHNpZ25hbCAqLwordm9sYXRpbGUgc2lnX2F0b21pY190IHBlbmRpbmdzaWdzOworLyogZG8gd2UgZ2VuZXJhdGUgRVhTSUcgZXZlbnRzICovCitpbnQgZXhzaWc7CisKKyNpZmRlZiBta2luaXQKK0lOQ0xVREUgPHNpZ25hbC5oPgorSU5JVCB7CisJc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworfQorI2VuZGlmCisKKy8qCisgKiBUaGUgdHJhcCBidWlsdGluLgorICovCisKK2ludAordHJhcGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYWN0aW9uOworCWNoYXIgKiphcDsKKwlpbnQgc2lnbm87CisKKwluZXh0b3B0KG51bGxzdHIpOworCWFwID0gYXJncHRyOworCWlmICghKmFwKSB7CisJCWZvciAoc2lnbm8gPSAwIDsgc2lnbm8gPCBOU0lHIDsgc2lnbm8rKykgeworCQkJaWYgKHRyYXBbc2lnbm9dICE9IE5VTEwpIHsKKwkJCQlvdXQxZm10KAorCQkJCQkidHJhcCAtLSAlcyAlc1xuIiwKKwkJCQkJc2luZ2xlX3F1b3RlKHRyYXBbc2lnbm9dKSwKKwkJCQkJc2lnbmFsX25hbWUoc2lnbm8pCisJCQkJKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFhcFsxXSkKKwkJYWN0aW9uID0gTlVMTDsKKwllbHNlCisJCWFjdGlvbiA9ICphcCsrOworCXdoaWxlICgqYXApIHsKKwkJaWYgKChzaWdubyA9IGRlY29kZV9zaWduYWwoKmFwLCAwKSkgPCAwKQorCQkJc2hfZXJyb3IoIiVzOiBiYWQgdHJhcCIsICphcCk7CisJCUlOVE9GRjsKKwkJaWYgKGFjdGlvbikgeworCQkJaWYgKGFjdGlvblswXSA9PSAnLScgJiYgYWN0aW9uWzFdID09ICdcMCcpCisJCQkJYWN0aW9uID0gTlVMTDsKKwkJCWVsc2UKKwkJCQlhY3Rpb24gPSBzYXZlc3RyKGFjdGlvbik7CisJCX0KKwkJaWYgKHRyYXBbc2lnbm9dKQorCQkJY2tmcmVlKHRyYXBbc2lnbm9dKTsKKwkJdHJhcFtzaWdub10gPSBhY3Rpb247CisJCWlmIChzaWdubyAhPSAwKQorCQkJc2V0c2lnbmFsKHNpZ25vKTsKKwkJSU5UT047CisJCWFwKys7CisJfQorCXJldHVybiAwOworfQorCisKKworLyoKKyAqIENsZWFyIHRyYXBzIG9uIGEgZm9yay4KKyAqLworCit2b2lkCitjbGVhcl90cmFwcyh2b2lkKQoreworCWNoYXIgKip0cDsKKworCWZvciAodHAgPSB0cmFwIDsgdHAgPCAmdHJhcFtOU0lHXSA7IHRwKyspIHsKKwkJaWYgKCp0cCAmJiAqKnRwKSB7CS8qIHRyYXAgbm90IE5VTEwgb3IgU0lHX0lHTiAqLworCQkJSU5UT0ZGOworCQkJY2tmcmVlKCp0cCk7CisJCQkqdHAgPSBOVUxMOworCQkJaWYgKHRwICE9ICZ0cmFwWzBdKQorCQkJCXNldHNpZ25hbCh0cCAtIHRyYXApOworCQkJSU5UT047CisJCX0KKwl9Cit9CisKKworCisvKgorICogU2V0IHRoZSBzaWduYWwgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZCBzaWduYWwuICBUaGUgcm91dGluZSBmaWd1cmVzCisgKiBvdXQgd2hhdCBpdCBzaG91bGQgYmUgc2V0IHRvLgorICovCisKK3ZvaWQKK3NldHNpZ25hbChpbnQgc2lnbm8pCit7CisJaW50IGFjdGlvbjsKKwljaGFyICp0LCB0c2lnOworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCisJaWYgKCh0ID0gdHJhcFtzaWdub10pID09IE5VTEwpCisJCWFjdGlvbiA9IFNfREZMOworCWVsc2UgaWYgKCp0ICE9ICdcMCcpCisJCWFjdGlvbiA9IFNfQ0FUQ0g7CisJZWxzZQorCQlhY3Rpb24gPSBTX0lHTjsKKwlpZiAocm9vdHNoZWxsICYmIGFjdGlvbiA9PSBTX0RGTCkgeworCQlzd2l0Y2ggKHNpZ25vKSB7CisJCWNhc2UgU0lHSU5UOgorCQkJaWYgKGlmbGFnIHx8IG1pbnVzYyB8fCBzZmxhZyA9PSAwKQorCQkJCWFjdGlvbiA9IFNfQ0FUQ0g7CisJCQlicmVhazsKKwkJY2FzZSBTSUdRVUlUOgorI2lmZGVmIERFQlVHCisJCQlpZiAoZGVidWcpCisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgU0lHVEVSTToKKwkJCWlmIChpZmxhZykKKwkJCQlhY3Rpb24gPSBTX0lHTjsKKwkJCWJyZWFrOworI2lmIEpPQlMKKwkJY2FzZSBTSUdUU1RQOgorCQljYXNlIFNJR1RUT1U6CisJCQlpZiAobWZsYWcpCisJCQkJYWN0aW9uID0gU19JR047CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJfQorCisJdCA9ICZzaWdtb2RlW3NpZ25vIC0gMV07CisJdHNpZyA9ICp0OworCWlmICh0c2lnID09IDApIHsKKwkJLyoKKwkJICogY3VycmVudCBzZXR0aW5nIHVua25vd24KKwkJICovCisJCWlmIChzaWdhY3Rpb24oc2lnbm8sIDAsICZhY3QpID09IC0xKSB7CisJCQkvKgorCQkJICogUHJldGVuZCBpdCB3b3JrZWQ7IG1heWJlIHdlIHNob3VsZCBnaXZlIGEgd2FybmluZworCQkJICogaGVyZSwgYnV0IG90aGVyIHNoZWxscyBkb24ndC4gV2UgZG9uJ3QgYWx0ZXIKKwkJCSAqIHNpZ21vZGUsIHNvIHRoYXQgd2UgcmV0cnkgZXZlcnkgdGltZS4KKwkJCSAqLworCQkJcmV0dXJuOworCQl9CisJCWlmIChhY3Quc2FfaGFuZGxlciA9PSBTSUdfSUdOKSB7CisJCQlpZiAobWZsYWcgJiYgKHNpZ25vID09IFNJR1RTVFAgfHwKKwkJCSAgICAgc2lnbm8gPT0gU0lHVFRJTiB8fCBzaWdubyA9PSBTSUdUVE9VKSkgeworCQkJCXRzaWcgPSBTX0lHTjsJLyogZG9uJ3QgaGFyZCBpZ25vcmUgdGhlc2UgKi8KKwkJCX0gZWxzZQorCQkJCXRzaWcgPSBTX0hBUkRfSUdOOworCQl9IGVsc2UgeworCQkJdHNpZyA9IFNfUkVTRVQ7CS8qIGZvcmNlIHRvIGJlIHNldCAqLworCQl9CisJfQorCWlmICh0c2lnID09IFNfSEFSRF9JR04gfHwgdHNpZyA9PSBhY3Rpb24pCisJCXJldHVybjsKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgU19DQVRDSDoKKwkJYWN0LnNhX2hhbmRsZXIgPSBvbnNpZzsKKwkJYnJlYWs7CisJY2FzZSBTX0lHTjoKKwkJYWN0LnNhX2hhbmRsZXIgPSBTSUdfSUdOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhY3Quc2FfaGFuZGxlciA9IFNJR19ERkw7CisJfQorCSp0ID0gYWN0aW9uOworCWFjdC5zYV9mbGFncyA9IDA7CisJc2lnZmlsbHNldCgmYWN0LnNhX21hc2spOworCXNpZ2FjdGlvbihzaWdubywgJmFjdCwgMCk7Cit9CisKKy8qCisgKiBJZ25vcmUgYSBzaWduYWwuCisgKi8KKwordm9pZAoraWdub3Jlc2lnKGludCBzaWdubykKK3sKKwlpZiAoc2lnbW9kZVtzaWdubyAtIDFdICE9IFNfSUdOICYmIHNpZ21vZGVbc2lnbm8gLSAxXSAhPSBTX0hBUkRfSUdOKSB7CisJCXNpZ25hbChzaWdubywgU0lHX0lHTik7CisJfQorCXNpZ21vZGVbc2lnbm8gLSAxXSA9IFNfSEFSRF9JR047Cit9CisKKworCisvKgorICogU2lnbmFsIGhhbmRsZXIuCisgKi8KKwordm9pZAorb25zaWcoaW50IHNpZ25vKQoreworCWdvdHNpZ1tzaWdubyAtIDFdID0gMTsKKwlwZW5kaW5nc2lncyA9IHNpZ25vOworCisJaWYgKGV4c2lnIHx8IChzaWdubyA9PSBTSUdJTlQgJiYgIXRyYXBbU0lHSU5UXSkpIHsKKwkJaWYgKCFzdXBwcmVzc2ludCkKKwkJCW9uaW50KCk7CisJCWludHBlbmRpbmcgPSAxOworCX0KK30KKworCisKKy8qCisgKiBDYWxsZWQgdG8gZXhlY3V0ZSBhIHRyYXAuICBQZXJoYXBzIHdlIHNob3VsZCBhdm9pZCBlbnRlcmluZyBuZXcgdHJhcAorICogaGFuZGxlcnMgd2hpbGUgd2UgYXJlIGV4ZWN1dGluZyBhIHRyYXAgaGFuZGxlci4KKyAqLworCitpbnQKK2RvdHJhcCh2b2lkKQoreworCWNoYXIgKnA7CisJY2hhciAqcTsKKwlpbnQgaTsKKwlpbnQgc2F2ZXN0YXR1czsKKwlpbnQgc2tpcCA9IDA7CisKKwlzYXZlc3RhdHVzID0gZXhpdHN0YXR1czsKKwlwZW5kaW5nc2lncyA9IDA7CisJYmFycmllcigpOworCisJZm9yIChpID0gMCwgcSA9IGdvdHNpZzsgaSA8IE5TSUcgLSAxOyBpKyssIHErKykgeworCQlpZiAoISpxKQorCQkJY29udGludWU7CisJCSpxID0gMDsKKworCQlwID0gdHJhcFtpICsgMV07CisJCWlmICghcCkKKwkJCWNvbnRpbnVlOworCQlza2lwID0gZXZhbHN0cmluZyhwLCBTS0lQRVZBTCk7CisJCWV4aXRzdGF0dXMgPSBzYXZlc3RhdHVzOworCQlpZiAoc2tpcCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBza2lwOworfQorCisKKworLyoKKyAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHNoZWxsIGlzIGludGVyYWN0aXZlIG9yIG5vdC4KKyAqLworCisKK3ZvaWQKK3NldGludGVyYWN0aXZlKGludCBvbikKK3sKKwlzdGF0aWMgaW50IGlzX2ludGVyYWN0aXZlOworCisJaWYgKCsrb24gPT0gaXNfaW50ZXJhY3RpdmUpCisJCXJldHVybjsKKwlpc19pbnRlcmFjdGl2ZSA9IG9uOworCXNldHNpZ25hbChTSUdJTlQpOworCXNldHNpZ25hbChTSUdRVUlUKTsKKwlzZXRzaWduYWwoU0lHVEVSTSk7Cit9CisKKworCisvKgorICogQ2FsbGVkIHRvIGV4aXQgdGhlIHNoZWxsLgorICovCisKK3ZvaWQKK2V4aXRzaGVsbCh2b2lkKQoreworCXN0cnVjdCBqbXBsb2MgbG9jOworCWNoYXIgKnA7CisJaW50IHN0YXR1czsKKworI2lmZGVmIEhFVElPCisJaGV0aW9fcmVzZXRfdGVybSgpOworI2VuZGlmCisJc3RhdHVzID0gZXhpdHN0YXR1czsKKwlUUkFDRSgoInBpZCAlZCwgZXhpdHNoZWxsKCVkKVxuIiwgZ2V0cGlkKCksIHN0YXR1cykpOworCWlmIChzZXRqbXAobG9jLmxvYykpIHsKKwkJaWYgKGV4Y2VwdGlvbiA9PSBFWEVYSVQpCisJCQlfZXhpdChleGl0c3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCWhhbmRsZXIgPSAmbG9jOworCWlmICgocCA9IHRyYXBbMF0pKSB7CisJCXRyYXBbMF0gPSBOVUxMOworCQlldmFsc3RyaW5nKHAsIDApOworCX0KKwlmbHVzaGFsbCgpOworb3V0OgorCV9leGl0KHN0YXR1cyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogRGVjb2RlIGEgc2lnbmFsIG5hbWUKKyAqLworaW50IGRlY29kZV9zaWduYWwoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgbWluc2lnKQoreworCWludCBpOworCisJaWYgKGlzX251bWJlcihzdHJpbmcpKSB7CisJCWkgPSBhdG9pKHN0cmluZyk7CisJCWlmIChpID49IE5TSUcpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gaTsKKwl9CisKKwlmb3IgKCBpID0gbWluc2lnIDsgaSA8IE5TSUcgOyBpKysgKSB7CisJCWlmICggc3lzX3NpZ2FiYnJldltpXSAmJgorCQkgICAgICFzdHJjYXNlY21wKHN0cmluZywgc3lzX3NpZ2FiYnJldltpXSkgKQorCQkJcmV0dXJuIGk7CisJfQorCisjaWZkZWYgU0lHUlRNSU4KKwlpZiAoICFzdHJuY2FzZWNtcChzdHJpbmcsICJSVE1JTiIsIDUpICkgeworCQljaGFyICplcDsKKworCQlpZiAoIHN0cmluZ1s1XSAmJiBzdHJpbmdbNV0gIT0gJysnICkKKwkJCXJldHVybiAtMTsKKwkJaSA9IFNJR1JUTUlOICsgc3RydG9sKHN0cmluZys1LCAmZXAsIDEwKTsKKwkJaWYgKCAqZXAgfHwgaSA8IFNJR1JUTUlOIHx8IGkgPiBTSUdSVE1BWCApCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiBpOworCX0KKworCWlmICggIXN0cm5jYXNlY21wKHN0cmluZywgIlJUTUFYIiwgNSkgKSB7CisJCWNoYXIgKmVwOworCisJCWlmICggc3RyaW5nWzVdICYmIHN0cmluZ1s1XSAhPSAnLScgKQorCQkJcmV0dXJuIC0xOworCQlpID0gU0lHUlRNQVggKyBzdHJ0b2woc3RyaW5nKzUsICZlcCwgMTApOworCQlpZiAoICplcCB8fCBpIDwgU0lHUlRNSU4gfHwgaSA+IFNJR1JUTUFYICkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIGk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBIdW1hbi1yZWFkYWJsZSBzaWduYWwgbmFtZQorICovCitjb25zdCBjaGFyICoKK3NpZ25hbF9uYW1lKGludCBzaWcpCit7CisJc3RhdGljIGNoYXIgYnVmWzY0XTsKKworCWlmICggc2lnIDwgMCB8fCBzaWcgPj0gTlNJRyApIHsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICggc3lzX3NpZ2FiYnJldltzaWddICkgeworCQlyZXR1cm4gc3lzX3NpZ2FiYnJldltzaWddOworI2lmZGVmIFNJR1JUTUlOCisJfSBlbHNlIGlmICggc2lnID49IFNJR1JUTUlOICYmIHNpZyA8PSBTSUdSVE1BWCApIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiUlRNSU4rJWQiLCBzaWctU0lHUlRNSU4pOworCQlyZXR1cm4gYnVmOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJWQiLCBzaWcpOworCQlyZXR1cm4gYnVmOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3RyYXAuaCBiL3Vzci9kYXNoL3RyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVkZTVkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvdHJhcC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdHJhcC5oCTguMyAoQmVya2VsZXkpIDYvNS85NQorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworZXh0ZXJuIGNoYXIgKnRyYXBbXTsKK2V4dGVybiBjaGFyIGdvdHNpZ1tdOworZXh0ZXJuIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBwZW5kaW5nc2lnczsKKworaW50IHRyYXBjbWQoaW50LCBjaGFyICoqKTsKK3ZvaWQgY2xlYXJfdHJhcHModm9pZCk7Cit2b2lkIHNldHNpZ25hbChpbnQpOwordm9pZCBpZ25vcmVzaWcoaW50KTsKK3ZvaWQgb25zaWcoaW50KTsKK2ludCBkb3RyYXAodm9pZCk7Cit2b2lkIHNldGludGVyYWN0aXZlKGludCk7Cit2b2lkIGV4aXRzaGVsbCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKK2ludCBkZWNvZGVfc2lnbmFsKGNvbnN0IGNoYXIgKiwgaW50KTsKK2NvbnN0IGNoYXIgKnNpZ25hbF9uYW1lKGludCk7CmRpZmYgLS1naXQgYS91c3IvZGFzaC92YXIuYyBiL3Vzci9kYXNoL3Zhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjNkYzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC92YXIuYwpAQCAtMCwwICsxLDY3NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorCisvKgorICogU2hlbGwgdmFyaWFibGVzLgorICovCisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgImV4cGFuZC5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCS8qIGZvciBvdGhlciBoZWFkZXJzICovCisjaW5jbHVkZSAiZXZhbC5oIgkvKiBkZWZpbmVzIGNtZGVudmlyb24gKi8KKyNpbmNsdWRlICJleGVjLmgiCisjaW5jbHVkZSAic3ludGF4LmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgIm1haWwuaCIKKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaWZuZGVmIFNNQUxMCisjaW5jbHVkZSAibXloaXN0ZWRpdC5oIgorI2VuZGlmCisjaW5jbHVkZSAic3lzdGVtLmgiCisKKworI2RlZmluZSBWVEFCU0laRSAzOQorCisKK3N0cnVjdCBsb2NhbHZhciAqbG9jYWx2YXJzOworCitjb25zdCBjaGFyIGRlZnBhdGh2YXJbXSA9CisJIlBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIjsKKyNpZmRlZiBJRlNfQlJPS0VOCitjb25zdCBjaGFyIGRlZmlmc3ZhcltdID0gIklGUz0gXHRcbiI7CisjZWxzZQorY29uc3QgY2hhciBkZWZpZnNbXSA9ICIgXHRcbiI7CisjZW5kaWYKKworc3RydWN0IHZhciB2YXJpbml0W10gPSB7CisjaWYgQVRUWQorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VULAkiQVRUWVwwIiwJMCB9LAorI2VuZGlmCisjaWZkZWYgSUZTX0JST0tFTgorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUQsCQlkZWZpZnN2YXIsCTAgfSwKKyNlbHNlCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsCSJJRlNcMCIsCTAgfSwKKyNlbmRpZgorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VULAkiTUFJTFwwIiwJY2hhbmdlbWFpbCB9LAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VULAkiTUFJTFBBVEhcMCIsCWNoYW5nZW1haWwgfSwKKwl7IDAsCVZTVFJGSVhFRHxWVEVYVEZJWEVELAkJZGVmcGF0aHZhciwJY2hhbmdlcGF0aCB9LAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUQsCQkiUFMxPSQgIiwJMCB9LAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUQsCQkiUFMyPT4gIiwJMCB9LAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUQsCQkiUFM0PSsgIiwJMCB9LAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUQsCQkiT1BUSU5EPTEiLAlnZXRvcHRzcmVzZXQgfSwKKyNpZm5kZWYgU01BTEwKKwl7IDAsCVZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwJIlRFUk1cMCIsCTAgfSwKKwl7IDAsCVZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwJIkhJU1RTSVpFXDAiLAlzZXRoaXN0c2l6ZSB9LAorI2VuZGlmCit9OworCitTVEFUSUMgc3RydWN0IHZhciAqdmFydGFiW1ZUQUJTSVpFXTsKKworU1RBVElDIHZvaWQgbWtsb2NhbChjaGFyICopOworU1RBVElDIHN0cnVjdCB2YXIgKipoYXNodmFyKGNvbnN0IGNoYXIgKik7CitTVEFUSUMgaW50IHZwY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK1NUQVRJQyBzdHJ1Y3QgdmFyICoqZmluZHZhcihzdHJ1Y3QgdmFyICoqLCBjb25zdCBjaGFyICopOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgdmFyYWJsZSBzeW1ib2wgdGFibGVzIGFuZCBpbXBvcnQgdGhlIGVudmlyb25tZW50CisgKi8KKworI2lmZGVmIG1raW5pdAorSU5DTFVERSA8dW5pc3RkLmg+CitJTkNMVURFIDxzeXMvdHlwZXMuaD4KK0lOQ0xVREUgPHN5cy9zdGF0Lmg+CitJTkNMVURFICJjZC5oIgorSU5DTFVERSAib3V0cHV0LmgiCitJTkNMVURFICJ2YXIuaCIKK01LSU5JVCBjaGFyICoqZW52aXJvbjsKK0lOSVQgeworCWNoYXIgKiplbnZwOworCXN0YXRpYyBjaGFyIHBwaWRbMzJdID0gIlBQSUQ9IjsKKwljb25zdCBjaGFyICpwOworCXN0cnVjdCBzdGF0IHN0MSwgc3QyOworCisJaW5pdHZhcigpOworCWZvciAoZW52cCA9IGVudmlyb24gOyAqZW52cCA7IGVudnArKykgeworCQlpZiAoc3RyY2hyKCplbnZwLCAnPScpKSB7CisJCQlzZXR2YXJlcSgqZW52cCwgVkVYUE9SVHxWVEVYVEZJWEVEKTsKKwkJfQorCX0KKworCWZtdHN0cihwcGlkICsgNSwgc2l6ZW9mKHBwaWQpIC0gNSwgIiVsZCIsIChsb25nKSBnZXRwcGlkKCkpOworCXNldHZhcmVxKHBwaWQsIFZURVhURklYRUQpOworCisJcCA9IGxvb2t1cHZhcigiUFdEIik7CisJaWYgKHApCisJCWlmICgqcCAhPSAnLycgfHwgc3RhdChwLCAmc3QxKSB8fCBzdGF0KCIuIiwgJnN0MikgfHwKKwkJICAgIHN0MS5zdF9kZXYgIT0gc3QyLnN0X2RldiB8fCBzdDEuc3RfaW5vICE9IHN0Mi5zdF9pbm8pCisJCQlwID0gMDsKKwlzZXRwd2QocCwgMCk7Cit9CisjZW5kaWYKKworCisvKgorICogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBidWlsdGluIHZhcmlhYmxlcy4gIEl0IGlzIGNhbGxlZCB3aGVuIHRoZQorICogc2hlbGwgaXMgaW5pdGlhbGl6ZWQuCisgKi8KKwordm9pZAoraW5pdHZhcih2b2lkKQoreworCXN0cnVjdCB2YXIgKnZwOworCXN0cnVjdCB2YXIgKmVuZDsKKwlzdHJ1Y3QgdmFyICoqdnBwOworCisJdnAgPSB2YXJpbml0OworCWVuZCA9IHZwICsgc2l6ZW9mKHZhcmluaXQpIC8gc2l6ZW9mKHZhcmluaXRbMF0pOworCWRvIHsKKwkJdnBwID0gaGFzaHZhcih2cC0+dGV4dCk7CisJCXZwLT5uZXh0ID0gKnZwcDsKKwkJKnZwcCA9IHZwOworCX0gd2hpbGUgKCsrdnAgPCBlbmQpOworCS8qCisJICogUFMxIGRlcGVuZHMgb24gdWlkCisJICovCisJaWYgKCFnZXRldWlkKCkpCisJCXZwczEudGV4dCA9ICJQUzE9IyAiOworfQorCisvKgorICogU2FmZSB2ZXJzaW9uIG9mIHNldHZhciwgcmV0dXJucyAxIG9uIHN1Y2Nlc3MgMCBvbiBmYWlsdXJlLgorICovCisKK2ludAorc2V0dmFyc2FmZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwsIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCXZvbGF0aWxlIGludCBzYXZlaW50OworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyID0gaGFuZGxlcjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKworCVNBVkVJTlQoc2F2ZWludCk7CisJaWYgKHNldGptcChqbXBsb2MubG9jKSkKKwkJZXJyID0gMTsKKwllbHNlIHsKKwkJaGFuZGxlciA9ICZqbXBsb2M7CisJCXNldHZhcihuYW1lLCB2YWwsIGZsYWdzKTsKKwkJZXJyID0gMDsKKwl9CisJaGFuZGxlciA9IHNhdmVoYW5kbGVyOworCVJFU1RPUkVJTlQoc2F2ZWludCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4gIFRoZSBmbGFncyBhcmd1bWVudCBpcyBvcmVkIHdpdGggdGhlCisgKiBmbGFncyBvZiB0aGUgdmFyaWFibGUuICBJZiB2YWwgaXMgTlVMTCwgdGhlIHZhcmlhYmxlIGlzIHVuc2V0LgorICovCisKK3ZvaWQKK3NldHZhcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwsIGludCBmbGFncykKK3sKKwljaGFyICpwLCAqcTsKKwlzaXplX3QgbmFtZWxlbjsKKwljaGFyICpuYW1lZXE7CisJc2l6ZV90IHZhbGxlbjsKKworCXEgPSBlbmRvZm5hbWUobmFtZSk7CisJcCA9IHN0cmNocm51bChxLCAnPScpOworCW5hbWVsZW4gPSBwIC0gbmFtZTsKKwlpZiAoIW5hbWVsZW4gfHwgcCAhPSBxKQorCQlzaF9lcnJvcigiJS4qczogYmFkIHZhcmlhYmxlIG5hbWUiLCBuYW1lbGVuLCBuYW1lKTsKKwl2YWxsZW4gPSAwOworCWlmICh2YWwgPT0gTlVMTCkgeworCQlmbGFncyB8PSBWVU5TRVQ7CisJfSBlbHNlIHsKKwkJdmFsbGVuID0gc3RybGVuKHZhbCk7CisJfQorCUlOVE9GRjsKKwlwID0gbWVtcGNweShuYW1lZXEgPSBja21hbGxvYyhuYW1lbGVuICsgdmFsbGVuICsgMiksIG5hbWUsIG5hbWVsZW4pOworCWlmICh2YWwpIHsKKwkJKnArKyA9ICc9JzsKKwkJcCA9IG1lbXBjcHkocCwgdmFsLCB2YWxsZW4pOworCX0KKwkqcCA9ICdcMCc7CisJc2V0dmFyZXEobmFtZWVxLCBmbGFncyB8IFZOT1NBVkUpOworCUlOVE9OOworfQorCisKKworLyoKKyAqIFNhbWUgYXMgc2V0dmFyIGV4Y2VwdCB0aGF0IHRoZSB2YXJpYWJsZSBhbmQgdmFsdWUgYXJlIHBhc3NlZCBpbgorICogdGhlIGZpcnN0IGFyZ3VtZW50IGFzIG5hbWU9dmFsdWUuICBTaW5jZSB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbAorICogYmUgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSB0YWJsZSwgaXQgc2hvdWxkIG5vdCBiZSBhIHN0cmluZyB0aGF0CisgKiB3aWxsIGdvIGF3YXkuCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworCit2b2lkCitzZXR2YXJlcShjaGFyICpzLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHZhciAqdnAsICoqdnBwOworCisJdnBwID0gaGFzaHZhcihzKTsKKwlmbGFncyB8PSAoVkVYUE9SVCAmICgoKHVuc2lnbmVkKSAoMSAtIGFmbGFnKSkgLSAxKSk7CisJdnAgPSAqZmluZHZhcih2cHAsIHMpOworCWlmICh2cCkgeworCQlpZiAodnAtPmZsYWdzICYgVlJFQURPTkxZKSB7CisJCQljb25zdCBjaGFyICpuOworCisJCQlpZiAoZmxhZ3MgJiBWTk9TQVZFKQorCQkJCWZyZWUocyk7CisJCQluID0gdnAtPnRleHQ7CisJCQlzaF9lcnJvcigiJS4qczogaXMgcmVhZCBvbmx5Iiwgc3RyY2hybnVsKG4sICc9JykgLSBuLAorCQkJCSBuKTsKKwkJfQorCisJCWlmIChmbGFncyAmIFZOT1NFVCkKKwkJCXJldHVybjsKKworCQlpZiAodnAtPmZ1bmMgJiYgKGZsYWdzICYgVk5PRlVOQykgPT0gMCkKKwkJCSgqdnAtPmZ1bmMpKHN0cmNocm51bChzLCAnPScpICsgMSk7CisKKwkJaWYgKCh2cC0+ZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0spKSA9PSAwKQorCQkJY2tmcmVlKHZwLT50ZXh0KTsKKworCQlmbGFncyB8PSB2cC0+ZmxhZ3MgJiB+KFZURVhURklYRUR8VlNUQUNLfFZOT1NBVkV8VlVOU0VUKTsKKwl9IGVsc2UgeworCQlpZiAoZmxhZ3MgJiBWTk9TRVQpCisJCQlyZXR1cm47CisJCS8qIG5vdCBmb3VuZCAqLworCQl2cCA9IGNrbWFsbG9jKHNpemVvZiAoKnZwKSk7CisJCXZwLT5uZXh0ID0gKnZwcDsKKwkJdnAtPmZ1bmMgPSBOVUxMOworCQkqdnBwID0gdnA7CisJfQorCWlmICghKGZsYWdzICYgKFZURVhURklYRUR8VlNUQUNLfFZOT1NBVkUpKSkKKwkJcyA9IHNhdmVzdHIocyk7CisJdnAtPnRleHQgPSBzOworCXZwLT5mbGFncyA9IGZsYWdzOworfQorCisKKworLyoKKyAqIFByb2Nlc3MgYSBsaW5rZWQgbGlzdCBvZiB2YXJpYWJsZSBhc3NpZ25tZW50cy4KKyAqLworCit2b2lkCitsaXN0c2V0dmFyKHN0cnVjdCBzdHJsaXN0ICpsaXN0LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHN0cmxpc3QgKmxwOworCisJbHAgPSBsaXN0OworCWlmICghbHApCisJCXJldHVybjsKKwlJTlRPRkY7CisJZG8geworCQlzZXR2YXJlcShscC0+dGV4dCwgZmxhZ3MpOworCX0gd2hpbGUgKChscCA9IGxwLT5uZXh0KSk7CisJSU5UT047Cit9CisKKworLyoKKyAqIEZpbmQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuICBSZXR1cm5zIE5VTEwgaWYgbm90IHNldC4KKyAqLworCitjaGFyICoKK2xvb2t1cHZhcihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB2YXIgKnY7CisKKwlpZiAoKHYgPSAqZmluZHZhcihoYXNodmFyKG5hbWUpLCBuYW1lKSkgJiYgISh2LT5mbGFncyAmIFZVTlNFVCkpIHsKKwkJcmV0dXJuIHN0cmNocm51bCh2LT50ZXh0LCAnPScpICsgMTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworCisvKgorICogU2VhcmNoIHRoZSBlbnZpcm9ubWVudCBvZiBhIGJ1aWx0aW4gY29tbWFuZC4KKyAqLworCitjaGFyICoKK2JsdGlubG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCisJZm9yIChzcCA9IGNtZGVudmlyb24gOyBzcCA7IHNwID0gc3AtPm5leHQpIHsKKwkJaWYgKHZhcmVxdWFsKHNwLT50ZXh0LCBuYW1lKSkKKwkJCXJldHVybiBzdHJjaHJudWwoc3AtPnRleHQsICc9JykgKyAxOworCX0KKwlyZXR1cm4gbG9va3VwdmFyKG5hbWUpOworfQorCisKKworLyoKKyAqIEdlbmVyYXRlIGEgbGlzdCBvZiB2YXJpYWJsZXMgc2F0aXNmeWluZyB0aGUgZ2l2ZW4gY29uZGl0aW9ucy4KKyAqLworCitjaGFyICoqCitsaXN0dmFycyhpbnQgb24sIGludCBvZmYsIGNoYXIgKioqZW5kKQoreworCXN0cnVjdCB2YXIgKip2cHA7CisJc3RydWN0IHZhciAqdnA7CisJY2hhciAqKmVwOworCWludCBtYXNrOworCisJU1RBUlRTVEFDS1NUUihlcCk7CisJdnBwID0gdmFydGFiOworCW1hc2sgPSBvbiB8IG9mZjsKKwlkbyB7CisJCWZvciAodnAgPSAqdnBwIDsgdnAgOyB2cCA9IHZwLT5uZXh0KQorCQkJaWYgKCh2cC0+ZmxhZ3MgJiBtYXNrKSA9PSBvbikgeworCQkJCWlmIChlcCA9PSBzdGFja3N0cmVuZCgpKQorCQkJCQllcCA9IGdyb3dzdGFja3N0cigpOworCQkJCSplcCsrID0gKGNoYXIgKikgdnAtPnRleHQ7CisJCQl9CisJfSB3aGlsZSAoKyt2cHAgPCB2YXJ0YWIgKyBWVEFCU0laRSk7CisJaWYgKGVwID09IHN0YWNrc3RyZW5kKCkpCisJCWVwID0gZ3Jvd3N0YWNrc3RyKCk7CisJaWYgKGVuZCkKKwkJKmVuZCA9IGVwOworCSplcCsrID0gTlVMTDsKKwlyZXR1cm4gZ3JhYnN0YWNrc3RyKGVwKTsKK30KKworCisKKy8qCisgKiBQT1NJWCByZXF1aXJlcyB0aGF0ICdzZXQnIChidXQgbm90IGV4cG9ydCBvciByZWFkb25seSkgb3V0cHV0IHRoZQorICogdmFyaWFibGVzIGluIGxleGljb2dyYXBoaWMgb3JkZXIgLSBieSB0aGUgbG9jYWxlJ3MgY29sbGF0aW5nIG9yZGVyIChzaWdoKS4KKyAqIE1heWJlIHdlIGNvdWxkIGtlZXAgdGhlbSBpbiBhbiBvcmRlcmVkIGJhbGFuY2VkIGJpbmFyeSB0cmVlCisgKiBpbnN0ZWFkIG9mIGhhc2hlZCBsaXN0cy4KKyAqIEZvciBub3cganVzdCByb2xsICdlbSB0aHJvdWdoIHFzb3J0IGZvciBwcmludGluZy4uLgorICovCisKK2ludAorc2hvd3ZhcnMoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgb24sIGludCBvZmYpCit7CisJY29uc3QgY2hhciAqc2VwOworCWNoYXIgKiplcCwgKiplcGVuZDsKKworCWVwID0gbGlzdHZhcnMob24sIG9mZiwgJmVwZW5kKTsKKwlxc29ydChlcCwgZXBlbmQgLSBlcCwgc2l6ZW9mKGNoYXIgKiksIHZwY21wKTsKKworCXNlcCA9ICpwcmVmaXggPyBzcGNzdHIgOiBwcmVmaXg7CisKKwlmb3IgKDsgZXAgPCBlcGVuZDsgZXArKykgeworCQljb25zdCBjaGFyICpwOworCQljb25zdCBjaGFyICpxOworCisJCXAgPSBzdHJjaHJudWwoKmVwLCAnPScpOworCQlxID0gbnVsbHN0cjsKKwkJaWYgKCpwKQorCQkJcSA9IHNpbmdsZV9xdW90ZSgrK3ApOworCisJCW91dDFmbXQoIiVzJXMlLipzJXNcbiIsIHByZWZpeCwgc2VwLCAoaW50KShwIC0gKmVwKSwgKmVwLCBxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBUaGUgZXhwb3J0IGFuZCByZWFkb25seSBjb21tYW5kcy4KKyAqLworCitpbnQKK2V4cG9ydGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHZhciAqdnA7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpwOworCWNoYXIgKiphcHRyOworCWludCBmbGFnID0gYXJndlswXVswXSA9PSAncic/IFZSRUFET05MWSA6IFZFWFBPUlQ7CisJaW50IG5vdHA7CisKKwlub3RwID0gbmV4dG9wdCgicCIpIC0gJ3AnOworCWlmIChub3RwICYmICgobmFtZSA9ICooYXB0ciA9IGFyZ3B0cikpKSkgeworCQlkbyB7CisJCQlpZiAoKHAgPSBzdHJjaHIobmFtZSwgJz0nKSkgIT0gTlVMTCkgeworCQkJCXArKzsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh2cCA9ICpmaW5kdmFyKGhhc2h2YXIobmFtZSksIG5hbWUpKSkgeworCQkJCQl2cC0+ZmxhZ3MgfD0gZmxhZzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJc2V0dmFyKG5hbWUsIHAsIGZsYWcpOworCQl9IHdoaWxlICgobmFtZSA9ICorK2FwdHIpICE9IE5VTEwpOworCX0gZWxzZSB7CisJCXNob3d2YXJzKGFyZ3ZbMF0sIGZsYWcsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVGhlICJsb2NhbCIgY29tbWFuZC4KKyAqLworCitpbnQKK2xvY2FsY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpuYW1lOworCisJYXJndiA9IGFyZ3B0cjsKKwl3aGlsZSAoKG5hbWUgPSAqYXJndisrKSAhPSBOVUxMKSB7CisJCW1rbG9jYWwobmFtZSk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBNYWtlIGEgdmFyaWFibGUgYSBsb2NhbCB2YXJpYWJsZS4gIFdoZW4gYSB2YXJpYWJsZSBpcyBtYWRlIGxvY2FsLCBpdCdzCisgKiB2YWx1ZSBhbmQgZmxhZ3MgYXJlIHNhdmVkIGluIGEgbG9jYWx2YXIgc3RydWN0dXJlLiAgVGhlIHNhdmVkIHZhbHVlcworICogd2lsbCBiZSByZXN0b3JlZCB3aGVuIHRoZSBzaGVsbCBmdW5jdGlvbiByZXR1cm5zLiAgV2UgaGFuZGxlIHRoZSBuYW1lCisgKiAiLSIgYXMgYSBzcGVjaWFsIGNhc2UuCisgKi8KKworU1RBVElDIHZvaWQKK21rbG9jYWwoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbG9jYWx2YXIgKmx2cDsKKwlzdHJ1Y3QgdmFyICoqdnBwOworCXN0cnVjdCB2YXIgKnZwOworCisJSU5UT0ZGOworCWx2cCA9IGNrbWFsbG9jKHNpemVvZiAoc3RydWN0IGxvY2FsdmFyKSk7CisJaWYgKG5hbWVbMF0gPT0gJy0nICYmIG5hbWVbMV0gPT0gJ1wwJykgeworCQljaGFyICpwOworCQlwID0gY2ttYWxsb2Moc2l6ZW9mKG9wdGxpc3QpKTsKKwkJbHZwLT50ZXh0ID0gbWVtY3B5KHAsIG9wdGxpc3QsIHNpemVvZihvcHRsaXN0KSk7CisJCXZwID0gTlVMTDsKKwl9IGVsc2UgeworCQljaGFyICplcTsKKworCQl2cHAgPSBoYXNodmFyKG5hbWUpOworCQl2cCA9ICpmaW5kdmFyKHZwcCwgbmFtZSk7CisJCWVxID0gc3RyY2hyKG5hbWUsICc9Jyk7CisJCWlmICh2cCA9PSBOVUxMKSB7CisJCQlpZiAoZXEpCisJCQkJc2V0dmFyZXEobmFtZSwgVlNUUkZJWEVEKTsKKwkJCWVsc2UKKwkJCQlzZXR2YXIobmFtZSwgTlVMTCwgVlNUUkZJWEVEKTsKKwkJCXZwID0gKnZwcDsJLyogdGhlIG5ldyB2YXJpYWJsZSAqLworCQkJbHZwLT5mbGFncyA9IFZVTlNFVDsKKwkJfSBlbHNlIHsKKwkJCWx2cC0+dGV4dCA9IHZwLT50ZXh0OworCQkJbHZwLT5mbGFncyA9IHZwLT5mbGFnczsKKwkJCXZwLT5mbGFncyB8PSBWU1RSRklYRUR8VlRFWFRGSVhFRDsKKwkJCWlmIChlcSkKKwkJCQlzZXR2YXJlcShuYW1lLCAwKTsKKwkJfQorCX0KKwlsdnAtPnZwID0gdnA7CisJbHZwLT5uZXh0ID0gbG9jYWx2YXJzOworCWxvY2FsdmFycyA9IGx2cDsKKwlJTlRPTjsKK30KKworCisvKgorICogQ2FsbGVkIGFmdGVyIGEgZnVuY3Rpb24gcmV0dXJucy4KKyAqIEludGVycnVwdHMgbXVzdCBiZSBvZmYuCisgKi8KKwordm9pZAorcG9wbG9jYWx2YXJzKHZvaWQpCit7CisJc3RydWN0IGxvY2FsdmFyICpsdnA7CisJc3RydWN0IHZhciAqdnA7CisKKwl3aGlsZSAoKGx2cCA9IGxvY2FsdmFycykgIT0gTlVMTCkgeworCQlsb2NhbHZhcnMgPSBsdnAtPm5leHQ7CisJCXZwID0gbHZwLT52cDsKKwkJVFJBQ0UoKCJwb3Bsb2NhbHZhciAlcyIsIHZwID8gdnAtPnRleHQgOiAiLSIpKTsKKwkJaWYgKHZwID09IE5VTEwpIHsJLyogJC0gc2F2ZWQgKi8KKwkJCW1lbWNweShvcHRsaXN0LCBsdnAtPnRleHQsIHNpemVvZihvcHRsaXN0KSk7CisJCQlja2ZyZWUobHZwLT50ZXh0KTsKKwkJCW9wdHNjaGFuZ2VkKCk7CisJCX0gZWxzZSBpZiAoKGx2cC0+ZmxhZ3MgJiAoVlVOU0VUfFZTVFJGSVhFRCkpID09IFZVTlNFVCkgeworCQkJdW5zZXR2YXIodnAtPnRleHQpOworCQl9IGVsc2UgeworCQkJaWYgKHZwLT5mdW5jKQorCQkJCSgqdnAtPmZ1bmMpKHN0cmNocm51bChsdnAtPnRleHQsICc9JykgKyAxKTsKKwkJCWlmICgodnAtPmZsYWdzICYgKFZURVhURklYRUR8VlNUQUNLKSkgPT0gMCkKKwkJCQlja2ZyZWUodnAtPnRleHQpOworCQkJdnAtPmZsYWdzID0gbHZwLT5mbGFnczsKKwkJCXZwLT50ZXh0ID0gbHZwLT50ZXh0OworCQl9CisJCWNrZnJlZShsdnApOworCX0KK30KKworCisvKgorICogVGhlIHVuc2V0IGJ1aWx0aW4gY29tbWFuZC4gIFdlIHVuc2V0IHRoZSBmdW5jdGlvbiBiZWZvcmUgd2UgdW5zZXQgdGhlCisgKiB2YXJpYWJsZSB0byBhbGxvdyBhIGZ1bmN0aW9uIHRvIGJlIHVuc2V0IHdoZW4gdGhlcmUgaXMgYSByZWFkb25seSB2YXJpYWJsZQorICogd2l0aCB0aGUgc2FtZSBuYW1lLgorICovCisKK2ludAordW5zZXRjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKiphcDsKKwlpbnQgaTsKKwlpbnQgZmxhZyA9IDA7CisJaW50IHJldCA9IDA7CisKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJ2ZiIpKSAhPSAnXDAnKSB7CisJCWZsYWcgPSBpOworCX0KKworCWZvciAoYXAgPSBhcmdwdHI7ICphcCA7IGFwKyspIHsKKwkJaWYgKGZsYWcgIT0gJ2YnKSB7CisJCQlpID0gdW5zZXR2YXIoKmFwKTsKKwkJCXJldCB8PSBpOworCQkJaWYgKCEoaSAmIDIpKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmbGFnICE9ICd2JykKKwkJCXVuc2V0ZnVuYygqYXApOworCX0KKwlyZXR1cm4gcmV0ICYgMTsKK30KKworCisvKgorICogVW5zZXQgdGhlIHNwZWNpZmllZCB2YXJpYWJsZS4KKyAqLworCitpbnQKK3Vuc2V0dmFyKGNvbnN0IGNoYXIgKnMpCit7CisJc3RydWN0IHZhciAqKnZwcDsKKwlzdHJ1Y3QgdmFyICp2cDsKKwlpbnQgcmV0dmFsOworCisJdnBwID0gZmluZHZhcihoYXNodmFyKHMpLCBzKTsKKwl2cCA9ICp2cHA7CisJcmV0dmFsID0gMjsKKwlpZiAodnApIHsKKwkJaW50IGZsYWdzID0gdnAtPmZsYWdzOworCisJCXJldHZhbCA9IDE7CisJCWlmIChmbGFncyAmIFZSRUFET05MWSkKKwkJCWdvdG8gb3V0OworCQlpZiAoZmxhZ3MgJiBWVU5TRVQpCisJCQlnb3RvIG9rOworCQlpZiAoKGZsYWdzICYgVlNUUkZJWEVEKSA9PSAwKSB7CisJCQlJTlRPRkY7CisJCQlpZiAoKGZsYWdzICYgKFZURVhURklYRUR8VlNUQUNLKSkgPT0gMCkKKwkJCQlja2ZyZWUodnAtPnRleHQpOworCQkJKnZwcCA9IHZwLT5uZXh0OworCQkJY2tmcmVlKHZwKTsKKwkJCUlOVE9OOworCQl9IGVsc2UgeworCQkJc2V0dmFyKHMsIDAsIDApOworCQkJdnAtPmZsYWdzICY9IH5WRVhQT1JUOworCQl9CitvazoKKwkJcmV0dmFsID0gMDsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKworLyoKKyAqIEZpbmQgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGZyb20gdGhlIG5hbWUuCisgKi8KKworU1RBVElDIHN0cnVjdCB2YXIgKioKK2hhc2h2YXIoY29uc3QgY2hhciAqcCkKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaHZhbDsKKworCWhhc2h2YWwgPSAoKHVuc2lnbmVkIGNoYXIpICpwKSA8PCA0OworCXdoaWxlICgqcCAmJiAqcCAhPSAnPScpCisJCWhhc2h2YWwgKz0gKHVuc2lnbmVkIGNoYXIpICpwKys7CisJcmV0dXJuICZ2YXJ0YWJbaGFzaHZhbCAlIFZUQUJTSVpFXTsKK30KKworCisKKy8qCisgKiBDb21wYXJlcyB0d28gc3RyaW5ncyB1cCB0byB0aGUgZmlyc3QgPSBvciAnXDAnLiAgVGhlIGZpcnN0CisgKiBzdHJpbmcgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5ICc9JzsgdGhlIHNlY29uZCBtYXkgYmUgdGVybWluYXRlZCBieQorICogZWl0aGVyICc9JyBvciAnXDAnLgorICovCisKK2ludAordmFyY21wKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnEpCit7CisJaW50IGMsIGQ7CisKKwl3aGlsZSAoKGMgPSAqcCkgPT0gKGQgPSAqcSkpIHsKKwkJaWYgKCFjIHx8IGMgPT0gJz0nKQorCQkJZ290byBvdXQ7CisJCXArKzsKKwkJcSsrOworCX0KKwlpZiAoYyA9PSAnPScpCisJCWMgPSAwOworCWlmIChkID09ICc9JykKKwkJZCA9IDA7CitvdXQ6CisJcmV0dXJuIGMgLSBkOworfQorCitTVEFUSUMgaW50Cit2cGNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXJldHVybiB2YXJjbXAoKihjb25zdCBjaGFyICoqKWEsICooY29uc3QgY2hhciAqKiliKTsKK30KKworU1RBVElDIHN0cnVjdCB2YXIgKioKK2ZpbmR2YXIoc3RydWN0IHZhciAqKnZwcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlmb3IgKDsgKnZwcDsgdnBwID0gJigqdnBwKS0+bmV4dCkgeworCQlpZiAodmFyZXF1YWwoKCp2cHApLT50ZXh0LCBuYW1lKSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHZwcDsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3Zhci5oIGIvdXNyL2Rhc2gvdmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjMmNhNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL3Zhci5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXZhci5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKy8qCisgKiBTaGVsbCB2YXJpYWJsZXMuCisgKi8KKworLyogZmxhZ3MgKi8KKyNkZWZpbmUgVkVYUE9SVAkJMHgwMQkvKiB2YXJpYWJsZSBpcyBleHBvcnRlZCAqLworI2RlZmluZSBWUkVBRE9OTFkJMHgwMgkvKiB2YXJpYWJsZSBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyNkZWZpbmUgVlNUUkZJWEVECTB4MDQJLyogdmFyaWFibGUgc3RydWN0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisjZGVmaW5lIFZURVhURklYRUQJMHgwOAkvKiB0ZXh0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisjZGVmaW5lIFZTVEFDSwkJMHgxMAkvKiB0ZXh0IGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgKi8KKyNkZWZpbmUgVlVOU0VUCQkweDIwCS8qIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2V0ICovCisjZGVmaW5lIFZOT0ZVTkMJCTB4NDAJLyogZG9uJ3QgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNkZWZpbmUgVk5PU0VUCQkweDgwCS8qIGRvIG5vdCBzZXQgdmFyaWFibGUgLSBqdXN0IHJlYWRvbmx5IHRlc3QgKi8KKyNkZWZpbmUgVk5PU0FWRQkJMHgxMDAJLyogd2hlbiB0ZXh0IGlzIG9uIHRoZSBoZWFwIGJlZm9yZSBzZXR2YXJlcSAqLworCisKK3N0cnVjdCB2YXIgeworCXN0cnVjdCB2YXIgKm5leHQ7CQkvKiBuZXh0IGVudHJ5IGluIGhhc2ggbGlzdCAqLworCWludCBmbGFnczsJCQkvKiBmbGFncyBhcmUgZGVmaW5lZCBhYm92ZSAqLworCWNvbnN0IGNoYXIgKnRleHQ7CQkvKiBuYW1lPXZhbHVlICovCisJdm9pZCAoKmZ1bmMpKGNvbnN0IGNoYXIgKik7CisJCQkJCS8qIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuICAqLworCQkJCQkvKiB0aGUgdmFyaWFibGUgZ2V0cyBzZXQvdW5zZXQgKi8KK307CisKKworc3RydWN0IGxvY2FsdmFyIHsKKwlzdHJ1Y3QgbG9jYWx2YXIgKm5leHQ7CQkvKiBuZXh0IGxvY2FsIHZhcmlhYmxlIGluIGxpc3QgKi8KKwlzdHJ1Y3QgdmFyICp2cDsJCQkvKiB0aGUgdmFyaWFibGUgdGhhdCB3YXMgbWFkZSBsb2NhbCAqLworCWludCBmbGFnczsJCQkvKiBzYXZlZCBmbGFncyAqLworCWNvbnN0IGNoYXIgKnRleHQ7CQkvKiBzYXZlZCB0ZXh0ICovCit9OworCisKK2V4dGVybiBzdHJ1Y3QgbG9jYWx2YXIgKmxvY2FsdmFyczsKK2V4dGVybiBzdHJ1Y3QgdmFyIHZhcmluaXRbXTsKKworI2lmIEFUVFkKKyNkZWZpbmUgdmF0dHkgdmFyaW5pdFswXQorI2RlZmluZSB2aWZzIHZhcmluaXRbMV0KKyNlbHNlCisjZGVmaW5lIHZpZnMgdmFyaW5pdFswXQorI2VuZGlmCisjZGVmaW5lIHZtYWlsICgmdmlmcylbMV0KKyNkZWZpbmUgdm1wYXRoICgmdm1haWwpWzFdCisjZGVmaW5lIHZwYXRoICgmdm1wYXRoKVsxXQorI2RlZmluZSB2cHMxICgmdnBhdGgpWzFdCisjZGVmaW5lIHZwczIgKCZ2cHMxKVsxXQorI2RlZmluZSB2cHM0ICgmdnBzMilbMV0KKyNkZWZpbmUgdm9wdGluZCAoJnZwczQpWzFdCisjaWZuZGVmIFNNQUxMCisjZGVmaW5lIHZ0ZXJtICgmdm9wdGluZClbMV0KKyNkZWZpbmUgdmhpc3RzaXplICgmdnRlcm0pWzFdCisjZW5kaWYKKworI2lmZGVmIElGU19CUk9LRU4KK2V4dGVybiBjb25zdCBjaGFyIGRlZmlmc3ZhcltdOworI2RlZmluZSBkZWZpZnMgKGRlZmlmc3ZhciArIDQpCisjZWxzZQorZXh0ZXJuIGNvbnN0IGNoYXIgZGVmaWZzW107CisjZW5kaWYKK2V4dGVybiBjb25zdCBjaGFyIGRlZnBhdGh2YXJbXTsKKyNkZWZpbmUgZGVmcGF0aCAoZGVmcGF0aHZhciArIDUpCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhY2Nlc3MgdGhlIHZhbHVlcyBvZiB0aGUgYWJvdmUgdmFyaWFibGVzLgorICogVGhleSBoYXZlIHRvIHNraXAgb3ZlciB0aGUgbmFtZS4gIFRoZXkgcmV0dXJuIHRoZSBudWxsIHN0cmluZworICogZm9yIHVuc2V0IHZhcmlhYmxlcy4KKyAqLworCisjZGVmaW5lIGlmc3ZhbCgpCSh2aWZzLnRleHQgKyA0KQorI2RlZmluZSBpZnNzZXQoKQkoKHZpZnMuZmxhZ3MgJiBWVU5TRVQpID09IDApCisjZGVmaW5lIG1haWx2YWwoKQkodm1haWwudGV4dCArIDUpCisjZGVmaW5lIG1wYXRodmFsKCkJKHZtcGF0aC50ZXh0ICsgOSkKKyNkZWZpbmUgcGF0aHZhbCgpCSh2cGF0aC50ZXh0ICsgNSkKKyNkZWZpbmUgcHMxdmFsKCkJKHZwczEudGV4dCArIDQpCisjZGVmaW5lIHBzMnZhbCgpCSh2cHMyLnRleHQgKyA0KQorI2RlZmluZSBwczR2YWwoKQkodnBzNC50ZXh0ICsgNCkKKyNkZWZpbmUgb3B0aW5kdmFsKCkJKHZvcHRpbmQudGV4dCArIDcpCisjaWZuZGVmIFNNQUxMCisjZGVmaW5lIGhpc3RzaXpldmFsKCkJKHZoaXN0c2l6ZS50ZXh0ICsgOSkKKyNkZWZpbmUgdGVybXZhbCgpCSh2dGVybS50ZXh0ICsgNSkKKyNlbmRpZgorCisjaWYgQVRUWQorI2RlZmluZSBhdHR5c2V0KCkJKCh2YXR0eS5mbGFncyAmIFZVTlNFVCkgPT0gMCkKKyNlbmRpZgorI2RlZmluZSBtcGF0aHNldCgpCSgodm1wYXRoLmZsYWdzICYgVlVOU0VUKSA9PSAwKQorCit2b2lkIGluaXR2YXIodm9pZCk7Cit2b2lkIHNldHZhcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQgc2V0dmFyZXEoY2hhciAqLCBpbnQpOworc3RydWN0IHN0cmxpc3Q7Cit2b2lkIGxpc3RzZXR2YXIoc3RydWN0IHN0cmxpc3QgKiwgaW50KTsKK2NoYXIgKmxvb2t1cHZhcihjb25zdCBjaGFyICopOworY2hhciAqYmx0aW5sb29rdXAoY29uc3QgY2hhciAqKTsKK2NoYXIgKipsaXN0dmFycyhpbnQsIGludCwgY2hhciAqKiopOworI2RlZmluZSBlbnZpcm9ubWVudCgpIGxpc3R2YXJzKFZFWFBPUlQsIFZVTlNFVCwgMCkKK2ludCBzaG93dmFycyhjb25zdCBjaGFyICosIGludCwgaW50KTsKK2ludCBleHBvcnRjbWQoaW50LCBjaGFyICoqKTsKK2ludCBsb2NhbGNtZChpbnQsIGNoYXIgKiopOwordm9pZCBwb3Bsb2NhbHZhcnModm9pZCk7CitpbnQgdW5zZXRjbWQoaW50LCBjaGFyICoqKTsKK2ludCB1bnNldHZhcihjb25zdCBjaGFyICopOworaW50IHNldHZhcnNhZmUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CitpbnQgdmFyY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworc3RhdGljIGlubGluZSBpbnQgdmFyZXF1YWwoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikgeworCXJldHVybiAhdmFyY21wKGEsIGIpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvQ09QWUlORyBiL3Vzci9nemlwL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzZWEyMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL0NPUFlJTkcKQEAgLTAsMCArMSwzMzkgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAgICAgICAgICAgICAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwlBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3Vzci9nemlwL0tidWlsZCBiL3Vzci9nemlwL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGZhZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvS2J1aWxkCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIGd6aXAKKyMKKworIyBUaGUgZ3ppcCBleGVjdXRhYmxlCitzdGF0aWMteSA6PSBnemlwCitnemlwLXkgICA6PSBnemlwLm8gdXRpbC5vIHVuemlwLm8gaW5mbGF0ZS5vCisKKyMgQWRkaXRpb25hbCB0YXJnZXRzCithbHdheXMgOj0gZ3VuemlwIHpjYXQKKworIyBPcHRpb25hbCBaSVAgc3VwcG9ydAorZ3ppcC0kKENPTkZJR19LTElCX1pJUCkgICArPSB6aXAubyBkZWZsYXRlLm8gdHJlZXMubyBiaXRzLm8KK2NmbGFncy0kKENPTkZJR19LTElCX1pJUCkgKz0gLURTVVBQT1JUX1pJUAorRVhUUkFfS0xJQkNDRkxBR1MgOj0gJChjZmxhZ3MteSkKKworIyBBZGRpdGlvbmFsbHkgbGlua2VkIHRhcmdldHMKKyQob2JqKS9ndW56aXAgJChvYmopL3pjYXQ6ICQob2JqKS9nemlwCisJJChjYWxsIGNtZCxsbikKKworIyBDbGVhbmluZwordGFyZ2V0cyA6PSBnemlwIGd6aXAuZyBndW56aXAgemNhdAorCisjIFRhcmdldHMgdG8gaW5zdGFsbAoraW5zdGFsbC15IDo9IGd6aXAgZ3VuemlwIHpjYXQKZGlmZiAtLWdpdCBhL3Vzci9nemlwL1JFQURNRSBiL3Vzci9nemlwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ3MzExCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvUkVBRE1FCkBAIC0wLDAgKzEsMTQ0IEBACitUaGlzIGlzIHRoZSBmaWxlIFJFQURNRSBmb3IgdGhlIGd6aXAgZGlzdHJpYnV0aW9uLCB2ZXJzaW9uIDEuMi40LgorCitnemlwIChHTlUgemlwKSBpcyBhIGNvbXByZXNzaW9uIHV0aWxpdHkgZGVzaWduZWQgdG8gYmUgYSByZXBsYWNlbWVudAorZm9yICdjb21wcmVzcycuIEl0cyBtYWluIGFkdmFudGFnZXMgb3ZlciBjb21wcmVzcyBhcmUgbXVjaCBiZXR0ZXIKK2NvbXByZXNzaW9uIGFuZCBmcmVlZG9tIGZyb20gcGF0ZW50ZWQgYWxnb3JpdGhtcy4gIFRoZSBHTlUgUHJvamVjdAordXNlcyBpdCBhcyB0aGUgc3RhbmRhcmQgY29tcHJlc3Npb24gcHJvZ3JhbSBmb3IgaXRzIHN5c3RlbS4KKworZ3ppcCBjdXJyZW50bHkgdXNlcyBieSBkZWZhdWx0IHRoZSBMWjc3IGFsZ29yaXRobSB1c2VkIGluIHppcCAxLjkgKHRoZQorcG9ydGFibGUgcGt6aXAgY29tcGF0aWJsZSBhcmNoaXZlcikuIFRoZSBnemlwIGZvcm1hdCB3YXMgaG93ZXZlcgorZGVzaWduZWQgdG8gYWNjb21tb2RhdGUgc2V2ZXJhbCBjb21wcmVzc2lvbiBhbGdvcml0aG1zLiBTZWUgYmVsb3cKK2ZvciBhIGNvbXBhcmlzb24gb2YgemlwIGFuZCBnemlwLgorCitndW56aXAgY2FuIGN1cnJlbnRseSBkZWNvbXByZXNzIGZpbGVzIGNyZWF0ZWQgYnkgZ3ppcCwgY29tcHJlc3Mgb3IKK3BhY2suIFRoZSBkZXRlY3Rpb24gb2YgdGhlIGlucHV0IGZvcm1hdCBpcyBhdXRvbWF0aWMuICBGb3IgdGhlCitnemlwIGZvcm1hdCwgZ3VuemlwIGNoZWNrcyBhIDMyIGJpdCBDUkMuIEZvciBwYWNrLCBndW56aXAgY2hlY2tzIHRoZQordW5jb21wcmVzc2VkIGxlbmd0aC4gIFRoZSAnY29tcHJlc3MnIGZvcm1hdCB3YXMgbm90IGRlc2lnbmVkIHRvIGFsbG93Citjb25zaXN0ZW5jeSBjaGVja3MuIEhvd2V2ZXIgZ3VuemlwIGlzIHNvbWV0aW1lcyBhYmxlIHRvIGRldGVjdCBhIGJhZAorLlogZmlsZSBiZWNhdXNlIHRoZXJlIGlzIHNvbWUgcmVkdW5kYW5jeSBpbiB0aGUgLlogY29tcHJlc3Npb24gZm9ybWF0LgorSWYgeW91IGdldCBhbiBlcnJvciB3aGVuIHVuY29tcHJlc3NpbmcgYSAuWiBmaWxlLCBkbyBub3QgYXNzdW1lIHRoYXQKK3RoZSAuWiBmaWxlIGlzIGNvcnJlY3Qgc2ltcGx5IGJlY2F1c2UgdGhlIHN0YW5kYXJkIHVuY29tcHJlc3MgZG9lcyBub3QKK2NvbXBsYWluLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGUgc3RhbmRhcmQgdW5jb21wcmVzcyBkb2VzIG5vdAorY2hlY2sgaXRzIGlucHV0LCBhbmQgaGFwcGlseSBnZW5lcmF0ZXMgZ2FyYmFnZSBvdXRwdXQuCisKK2d6aXAgcHJvZHVjZXMgZmlsZXMgd2l0aCBhIC5neiBleHRlbnNpb24uIFByZXZpb3VzIHZlcnNpb25zIG9mIGd6aXAKK3VzZWQgdGhlIC56IGV4dGVuc2lvbiwgd2hpY2ggd2FzIGFscmVhZHkgdXNlZCBieSB0aGUgJ3BhY2snCitIdWZmbWFuIGVuY29kZXIuIGd1bnppcCBpcyBhYmxlIHRvIGRlY29tcHJlc3MgLnogZmlsZXMgKHBhY2tlZAorb3IgZ3ppcCdlZCkuCisKK1NldmVyYWwgcGxhbm5lZCBmZWF0dXJlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgKHNlZSB0aGUgZmlsZSBUT0RPKS4KK1NlZSB0aGUgZmlsZSBORVdTIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBzaW5jZSAwLjUuICBTZWUgdGhlIGZpbGUKK0lOU1RBTEwgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuIFNvbWUgYW5zd2VycyB0byBmcmVxdWVudGx5Cithc2tlZCBxdWVzdGlvbnMgYXJlIGdpdmVuIGluIHRoZSBmaWxlIElOU1RBTEwsIHBsZWFzZSByZWFkIGl0LiAoSW4KK3BhcnRpY3VsYXIsIHBsZWFzZSBkb24ndCBhc2sgbWUgb25jZSBtb3JlIGZvciBhbiAvZXRjL21hZ2ljIGVudHJ5LikKKworV0FSTklORzogb24gc2V2ZXJhbCBzeXN0ZW1zLCBjb21waWxlciBidWdzIGNhdXNlIGd6aXAgdG8gZmFpbCwgaW4KK3BhcnRpY3VsYXIgd2hlbiBvcHRpbWl6YXRpb24gb3B0aW9ucyBhcmUgb24uICBTZWUgdGhlIHNlY3Rpb24gIlNwZWNpYWwKK3RhcmdldHMiIGF0IHRoZSBlbmQgb2YgdGhlIElOU1RBTEwgZmlsZSBmb3IgYSBsaXN0IG9mIGtub3duIHByb2JsZW1zLgorRm9yIGFsbCBtYWNoaW5lcywgdXNlICJtYWtlIGNoZWNrIiB0byBjaGVjayB0aGF0IGd6aXAgd2FzIGNvbXBpbGVkCitjb3JyZWN0bHkuICBUcnkgY29tcGlsaW5nIGd6aXAgd2l0aG91dCBhbnkgb3B0aW1pemF0aW9uIGlmIHlvdSBoYXZlIGEKK3Byb2JsZW0uCisKK1BsZWFzZSBzZW5kIGFsbCBjb21tZW50cyBhbmQgYnVnIHJlcG9ydHMgYnkgZWxlY3Ryb25pYyBtYWlsIHRvOgorICAgSmVhbi1sb3VwIEdhaWxseSA8amxvdXBAY2hvcnVzLmZyPgorCitvciwgaWYgdGhpcyBmYWlscywgdG8gYnVnLWdudS11dGlsc0BwcmVwLmFpLm1pdC5lZHUuCitCdWcgcmVwb3J0cyBzaG91bGQgaWRlYWxseSBpbmNsdWRlOgorCisgICAgKiBUaGUgY29tcGxldGUgb3V0cHV0IG9mICJnemlwIC1WIiAob3IgdGhlIGNvbnRlbnRzIG9mIHJldmlzaW9uLmgKKyAgICAgIGlmIHlvdSBjYW4ndCBnZXQgZ3ppcCB0byBjb21waWxlKQorICAgICogVGhlIGhhcmR3YXJlIGFuZCBvcGVyYXRpbmcgc3lzdGVtICh0cnkgInVuYW1lIC1hIikKKyAgICAqIFRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgKGlmIGl0IGlzIGdjYywgdXNlICJnY2MgLXYiKQorICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIGJlaGF2aW9yCisgICAgKiBUaGUgaW5wdXQgdG8gZ3ppcCwgdGhhdCB0cmlnZ2VyZWQgdGhlIGJ1ZworCitJZiB5b3Ugc2VuZCBtZSBwYXRjaGVzIGZvciBtYWNoaW5lcyBJIGRvbid0IGhhdmUgYWNjZXNzIHRvLCBwbGVhc2UgdGVzdCB0aGVtCit2ZXJ5IGNhcmVmdWxseS4gZ3ppcCBpcyB1c2VkIGZvciBiYWNrdXBzLCBpdCBtdXN0IGJlIGV4dHJlbWVseSByZWxpYWJsZS4KKworVGhlIHBhY2thZ2UgY3J5cHQrKy5lbCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gbWFuaXB1bGF0ZSBnemlwJ2VkCitmaWxlIGZyb20gZW1hY3MuIEl0IHJlY29nbml6ZXMgYXV0b21hdGljYWxseSBlbmNyeXB0ZWQgYW5kIGNvbXByZXNzZWQKK2ZpbGVzIHdoZW4gdGhleSBhcmUgZmlyc3QgdmlzaXRlZCBvciB3cml0dGVuLiBJdCBpcyBhdmFpbGFibGUgdmlhCithbm9ueW1vdXMgZnRwIHRvIHJvZWJsaW5nLnBvbHkuZWR1IFsxMjguMjM4LjUuMzFdIGluIC9wdWIvY3J5cHQrKy5lbC4KK1RoZSBzYW1lIGRpcmVjdG9yeSBjb250YWlucyBhbHNvIHBhdGNoZXMgdG8gZGlyZWQsIGFuZ2UtZnRwIGFuZCBpbmZvLgorR05VIHRhciAxLjExLjIgaGFzIGEgLXogb3B0aW9uIHRvIGludm9rZSBkaXJlY3RseSBnemlwLCBzbyB5b3UgZG9uJ3QgaGF2ZSB0bworcGF0Y2ggaXQuIFRoZSBwYWNrYWdlIGZ0cC51dS5uZXQ6L2xhbmd1YWdlcy9lbWFjcy1saXNwL21pc2MvamthLWNvbXByMTkuZWwuWgorYWxzbyBzdXBwb3J0cyBnemlwJ2VkIGZpbGVzLgorCitUaGUgem5ldyBhbmQgZ3pleGUgc2hlbGwgc2NyaXB0cyBwcm92aWRlZCB3aXRoIGd6aXAgYmVuZWZpdCBmcm9tCisoYnV0IGRvIG5vdCByZXF1aXJlKSB0aGUgY3Btb2QgdXRpbGl0eSB0byB0cmFuc2ZlciBmaWxlIGF0dHJpYnV0ZXMuCitJdCBpcyBhdmFpbGFibGUgYnkgYW5vbnltb3VzIGZ0cCBvbiBnYXRla2VlcGVyLmRlYy5jb20gaW4KKy8uMC91c2VuZXQvY29tcC5zb3VyY2VzLnVuaXgvdm9sdW1lMTEvY3Btb2QuWi4KKworVGhlIHNhbXBsZSBwcm9ncmFtcyB6cmVhZC5jLCBzdWIuYyBhbmQgYWRkLmMgaW4gc3ViZGlyZWN0b3J5IHNhbXBsZQorYXJlIHByb3ZpZGVkIGFzIGV4YW1wbGVzIG9mIHVzZWZ1bCBjb21wbGVtZW50cyB0byBnemlwLiBSZWFkIHRoZQorY29tbWVudHMgaW5zaWRlIGVhY2ggc291cmNlIGZpbGUuICBUaGUgcGVybCBzY3JpcHQgenRvdWNoIGlzIGFsc28KK3Byb3ZpZGVkIGFzIGV4YW1wbGUgKG5vdCBpbnN0YWxsZWQgYnkgZGVmYXVsdCBzaW5jZSBpdCByZWxpZXMgb24gcGVybCkuCisKKworZ3ppcCBpcyBmcmVlIHNvZnR3YXJlLCB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hpY2ggaXMKK3Byb3ZpZGVkIHVuZGVyIHRoZSBuYW1lIENPUFlJTkcuIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnemlwIGFyZSBhbHdheXMKK2F2YWlsYWJsZSBieSBmdHAgaW4gcHJlcC5haS5taXQuZWR1Oi9wdWIvZ251LCBvciBpbiBhbnkgb2YgdGhlIHByZXAKK21pcnJvciBzaXRlczoKKworLSBzb3VyY2VzIGluIGd6aXAtKi50YXIgKG9yIC5zaGFyIG9yIC50YXIuZ3opLgorLSBTb2xhcmlzIDIgZXhlY3V0YWJsZXMgaW4gc3BhcmMtc3VuLXNvbGFyaXMyL2d6aXAtYmluYXJpZXMtKi50YXIKKy0gTVNET1MgbGhhIHNlbGYtZXh0cmFjdGluZyBleGUgaW4gZ3ppcC1tc2Rvcy0qLmV4ZS4gT25jZSBleHRyYWN0ZWQsCisgIGNvcHkgZ3ppcC5leGUgdG8gZ3VuemlwLmV4ZSBhbmQgemNhdC5leGUsIG9yIHVzZSAiZ3ppcCAtZCIgdG8gZGVjb21wcmVzcy4KKyAgZ3ppcDM4Ni5leGUgcnVucyBtdWNoIGZhc3RlciBidXQgb25seSBvbiAzODYgYW5kIGFib3ZlOyBpdCBpcyBjb21waWxlZCB3aXRoCisgIGRqZ3BwIDEuMTAgYXZhaWxhYmxlIGluIGRpcmVjdG9yeSBvbW5pZ2F0ZS5jbGFya3Nvbi5lZHU6L3B1Yi9tc2Rvcy9kamdwcC4KKworQSBWTVMgZXhlY3V0YWJsZSBpcyBhdmFpbGFibGUgaW4gZnRwLnNwYy5lZHU6Wy5tYWNybzMyLnNhdmVzZXRzXWd6aXAtMS0qLnppcAorKHVzZSBbLm1hY3JvMzJddW56aXAuZXhlIHRvIGV4dHJhY3QpLiBBIFBSSU1PUyBleGVjdXRhYmxlIGlzIGF2YWlsYWJsZQoraW4gZnRwLmx5c2F0b3IubGl1LnNlOi9wdWIvcHJpbW9zL3J1bi9nemlwLnJ1bi4KK09TLzIgZXhlY3V0YWJsZXMgKDE2IGFuZCAzMiBiaXRzIHZlcnNpb25zKSBhcmUgYXZhaWxhYmxlIGluCitmdHAudHUtbXVlbmNoZW4uZGU6L3B1Yi9jb21wL29zL29zMi9hcmNoaXZlci9neiotWzE2LDMyXS56aXAKKworU29tZSBmdHAgc2VydmVycyBjYW4gYXV0b21hdGljYWxseSBtYWtlIGEgdGFyLlogZnJvbSBhIHRhciBmaWxlLiBJZgoreW91IGFyZSBnZXR0aW5nIGd6aXAgZm9yIHRoZSBmaXJzdCB0aW1lLCB5b3UgY2FuIGFzayBmb3IgYSB0YXIuWiBmaWxlCitpbnN0ZWFkIG9mIHRoZSBtdWNoIGxhcmdlciB0YXIgZmlsZS4KKworTWFueSB0aGFua3MgdG8gdGhvc2Ugd2hvIHByb3ZpZGVkIG1lIHdpdGggYnVnIHJlcG9ydHMgYW5kIGZlZWRiYWNrLgorU2VlIHRoZSBmaWxlcyBUSEFOS1MgYW5kIENoYW5nZUxvZyBmb3IgbW9yZSBkZXRhaWxzLgorCisKKwkJTm90ZSBhYm91dCB6aXAgdnMuIGd6aXA6CisKK1RoZSBuYW1lICdnemlwJyB3YXMgYSB2ZXJ5IHVuZm9ydHVuYXRlIGNob2ljZSwgYmVjYXVzZSB6aXAgYW5kIGd6aXAKK2FyZSB0d28gcmVhbGx5IGRpZmZlcmVudCBwcm9ncmFtcywgYWx0aG91Z2ggdGhlIGFjdHVhbCBjb21wcmVzc2lvbiBhbmQKK2RlY29tcHJlc3Npb24gc291cmNlcyB3ZXJlIHdyaXR0ZW4gYnkgdGhlIHNhbWUgcGVyc29ucy4gQSBkaWZmZXJlbnQKK25hbWUgc2hvdWxkIGhhdmUgYmVlbiB1c2VkIGZvciBnemlwLCBidXQgaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIG5vdy4KKworemlwIGlzIGFuIGFyY2hpdmVyOiBpdCBjb21wcmVzc2VzIHNldmVyYWwgZmlsZXMgaW50byBhIHNpbmdsZSBhcmNoaXZlCitmaWxlLiBnemlwIGlzIGEgc2ltcGxlIGNvbXByZXNzb3I6IGVhY2ggZmlsZSBpcyBjb21wcmVzc2VkIHNlcGFyYXRlbHkuCitCb3RoIHNoYXJlIHRoZSBzYW1lIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGNvZGUgZm9yIHRoZQorJ2RlZmxhdGUnIG1ldGhvZC4gIHVuemlwIGNhbiBhbHNvIGRlY29tcHJlc3Mgb2xkIHppcCBhcmNoaXZlcworKGltcGxvZGUsIHNocmluayBhbmQgcmVkdWNlIG1ldGhvZHMpLiBndW56aXAgY2FuIGFsc28gZGVjb21wcmVzcyBmaWxlcworY3JlYXRlZCBieSBjb21wcmVzcyBhbmQgcGFjay4gemlwIDEuOSBhbmQgZ3ppcCBkbyBub3Qgc3VwcG9ydAorY29tcHJlc3Npb24gbWV0aG9kcyBvdGhlciB0aGFuIGRlZmxhdGlvbi4gKHppcCAxLjAgc3VwcG9ydHMgc2hyaW5rIGFuZAoraW1wbG9kZSkuIEJldHRlciBjb21wcmVzc2lvbiBtZXRob2RzIG1heSBiZSBhZGRlZCBpbiBmdXR1cmUgdmVyc2lvbnMKK29mIGd6aXAuIHppcCB3aWxsIGFsd2F5cyBzdGljayB0byBhYnNvbHV0ZSBjb21wYXRpYmlsaXR5IHdpdGggcGt6aXAsCitpdCBpcyB0aHVzIGNvbnN0cmFpbmVkIGJ5IFBLV2FyZSwgd2hpY2ggaXMgYSBjb21tZXJjaWFsIGNvbXBhbnkuICBUaGUKK2d6aXAgaGVhZGVyIGZvcm1hdCBpcyBkZWxpYmVyYXRlbHkgZGlmZmVyZW50IGZyb20gdGhhdCBvZiBwa3ppcCB0bworYXZvaWQgc3VjaCBhIGNvbnN0cmFpbnQuCisKK09uIFVuaXgsIGd6aXAgaXMgbW9zdGx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHRhci4gR05VIHRhcgorMS4xMS4yIGhhcyBhIC16IG9wdGlvbiB0byBpbnZva2UgZ3ppcCBhdXRvbWF0aWNhbGx5LiAgInRhciAteiIKK2NvbXByZXNzZXMgYmV0dGVyIHRoYW4gemlwLCBzaW5jZSBnemlwIGNhbiB0aGVuIHRha2UgYWR2YW50YWdlIG9mCityZWR1bmRhbmN5IGJldHdlZW4gZGlzdGluY3QgZmlsZXMuIFRoZSBkcmF3YmFjayBpcyB0aGF0IHlvdSBtdXN0CitzY2FuIHRoZSB3aG9sZSB0YXIuZ3ogZmlsZSBpbiBvcmRlciB0byBleHRyYWN0IGEgc2luZ2xlIGZpbGUgbmVhcgordGhlIGVuZDsgdW56aXAgY2FuIGRpcmVjdGx5IHNlZWsgdG8gdGhlIGVuZCBvZiB0aGUgemlwIGZpbGUuIFRoZXJlCitpcyBubyBvdmVyaGVhZCB3aGVuIHlvdSBleHRyYWN0IHRoZSB3aG9sZSBhcmNoaXZlIGFueXdheS4KK0lmIGEgbWVtYmVyIG9mIGEgLnppcCBhcmNoaXZlIGlzIGRhbWFnZWQsIG90aGVyIGZpbGVzIGNhbiBzdGlsbAorYmUgcmVjb3ZlcmVkLiBJZiBhIC50YXIuZ3ogZmlsZSBpcyBkYW1hZ2VkLCBmaWxlcyBiZXlvbmQgdGhlIGZhaWx1cmUKK3BvaW50IGNhbm5vdCBiZSByZWNvdmVyZWQuIChGdXR1cmUgdmVyc2lvbnMgb2YgZ3ppcCB3aWxsIGhhdmUKK2Vycm9yIHJlY292ZXJ5IGZlYXR1cmVzLikKKworZ3ppcCBhbmQgZ3VuemlwIGFyZSBkaXN0cmlidXRlZCBhcyBhIHNpbmdsZSBwcm9ncmFtLiB6aXAgYW5kIHVuemlwCithcmUsIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHR3byBzZXBhcmF0ZSBwcm9ncmFtcywgYWx0aG91Z2ggdGhlCithdXRob3JzIG9mIHRoZXNlIHR3byBwcm9ncmFtcyB3b3JrIGNsb3NlbHkgdG9nZXRoZXIgaW4gdGhlIGluZm8temlwCit0ZWFtLiB6aXAgYW5kIHVuemlwIGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBHTlUgcHJvamVjdC4KK1RoZSBzb3VyY2VzIGFyZSBhdmFpbGFibGUgYnkgZnRwIGluCisKKwkgb2FrLm9ha2xhbmQuZWR1Oi9wdWIvbWlzYy91bml4L3ppcDE5cDEuemlwCisJIG9hay5vYWtsYW5kLmVkdTovcHViL21pc2MvdW5peC91bno1MHAxLnRhci16CmRpZmYgLS1naXQgYS91c3IvZ3ppcC9iaXRzLmMgYi91c3IvZ3ppcC9iaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwN2EwOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL2JpdHMuYwpAQCAtMCwwICsxLDIwMCBAQAorLyogYml0cy5jIC0tIG91dHB1dCB2YXJpYWJsZS1sZW5ndGggYml0IHN0cmluZ3MKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKi8KKworCisvKgorICogIFBVUlBPU0UKKyAqCisgKiAgICAgIE91dHB1dCB2YXJpYWJsZS1sZW5ndGggYml0IHN0cmluZ3MuIENvbXByZXNzaW9uIGNhbiBiZSBkb25lCisgKiAgICAgIHRvIGEgZmlsZSBvciB0byBtZW1vcnkuIChUaGUgbGF0dGVyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uLikKKyAqCisgKiAgRElTQ1VTU0lPTgorICoKKyAqICAgICAgVGhlIFBLWklQICJkZWZsYXRlIiBmaWxlIGZvcm1hdCBpbnRlcnByZXRzIGNvbXByZXNzZWQgZmlsZSBkYXRhCisgKiAgICAgIGFzIGEgc2VxdWVuY2Ugb2YgYml0cy4gIE11bHRpLWJpdCBzdHJpbmdzIGluIHRoZSBmaWxlIG1heSBjcm9zcworICogICAgICBieXRlIGJvdW5kYXJpZXMgd2l0aG91dCByZXN0cmljdGlvbi4KKyAqCisgKiAgICAgIFRoZSBmaXJzdCBiaXQgb2YgZWFjaCBieXRlIGlzIHRoZSBsb3ctb3JkZXIgYml0LgorICoKKyAqICAgICAgVGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBhbGxvdyBhIHZhcmlhYmxlLWxlbmd0aCBiaXQgdmFsdWUgdG8KKyAqICAgICAgYmUgb3V0cHV0IHJpZ2h0LXRvLWxlZnQgKHVzZWZ1bCBmb3IgbGl0ZXJhbCB2YWx1ZXMpLiBGb3IKKyAqICAgICAgbGVmdC10by1yaWdodCBvdXRwdXQgKHVzZWZ1bCBmb3IgY29kZSBzdHJpbmdzIGZyb20gdGhlIHRyZWUgcm91dGluZXMpLAorICogICAgICB0aGUgYml0cyBtdXN0IGhhdmUgYmVlbiByZXZlcnNlZCBmaXJzdCB3aXRoIGJpX3JldmVyc2UoKS4KKyAqCisgKiAgICAgIEZvciBpbi1tZW1vcnkgY29tcHJlc3Npb24sIHRoZSBjb21wcmVzc2VkIGJpdCBzdHJlYW0gZ29lcyBkaXJlY3RseQorICogICAgICBpbnRvIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgaXMgcmVhZCBpbiBibG9ja3MKKyAqICAgICAgYnkgdGhlIG1lbV9yZWFkKCkgZnVuY3Rpb24uIFRoZSBidWZmZXIgaXMgbGltaXRlZCB0byA2NEsgb24gMTYgYml0CisgKiAgICAgIG1hY2hpbmVzLgorICoKKyAqICBJTlRFUkZBQ0UKKyAqCisgKiAgICAgIHZvaWQgYmlfaW5pdCAoRklMRSAqemlwZmlsZSkKKyAqICAgICAgICAgIEluaXRpYWxpemUgdGhlIGJpdCBzdHJpbmcgcm91dGluZXMuCisgKgorICogICAgICB2b2lkIHNlbmRfYml0cyAoaW50IHZhbHVlLCBpbnQgbGVuZ3RoKQorICogICAgICAgICAgV3JpdGUgb3V0IGEgYml0IHN0cmluZywgdGFraW5nIHRoZSBzb3VyY2UgYml0cyByaWdodCB0bworICogICAgICAgICAgbGVmdC4KKyAqCisgKiAgICAgIGludCBiaV9yZXZlcnNlIChpbnQgdmFsdWUsIGludCBsZW5ndGgpCisgKiAgICAgICAgICBSZXZlcnNlIHRoZSBiaXRzIG9mIGEgYml0IHN0cmluZywgdGFraW5nIHRoZSBzb3VyY2UgYml0cyBsZWZ0IHRvCisgKiAgICAgICAgICByaWdodCBhbmQgZW1pdHRpbmcgdGhlbSByaWdodCB0byBsZWZ0LgorICoKKyAqICAgICAgdm9pZCBiaV93aW5kdXAgKHZvaWQpCisgKiAgICAgICAgICBXcml0ZSBvdXQgYW55IHJlbWFpbmluZyBiaXRzIGluIGFuIGluY29tcGxldGUgYnl0ZS4KKyAqCisgKiAgICAgIHZvaWQgY29weV9ibG9jayhjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgaW50IGhlYWRlcikKKyAqICAgICAgICAgIENvcHkgYSBzdG9yZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kCisgKiAgICAgICAgICBpdHMgb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuCisgKgorICovCisKKyNpbmNsdWRlICJ0YWlsb3IuaCIKKyNpbmNsdWRlICJnemlwLmgiCisKKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJElkOiBiaXRzLmMsdiAxLjEgMjAwMi8wOC8xOCAwMDo1OToyMSBocGEgRXhwICQiOworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YSB1c2VkIGJ5IHRoZSAiYml0IHN0cmluZyIgcm91dGluZXMuCisgKi8KKworbG9jYWwgZmlsZV90IHpmaWxlOyAvKiBvdXRwdXQgZ3ppcCBmaWxlICovCisKK2xvY2FsIHVuc2lnbmVkIHNob3J0IGJpX2J1ZjsKKy8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0IHNpZ25pZmljYW50CisgKiBiaXRzKS4KKyAqLworCisjZGVmaW5lIEJ1Zl9zaXplICg4ICogMipzaXplb2YoY2hhcikpCisvKiBOdW1iZXIgb2YgYml0cyB1c2VkIHdpdGhpbiBiaV9idWYuIChiaV9idWYgbWlnaHQgYmUgaW1wbGVtZW50ZWQgb24KKyAqIG1vcmUgdGhhbiAxNiBiaXRzIG9uIHNvbWUgc3lzdGVtcy4pCisgKi8KKworbG9jYWwgaW50IGJpX3ZhbGlkOworLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0CisgKiBhcmUgYWx3YXlzIHplcm8uCisgKi8KKworaW50ICgqcmVhZF9idWYpIE9GKChjaGFyICpidWYsIHVuc2lnbmVkIHNpemUpKTsKKy8qIEN1cnJlbnQgaW5wdXQgZnVuY3Rpb24uIFNldCB0byBtZW1fcmVhZCBmb3IgaW4tbWVtb3J5IGNvbXByZXNzaW9uICovCisKKyNpZmRlZiBERUJVRworICB1bGcgYml0c19zZW50OyAgIC8qIGJpdCBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAqLworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgYml0IHN0cmluZyByb3V0aW5lcy4KKyAqLwordm9pZCBiaV9pbml0ICh6aXBmaWxlKQorICAgIGZpbGVfdCB6aXBmaWxlOyAvKiBvdXRwdXQgemlwIGZpbGUsIE5PX0ZJTEUgZm9yIGluLW1lbW9yeSBjb21wcmVzc2lvbiAqLworeworICAgIHpmaWxlICA9IHppcGZpbGU7CisgICAgYmlfYnVmID0gMDsKKyAgICBiaV92YWxpZCA9IDA7CisjaWZkZWYgREVCVUcKKyAgICBiaXRzX3NlbnQgPSAwTDsKKyNlbmRpZgorCisgICAgLyogU2V0IHRoZSBkZWZhdWx0cyBmb3IgZmlsZSBjb21wcmVzc2lvbi4gVGhleSBhcmUgc2V0IGJ5IG1lbWNvbXByZXNzCisgICAgICogZm9yIGluLW1lbW9yeSBjb21wcmVzc2lvbi4KKyAgICAgKi8KKyAgICBpZiAoemZpbGUgIT0gTk9fRklMRSkgeworCXJlYWRfYnVmICA9IGZpbGVfcmVhZDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuCisgKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy4KKyAqLwordm9pZCBzZW5kX2JpdHModmFsdWUsIGxlbmd0aCkKKyAgICBpbnQgdmFsdWU7ICAvKiB2YWx1ZSB0byBzZW5kICovCisgICAgaW50IGxlbmd0aDsgLyogbnVtYmVyIG9mIGJpdHMgKi8KK3sKKyNpZmRlZiBERUJVRworICAgIFRyYWNldigoc3RkZXJyLCIgbCAlMmQgdiAlNHggIiwgbGVuZ3RoLCB2YWx1ZSkpOworICAgIEFzc2VydChsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAxNSwgImludmFsaWQgbGVuZ3RoIik7CisgICAgYml0c19zZW50ICs9ICh1bGcpbGVuZ3RoOworI2VuZGlmCisgICAgLyogSWYgbm90IGVub3VnaCByb29tIGluIGJpX2J1ZiwgdXNlICh2YWxpZCkgYml0cyBmcm9tIGJpX2J1ZiBhbmQKKyAgICAgKiAoMTYgLSBiaV92YWxpZCkgYml0cyBmcm9tIHZhbHVlLCBsZWF2aW5nICh3aWR0aCAtICgxNi1iaV92YWxpZCkpCisgICAgICogdW51c2VkIGJpdHMgaW4gdmFsdWUuCisgICAgICovCisgICAgaWYgKGJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbmd0aCkgeworICAgICAgICBiaV9idWYgfD0gKHZhbHVlIDw8IGJpX3ZhbGlkKTsKKyAgICAgICAgcHV0X3Nob3J0KGJpX2J1Zik7CisgICAgICAgIGJpX2J1ZiA9ICh1c2gpdmFsdWUgPj4gKEJ1Zl9zaXplIC0gYmlfdmFsaWQpOworICAgICAgICBiaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBiaV9idWYgfD0gdmFsdWUgPDwgYmlfdmFsaWQ7CisgICAgICAgIGJpX3ZhbGlkICs9IGxlbmd0aDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXIKKyAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSkKKyAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTUKKyAqLwordW5zaWduZWQgYmlfcmV2ZXJzZShjb2RlLCBsZW4pCisgICAgdW5zaWduZWQgY29kZTsgLyogdGhlIHZhbHVlIHRvIGludmVydCAqLworICAgIGludCBsZW47ICAgICAgIC8qIGl0cyBiaXQgbGVuZ3RoICovCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgcmVzID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJlcyB8PSBjb2RlICYgMTsKKyAgICAgICAgY29kZSA+Pj0gMSwgcmVzIDw8PSAxOworICAgIH0gd2hpbGUgKC0tbGVuID4gMCk7CisgICAgcmV0dXJuIHJlcyA+PiAxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIG91dCBhbnkgcmVtYWluaW5nIGJpdHMgaW4gYW4gaW5jb21wbGV0ZSBieXRlLgorICovCit2b2lkIGJpX3dpbmR1cCgpCit7CisgICAgaWYgKGJpX3ZhbGlkID4gOCkgeworICAgICAgICBwdXRfc2hvcnQoYmlfYnVmKTsKKyAgICB9IGVsc2UgaWYgKGJpX3ZhbGlkID4gMCkgeworICAgICAgICBwdXRfYnl0ZShiaV9idWYpOworICAgIH0KKyAgICBiaV9idWYgPSAwOworICAgIGJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworICAgIGJpdHNfc2VudCA9IChiaXRzX3NlbnQrNykgJiB+NzsKKyNlbmRpZgorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgYSBzdG9yZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cworICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuCisgKi8KK3ZvaWQgY29weV9ibG9jayhidWYsIGxlbiwgaGVhZGVyKQorICAgIGNoYXIgICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqLworICAgIGludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqLworeworICAgIGJpX3dpbmR1cCgpOyAgICAgICAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworCisgICAgaWYgKGhlYWRlcikgeworICAgICAgICBwdXRfc2hvcnQoKHVzaClsZW4pOworICAgICAgICBwdXRfc2hvcnQoKHVzaCl+bGVuKTsKKyNpZmRlZiBERUJVRworICAgICAgICBiaXRzX3NlbnQgKz0gMioxNjsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBERUJVRworICAgIGJpdHNfc2VudCArPSAodWxnKWxlbjw8MzsKKyNlbmRpZgorICAgIHdoaWxlIChsZW4tLSkgeworCXB1dF9ieXRlKCpidWYrKyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvZGVmbGF0ZS5jIGIvdXNyL2d6aXAvZGVmbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjQ0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC9kZWZsYXRlLmMKQEAgLTAsMCArMSw3NTkgQEAKKy8qIGRlZmxhdGUuYyAtLSBjb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKy8qCisgKiAgUFVSUE9TRQorICoKKyAqICAgICAgSWRlbnRpZnkgbmV3IHRleHQgYXMgcmVwZXRpdGlvbnMgb2Ygb2xkIHRleHQgd2l0aGluIGEgZml4ZWQtCisgKiAgICAgIGxlbmd0aCBzbGlkaW5nIHdpbmRvdyB0cmFpbGluZyBiZWhpbmQgdGhlIG5ldyB0ZXh0LgorICoKKyAqICBESVNDVVNTSU9OCisgKgorICogICAgICBUaGUgImRlZmxhdGlvbiIgcHJvY2VzcyBkZXBlbmRzIG9uIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgcG9ydGlvbnMKKyAqICAgICAgb2YgdGhlIGlucHV0IHRleHQgd2hpY2ggYXJlIGlkZW50aWNhbCB0byBlYXJsaWVyIGlucHV0ICh3aXRoaW4gYQorICogICAgICBzbGlkaW5nIHdpbmRvdyB0cmFpbGluZyBiZWhpbmQgdGhlIGlucHV0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQpLgorICoKKyAqICAgICAgVGhlIG1vc3Qgc3RyYWlnaHRmb3J3YXJkIHRlY2huaXF1ZSB0dXJucyBvdXQgdG8gYmUgdGhlIGZhc3Rlc3QgZm9yCisgKiAgICAgIG1vc3QgaW5wdXQgZmlsZXM6IHRyeSBhbGwgcG9zc2libGUgbWF0Y2hlcyBhbmQgc2VsZWN0IHRoZSBsb25nZXN0LgorICogICAgICBUaGUga2V5IGZlYXR1cmUgb2YgdGhpcyBhbGdvcml0aG0gaXMgdGhhdCBpbnNlcnRpb25zIGludG8gdGhlIHN0cmluZworICogICAgICBkaWN0aW9uYXJ5IGFyZSB2ZXJ5IHNpbXBsZSBhbmQgdGh1cyBmYXN0LCBhbmQgZGVsZXRpb25zIGFyZSBhdm9pZGVkCisgKiAgICAgIGNvbXBsZXRlbHkuIEluc2VydGlvbnMgYXJlIHBlcmZvcm1lZCBhdCBlYWNoIGlucHV0IGNoYXJhY3Rlciwgd2hlcmVhcworICogICAgICBzdHJpbmcgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggZW5kcy4gU28gaXQKKyAqICAgICAgaXMgcHJlZmVyYWJsZSB0byBzcGVuZCBtb3JlIHRpbWUgaW4gbWF0Y2hlcyB0byBhbGxvdyB2ZXJ5IGZhc3Qgc3RyaW5nCisgKiAgICAgIGluc2VydGlvbnMgYW5kIGF2b2lkIGRlbGV0aW9ucy4gVGhlIG1hdGNoaW5nIGFsZ29yaXRobSBmb3Igc21hbGwKKyAqICAgICAgc3RyaW5ncyBpcyBpbnNwaXJlZCBmcm9tIHRoYXQgb2YgUmFiaW4gJiBLYXJwLiBBIGJydXRlIGZvcmNlIGFwcHJvYWNoCisgKiAgICAgIGlzIHVzZWQgdG8gZmluZCBsb25nZXIgc3RyaW5ncyB3aGVuIGEgc21hbGwgbWF0Y2ggaGFzIGJlZW4gZm91bmQuCisgKiAgICAgIEEgc2ltaWxhciBhbGdvcml0aG0gaXMgdXNlZCBpbiBjb21pYyAoYnkgSmFuLU1hcmsgV2FtcykgYW5kIGZyZWV6ZQorICogICAgICAoYnkgTGVvbmlkIEJyb3VraGlzKS4KKyAqICAgICAgICAgQSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1c2VkIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGFsZ29yaXRobQorICogICAgICAoYnkgRmlhbGEgYW5kIEdyZWVuZSkgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gbGluZWFyIGFtb3J0aXplZAorICogICAgICB0aW1lLCBidXQgaGFzIGEgbGFyZ2VyIGF2ZXJhZ2UgY29zdCwgdXNlcyBtb3JlIG1lbW9yeSBhbmQgaXMgcGF0ZW50ZWQuCisgKiAgICAgIEhvd2V2ZXIgdGhlIEYmRyBhbGdvcml0aG0gbWF5IGJlIGZhc3RlciBmb3Igc29tZSBoaWdobHkgcmVkdW5kYW50CisgKiAgICAgIGZpbGVzIGlmIHRoZSBwYXJhbWV0ZXIgbWF4X2NoYWluX2xlbmd0aCAoZGVzY3JpYmVkIGJlbG93KSBpcyB0b28gbGFyZ2UuCisgKgorICogIEFDS05PV0xFREdFTUVOVFMKKyAqCisgKiAgICAgIFRoZSBpZGVhIG9mIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGlzIGR1ZSB0byBKYW4tTWFyayBXYW1zLCBhbmQKKyAqICAgICAgSSBmb3VuZCBpdCBpbiAnZnJlZXplJyB3cml0dGVuIGJ5IExlb25pZCBCcm91a2hpcy4KKyAqICAgICAgVGhhbmtzIHRvIG1hbnkgaW5mby16aXBwZXJzIGZvciBidWcgcmVwb3J0cyBhbmQgdGVzdGluZy4KKyAqCisgKiAgUkVGRVJFTkNFUworICoKKyAqICAgICAgQVBQTk9URS5UWFQgZG9jdW1lbnRhdGlvbiBmaWxlIGluIFBLWklQIDEuOTNhIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgICAgIEEgZGVzY3JpcHRpb24gb2YgdGhlIFJhYmluIGFuZCBLYXJwIGFsZ29yaXRobSBpcyBnaXZlbiBpbiB0aGUgYm9vaworICogICAgICAgICAiQWxnb3JpdGhtcyIgYnkgUi4gU2VkZ2V3aWNrLCBBZGRpc29uLVdlc2xleSwgcDI1Mi4KKyAqCisgKiAgICAgIEZpYWxhLEUuUi4sIGFuZCBHcmVlbmUsRC5ILgorICogICAgICAgICBEYXRhIENvbXByZXNzaW9uIHdpdGggRmluaXRlIFdpbmRvd3MsIENvbW0uQUNNLCAzMiw0ICgxOTg5KSA0OTAtNTk1CisgKgorICogIElOVEVSRkFDRQorICoKKyAqICAgICAgdm9pZCBsbV9pbml0IChpbnQgcGFja19sZXZlbCwgdXNoICpmbGFncykKKyAqICAgICAgICAgIEluaXRpYWxpemUgdGhlICJsb25nZXN0IG1hdGNoIiByb3V0aW5lcyBmb3IgYSBuZXcgZmlsZQorICoKKyAqICAgICAgdWxnIGRlZmxhdGUgKHZvaWQpCisgKiAgICAgICAgICBQcm9jZXNzZXMgYSBuZXcgaW5wdXQgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb21wcmVzc2VkIGxlbmd0aC4gU2V0cworICogICAgICAgICAgdGhlIGNvbXByZXNzZWQgbGVuZ3RoLCBjcmMsIGRlZmxhdGUgZmxhZ3MgYW5kIGludGVybmFsIGZpbGUKKyAqICAgICAgICAgIGF0dHJpYnV0ZXMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ0YWlsb3IuaCIKKyNpbmNsdWRlICJnemlwLmgiCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGRlZmxhdGUuYyx2IDEuMSAyMDAyLzA4LzE4IDAwOjU5OjIxIGhwYSBFeHAgJCI7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqLworCisvKiBDb21waWxlIHdpdGggTUVESVVNX01FTSB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb3IKKyAqIHdpdGggU01BTExfTUVNIHRvIHVzZSBhcyBsaXR0bGUgbWVtb3J5IGFzIHBvc3NpYmxlLiBVc2UgQklHX01FTSBpZiB0aGUKKyAqIGVudGlyZSBpbnB1dCBmaWxlIGNhbiBiZSBoZWxkIGluIG1lbW9yeSAobm90IHBvc3NpYmxlIG9uIDE2IGJpdCBzeXN0ZW1zKS4KKyAqIFdhcm5pbmc6IGRlZmluaW5nIHRoZXNlIHN5bWJvbHMgYWZmZWN0cyBIQVNIX0JJVFMgKHNlZSBiZWxvdykgYW5kIHRodXMKKyAqIGFmZmVjdHMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLiBUaGUgY29tcHJlc3NlZCBvdXRwdXQKKyAqIGlzIHN0aWxsIGNvcnJlY3QsIGFuZCBtaWdodCBldmVuIGJlIHNtYWxsZXIgaW4gc29tZSBjYXNlcy4KKyAqLworCisjaWZkZWYgU01BTExfTUVNCisjICAgZGVmaW5lIEhBU0hfQklUUyAgMTMgIC8qIE51bWJlciBvZiBiaXRzIHVzZWQgdG8gaGFzaCBzdHJpbmdzICovCisjZW5kaWYKKyNpZmRlZiBNRURJVU1fTUVNCisjICAgZGVmaW5lIEhBU0hfQklUUyAgMTQKKyNlbmRpZgorI2lmbmRlZiBIQVNIX0JJVFMKKyMgICBkZWZpbmUgSEFTSF9CSVRTICAxNQorICAgLyogRm9yIHBvcnRhYmlsaXR5IHRvIDE2IGJpdCBtYWNoaW5lcywgZG8gbm90IHVzZSB2YWx1ZXMgYWJvdmUgMTUuICovCisjZW5kaWYKKworLyogVG8gc2F2ZSBzcGFjZSAoc2VlIHVubHp3LmMpLCB3ZSBvdmVybGF5IHByZXYraGVhZCB3aXRoIHRhYl9wcmVmaXggYW5kCisgKiB3aW5kb3cgd2l0aCB0YWJfc3VmZml4LiBDaGVjayB0aGF0IHdlIGNhbiBkbyB0aGlzOgorICovCisjaWYgKFdTSVpFPDwxKSA+ICgxPDxCSVRTKQorICAgZXJyb3I6IGNhbm5vdCBvdmVybGF5IHdpbmRvdyB3aXRoIHRhYl9zdWZmaXggYW5kIHByZXYgd2l0aCB0YWJfcHJlZml4MAorI2VuZGlmCisjaWYgSEFTSF9CSVRTID4gQklUUy0xCisgICBlcnJvcjogY2Fubm90IG92ZXJsYXkgaGVhZCB3aXRoIHRhYl9wcmVmaXgxCisjZW5kaWYKKworI2RlZmluZSBIQVNIX1NJWkUgKHVuc2lnbmVkKSgxPDxIQVNIX0JJVFMpCisjZGVmaW5lIEhBU0hfTUFTSyAoSEFTSF9TSVpFLTEpCisjZGVmaW5lIFdNQVNLICAgICAoV1NJWkUtMSkKKy8qIEhBU0hfU0laRSBhbmQgV1NJWkUgbXVzdCBiZSBwb3dlcnMgb2YgdHdvICovCisKKyNkZWZpbmUgTklMIDAKKy8qIFRhaWwgb2YgaGFzaCBjaGFpbnMgKi8KKworI2RlZmluZSBGQVNUIDQKKyNkZWZpbmUgU0xPVyAyCisvKiBzcGVlZCBvcHRpb25zIGZvciB0aGUgZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICovCisKKyNpZm5kZWYgVE9PX0ZBUgorIyAgZGVmaW5lIFRPT19GQVIgNDA5NgorI2VuZGlmCisvKiBNYXRjaGVzIG9mIGxlbmd0aCAzIGFyZSBkaXNjYXJkZWQgaWYgdGhlaXIgZGlzdGFuY2UgZXhjZWVkcyBUT09fRkFSICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YSB1c2VkIGJ5IHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMuCisgKi8KKwordHlwZWRlZiB1c2ggUG9zOwordHlwZWRlZiB1bnNpZ25lZCBJUG9zOworLyogQSBQb3MgaXMgYW4gaW5kZXggaW4gdGhlIGNoYXJhY3RlciB3aW5kb3cuIFdlIHVzZSBzaG9ydCBpbnN0ZWFkIG9mIGludCB0bworICogc2F2ZSBzcGFjZSBpbiB0aGUgdmFyaW91cyB0YWJsZXMuIElQb3MgaXMgdXNlZCBvbmx5IGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAqLworCisvKiBERUNMQVJFKHVjaCwgd2luZG93LCAyTCpXU0laRSk7ICovCisvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdywKKyAqIGFuZCBtb3ZlIHRvIHRoZSBmaXJzdCBoYWxmIGxhdGVyIHRvIGtlZXAgYSBkaWN0aW9uYXJ5IG9mIGF0IGxlYXN0IFdTSVpFCisgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mCisgKiBXU0laRS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXMKKyAqIHBlcmZvcm1lZCB3aXRoIGEgbGVuZ3RoIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLiBBbHNvLCBpdCBsaW1pdHMKKyAqIHRoZSB3aW5kb3cgc2l6ZSB0byA2NEssIHdoaWNoIGlzIHF1aXRlIHVzZWZ1bCBvbiBNU0RPUy4KKyAqIFRvIGRvOiBsaW1pdCB0aGUgd2luZG93IHNpemUgdG8gV1NJWkUrQlNaIGlmIFNNQUxMX01FTSAodGhlIGNvZGUgd291bGQKKyAqIGJlIGxlc3MgZWZmaWNpZW50KS4KKyAqLworCisvKiBERUNMQVJFKFBvcywgcHJldiwgV1NJWkUpOyAqLworLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKKyAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuCisgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy4KKyAqLworCisvKiBERUNMQVJFKFBvcywgaGVhZCwgMTw8SEFTSF9CSVRTKTsgKi8KKy8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovCisKK3VsZyB3aW5kb3dfc2l6ZSA9ICh1bGcpMipXU0laRTsKKy8qIHdpbmRvdyBzaXplLCAyKldTSVpFIGV4Y2VwdCBmb3IgTU1BUCBvciBCSUdfTUVNLCB3aGVyZSBpdCBpcyB0aGUKKyAqIGlucHV0IGZpbGUgbGVuZ3RoIHBsdXMgTUlOX0xPT0tBSEVBRC4KKyAqLworCitsb25nIGJsb2NrX3N0YXJ0OworLyogd2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzCisgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLgorICovCisKK2xvY2FsIHVuc2lnbmVkIGluc19oOyAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi8KKworI2RlZmluZSBIX1NISUZUICAoKEhBU0hfQklUUytNSU5fTUFUQ0gtMSkvTUlOX01BVENIKQorLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggYW5kIGRlbF9oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoCisgKiBpbnB1dCBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKKyAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOgorICogICBIX1NISUZUICogTUlOX01BVENIID49IEhBU0hfQklUUworICovCisKK3Vuc2lnbmVkIGludCBwcmV2X2xlbmd0aDsKKy8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpcworICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uCisgKi8KKworICAgICAgdW5zaWduZWQgICAgICBzdHJzdGFydDsgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovCisgICAgICB1bnNpZ25lZCAgICAgIG1hdGNoX3N0YXJ0OyAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqLworbG9jYWwgaW50ICAgICAgICAgICBlb2ZpbGU7ICAgICAgICAvKiBmbGFnIHNldCBhdCBlbmQgb2YgaW5wdXQgZmlsZSAqLworbG9jYWwgdW5zaWduZWQgICAgICBsb29rYWhlYWQ7ICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovCisKK3Vuc2lnbmVkIG1heF9jaGFpbl9sZW5ndGg7CisvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpcyBsZW5ndGguCisgKiBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlIHNwZWVkLgorICovCisKK2xvY2FsIHVuc2lnbmVkIGludCBtYXhfbGF6eV9tYXRjaDsKKy8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHkKKyAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uCisgKiBsZXZlbHMgPj0gNC4KKyAqLworI2RlZmluZSBtYXhfaW5zZXJ0X2xlbmd0aCAgbWF4X2xhenlfbWF0Y2gKKy8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGgKKyAqIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLgorICovCisKK2xvY2FsIGludCBjb21wcl9sZXZlbDsKKy8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqLworCit1bnNpZ25lZCBnb29kX21hdGNoOworLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovCisKKworLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uCisgKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG8KKyAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZQorICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IGNvbmZpZyB7CisgICB1c2ggZ29vZF9sZW5ndGg7IC8qIHJlZHVjZSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9sYXp5OyAgICAvKiBkbyBub3QgcGVyZm9ybSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG5pY2VfbGVuZ3RoOyAvKiBxdWl0IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9jaGFpbjsKK30gY29uZmlnOworCisjaWZkZWYgIEZVTExfU0VBUkNICisjIGRlZmluZSBuaWNlX21hdGNoIE1BWF9NQVRDSAorI2Vsc2UKKyAgaW50IG5pY2VfbWF0Y2g7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi8KKyNlbmRpZgorCitsb2NhbCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7CisvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCisvKiAwICovIHswLCAgICAwLCAgMCwgICAgMH0sICAvKiBzdG9yZSBvbmx5ICovCisvKiAxICovIHs0LCAgICA0LCAgOCwgICAgNH0sICAvKiBtYXhpbXVtIHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKy8qIDIgKi8gezQsICAgIDUsIDE2LCAgICA4fSwKKy8qIDMgKi8gezQsICAgIDYsIDMyLCAgIDMyfSwKKworLyogNCAqLyB7NCwgICAgNCwgMTYsICAgMTZ9LCAgLyogbGF6eSBtYXRjaGVzICovCisvKiA1ICovIHs4LCAgIDE2LCAzMiwgICAzMn0sCisvKiA2ICovIHs4LCAgIDE2LCAxMjgsIDEyOH0sCisvKiA3ICovIHs4LCAgIDMyLCAxMjgsIDI1Nn0sCisvKiA4ICovIHszMiwgMTI4LCAyNTgsIDEwMjR9LAorLyogOSAqLyB7MzIsIDI1OCwgMjU4LCA0MDk2fX07IC8qIG1heGltdW0gY29tcHJlc3Npb24gKi8KKworLyogTm90ZTogdGhlIGRlZmxhdGUoKSBjb2RlIHJlcXVpcmVzIG1heF9sYXp5ID49IE1JTl9NQVRDSCBhbmQgbWF4X2NoYWluID49IDQKKyAqIEZvciBkZWZsYXRlX2Zhc3QoKSAobGV2ZWxzIDw9IDMpIGdvb2QgaXMgaWdub3JlZCBhbmQgbGF6eSBoYXMgYSBkaWZmZXJlbnQKKyAqIG1lYW5pbmcuCisgKi8KKworI2RlZmluZSBFUVVBTCAwCisvKiByZXN1bHQgb2YgbWVtY21wIGZvciBlcXVhbCBzdHJpbmdzICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4KKyAqLworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyAgIE9GKCh2b2lkKSk7Citsb2NhbCB1bGcgZGVmbGF0ZV9mYXN0ICAgT0YoKHZvaWQpKTsKKworICAgICAgaW50ICBsb25nZXN0X21hdGNoIE9GKChJUG9zIGN1cl9tYXRjaCkpOworI2lmZGVmIEFTTVYKKyAgICAgIHZvaWQgbWF0Y2hfaW5pdCBPRigodm9pZCkpOyAvKiBhc20gY29kZSBpbml0aWFsaXphdGlvbiAqLworI2VuZGlmCisKKyNpZmRlZiBERUJVRworbG9jYWwgIHZvaWQgY2hlY2tfbWF0Y2ggT0YoKElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsIGludCBsZW5ndGgpKTsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0goaCxjKSAoaCA9ICgoKGgpPDxIX1NISUZUKSBeIChjKSkgJiBIQVNIX01BU0spCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5zZXJ0IHN0cmluZyBzIGluIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQgbWF0Y2hfaGVhZCB0byB0aGUgcHJldmlvdXMgaGVhZAorICogb2YgdGhlIGhhc2ggY2hhaW4gKHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgd2l0aCBzYW1lIGhhc2gga2V5KS4gUmV0dXJuCisgKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIElOU0VSVF9TVFJJTkcgYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogICAgaW5wdXQgY2hhcmFjdGVycyBhbmQgdGhlIGZpcnN0IE1JTl9NQVRDSCBieXRlcyBvZiBzIGFyZSB2YWxpZAorICogICAgKGV4Y2VwdCBmb3IgdGhlIGxhc3QgTUlOX01BVENILTEgYnl0ZXMgb2YgdGhlIGlucHV0IGZpbGUpLgorICovCisjZGVmaW5lIElOU0VSVF9TVFJJTkcocywgbWF0Y2hfaGVhZCkgXAorICAgKFVQREFURV9IQVNIKGluc19oLCB3aW5kb3dbKHMpICsgTUlOX01BVENILTFdKSwgXAorICAgIHByZXZbKHMpICYgV01BU0tdID0gbWF0Y2hfaGVhZCA9IGhlYWRbaW5zX2hdLCBcCisgICAgaGVhZFtpbnNfaF0gPSAocykpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgImxvbmdlc3QgbWF0Y2giIHJvdXRpbmVzIGZvciBhIG5ldyBmaWxlCisgKi8KK3ZvaWQgbG1faW5pdCAocGFja19sZXZlbCwgZmxhZ3MpCisgICAgaW50IHBhY2tfbGV2ZWw7IC8qIDA6IHN0b3JlLCAxOiBiZXN0IHNwZWVkLCA5OiBiZXN0IGNvbXByZXNzaW9uICovCisgICAgdXNoICpmbGFnczsgICAgIC8qIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyAqLworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGo7CisKKyAgICBpZiAocGFja19sZXZlbCA8IDEgfHwgcGFja19sZXZlbCA+IDkpIGVycm9yKCJiYWQgcGFjayBsZXZlbCIpOworICAgIGNvbXByX2xldmVsID0gcGFja19sZXZlbDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUuICovCisgICAgbWVtemVybygoY2hhciopaGVhZCwgSEFTSF9TSVpFKnNpemVvZigqaGVhZCkpOworCisgICAgLyogcHJldiB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHRoZSBmbHkgKi8KKworICAgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6CisgICAgICovCisgICAgbWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcGFja19sZXZlbF0ubWF4X2xhenk7CisgICAgZ29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcGFja19sZXZlbF0uZ29vZF9sZW5ndGg7CisjaWZuZGVmIEZVTExfU0VBUkNICisgICAgbmljZV9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcGFja19sZXZlbF0ubmljZV9sZW5ndGg7CisjZW5kaWYKKyAgICBtYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtwYWNrX2xldmVsXS5tYXhfY2hhaW47CisgICAgaWYgKHBhY2tfbGV2ZWwgPT0gMSkgeworICAgICAgICpmbGFncyB8PSBGQVNUOworICAgIH0gZWxzZSBpZiAocGFja19sZXZlbCA9PSA5KSB7CisgICAgICAgKmZsYWdzIHw9IFNMT1c7CisgICAgfQorICAgIC8qID8/PyByZWR1Y2UgbWF4X2NoYWluX2xlbmd0aCBmb3IgYmluYXJ5IGZpbGVzICovCisKKyAgICBzdHJzdGFydCA9IDA7CisgICAgYmxvY2tfc3RhcnQgPSAwTDsKKyNpZmRlZiBBU01WCisgICAgbWF0Y2hfaW5pdCgpOyAvKiBpbml0aWFsaXplIHRoZSBhc20gY29kZSAqLworI2VuZGlmCisKKyAgICBsb29rYWhlYWQgPSByZWFkX2J1ZigoY2hhciopd2luZG93LAorCQkJIHNpemVvZihpbnQpIDw9IDIgPyAodW5zaWduZWQpV1NJWkUgOiAyKldTSVpFKTsKKworICAgIGlmIChsb29rYWhlYWQgPT0gMCB8fCBsb29rYWhlYWQgPT0gKHVuc2lnbmVkKUVPRikgeworICAgICAgIGVvZmlsZSA9IDEsIGxvb2thaGVhZCA9IDA7CisgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlb2ZpbGUgPSAwOworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQuIFRoaXMgaXMgaW1wb3J0YW50CisgICAgICogaWYgaW5wdXQgY29tZXMgZnJvbSBhIGRldmljZSBzdWNoIGFzIGEgdHR5LgorICAgICAqLworICAgIHdoaWxlIChsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmICFlb2ZpbGUpIGZpbGxfd2luZG93KCk7CisKKyAgICBpbnNfaCA9IDA7CisgICAgZm9yIChqPTA7IGo8TUlOX01BVENILTE7IGorKykgVVBEQVRFX0hBU0goaW5zX2gsIHdpbmRvd1tqXSk7CisgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgdGhpcyBpcworICAgICAqIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KKyAgICAgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmQKKyAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXMKKyAqIGdhcmJhZ2UuCisgKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50CisgKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxCisgKi8KKyNpZm5kZWYgQVNNVgorLyogRm9yIE1TRE9TLCBPUy8yIGFuZCAzODYgVW5peCwgYW4gb3B0aW1pemVkIHZlcnNpb24gaXMgaW4gbWF0Y2guYXNtIG9yCisgKiBtYXRjaC5zLiBUaGUgY29kZSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCwgc28geW91IGNhbiB1c2UgdGhlIEMgdmVyc2lvbgorICogaWYgZGVzaXJlZC4KKyAqLworaW50IGxvbmdlc3RfbWF0Y2goY3VyX21hdGNoKQorICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworeworICAgIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IG1heF9jaGFpbl9sZW5ndGg7ICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCisgICAgcmVnaXN0ZXIgdWNoICpzY2FuID0gd2luZG93ICsgc3Ryc3RhcnQ7ICAgICAvKiBjdXJyZW50IHN0cmluZyAqLworICAgIHJlZ2lzdGVyIHVjaCAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCisgICAgaW50IGJlc3RfbGVuID0gcHJldl9sZW5ndGg7ICAgICAgICAgICAgICAgICAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi8KKyAgICBJUG9zIGxpbWl0ID0gc3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVCA/IHN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QgOiBOSUw7CisgICAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSwKKyAgICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLgorICAgICAqLworCisvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KKyAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgKi8KKyNpZiBIQVNIX0JJVFMgPCA4IHx8IE1BWF9NQVRDSCAhPSAyNTgKKyAgIGVycm9yOiBDb2RlIHRvbyBjbGV2ZXIKKyNlbmRpZgorCisjaWZkZWYgVU5BTElHTkVEX09LCisgICAgLyogQ29tcGFyZSB0d28gYnl0ZXMgYXQgYSB0aW1lLiBOb3RlOiB0aGlzIGlzIG5vdCBhbHdheXMgYmVuZWZpY2lhbC4KKyAgICAgKiBUcnkgd2l0aCBhbmQgd2l0aG91dCAtRFVOQUxJR05FRF9PSyB0byBjaGVjay4KKyAgICAgKi8KKyAgICByZWdpc3RlciB1Y2ggKnN0cmVuZCA9IHdpbmRvdyArIHN0cnN0YXJ0ICsgTUFYX01BVENIIC0gMTsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoKilzY2FuOworICAgIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2gqKShzY2FuK2Jlc3RfbGVuLTEpOworI2Vsc2UKKyAgICByZWdpc3RlciB1Y2ggKnN0cmVuZCA9IHdpbmRvdyArIHN0cnN0YXJ0ICsgTUFYX01BVENIOworICAgIHJlZ2lzdGVyIHVjaCBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICByZWdpc3RlciB1Y2ggc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisKKyAgICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLworICAgIGlmIChwcmV2X2xlbmd0aCA+PSBnb29kX21hdGNoKSB7CisgICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKKyAgICB9CisgICAgQXNzZXJ0KHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJpbnN1ZmZpY2llbnQgbG9va2FoZWFkIik7CisKKyAgICBkbyB7CisgICAgICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzdHJzdGFydCwgIm5vIGZ1dHVyZSIpOworICAgICAgICBtYXRjaCA9IHdpbmRvdyArIGN1cl9tYXRjaDsKKworICAgICAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKKyAgICAgICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMjoKKyAgICAgICAgICovCisjaWYgKGRlZmluZWQoVU5BTElHTkVEX09LKSAmJiBNQVhfTUFUQ0ggPT0gMjU4KQorICAgICAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyBzaXplb2YodW5zaWduZWQgc2hvcnQpID09IDIuIERvIG5vdCB1c2UKKyAgICAgICAgICogVU5BTElHTkVEX09LIGlmIHlvdXIgY29tcGlsZXIgdXNlcyBhIGRpZmZlcmVudCBzaXplLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCoodXNoKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKKyAgICAgICAgICAgICoodXNoKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKKworICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKKyAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKKyAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0CisgICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50CisgICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKKyAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKKyAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KKyAgICAgICAgICovCisgICAgICAgIHNjYW4rKywgbWF0Y2grKzsKKyAgICAgICAgZG8geworICAgICAgICB9IHdoaWxlICgqKHVzaCopKHNjYW4rPTIpID09ICoodXNoKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoKikoc2Nhbis9MikgPT0gKih1c2gqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2gqKShzY2FuKz0yKSA9PSAqKHVzaCopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaCopKHNjYW4rPTIpID09ICoodXNoKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworICAgICAgICAvKiBUaGUgZnVubnkgImRvIHt9IiBnZW5lcmF0ZXMgYmV0dGVyIGNvZGUgb24gbW9zdCBjb21waWxlcnMgKi8KKworICAgICAgICAvKiBIZXJlLCBzY2FuIDw9IHdpbmRvdytzdHJzdGFydCsyNTcgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW4gPD0gd2luZG93Kyh1bnNpZ25lZCkod2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICptYXRjaCkgc2NhbisrOworCisgICAgICAgIGxlbiA9IChNQVhfTUFUQ0ggLSAxKSAtIChpbnQpKHN0cmVuZC1zY2FuKTsKKyAgICAgICAgc2NhbiA9IHN0cmVuZCAtIChNQVhfTUFUQ0gtMSk7CisKKyNlbHNlIC8qIFVOQUxJR05FRF9PSyAqLworCisgICAgICAgIGlmIChtYXRjaFtiZXN0X2xlbl0gICAhPSBzY2FuX2VuZCAgfHwKKyAgICAgICAgICAgIG1hdGNoW2Jlc3RfbGVuLTFdICE9IHNjYW5fZW5kMSB8fAorICAgICAgICAgICAgKm1hdGNoICAgICAgICAgICAgIT0gKnNjYW4gICAgIHx8CisgICAgICAgICAgICAqKyttYXRjaCAgICAgICAgICAhPSBzY2FuWzFdKSAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pCisgICAgICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKKyAgICAgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguCisgICAgICAgICAqLworICAgICAgICBzY2FuICs9IDIsIG1hdGNoKys7CisKKyAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKKyAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICAgICAqLworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgICAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKKyAgICAgICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDsKKworI2VuZGlmIC8qIFVOQUxJR05FRF9PSyAqLworCisgICAgICAgIGlmIChsZW4gPiBiZXN0X2xlbikgeworICAgICAgICAgICAgbWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CisgICAgICAgICAgICBiZXN0X2xlbiA9IGxlbjsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7CisjaWZkZWYgVU5BTElHTkVEX09LCisgICAgICAgICAgICBzY2FuX2VuZCA9ICoodXNoKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgV01BU0tdKSA+IGxpbWl0CisJICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKKworICAgIHJldHVybiBiZXN0X2xlbjsKK30KKyNlbmRpZiAvKiBBU01WICovCisKKyNpZmRlZiBERUJVRworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0aGF0IHRoZSBtYXRjaCBhdCBtYXRjaF9zdGFydCBpcyBpbmRlZWQgYSBtYXRjaC4KKyAqLworbG9jYWwgdm9pZCBjaGVja19tYXRjaChzdGFydCwgbWF0Y2gsIGxlbmd0aCkKKyAgICBJUG9zIHN0YXJ0LCBtYXRjaDsKKyAgICBpbnQgbGVuZ3RoOworeworICAgIC8qIGNoZWNrIHRoYXQgdGhlIG1hdGNoIGlzIGluZGVlZCBhIG1hdGNoICovCisgICAgaWYgKG1lbWNtcCgoY2hhciopd2luZG93ICsgbWF0Y2gsCisgICAgICAgICAgICAgICAgKGNoYXIqKXdpbmRvdyArIHN0YXJ0LCBsZW5ndGgpICE9IEVRVUFMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIiBzdGFydCAlZCwgbWF0Y2ggJWQsIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKTsKKyAgICAgICAgZXJyb3IoImludmFsaWQgbWF0Y2giKTsKKyAgICB9CisgICAgaWYgKHZlcmJvc2UgPiAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJcXFslZCwlZF0iLCBzdGFydC1tYXRjaCwgbGVuZ3RoKTsKKyAgICAgICAgZG8geyBwdXRjKHdpbmRvd1tzdGFydCsrXSwgc3RkZXJyKTsgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CisgICAgfQorfQorI2Vsc2UKKyMgIGRlZmluZSBjaGVja19tYXRjaChzdGFydCwgbWF0Y2gsIGxlbmd0aCkKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuCisgKiBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQsIGFuZCBzZXRzIGVvZmlsZSBpZiBlbmQgb2YgaW5wdXQgZmlsZS4KKyAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzdHJzdGFydCArIGxvb2thaGVhZCA+IDAKKyAqIE9VVCBhc3NlcnRpb25zOiBhdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBlb2ZpbGUgaXMgc2V0OworICogICAgZmlsZSByZWFkcyBhcmUgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUKKyAqICAgIHRyYW5zbGF0ZV9lb2wgb3B0aW9uKS4KKyAqLworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdygpCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbiwgbTsKKyAgICB1bnNpZ25lZCBtb3JlID0gKHVuc2lnbmVkKSh3aW5kb3dfc2l6ZSAtICh1bGcpbG9va2FoZWFkIC0gKHVsZylzdHJzdGFydCk7CisgICAgLyogQW1vdW50IG9mIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LiAqLworCisgICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCwKKyAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLgorICAgICAqLworICAgIGlmIChtb3JlID09ICh1bnNpZ25lZClFT0YpIHsKKyAgICAgICAgLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmIHN0cnN0YXJ0ID09IDAKKyAgICAgICAgICogYW5kIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIG9uZSBieXRlIGF0IHRpbWUpCisgICAgICAgICAqLworICAgICAgICBtb3JlLS07CisgICAgfSBlbHNlIGlmIChzdHJzdGFydCA+PSBXU0laRStNQVhfRElTVCkgeworICAgICAgICAvKiBCeSB0aGUgSU4gYXNzZXJ0aW9uLCB0aGUgd2luZG93IGlzIG5vdCBlbXB0eSBzbyB3ZSBjYW4ndCBjb25mdXNlCisgICAgICAgICAqIG1vcmUgPT0gMCB3aXRoIG1vcmUgPT0gNjRLIG9uIGEgMTYgYml0IG1hY2hpbmUuCisgICAgICAgICAqLworICAgICAgICBBc3NlcnQod2luZG93X3NpemUgPT0gKHVsZykyKldTSVpFLCAibm8gc2xpZGluZyB3aXRoIEJJR19NRU0iKTsKKworICAgICAgICBtZW1jcHkoKGNoYXIqKXdpbmRvdywgKGNoYXIqKXdpbmRvdytXU0laRSwgKHVuc2lnbmVkKVdTSVpFKTsKKyAgICAgICAgbWF0Y2hfc3RhcnQgLT0gV1NJWkU7CisgICAgICAgIHN0cnN0YXJ0ICAgIC09IFdTSVpFOyAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVDogKi8KKworICAgICAgICBibG9ja19zdGFydCAtPSAobG9uZykgV1NJWkU7CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IEhBU0hfU0laRTsgbisrKSB7CisgICAgICAgICAgICBtID0gaGVhZFtuXTsKKyAgICAgICAgICAgIGhlYWRbbl0gPSAoUG9zKShtID49IFdTSVpFID8gbS1XU0laRSA6IE5JTCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChuID0gMDsgbiA8IFdTSVpFOyBuKyspIHsKKyAgICAgICAgICAgIG0gPSBwcmV2W25dOworICAgICAgICAgICAgcHJldltuXSA9IChQb3MpKG0gPj0gV1NJWkUgPyBtLVdTSVpFIDogTklMKTsKKyAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0CisgICAgICAgICAgICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgorICAgICAgICAgICAgICovCisgICAgICAgIH0KKyAgICAgICAgbW9yZSArPSBXU0laRTsKKyAgICB9CisgICAgLyogQXQgdGhpcyBwb2ludCwgbW9yZSA+PSAyICovCisgICAgaWYgKCFlb2ZpbGUpIHsKKyAgICAgICAgbiA9IHJlYWRfYnVmKChjaGFyKil3aW5kb3crc3Ryc3RhcnQrbG9va2FoZWFkLCBtb3JlKTsKKyAgICAgICAgaWYgKG4gPT0gMCB8fCBuID09ICh1bnNpZ25lZClFT0YpIHsKKyAgICAgICAgICAgIGVvZmlsZSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb29rYWhlYWQgKz0gbjsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgY3VycmVudCBibG9jaywgd2l0aCBnaXZlbiBlbmQtb2YtZmlsZSBmbGFnLgorICogSU4gYXNzZXJ0aW9uOiBzdHJzdGFydCBpcyBzZXQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtYXRjaC4KKyAqLworI2RlZmluZSBGTFVTSF9CTE9DSyhlb2YpIFwKKyAgIGZsdXNoX2Jsb2NrKGJsb2NrX3N0YXJ0ID49IDBMID8gKGNoYXIqKSZ3aW5kb3dbKHVuc2lnbmVkKWJsb2NrX3N0YXJ0XSA6IFwKKyAgICAgICAgICAgICAgICAoY2hhciopTlVMTCwgKGxvbmcpc3Ryc3RhcnQgLSBibG9ja19zdGFydCwgKGVvZikpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2Vzc2VzIGEgbmV3IGlucHV0IGZpbGUgYW5kIHJldHVybiBpdHMgY29tcHJlc3NlZCBsZW5ndGguIFRoaXMKKyAqIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9ub2YgbWF0Y2hlcyBhbmQgaW5zZXJ0cworICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0CisgKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuCisgKi8KK2xvY2FsIHVsZyBkZWZsYXRlX2Zhc3QoKQoreworICAgIElQb3MgaGFzaF9oZWFkOyAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovCisgICAgaW50IGZsdXNoOyAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworICAgIHVuc2lnbmVkIG1hdGNoX2xlbmd0aCA9IDA7ICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLworCisgICAgcHJldl9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICB3aGlsZSAobG9va2FoZWFkICE9IDApIHsKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIElOU0VSVF9TVFJJTkcoc3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisKKyAgICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0gKKyAgICAgICAgICovCisgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gTklMICYmIHN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IE1BWF9ESVNUKSB7CisgICAgICAgICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKGhhc2hfaGVhZCk7CisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLworICAgICAgICAgICAgaWYgKG1hdGNoX2xlbmd0aCA+IGxvb2thaGVhZCkgbWF0Y2hfbGVuZ3RoID0gbG9va2FoZWFkOworICAgICAgICB9CisgICAgICAgIGlmIChtYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBjaGVja19tYXRjaChzdHJzdGFydCwgbWF0Y2hfc3RhcnQsIG1hdGNoX2xlbmd0aCk7CisKKyAgICAgICAgICAgIGZsdXNoID0gY3RfdGFsbHkoc3Ryc3RhcnQtbWF0Y2hfc3RhcnQsIG1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7CisKKyAgICAgICAgICAgIGxvb2thaGVhZCAtPSBtYXRjaF9sZW5ndGg7CisKKwkgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aAorICAgICAgICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1hdGNoX2xlbmd0aCA8PSBtYXhfaW5zZXJ0X2xlbmd0aCkgeworICAgICAgICAgICAgICAgIG1hdGNoX2xlbmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiBoYXNoIHRhYmxlICovCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCsrOworICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSAorICAgICAgICAgICAgICAgICAgICAgKiB0aGVzZSBieXRlcyBhcmUgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90IG1hdHRlciBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBsb29rYWhlYWQgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkIGFzIGxpdGVyYWxzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW1hdGNoX2xlbmd0aCAhPSAwKTsKKwkgICAgICAgIHN0cnN0YXJ0Kys7CisgICAgICAgICAgICB9IGVsc2UgeworCSAgICAgICAgc3Ryc3RhcnQgKz0gbWF0Y2hfbGVuZ3RoOworCSAgICAgICAgbWF0Y2hfbGVuZ3RoID0gMDsKKwkgICAgICAgIGluc19oID0gd2luZG93W3N0cnN0YXJ0XTsKKwkgICAgICAgIFVQREFURV9IQVNIKGluc19oLCB3aW5kb3dbc3Ryc3RhcnQrMV0pOworI2lmIE1JTl9NQVRDSCAhPSAzCisgICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXMKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsd2luZG93W3N0cnN0YXJ0XSkpOworICAgICAgICAgICAgZmx1c2ggPSBjdF90YWxseSAoMCwgd2luZG93W3N0cnN0YXJ0XSk7CisgICAgICAgICAgICBsb29rYWhlYWQtLTsKKwkgICAgc3Ryc3RhcnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmx1c2gpIEZMVVNIX0JMT0NLKDApLCBibG9ja19zdGFydCA9IHN0cnN0YXJ0OworCisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKyAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlIChsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmICFlb2ZpbGUpIGZpbGxfd2luZG93KCk7CisKKyAgICB9CisgICAgcmV0dXJuIEZMVVNIX0JMT0NLKDEpOyAvKiBlb2YgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5CisgKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzCisgKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLgorICovCit1bGcgZGVmbGF0ZSgpCit7CisgICAgSVBvcyBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqLworICAgIElQb3MgcHJldl9tYXRjaDsgICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqLworICAgIGludCBmbHVzaDsgICAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KKyAgICBpbnQgbWF0Y2hfYXZhaWxhYmxlID0gMDsgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqLworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIG1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOyAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLworI2lmZGVmIERFQlVHCisgICAgZXh0ZXJuIGxvbmcgaXNpemU7ICAgICAgICAvKiBieXRlIGxlbmd0aCBvZiBpbnB1dCBmaWxlLCBmb3IgZGVidWcgb25seSAqLworI2VuZGlmCisKKyAgICBpZiAoY29tcHJfbGV2ZWwgPD0gMykgcmV0dXJuIGRlZmxhdGVfZmFzdCgpOyAvKiBvcHRpbWl6ZWQgZm9yIHNwZWVkICovCisKKyAgICAvKiBQcm9jZXNzIHRoZSBpbnB1dCBibG9jay4gKi8KKyAgICB3aGlsZSAobG9va2FoZWFkICE9IDApIHsKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIElOU0VSVF9TVFJJTkcoc3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisKKyAgICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICovCisgICAgICAgIHByZXZfbGVuZ3RoID0gbWF0Y2hfbGVuZ3RoLCBwcmV2X21hdGNoID0gbWF0Y2hfc3RhcnQ7CisgICAgICAgIG1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworCisgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gTklMICYmIHByZXZfbGVuZ3RoIDwgbWF4X2xhenlfbWF0Y2ggJiYKKyAgICAgICAgICAgIHN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IE1BWF9ESVNUKSB7CisgICAgICAgICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKGhhc2hfaGVhZCk7CisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLworICAgICAgICAgICAgaWYgKG1hdGNoX2xlbmd0aCA+IGxvb2thaGVhZCkgbWF0Y2hfbGVuZ3RoID0gbG9va2FoZWFkOworCisgICAgICAgICAgICAvKiBJZ25vcmUgYSBsZW5ndGggMyBtYXRjaCBpZiBpdCBpcyB0b28gZGlzdGFudDogKi8KKyAgICAgICAgICAgIGlmIChtYXRjaF9sZW5ndGggPT0gTUlOX01BVENIICYmIHN0cnN0YXJ0LW1hdGNoX3N0YXJ0ID4gVE9PX0ZBUil7CisgICAgICAgICAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZQorICAgICAgICAgICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbWF0Y2hfbGVuZ3RoLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50CisgICAgICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6CisgICAgICAgICAqLworICAgICAgICBpZiAocHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIG1hdGNoX2xlbmd0aCA8PSBwcmV2X2xlbmd0aCkgeworCisgICAgICAgICAgICBjaGVja19tYXRjaChzdHJzdGFydC0xLCBwcmV2X21hdGNoLCBwcmV2X2xlbmd0aCk7CisKKyAgICAgICAgICAgIGZsdXNoID0gY3RfdGFsbHkoc3Ryc3RhcnQtMS1wcmV2X21hdGNoLCBwcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxvb2thaGVhZCAtPSBwcmV2X2xlbmd0aC0xOworICAgICAgICAgICAgcHJldl9sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzdHJzdGFydCsrOworICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcoc3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSAorICAgICAgICAgICAgICAgICAqIHRoZXNlIGJ5dGVzIGFyZSBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3QgbWF0dGVyIHNpbmNlIHRoZQorICAgICAgICAgICAgICAgICAqIG5leHQgbG9va2FoZWFkIGJ5dGVzIHdpbGwgYWx3YXlzIGJlIGVtaXR0ZWQgYXMgbGl0ZXJhbHMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9IHdoaWxlICgtLXByZXZfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgbWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgIG1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgc3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIGlmIChmbHVzaCkgRkxVU0hfQkxPQ0soMCksIGJsb2NrX3N0YXJ0ID0gc3Ryc3RhcnQ7CisKKyAgICAgICAgfSBlbHNlIGlmIChtYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhCisgICAgICAgICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoCisgICAgICAgICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIix3aW5kb3dbc3Ryc3RhcnQtMV0pKTsKKyAgICAgICAgICAgIGlmIChjdF90YWxseSAoMCwgd2luZG93W3N0cnN0YXJ0LTFdKSkgeworICAgICAgICAgICAgICAgIEZMVVNIX0JMT0NLKDApLCBibG9ja19zdGFydCA9IHN0cnN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIGxvb2thaGVhZC0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvcgorICAgICAgICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1hdGNoX2F2YWlsYWJsZSA9IDE7CisgICAgICAgICAgICBzdHJzdGFydCsrOworICAgICAgICAgICAgbG9va2FoZWFkLS07CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0IChzdHJzdGFydCA8PSBpc2l6ZSAmJiBsb29rYWhlYWQgPD0gaXNpemUsICJhIGJpdCB0b28gZmFyIik7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CisgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQorICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgIWVvZmlsZSkgZmlsbF93aW5kb3coKTsKKyAgICB9CisgICAgaWYgKG1hdGNoX2F2YWlsYWJsZSkgY3RfdGFsbHkgKDAsIHdpbmRvd1tzdHJzdGFydC0xXSk7CisKKyAgICByZXR1cm4gRkxVU0hfQkxPQ0soMSk7IC8qIGVvZiAqLworfQpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvZ3ppcC5jIGIvdXNyL2d6aXAvZ3ppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGMxMjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC9nemlwLmMKQEAgLTAsMCArMSwxMjE0IEBACisvKiBnemlwIChHTlUgemlwKSAtLSBjb21wcmVzcyBmaWxlcyB3aXRoIHppcCBhbGdvcml0aG0gYW5kICdjb21wcmVzcycgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGUgdW56aXAgY29kZSB3YXMgd3JpdHRlbiBhbmQgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IE1hcmsgQWRsZXIuCisgKiBQb3J0aW9ucyBvZiB0aGUgbHp3IGNvZGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgcHVibGljIGRvbWFpbiAnY29tcHJlc3MnCisgKiB3cml0dGVuIGJ5IFNwZW5jZXIgVGhvbWFzLCBKb2UgT3Jvc3QsIEphbWVzIFdvb2RzLCBKaW0gTWNLaWUsIFN0ZXZlIERhdmllcywKKyAqIEtlbiBUdXJrb3dza2ksIERhdmUgTWFjayBhbmQgUGV0ZXIgSmFubmVzZW4uCisgKgorICogU2VlIHRoZSBsaWNlbnNlX21zZyBiZWxvdyBhbmQgdGhlIGZpbGUgQ09QWUlORyBmb3IgdGhlIHNvZnR3YXJlIGxpY2Vuc2UuCisgKiBTZWUgdGhlIGZpbGUgYWxnb3JpdGhtLmRvYyBmb3IgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgYW5kIGZpbGUgZm9ybWF0cy4KKyAqLworCitzdGF0aWMgY2hhciAgKmxpY2Vuc2VfbXNnW10gPSB7CisiICAgQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseSIsCisiICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkiLAorIiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IiwKKyIgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIiwKKyIgICBhbnkgbGF0ZXIgdmVyc2lvbi4iLAorIiIsCisiICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIiwKKyIgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiIsCisiICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSIsCisiICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4iLAorIiIsCisiICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UiLAorIiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIiwKKyIgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4iLAorMH07CisKKy8qIENvbXByZXNzIGZpbGVzIHdpdGggemlwIGFsZ29yaXRobSBhbmQgJ2NvbXByZXNzJyBpbnRlcmZhY2UuCisgKiBTZWUgdXNhZ2UoKSBhbmQgaGVscCgpIGZ1bmN0aW9ucyBiZWxvdyBmb3IgYWxsIG9wdGlvbnMuCisgKiBPdXRwdXRzOgorICogICAgICAgIGZpbGUuZ3o6ICAgY29tcHJlc3NlZCBmaWxlIHdpdGggc2FtZSBtb2RlLCBvd25lciwgYW5kIHV0aW1lcworICogICAgIG9yIHN0ZG91dCB3aXRoIC1jIG9wdGlvbiBvciBpZiBzdGRpbiB1c2VkIGFzIGlucHV0LgorICogSWYgdGhlIG91dHB1dCBmaWxlIG5hbWUgaGFkIHRvIGJlIHRydW5jYXRlZCwgdGhlIG9yaWdpbmFsIG5hbWUgaXMga2VwdAorICogaW4gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAqIE9uIE1TRE9TLCBmaWxlLnRtcCAtPiBmaWxlLnRtei4gT24gVk1TLCBmaWxlLnRtcCAtPiBmaWxlLnRtcC1nei4KKyAqCisgKiBVc2luZyBneiBvbiBNU0RPUyB3b3VsZCBjcmVhdGUgdG9vIG1hbnkgZmlsZSBuYW1lIGNvbmZsaWN0cy4gRm9yCisgKiBleGFtcGxlLCBmb28udHh0IC0+IGZvby50Z3ogKC50Z3ogbXVzdCBiZSByZXNlcnZlZCBhcyBzaG9ydGhhbmQgZm9yCisgKiB0YXIuZ3opLiBTaW1pbGFybHksIGZvby5kaXIgYW5kIGZvby5kb2Mgd291bGQgYm90aCBiZSBtYXBwZWQgdG8gZm9vLmRnei4KKyAqIEkgYWxzbyBjb25zaWRlcmVkIDEyMzQ1Njc4LnR4dCAtPiAxMjM0NXR4dC5neiBidXQgdGhpcyB0cnVuY2F0ZXMgdGhlIG5hbWUKKyAqIHRvbyBoZWF2aWx5LiBUaGVyZSBpcyBubyBpZGVhbCBzb2x1dGlvbiBnaXZlbiB0aGUgTVNET1MgOCszIGxpbWl0YXRpb24uCisgKgorICogRm9yIHRoZSBtZWFuaW5nIG9mIGFsbCBjb21waWxhdGlvbiBmbGFncywgc2VlIGNvbW1lbnRzIGluIE1ha2VmaWxlLmluLgorICovCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGd6aXAuYyx2IDEuMyAyMDA1LzAyLzEyIDIxOjAzOjI4IG9saCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAidGFpbG9yLmgiCisjaW5jbHVkZSAiZ3ppcC5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHV0aW1lLmg+CisKK3R5cGVkZWYgdm9pZCAoKnNpZ190eXBlKSBPRigoaW50KSk7CisKKyNkZWZpbmUgUldfVVNFUiAoU19JUlVTUiB8IFNfSVdVU1IpICAvKiBjcmVhdGlvbiBtb2RlIGZvciBvcGVuKCkgKi8KKworI2lmbmRlZiBNQVhfUEFUSF9MRU4KKyMgIGRlZmluZSBNQVhfUEFUSF9MRU4gICAxMDI0IC8qIG1heCBwYXRobmFtZSBsZW5ndGggKi8KKyNlbmRpZgorCisJCS8qIGdsb2JhbCBidWZmZXJzICovCisKK0RFQ0xBUkUodWNoLCBpbmJ1ZiwgIElOQlVGU0laICtJTkJVRl9FWFRSQSk7CitERUNMQVJFKHVjaCwgb3V0YnVmLCBPVVRCVUZTSVorT1VUQlVGX0VYVFJBKTsKK0RFQ0xBUkUodXNoLCBkX2J1ZiwgIERJU1RfQlVGU0laRSk7CitERUNMQVJFKHVjaCwgd2luZG93LCAyTCpXU0laRSk7CitERUNMQVJFKHVzaCwgdGFiX3ByZWZpeCwgMUw8PEJJVFMpOworCisJCS8qIGxvY2FsIHZhcmlhYmxlcyAqLworCisjaWZuZGVmIFNVUFBPUlRfWklQCisjZGVmaW5lIGRlY29tcHJlc3MgMQorI2Vsc2UKK2ludCBsZXZlbCA9IDY7ICAgICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAqLworI2VuZGlmCisKK2ludCB0b19zdGRvdXQ7ICAgICAgICAvKiBvdXRwdXQgdG8gc3Rkb3V0ICgtYykgKi8KKyNpZm5kZWYgZGVjb21wcmVzcworaW50IGRlY29tcHJlc3M7ICAgICAgIC8qIGRlY29tcHJlc3MgKC1kKSAqLworI2VuZGlmCitpbnQgZm9yY2U7ICAgICAgICAgICAgLyogZG9uJ3QgYXNrIHF1ZXN0aW9ucywgY29tcHJlc3MgbGlua3MgKC1mKSAqLworaW50IG5vX25hbWUgPSAtMTsgICAgIC8qIGRvbid0IHNhdmUgb3IgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lICovCitpbnQgbm9fdGltZSA9IC0xOyAgICAgLyogZG9uJ3Qgc2F2ZSBvciByZXN0b3JlIHRoZSBvcmlnaW5hbCBmaWxlIHRpbWUgKi8KK2ludCB2ZXJib3NlOyAgICAgICAgICAvKiBiZSB2ZXJib3NlICgtdikgKi8KK2ludCBxdWlldDsgICAgICAgICAgICAvKiBiZSB2ZXJ5IHF1aWV0ICgtcSkgKi8KK2ludCB0ZXN0OyAgICAgICAgICAgICAvKiB0ZXN0IC5neiBmaWxlIGludGVncml0eSAqLworaW50IGZvcmVncm91bmQ7ICAgICAgIC8qIHNldCBpZiBwcm9ncmFtIHJ1biBpbiBmb3JlZ3JvdW5kICovCitjaGFyICpwcm9nbmFtZTsgICAgICAgLyogcHJvZ3JhbSBuYW1lICovCitpbnQgbWV0aG9kID0gREVGTEFURUQ7LyogY29tcHJlc3Npb24gbWV0aG9kICovCitpbnQgZXhpdF9jb2RlID0gT0s7ICAgLyogcHJvZ3JhbSBleGl0IGNvZGUgKi8KK2ludCBzYXZlX29yaWdfbmFtZTsgICAvKiBzZXQgaWYgb3JpZ2luYWwgbmFtZSBtdXN0IGJlIHNhdmVkICovCitpbnQgbGFzdF9tZW1iZXI7ICAgICAgLyogc2V0IGZvciAuemlwIGFuZCAuWiBmaWxlcyAqLworaW50IHBhcnRfbmI7ICAgICAgICAgIC8qIG51bWJlciBvZiBwYXJ0cyBpbiAuZ3ogZmlsZSAqLwordGltZV90IHRpbWVfc3RhbXA7IC8qIG9yaWdpbmFsIHRpbWUgc3RhbXAgKG1vZGlmaWNhdGlvbiB0aW1lKSAqLworbG9uZyBpZmlsZV9zaXplOyAgICAgIC8qIGlucHV0IGZpbGUgc2l6ZSwgLTEgZm9yIGRldmljZXMgKGRlYnVnIG9ubHkpICovCitjaGFyICplbnY7ICAgICAgICAgICAgLyogY29udGVudHMgb2YgR1pJUCBlbnYgdmFyaWFibGUgKi8KK2NoYXIgKiphcmdzID0gTlVMTDsgICAvKiBhcmd2IHBvaW50ZXIgaWYgR1pJUCBlbnYgdmFyaWFibGUgZGVmaW5lZCAqLworY2hhciB6X3N1ZmZpeFtNQVhfU1VGRklYKzFdOyAvKiBkZWZhdWx0IHN1ZmZpeCAoY2FuIGJlIHNldCB3aXRoIC0tc3VmZml4KSAqLworaW50ICB6X2xlbjsgICAgICAgICAgIC8qIHN0cmxlbih6X3N1ZmZpeCkgKi8KKworbG9uZyBoZWFkZXJfYnl0ZXM7CSAgIC8qIG51bWJlciBvZiBieXRlcyBpbiBnemlwIGhlYWRlciAqLworbG9uZyBieXRlc19pbjsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGlucHV0IGJ5dGVzICovCitsb25nIGJ5dGVzX291dDsgICAgICAgICAgICAvKiBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzICovCitsb25nIHRvdGFsX2luOyAgICAgICAgICAgICAvKiBpbnB1dCBieXRlcyBmb3IgYWxsIGZpbGVzICovCitsb25nIHRvdGFsX291dDsgICAgICAgICAgICAvKiBvdXRwdXQgYnl0ZXMgZm9yIGFsbCBmaWxlcyAqLworY2hhciBpZm5hbWVbTUFYX1BBVEhfTEVOXTsgLyogaW5wdXQgZmlsZSBuYW1lICovCitjaGFyIG9mbmFtZVtNQVhfUEFUSF9MRU5dOyAvKiBvdXRwdXQgZmlsZSBuYW1lICovCitpbnQgIHJlbW92ZV9vZm5hbWU7CSAgIC8qIHJlbW92ZSBvdXRwdXQgZmlsZSBvbiBlcnJvciAqLworc3RydWN0IHN0YXQgaXN0YXQ7ICAgICAgICAgLyogc3RhdHVzIGZvciBpbnB1dCBmaWxlICovCitpbnQgIGlmZDsgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBmaWxlIGRlc2NyaXB0b3IgKi8KK2ludCAgb2ZkOyAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCBmaWxlIGRlc2NyaXB0b3IgKi8KK3Vuc2lnbmVkIGluc2l6ZTsgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIGluYnVmICovCit1bnNpZ25lZCBpbnB0cjsgICAgICAgICAgICAvKiBpbmRleCBvZiBuZXh0IGJ5dGUgdG8gYmUgcHJvY2Vzc2VkIGluIGluYnVmICovCit1bnNpZ25lZCBvdXRjbnQ7ICAgICAgICAgICAvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCisKKy8qIGxvY2FsIGZ1bmN0aW9ucyAqLworCitsb2NhbCB2b2lkIHVzYWdlICAgICAgICBPRigodm9pZCkpOworbG9jYWwgdm9pZCBoZWxwICAgICAgICAgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgbGljZW5zZSAgICAgIE9GKCh2b2lkKSk7Citsb2NhbCB2b2lkIHZlcnNpb24gICAgICBPRigodm9pZCkpOworbG9jYWwgdm9pZCB0cmVhdF9zdGRpbiAgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgdHJlYXRfZmlsZSAgIE9GKChjaGFyICppbmFtZSkpOworbG9jYWwgaW50IGNyZWF0ZV9vdXRmaWxlIE9GKCh2b2lkKSk7Citsb2NhbCBpbnQgIGRvX3N0YXQgICAgICBPRigoY2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKnNidWYpKTsKK2xvY2FsIGNoYXIgKmdldF9zdWZmaXggIE9GKChjaGFyICpuYW1lKSk7Citsb2NhbCBpbnQgIGdldF9pc3RhdCAgICBPRigoY2hhciAqaW5hbWUsIHN0cnVjdCBzdGF0ICpzYnVmKSk7Citsb2NhbCBpbnQgIG1ha2Vfb2ZuYW1lICBPRigodm9pZCkpOworbG9jYWwgaW50ICBzYW1lX2ZpbGUgICAgT0YoKHN0cnVjdCBzdGF0ICpzdGF0MSwgc3RydWN0IHN0YXQgKnN0YXQyKSk7Citsb2NhbCBpbnQgbmFtZV90b29fbG9uZyBPRigoY2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKnN0YXRiKSk7Citsb2NhbCB2b2lkIHNob3J0ZW5fbmFtZSAgT0YoKGNoYXIgKm5hbWUpKTsKK2xvY2FsIGludCAgZ2V0X21ldGhvZCAgIE9GKCh2b2lkKSk7Citsb2NhbCBpbnQgIGNoZWNrX29mbmFtZSBPRigodm9pZCkpOworbG9jYWwgdm9pZCBjb3B5X3N0YXQgICAgT0YoKHN0cnVjdCBzdGF0ICppZnN0YXQpKTsKK2xvY2FsIHZvaWQgZG9fZXhpdCAgICAgIE9GKChpbnQgZXhpdGNvZGUpKTsKKyAgICAgIGludCBtYWluICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKK2ludCAoKndvcmspIE9GKChpbnQgaW5maWxlLCBpbnQgb3V0ZmlsZSkpCisjaWZkZWYgU1VQUE9SVF9aSVAKKyA9IHppcDsgLyogZnVuY3Rpb24gdG8gY2FsbCAqLworI2Vsc2UKKyA9IHVuemlwOworI2VuZGlmCitsb2NhbCB2b2lkIHJlc2V0X3RpbWVzICBPRigoY2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKnN0YXRiKSk7CisKKyNkZWZpbmUgc3RyZXF1KHMxLCBzMikgKHN0cmNtcCgoczEpLChzMikpID09IDApCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdm9pZCB1c2FnZSgpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWy1jZGZobExuTnR2VjE5XSBbLVMgc3VmZml4XSBbZmlsZSAuLi5dXG4iLAorCSAgICBwcm9nbmFtZSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdm9pZCBoZWxwKCkKK3sKKyAgICBzdGF0aWMgY2hhciAgKmhlbHBfbXNnW10gPSB7CisgIiAtYyAtLXN0ZG91dCAgICAgIHdyaXRlIG9uIHN0YW5kYXJkIG91dHB1dCwga2VlcCBvcmlnaW5hbCBmaWxlcyB1bmNoYW5nZWQiLAorICIgLWQgLS1kZWNvbXByZXNzICBkZWNvbXByZXNzIiwKKyAiIC1mIC0tZm9yY2UgICAgICAgZm9yY2Ugb3ZlcndyaXRlIG9mIG91dHB1dCBmaWxlIGFuZCBjb21wcmVzcyBsaW5rcyIsCisgIiAtaCAtLWhlbHAgICAgICAgIGdpdmUgdGhpcyBoZWxwIiwKKyAiIC1MIC0tbGljZW5zZSAgICAgZGlzcGxheSBzb2Z0d2FyZSBsaWNlbnNlIiwKKyNpZmRlZiBVTkRPQ1VNRU5URUQKKyAiIC1tIC0tbm8tdGltZSAgICAgZG8gbm90IHNhdmUgb3IgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbW9kaWZpY2F0aW9uIHRpbWUiLAorICIgLU0gLS10aW1lICAgICAgICBzYXZlIG9yIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG1vZGlmaWNhdGlvbiB0aW1lIiwKKyNlbmRpZgorICIgLW4gLS1uby1uYW1lICAgICBkbyBub3Qgc2F2ZSBvciByZXN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCB0aW1lIHN0YW1wIiwKKyAiIC1OIC0tbmFtZSAgICAgICAgc2F2ZSBvciByZXN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCB0aW1lIHN0YW1wIiwKKyAiIC1xIC0tcXVpZXQgICAgICAgc3VwcHJlc3MgYWxsIHdhcm5pbmdzIiwKKyAiIC1TIC5zdWYgIC0tc3VmZml4IC5zdWYgICAgIHVzZSBzdWZmaXggLnN1ZiBvbiBjb21wcmVzc2VkIGZpbGVzIiwKKyAiIC10IC0tdGVzdCAgICAgICAgdGVzdCBjb21wcmVzc2VkIGZpbGUgaW50ZWdyaXR5IiwKKyAiIC12IC0tdmVyYm9zZSAgICAgdmVyYm9zZSBtb2RlIiwKKyAiIC1WIC0tdmVyc2lvbiAgICAgZGlzcGxheSB2ZXJzaW9uIG51bWJlciIsCisjaWZkZWYgU1VQUE9SVF9aSVAKKyAiIC0xIC0tZmFzdCAgICAgICAgY29tcHJlc3MgZmFzdGVyIiwKKyAiIC05IC0tYmVzdCAgICAgICAgY29tcHJlc3MgYmV0dGVyIiwKKyAiIGZpbGUuLi4gICAgICAgICAgZmlsZXMgdG8gKGRlKWNvbXByZXNzLiBJZiBub25lIGdpdmVuLCB1c2Ugc3RhbmRhcmQgaW5wdXQuIiwKKyNlbHNlCisgIiBmaWxlLi4uICAgICAgICAgIGZpbGVzIHRvIGRlY29tcHJlc3MuIElmIG5vbmUgZ2l2ZW4sIHVzZSBzdGFuZGFyZCBpbnB1dC4iLAorI2VuZGlmCisgIDB9OworICAgIGNoYXIgKipwID0gaGVscF9tc2c7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwiJXMgJXMgKCVzKVxuIiwgcHJvZ25hbWUsIFZFUlNJT04sIFJFVkRBVEUpOworICAgIHVzYWdlKCk7CisgICAgd2hpbGUgKCpwKSBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCAqcCsrKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB2b2lkIGxpY2Vuc2UoKQoreworICAgIGNoYXIgKipwID0gbGljZW5zZV9tc2c7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwiJXMgJXMgKCVzKVxuIiwgcHJvZ25hbWUsIFZFUlNJT04sIFJFVkRBVEUpOworICAgIHdoaWxlICgqcCkgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgKnArKyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdm9pZCB2ZXJzaW9uKCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwiJXMgJXMgKCVzKVxuIiwgcHJvZ25hbWUsIFZFUlNJT04sIFJFVkRBVEUpOworCisgICAgZnByaW50ZihzdGRlcnIsICJDb21waWxhdGlvbiBvcHRpb25zOiBVVElNRSBTVERDX0hFQURFUlMiCisjaWZuZGVmIFNVUFBPUlRfWklQCisJIiBERUNPTVBSRVNTX09OTFkiCisjZW5kaWYKKwkiXG4iKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgbWFpbiAoYXJnYywgYXJndikKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICoqYXJndjsKK3sKKyAgICBpbnQgZmlsZV9jb3VudDsgICAgIC8qIG51bWJlciBvZiBmaWxlcyB0byBwcmVjZXNzICovCisgICAgaW50IHByb2dsZW47ICAgICAgICAvKiBsZW5ndGggb2YgcHJvZ25hbWUgKi8KKyAgICBpbnQgb3B0YzsgICAgICAgICAgIC8qIGN1cnJlbnQgb3B0aW9uICovCisKKyAgICBwcm9nbmFtZSA9IGJhc2VuYW1lKGFyZ3ZbMF0pOworICAgIHByb2dsZW4gPSBzdHJsZW4ocHJvZ25hbWUpOworCisgICAgLyogQWRkIG9wdGlvbnMgaW4gR1pJUCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB0aGVyZSBpcyBvbmUgKi8KKyAgICBlbnYgPSBhZGRfZW52b3B0KCZhcmdjLCAmYXJndiwgT1BUSU9OU19WQVIpOworICAgIGlmIChlbnYgIT0gTlVMTCkgYXJncyA9IGFyZ3Y7CisKKyAgICBmb3JlZ3JvdW5kID0gc3lzdl9zaWduYWwoU0lHSU5ULCBTSUdfSUdOKSAhPSBTSUdfSUdOOworICAgIGlmIChmb3JlZ3JvdW5kKSB7CisJKHZvaWQpIHN5c3Zfc2lnbmFsKFNJR0lOVCwgKHNpZ190eXBlKWFib3J0X2d6aXApOworICAgIH0KKyNpZmRlZiBTSUdURVJNCisgICAgaWYgKHN5c3Zfc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pICE9IFNJR19JR04pIHsKKwkodm9pZCkgc3lzdl9zaWduYWwoU0lHVEVSTSwgKHNpZ190eXBlKWFib3J0X2d6aXApOworICAgIH0KKyNlbmRpZgorI2lmZGVmIFNJR0hVUAorICAgIGlmIChzeXN2X3NpZ25hbChTSUdIVVAsIFNJR19JR04pICE9IFNJR19JR04pIHsKKwkodm9pZCkgc3lzdl9zaWduYWwoU0lHSFVQLCAgKHNpZ190eXBlKWFib3J0X2d6aXApOworICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIEdOVV9TVEFOREFSRAorICAgIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGNvbXByZXNzLCB1c2UgcHJvZ3JhbSBuYW1lIGFzIGFuIG9wdGlvbi4KKyAgICAgKiBJZiB5b3UgY29tcGlsZSB3aXRoIC1ER05VX1NUQU5EQVJELCB0aGlzIHByb2dyYW0gd2lsbCBiZWhhdmUgYXMKKyAgICAgKiBnemlwIGV2ZW4gaWYgaXQgaXMgaW52b2tlZCB1bmRlciB0aGUgbmFtZSBndW56aXAgb3IgemNhdC4KKyAgICAgKgorICAgICAqIFN5c3RlbXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgbGlua3MgY2FuIHN0aWxsIHVzZSAtZCBvciAtZGMuCisgICAgICogSWdub3JlIGFuIC5leGUgZXh0ZW5zaW9uIGZvciBNU0RPUywgT1MvMiBhbmQgVk1TLgorICAgICAqLworI2lmbmRlZiBkZWNvbXByZXNzCisgICAgaWYgKCAgc3RybmNtcChwcm9nbmFtZSwgInVuIiwgIDIpID09IDAgICAgIC8qIHVuZ3ppcCwgdW5jb21wcmVzcyAqLworICAgICAgIHx8IHN0cm5jbXAocHJvZ25hbWUsICJndW4iLCAzKSA9PSAwKSB7ICAvKiBndW56aXAgKi8KKwlkZWNvbXByZXNzID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc3RyZXF1KHByb2duYW1lKzEsICJjYXQiKSAgICAgICAvKiB6Y2F0LCBwY2F0LCBnY2F0ICovCisJfHwgc3RyZXF1KHByb2duYW1lLCAiZ3pjYXQiKSkgeyAgICAvKiBnemNhdCAqLworI2lmbmRlZiBkZWNvbXByZXNzCisJZGVjb21wcmVzcyA9IDE7CisjZW5kaWYKKwl0b19zdGRvdXQgPSAxOworICAgIH0KKyNlbmRpZgorCisgICAgc3RybmNweSh6X3N1ZmZpeCwgWl9TVUZGSVgsIHNpemVvZih6X3N1ZmZpeCktMSk7CisgICAgel9sZW4gPSBzdHJsZW4oel9zdWZmaXgpOworCisgICAgd2hpbGUgKChvcHRjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJjZGZoSD9MbU1uTnFyUzp0dlYxMjM0NTY3ODkiKSkgIT0gRU9GKSB7CisJc3dpdGNoIChvcHRjKSB7CisJY2FzZSAnYyc6CisJICAgIHRvX3N0ZG91dCA9IDE7IGJyZWFrOworCWNhc2UgJ2QnOgorI2lmbmRlZiBkZWNvbXByZXNzCisJICAgIGRlY29tcHJlc3MgPSAxOworI2VuZGlmCisJICAgIGJyZWFrOworCWNhc2UgJ2YnOgorCSAgICBmb3JjZSsrOyBicmVhazsKKwljYXNlICdoJzogY2FzZSAnSCc6IGNhc2UgJz8nOgorCSAgICBoZWxwKCk7IGRvX2V4aXQoT0spOyBicmVhazsKKwljYXNlICdMJzoKKwkgICAgbGljZW5zZSgpOyBkb19leGl0KE9LKTsgYnJlYWs7CisJY2FzZSAnbSc6IC8qIHVuZG9jdW1lbnRlZCwgbWF5IGNoYW5nZSBsYXRlciAqLworCSAgICBub190aW1lID0gMTsgYnJlYWs7CisJY2FzZSAnTSc6IC8qIHVuZG9jdW1lbnRlZCwgbWF5IGNoYW5nZSBsYXRlciAqLworCSAgICBub190aW1lID0gMDsgYnJlYWs7CisJY2FzZSAnbic6CisJICAgIG5vX25hbWUgPSBub190aW1lID0gMTsgYnJlYWs7CisJY2FzZSAnTic6CisJICAgIG5vX25hbWUgPSBub190aW1lID0gMDsgYnJlYWs7CisJY2FzZSAncSc6CisJICAgIHF1aWV0ID0gMTsgdmVyYm9zZSA9IDA7IGJyZWFrOworCWNhc2UgJ1MnOgorICAgICAgICAgICAgel9sZW4gPSBzdHJsZW4ob3B0YXJnKTsKKyAgICAgICAgICAgIHN0cmNweSh6X3N1ZmZpeCwgb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgJ3QnOgorCSAgICB0ZXN0ID0gdG9fc3Rkb3V0ID0gMTsKKyNpZm5kZWYgZGVjb21wcmVzcworCSAgICBkZWNvbXByZXNzID0gMTsKKyNlbmRpZgorCSAgICBicmVhazsKKwljYXNlICd2JzoKKwkgICAgdmVyYm9zZSsrOyBxdWlldCA9IDA7IGJyZWFrOworCWNhc2UgJ1YnOgorCSAgICB2ZXJzaW9uKCk7IGRvX2V4aXQoT0spOyBicmVhazsKKyNpZmRlZiBTVVBQT1JUX1pJUAorCWNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzogIGNhc2UgJzQnOgorCWNhc2UgJzUnOiAgY2FzZSAnNic6ICBjYXNlICc3JzogIGNhc2UgJzgnOiAgY2FzZSAnOSc6CisJICAgIGxldmVsID0gb3B0YyAtICcwJzsKKwkgICAgYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCSAgICAvKiBFcnJvciBtZXNzYWdlIGFscmVhZHkgZW1pdHRlZCBieSBnZXRvcHRfbG9uZy4gKi8KKwkgICAgdXNhZ2UoKTsKKwkgICAgZG9fZXhpdChFUlJPUik7CisJfQorICAgIH0gLyogbG9vcCBvbiBhbGwgYXJndW1lbnRzICovCisKKyAgICAvKiBCeSBkZWZhdWx0LCBzYXZlIG5hbWUgYW5kIHRpbWVzdGFtcCBvbiBjb21wcmVzc2lvbiBidXQgZG8gbm90CisgICAgICogcmVzdG9yZSB0aGVtIG9uIGRlY29tcHJlc3Npb24uCisgICAgICovCisgICAgaWYgKG5vX3RpbWUgPCAwKSBub190aW1lID0gZGVjb21wcmVzczsKKyAgICBpZiAobm9fbmFtZSA8IDApIG5vX25hbWUgPSBkZWNvbXByZXNzOworCisgICAgZmlsZV9jb3VudCA9IGFyZ2MgLSBvcHRpbmQ7CisKKyAgICBpZiAoKHpfbGVuID09IDAgJiYgIWRlY29tcHJlc3MpIHx8IHpfbGVuID4gTUFYX1NVRkZJWCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbmNvcnJlY3Qgc3VmZml4ICclcydcbiIsCisgICAgICAgICAgICAgICAgcHJvZ25hbWUsIG9wdGFyZyk7CisgICAgICAgIGRvX2V4aXQoRVJST1IpOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFsbCBnbG9iYWwgYnVmZmVycyAoZm9yIERZTl9BTExPQyBvcHRpb24pICovCisgICAgQUxMT0ModWNoLCBpbmJ1ZiwgIElOQlVGU0laICtJTkJVRl9FWFRSQSk7CisgICAgQUxMT0ModWNoLCBvdXRidWYsIE9VVEJVRlNJWitPVVRCVUZfRVhUUkEpOworICAgIEFMTE9DKHVzaCwgZF9idWYsICBESVNUX0JVRlNJWkUpOworICAgIEFMTE9DKHVjaCwgd2luZG93LCAyTCpXU0laRSk7CisgICAgQUxMT0ModXNoLCB0YWJfcHJlZml4LCAxTDw8QklUUyk7CisKKyAgICAvKiBBbmQgZ2V0IHRvIHdvcmsgKi8KKyAgICBpZiAoZmlsZV9jb3VudCAhPSAwKSB7CisgICAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKSB7CisJICAgIHRyZWF0X2ZpbGUoYXJndltvcHRpbmQrK10pOworCX0KKyAgICB9IGVsc2UgeyAgLyogU3RhbmRhcmQgaW5wdXQgKi8KKwl0cmVhdF9zdGRpbigpOworICAgIH0KKyAgICBkb19leGl0KGV4aXRfY29kZSk7CisgICAgcmV0dXJuIGV4aXRfY29kZTsgLyoganVzdCB0byBhdm9pZCBsaW50IHdhcm5pbmcgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wcmVzcyBvciBkZWNvbXByZXNzIHN0ZGluCisgKi8KK2xvY2FsIHZvaWQgdHJlYXRfc3RkaW4oKQoreworICAgIGlmICghZm9yY2UgJiYKKwlpc2F0dHkoZmlsZW5vKChGSUxFICopKGRlY29tcHJlc3MgPyBzdGRpbiA6IHN0ZG91dCkpKSkgeworCS8qIERvIG5vdCBzZW5kIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgdGVybWluYWwgb3IgcmVhZCBpdCBmcm9tCisJICogdGhlIHRlcm1pbmFsLiBXZSBnZXQgaGVyZSB3aGVuIHVzZXIgaW52b2tlZCB0aGUgcHJvZ3JhbQorCSAqIHdpdGhvdXQgcGFyYW1ldGVycywgc28gYmUgaGVscGZ1bC4gQWNjb3JkaW5nIHRvIHRoZSBHTlUgc3RhbmRhcmRzOgorCSAqCisJICogICBJZiB0aGVyZSBpcyBvbmUgYmVoYXZpb3IgeW91IHRoaW5rIGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIG91dHB1dAorCSAqICAgaXMgdG8gYSB0ZXJtaW5hbCwgYW5kIGFub3RoZXIgdGhhdCB5b3UgdGhpbmsgaXMgbW9zdCB1c2VmdWwgd2hlbgorCSAqICAgdGhlIG91dHB1dCBpcyBhIGZpbGUgb3IgYSBwaXBlLCB0aGVuIGl0IGlzIHVzdWFsbHkgYmVzdCB0byBtYWtlCisJICogICB0aGUgZGVmYXVsdCBiZWhhdmlvciB0aGUgb25lIHRoYXQgaXMgdXNlZnVsIHdpdGggb3V0cHV0IHRvIGEKKwkgKiAgIHRlcm1pbmFsLCBhbmQgaGF2ZSBhbiBvcHRpb24gZm9yIHRoZSBvdGhlciBiZWhhdmlvci4KKwkgKgorCSAqIEhlcmUgd2UgdXNlIHRoZSAtLWZvcmNlIG9wdGlvbiB0byBnZXQgdGhlIG90aGVyIGJlaGF2aW9yLgorCSAqLworCWZwcmludGYoc3RkZXJyLAorICAgICIlczogY29tcHJlc3NlZCBkYXRhIG5vdCAlcyBhIHRlcm1pbmFsLiBVc2UgLWYgdG8gZm9yY2UgJXNjb21wcmVzc2lvbi5cbiIsCisJCXByb2duYW1lLCBkZWNvbXByZXNzID8gInJlYWQgZnJvbSIgOiAid3JpdHRlbiB0byIsCisJCWRlY29tcHJlc3MgPyAiZGUiIDogIiIpOworCWZwcmludGYoc3RkZXJyLCJGb3IgaGVscCwgdHlwZTogJXMgLWhcbiIsIHByb2duYW1lKTsKKwlkb19leGl0KEVSUk9SKTsKKyAgICB9CisKKyAgICBzdHJjcHkoaWZuYW1lLCAic3RkaW4iKTsKKyAgICBzdHJjcHkob2ZuYW1lLCAic3Rkb3V0Iik7CisKKyAgICAvKiBHZXQgdGhlIHRpbWUgc3RhbXAgb24gdGhlIGlucHV0IGZpbGUuICovCisgICAgdGltZV9zdGFtcCA9IDA7IC8qIHRpbWUgdW5rbm93biBieSBkZWZhdWx0ICovCisKKyAgICBpZiAoIW5vX3RpbWUpIHsKKwlpZiAoZnN0YXQoZmlsZW5vKHN0ZGluKSwgJmlzdGF0KSAhPSAwKSB7CisJICAgIGVycm9yKCJmc3RhdChzdGRpbikiKTsKKwl9CisJdGltZV9zdGFtcCA9IGlzdGF0LnN0X210aW1lOworICAgIH0KKyAgICBpZmlsZV9zaXplID0gLTFMOyAvKiBjb252ZW50aW9uIGZvciB1bmtub3duIHNpemUgKi8KKworICAgIGNsZWFyX2J1ZnMoKTsgLyogY2xlYXIgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzICovCisgICAgdG9fc3Rkb3V0ID0gMTsKKyAgICBwYXJ0X25iID0gMDsKKworICAgIGlmIChkZWNvbXByZXNzKSB7CisJbWV0aG9kID0gZ2V0X21ldGhvZCgpOworCWlmIChtZXRob2QgPCAwKSB7CisJICAgIGRvX2V4aXQoZXhpdF9jb2RlKTsgLyogZXJyb3IgbWVzc2FnZSBhbHJlYWR5IGVtaXR0ZWQgKi8KKwl9CisgICAgfQorCisgICAgLyogQWN0dWFsbHkgZG8gdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uIExvb3Agb3ZlciB6aXBwZWQgbWVtYmVycy4KKyAgICAgKi8KKyAgICBmb3IgKDs7KSB7CisJaWYgKCgqd29yaykoZmlsZW5vKHN0ZGluKSwgZmlsZW5vKHN0ZG91dCkpICE9IE9LKSByZXR1cm47CisKKwlpZiAoIWRlY29tcHJlc3MgfHwgbGFzdF9tZW1iZXIgfHwgaW5wdHIgPT0gaW5zaXplKSBicmVhazsKKwkvKiBlbmQgb2YgZmlsZSAqLworCisJbWV0aG9kID0gZ2V0X21ldGhvZCgpOworCWlmIChtZXRob2QgPCAwKSByZXR1cm47IC8qIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSBlbWl0dGVkICovCisJYnl0ZXNfb3V0ID0gMDsgICAgICAgICAgICAvKiByZXF1aXJlZCBmb3IgbGVuZ3RoIGNoZWNrICovCisgICAgfQorCisgICAgaWYgKHZlcmJvc2UpIHsKKwlpZiAodGVzdCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiBPS1xuIik7CisKKwl9IGVsc2UgaWYgKCFkZWNvbXByZXNzKSB7CisJICAgIGRpc3BsYXlfcmF0aW8oYnl0ZXNfaW4tKGJ5dGVzX291dC1oZWFkZXJfYnl0ZXMpLCBieXRlc19pbiwgc3RkZXJyKTsKKwkgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworI2lmZGVmIERJU1BMQVlfU1RESU5fUkFUSU8KKwl9IGVsc2UgeworCSAgICBkaXNwbGF5X3JhdGlvKGJ5dGVzX291dC0oYnl0ZXNfaW4taGVhZGVyX2J5dGVzKSwgYnl0ZXNfb3V0LHN0ZGVycik7CisJICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorCX0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyB0aGUgZ2l2ZW4gZmlsZQorICovCitsb2NhbCB2b2lkIHRyZWF0X2ZpbGUoaW5hbWUpCisgICAgY2hhciAqaW5hbWU7Cit7CisgICAgLyogQWNjZXB0ICItIiBhcyBzeW5vbnltIGZvciBzdGRpbiAqLworICAgIGlmIChzdHJlcXUoaW5hbWUsICItIikpIHsKKwlpbnQgY2ZsYWcgPSB0b19zdGRvdXQ7CisJdHJlYXRfc3RkaW4oKTsKKwl0b19zdGRvdXQgPSBjZmxhZzsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGZpbGUgaXMgcHJlc2VudCwgc2V0IGlmbmFtZSBhbmQgaXN0YXQ6ICovCisgICAgaWYgKGdldF9pc3RhdChpbmFtZSwgJmlzdGF0KSAhPSBPSykgcmV0dXJuOworCisgICAgLyogSWYgdGhlIGlucHV0IG5hbWUgaXMgdGhhdCBvZiBhIGRpcmVjdG9yeSwgcmVjdXJzZSBvciBpZ25vcmU6ICovCisgICAgaWYgKFNfSVNESVIoaXN0YXQuc3RfbW9kZSkpIHsKKwlXQVJOKChzdGRlcnIsIiVzOiAlcyBpcyBhIGRpcmVjdG9yeSAtLSBpZ25vcmVkXG4iLCBwcm9nbmFtZSwgaWZuYW1lKSk7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAoIVNfSVNSRUcoaXN0YXQuc3RfbW9kZSkpIHsKKwlXQVJOKChzdGRlcnIsCisJICAgICAgIiVzOiAlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgYSByZWd1bGFyIGZpbGUgLSBpZ25vcmVkXG4iLAorCSAgICAgIHByb2duYW1lLCBpZm5hbWUpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmIChpc3RhdC5zdF9ubGluayA+IDEgJiYgIXRvX3N0ZG91dCAmJiAhZm9yY2UpIHsKKwlXQVJOKChzdGRlcnIsICIlczogJXMgaGFzICVkIG90aGVyIGxpbmslYyAtLSB1bmNoYW5nZWRcbiIsCisJICAgICAgcHJvZ25hbWUsIGlmbmFtZSwKKwkgICAgICAoaW50KWlzdGF0LnN0X25saW5rIC0gMSwgaXN0YXQuc3RfbmxpbmsgPiAyID8gJ3MnIDogJyAnKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmaWxlX3NpemUgPSBpc3RhdC5zdF9zaXplOworICAgIHRpbWVfc3RhbXAgPSBub190aW1lID8gMCA6IGlzdGF0LnN0X210aW1lOworCisgICAgLyogR2VuZXJhdGUgb3V0cHV0IGZpbGUgbmFtZS4gRm9yIC1yIGFuZCAoLXQgb3IgLWwpLCBza2lwIGZpbGVzCisgICAgICogd2l0aG91dCBhIHZhbGlkIGd6aXAgc3VmZml4IChjaGVjayBkb25lIGluIG1ha2Vfb2ZuYW1lKS4KKyAgICAgKi8KKyAgICBpZiAodG9fc3Rkb3V0ICYmICF0ZXN0KSB7CisJc3RyY3B5KG9mbmFtZSwgInN0ZG91dCIpOworCisgICAgfSBlbHNlIGlmIChtYWtlX29mbmFtZSgpICE9IE9LKSB7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUgYW5kIGRldGVybWluZSBjb21wcmVzc2lvbiBtZXRob2QuIFRoZSBtb2RlCisgICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnV0IHJlcXVpcmVkIGJ5IHNvbWUgc3lzdGVtcyAoVk1TKSBhbmQgZm9yYmlkZGVuCisgICAgICogb24gb3RoZXIgc3lzdGVtcyAoTWFjT1MpLgorICAgICAqLworICAgIGlmZCA9IG9wZW4oaWZuYW1lLCAhZGVjb21wcmVzcyA/IE9fUkRPTkxZIDogT19SRE9OTFksCisJICAgICAgIFJXX1VTRVIpOworICAgIGlmIChpZmQgPT0gLTEpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisJcGVycm9yKGlmbmFtZSk7CisJZXhpdF9jb2RlID0gRVJST1I7CisJcmV0dXJuOworICAgIH0KKyAgICBjbGVhcl9idWZzKCk7IC8qIGNsZWFyIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyAqLworICAgIHBhcnRfbmIgPSAwOworCisgICAgaWYgKGRlY29tcHJlc3MpIHsKKwltZXRob2QgPSBnZXRfbWV0aG9kKCk7IC8qIHVwZGF0ZXMgb2ZuYW1lIGlmIG9yaWdpbmFsIGdpdmVuICovCisJaWYgKG1ldGhvZCA8IDApIHsKKwkgICAgY2xvc2UoaWZkKTsKKwkgICAgcmV0dXJuOyAgICAgICAgICAgICAgIC8qIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSBlbWl0dGVkICovCisJfQorICAgIH0KKworICAgIC8qIElmIGNvbXByZXNzaW5nIHRvIGEgZmlsZSwgY2hlY2sgaWYgb2ZuYW1lIGlzIG5vdCBhbWJpZ3VvdXMKKyAgICAgKiBiZWNhdXNlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRydW5jYXRlcyBuYW1lcy4gT3RoZXJ3aXNlLCBnZW5lcmF0ZQorICAgICAqIGEgbmV3IG9mbmFtZSBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgbmFtZSBpbiB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgICAqLworICAgIGlmICh0b19zdGRvdXQpIHsKKwlvZmQgPSBmaWxlbm8oc3Rkb3V0KTsKKwkvKiBrZWVwIHJlbW92ZV9vZm5hbWUgYXMgemVybyAqLworICAgIH0gZWxzZSB7CisJaWYgKGNyZWF0ZV9vdXRmaWxlKCkgIT0gT0spIHJldHVybjsKKworCWlmICghZGVjb21wcmVzcyAmJiBzYXZlX29yaWdfbmFtZSAmJiAhdmVyYm9zZSAmJiAhcXVpZXQpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgY29tcHJlc3NlZCB0byAlc1xuIiwKKwkJICAgIHByb2duYW1lLCBpZm5hbWUsIG9mbmFtZSk7CisJfQorICAgIH0KKyAgICAvKiBLZWVwIHRoZSBuYW1lIGV2ZW4gaWYgbm90IHRydW5jYXRlZCBleGNlcHQgd2l0aCAtLW5vLW5hbWU6ICovCisgICAgaWYgKCFzYXZlX29yaWdfbmFtZSkgc2F2ZV9vcmlnX25hbWUgPSAhbm9fbmFtZTsKKworICAgIGlmICh2ZXJib3NlKSB7CisJZnByaW50ZihzdGRlcnIsICIlczpcdCVzIiwgaWZuYW1lLCAoaW50KXN0cmxlbihpZm5hbWUpID49IDE1ID8KKwkJIiIgOiAoKGludClzdHJsZW4oaWZuYW1lKSA+PSA3ID8gIlx0IiA6ICJcdFx0IikpOworICAgIH0KKworICAgIC8qIEFjdHVhbGx5IGRvIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLiBMb29wIG92ZXIgemlwcGVkIG1lbWJlcnMuCisgICAgICovCisgICAgZm9yICg7OykgeworCWlmICgoKndvcmspKGlmZCwgb2ZkKSAhPSBPSykgeworCSAgICBtZXRob2QgPSAtMTsgLyogZm9yY2UgY2xlYW51cCAqLworCSAgICBicmVhazsKKwl9CisJaWYgKCFkZWNvbXByZXNzIHx8IGxhc3RfbWVtYmVyIHx8IGlucHRyID09IGluc2l6ZSkgYnJlYWs7CisJLyogZW5kIG9mIGZpbGUgKi8KKworCW1ldGhvZCA9IGdldF9tZXRob2QoKTsKKwlpZiAobWV0aG9kIDwgMCkgYnJlYWs7ICAgIC8qIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSBlbWl0dGVkICovCisJYnl0ZXNfb3V0ID0gMDsgICAgICAgICAgICAvKiByZXF1aXJlZCBmb3IgbGVuZ3RoIGNoZWNrICovCisgICAgfQorCisgICAgY2xvc2UoaWZkKTsKKyAgICBpZiAoIXRvX3N0ZG91dCAmJiBjbG9zZShvZmQpKSB7CisJd3JpdGVfZXJyb3IoKTsKKyAgICB9CisgICAgaWYgKG1ldGhvZCA9PSAtMSkgeworCWlmICghdG9fc3Rkb3V0KSB1bmxpbmsgKG9mbmFtZSk7CisJcmV0dXJuOworICAgIH0KKyAgICAvKiBEaXNwbGF5IHN0YXRpc3RpY3MgKi8KKyAgICBpZih2ZXJib3NlKSB7CisJaWYgKHRlc3QpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICIgT0siKTsKKwl9IGVsc2UgaWYgKGRlY29tcHJlc3MpIHsKKwkgICAgZGlzcGxheV9yYXRpbyhieXRlc19vdXQtKGJ5dGVzX2luLWhlYWRlcl9ieXRlcyksIGJ5dGVzX291dCxzdGRlcnIpOworCX0gZWxzZSB7CisJICAgIGRpc3BsYXlfcmF0aW8oYnl0ZXNfaW4tKGJ5dGVzX291dC1oZWFkZXJfYnl0ZXMpLCBieXRlc19pbiwgc3RkZXJyKTsKKwl9CisJaWYgKCF0ZXN0ICYmICF0b19zdGRvdXQpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICIgLS0gcmVwbGFjZWQgd2l0aCAlcyIsIG9mbmFtZSk7CisJfQorCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisgICAgLyogQ29weSBtb2RlcywgdGltZXMsIG93bmVyc2hpcCwgYW5kIHJlbW92ZSB0aGUgaW5wdXQgZmlsZSAqLworICAgIGlmICghdG9fc3Rkb3V0KSB7CisJY29weV9zdGF0KCZpc3RhdCk7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuIFJldHVybiBPSyBvciBFUlJPUi4KKyAqIFRyeSBzZXZlcmFsIHRpbWVzIGlmIG5lY2Vzc2FyeSB0byBhdm9pZCB0cnVuY2F0aW5nIHRoZSB6X3N1ZmZpeC4gRm9yCisgKiBleGFtcGxlLCBkbyBub3QgY3JlYXRlIGEgY29tcHJlc3NlZCBmaWxlIG9mIG5hbWUgIjEyMzQ1Njc4OTAxMjMuIgorICogU2V0cyBzYXZlX29yaWdfbmFtZSB0byB0cnVlIGlmIHRoZSBmaWxlIG5hbWUgaGFzIGJlZW4gdHJ1bmNhdGVkLgorICogSU4gYXNzZXJ0aW9uczogdGhlIGlucHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuIChpZmQgaXMgc2V0KSBhbmQKKyAqICAgb2ZuYW1lIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZCBpZiB0aGVyZSB3YXMgYW4gb3JpZ2luYWwgbmFtZS4KKyAqIE9VVCBhc3NlcnRpb25zOiBpZmQgYW5kIG9mZCBhcmUgY2xvc2VkIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2xvY2FsIGludCBjcmVhdGVfb3V0ZmlsZSgpCit7CisgICAgc3RydWN0IHN0YXQJb3N0YXQ7IC8qIHN0YXQgZm9yIG9mbmFtZSAqLworICAgIGludCBmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTDsKKworICAgIGZvciAoOzspIHsKKwkvKiBNYWtlIHN1cmUgdGhhdCBvZm5hbWUgaXMgbm90IGFuIGV4aXN0aW5nIGZpbGUgKi8KKwlpZiAoY2hlY2tfb2ZuYW1lKCkgIT0gT0spIHsKKwkgICAgY2xvc2UoaWZkKTsKKwkgICAgcmV0dXJuIEVSUk9SOworCX0KKwkvKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlICovCisJcmVtb3ZlX29mbmFtZSA9IDE7CisJb2ZkID0gb3BlbihvZm5hbWUsIGZsYWdzLCBSV19VU0VSKTsKKwlpZiAob2ZkID09IC0xKSB7CisJICAgIHBlcnJvcihvZm5hbWUpOworCSAgICBjbG9zZShpZmQpOworCSAgICBleGl0X2NvZGUgPSBFUlJPUjsKKwkgICAgcmV0dXJuIEVSUk9SOworCX0KKworCS8qIENoZWNrIGZvciBuYW1lIHRydW5jYXRpb24gb24gbmV3IGZpbGUgKDEyMzQ1Njc4OTAxMjMuZ3opICovCisJaWYgKGZzdGF0KG9mZCwgJm9zdGF0KSAhPSAwKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKKwkgICAgcGVycm9yKG9mbmFtZSk7CisJICAgIGNsb3NlKGlmZCk7IGNsb3NlKG9mZCk7CisJICAgIHVubGluayhvZm5hbWUpOworCSAgICBleGl0X2NvZGUgPSBFUlJPUjsKKwkgICAgcmV0dXJuIEVSUk9SOworCX0KKwlpZiAoIW5hbWVfdG9vX2xvbmcob2ZuYW1lLCAmb3N0YXQpKSByZXR1cm4gT0s7CisKKwlpZiAoZGVjb21wcmVzcykgeworCSAgICAvKiBuYW1lIG1pZ2h0IGJlIHRvbyBsb25nIGlmIGFuIG9yaWdpbmFsIG5hbWUgd2FzIHNhdmVkICovCisJICAgIFdBUk4oKHN0ZGVyciwgIiVzOiAlczogd2FybmluZywgbmFtZSB0cnVuY2F0ZWRcbiIsCisJCSAgcHJvZ25hbWUsIG9mbmFtZSkpOworCSAgICByZXR1cm4gT0s7CisJfQorCWNsb3NlKG9mZCk7CisJdW5saW5rKG9mbmFtZSk7CisJc2hvcnRlbl9uYW1lKG9mbmFtZSk7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVzZSBsc3RhdCBpZiBhdmFpbGFibGUsIGV4Y2VwdCBmb3IgLWMgb3IgLWYuIFVzZSBzdGF0IG90aGVyd2lzZS4KKyAqIFRoaXMgYWxsb3dzIGxpbmtzIHdoZW4gbm90IHJlbW92aW5nIHRoZSBvcmlnaW5hbCBmaWxlLgorICovCitsb2NhbCBpbnQgZG9fc3RhdChuYW1lLCBzYnVmKQorICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IHN0YXQgKnNidWY7Cit7CisgICAgZXJybm8gPSAwOworICAgIGlmICghdG9fc3Rkb3V0ICYmICFmb3JjZSkgeworCXJldHVybiBsc3RhdChuYW1lLCBzYnVmKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXQobmFtZSwgc2J1Zik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgJ3onIHN1ZmZpeCBvZiBhIGZpbGUgbmFtZSwgb3IgTlVMTC4gRm9yIGFsbAorICogc3lzdGVtcywgIi5neiIsICIueiIsICIuWiIsICIudGF6IiwgIi50Z3oiLCAiLWd6IiwgIi16IiBhbmQgIl96IiBhcmUKKyAqIGFjY2VwdGVkIHN1ZmZpeGVzLCBpbiBhZGRpdGlvbiB0byB0aGUgdmFsdWUgb2YgdGhlIC0tc3VmZml4IG9wdGlvbi4KKyAqICIudGd6IiBpcyBhIHVzZWZ1bCBjb252ZW50aW9uIGZvciB0YXIueiBmaWxlcyBvbiBzeXN0ZW1zIGxpbWl0ZWQKKyAqIHRvIDMgY2hhcmFjdGVycyBleHRlbnNpb25zLiBPbiBzdWNoIHN5c3RlbXMsICIuP3oiIGFuZCAiLj8/eiIgYXJlCisgKiBhbHNvIGFjY2VwdGVkIHN1ZmZpeGVzLiBGb3IgVW5peCwgd2UgZG8gbm90IHdhbnQgdG8gYWNjZXB0IGFueQorICogLj8/eiBzdWZmaXggYXMgaW5kaWNhdGluZyBhIGNvbXByZXNzZWQgZmlsZTsgc29tZSBwZW9wbGUgdXNlIC54eXoKKyAqIHRvIGRlbm90ZSB2b2x1bWUgZGF0YS4KKyAqICAgT24gc3lzdGVtcyBhbGxvd2luZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBmaWxlIChzdWNoIGFzIFZNUyksCisgKiB0aGlzIGZ1bmN0aW9uIHJlbW92ZXMgYW55IHZlcnNpb24gc3VmZml4IGluIHRoZSBnaXZlbiBuYW1lLgorICovCitsb2NhbCBjaGFyICpnZXRfc3VmZml4KG5hbWUpCisgICAgY2hhciAqbmFtZTsKK3sKKyAgICBpbnQgbmxlbiwgc2xlbjsKKyAgICBjaGFyIHN1ZmZpeFtNQVhfU1VGRklYKzNdOyAvKiBsYXN0IGNoYXJzIG9mIG5hbWUsIGZvcmNlZCB0byBsb3dlciBjYXNlICovCisgICAgc3RhdGljIGNoYXIgKmtub3duX3N1ZmZpeGVzW10gPQorICAgICAgIHt6X3N1ZmZpeCwgIi5neiIsICIueiIsICIudGF6IiwgIi50Z3oiLCAiLWd6IiwgIi16IiwgIl96IiwKKyAgICAgICAgICBOVUxMfTsKKyAgICBjaGFyICoqc3VmID0ga25vd25fc3VmZml4ZXM7CisKKyAgICBpZiAoc3RyZXF1KHpfc3VmZml4LCAieiIpKSBzdWYrKzsgLyogY2hlY2sgbG9uZyBzdWZmaXhlcyBmaXJzdCAqLworCisgICAgbmxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBpZiAobmxlbiA8PSBNQVhfU1VGRklYKzIpIHsKKyAgICAgICAgc3RyY3B5KHN1ZmZpeCwgbmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyY3B5KHN1ZmZpeCwgbmFtZStubGVuLU1BWF9TVUZGSVgtMik7CisgICAgfQorICAgIHN0cmx3cihzdWZmaXgpOworICAgIHNsZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgICBkbyB7CisgICAgICAgaW50IHMgPSBzdHJsZW4oKnN1Zik7CisgICAgICAgaWYgKHNsZW4gPiBzICYmIHN1ZmZpeFtzbGVuLXMtMV0gIT0gUEFUSF9TRVAKKyAgICAgICAgICAgJiYgc3RyZXF1KHN1ZmZpeCArIHNsZW4gLSBzLCAqc3VmKSkgeworICAgICAgICAgICByZXR1cm4gbmFtZStubGVuLXM7CisgICAgICAgfQorICAgIH0gd2hpbGUgKCorK3N1ZiAhPSBOVUxMKTsKKworICAgIHJldHVybiBOVUxMOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGlmbmFtZSB0byB0aGUgaW5wdXQgZmlsZSBuYW1lICh3aXRoIGEgc3VmZml4IGFwcGVuZGVkIGlmIG5lY2Vzc2FyeSkKKyAqIGFuZCBpc3RhdCB0byBpdHMgc3RhdHMuIEZvciBkZWNvbXByZXNzaW9uLCBpZiBubyBmaWxlIGV4aXN0cyB3aXRoIHRoZQorICogb3JpZ2luYWwgbmFtZSwgdHJ5IGFkZGluZyBzdWNjZXNzaXZlbHkgel9zdWZmaXgsIC5neiwgLnosIC16IGFuZCAuWi4KKyAqIEZvciBNU0RPUywgd2UgdHJ5IG9ubHkgel9zdWZmaXggYW5kIHouCisgKiBSZXR1cm4gT0sgb3IgRVJST1IuCisgKi8KK2xvY2FsIGludCBnZXRfaXN0YXQoaW5hbWUsIHNidWYpCisgICAgY2hhciAqaW5hbWU7CisgICAgc3RydWN0IHN0YXQgKnNidWY7Cit7CisgICAgaW50IGlsZW47ICAvKiBzdHJsZW4oaWZuYW1lKSAqLworICAgIHN0YXRpYyBjaGFyICpzdWZmaXhlc1tdID0ge3pfc3VmZml4LCAiLmd6IiwgIi56IiwgIi16IiwgIi5aIiwgTlVMTH07CisgICAgY2hhciAqKnN1ZiA9IHN1ZmZpeGVzOworICAgIGNoYXIgKnM7CisKKyAgICBzdHJjcHkoaWZuYW1lLCBpbmFtZSk7CisKKyAgICAvKiBJZiBpbnB1dCBmaWxlIGV4aXN0cywgcmV0dXJuIE9LLiAqLworICAgIGlmIChkb19zdGF0KGlmbmFtZSwgc2J1ZikgPT0gMCkgcmV0dXJuIE9LOworCisgICAgaWYgKCFkZWNvbXByZXNzIHx8IGVycm5vICE9IEVOT0VOVCkgeworCXBlcnJvcihpZm5hbWUpOworCWV4aXRfY29kZSA9IEVSUk9SOworCXJldHVybiBFUlJPUjsKKyAgICB9CisgICAgLyogZmlsZS5leHQgZG9lc24ndCBleGlzdCwgdHJ5IGFkZGluZyBhIHN1ZmZpeCAoYWZ0ZXIgcmVtb3ZpbmcgYW55CisgICAgICogdmVyc2lvbiBudW1iZXIgZm9yIFZNUykuCisgICAgICovCisgICAgcyA9IGdldF9zdWZmaXgoaWZuYW1lKTsKKyAgICBpZiAocyAhPSBOVUxMKSB7CisJcGVycm9yKGlmbmFtZSk7IC8qIGlmbmFtZSBhbHJlYWR5IGhhcyB6IHN1ZmZpeCBhbmQgZG9lcyBub3QgZXhpc3QgKi8KKwlleGl0X2NvZGUgPSBFUlJPUjsKKwlyZXR1cm4gRVJST1I7CisgICAgfQorICAgIGlsZW4gPSBzdHJsZW4oaWZuYW1lKTsKKyAgICBpZiAoc3RyZXF1KHpfc3VmZml4LCAiLmd6IikpIHN1ZisrOworCisgICAgLyogU2VhcmNoIGZvciBhbGwgc3VmZml4ZXMgKi8KKyAgICBkbyB7CisgICAgICAgIHMgPSAqc3VmOworICAgICAgICBzdHJjYXQoaWZuYW1lLCBzKTsKKyAgICAgICAgaWYgKGRvX3N0YXQoaWZuYW1lLCBzYnVmKSA9PSAwKSByZXR1cm4gT0s7CisJaWZuYW1lW2lsZW5dID0gJ1wwJzsKKyAgICB9IHdoaWxlICgqKytzdWYgIT0gTlVMTCk7CisKKyAgICAvKiBObyBzdWZmaXggZm91bmQsIGNvbXBsYWluIHVzaW5nIHpfc3VmZml4OiAqLworICAgIHN0cmNhdChpZm5hbWUsIHpfc3VmZml4KTsKKyAgICBwZXJyb3IoaWZuYW1lKTsKKyAgICBleGl0X2NvZGUgPSBFUlJPUjsKKyAgICByZXR1cm4gRVJST1I7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2VuZXJhdGUgb2ZuYW1lIGdpdmVuIGlmbmFtZS4gUmV0dXJuIE9LLCBvciBXQVJOSU5HIGlmIGZpbGUgbXVzdCBiZSBza2lwcGVkLgorICogU2V0cyBzYXZlX29yaWdfbmFtZSB0byB0cnVlIGlmIHRoZSBmaWxlIG5hbWUgaGFzIGJlZW4gdHJ1bmNhdGVkLgorICovCitsb2NhbCBpbnQgbWFrZV9vZm5hbWUoKQoreworICAgIGNoYXIgKnN1ZmY7ICAgICAgICAgICAgLyogb2ZuYW1lIHogc3VmZml4ICovCisKKyAgICBzdHJjcHkob2ZuYW1lLCBpZm5hbWUpOworICAgIC8qIHN0cmlwIGEgdmVyc2lvbiBudW1iZXIgaWYgYW55IGFuZCBnZXQgdGhlIGd6aXAgc3VmZml4IGlmIHByZXNlbnQ6ICovCisgICAgc3VmZiA9IGdldF9zdWZmaXgob2ZuYW1lKTsKKworICAgIGlmIChkZWNvbXByZXNzKSB7CisJaWYgKHN1ZmYgPT0gTlVMTCkgeworCSAgICAvKiBXaGl0aCAtdCBvciAtbCwgdHJ5IGFsbCBmaWxlcyAoZXZlbiB3aXRob3V0IC5neiBzdWZmaXgpCisJICAgICAqIGV4Y2VwdCB3aXRoIC1yIChiZWhhdmUgYXMgd2l0aCBqdXN0IC1kcikuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0ZXN0KSByZXR1cm4gT0s7CisKKwkgICAgLyogQXZvaWQgYW5ub3lpbmcgbWVzc2FnZXMgd2l0aCAtciAqLworCSAgICBpZiAodmVyYm9zZSB8fCAhcXVpZXQpIHsKKwkJV0FSTigoc3RkZXJyLCIlczogJXM6IHVua25vd24gc3VmZml4IC0tIGlnbm9yZWRcbiIsCisJCSAgICAgIHByb2duYW1lLCBpZm5hbWUpKTsKKwkgICAgfQorCSAgICByZXR1cm4gV0FSTklORzsKKwl9CisJLyogTWFrZSBhIHNwZWNpYWwgY2FzZSBmb3IgLnRneiBhbmQgLnRhejogKi8KKwlzdHJsd3Ioc3VmZik7CisJaWYgKHN0cmVxdShzdWZmLCAiLnRneiIpIHx8IHN0cmVxdShzdWZmLCAiLnRheiIpKSB7CisJICAgIHN0cmNweShzdWZmLCAiLnRhciIpOworCX0gZWxzZSB7CisJICAgICpzdWZmID0gJ1wwJzsgLyogc3RyaXAgdGhlIHogc3VmZml4ICovCisJfQorICAgICAgICAvKiBvZm5hbWUgbWlnaHQgYmUgY2hhbmdlZCBsYXRlciBpZiBpbmZpbGUgY29udGFpbnMgYW4gb3JpZ2luYWwgbmFtZSAqLworCisgICAgfSBlbHNlIGlmIChzdWZmICE9IE5VTEwpIHsKKwkvKiBBdm9pZCBhbm5veWluZyBtZXNzYWdlcyB3aXRoIC1yIChzZWUgdHJlYXRfZGlyKCkpICovCisJaWYgKHZlcmJvc2UgfHwgIXF1aWV0KSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGFscmVhZHkgaGFzICVzIHN1ZmZpeCAtLSB1bmNoYW5nZWRcbiIsCisJCSAgICBwcm9nbmFtZSwgaWZuYW1lLCBzdWZmKTsKKwl9CisJaWYgKGV4aXRfY29kZSA9PSBPSykgZXhpdF9jb2RlID0gV0FSTklORzsKKwlyZXR1cm4gV0FSTklORzsKKyAgICB9IGVsc2UgeworICAgICAgICBzYXZlX29yaWdfbmFtZSA9IDA7CisJc3RyY2F0KG9mbmFtZSwgel9zdWZmaXgpOworCisgICAgfSAvKiBkZWNvbXByZXNzID8gKi8KKyAgICByZXR1cm4gT0s7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBpbnB1dCBmaWxlIGFuZCB1cGRhdGUgb2ZuYW1lIGlmIGFuCisgKiBvcmlnaW5hbCBuYW1lIHdhcyBnaXZlbiBhbmQgdG9fc3Rkb3V0IGlzIG5vdCBzZXQuCisgKiBSZXR1cm4gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCwgLTEgZm9yIGVycm9yLCAtMiBmb3Igd2FybmluZy4KKyAqIFNldCBpbnB0ciB0byB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGJ5dGUgdG8gYmUgcHJvY2Vzc2VkLgorICogVXBkYXRlcyB0aW1lX3N0YW1wIGlmIHRoZXJlIGlzIG9uZSBhbmQgLS1uby10aW1lIGlzIG5vdCB1c2VkLgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHkgZm9yIGFuIGlucHV0IGZpbGUgY29uc2lzdGluZworICogb2Ygc2V2ZXJhbCBjb250aWd1b3VzIGd6aXAnZWQgbWVtYmVycy4KKyAqIElOIGFzc2VydGlvbnM6IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZW1haW5pbmcgY29tcHJlc3NlZCBtZW1iZXIuCisgKiAgIElmIHRoZSBtZW1iZXIgaXMgYSB6aXAgZmlsZSwgaXQgbXVzdCBiZSB0aGUgb25seSBvbmUuCisgKi8KK2xvY2FsIGludCBnZXRfbWV0aG9kKCkKK3sKKyAgICB1Y2ggZmxhZ3M7ICAgICAvKiBjb21wcmVzc2lvbiBmbGFncyAqLworICAgIGNoYXIgbWFnaWNbMl07IC8qIG1hZ2ljIGhlYWRlciAqLworICAgIHVsZyBzdGFtcDsgICAgIC8qIHRpbWUgc3RhbXAgKi8KKworICAgIC8qIElmIC0tZm9yY2UgYW5kIC0tc3Rkb3V0LCB6Y2F0ID09IGNhdCwgc28gZG8gbm90IGNvbXBsYWluIGFib3V0CisgICAgICogcHJlbWF0dXJlIGVuZCBvZiBmaWxlOiB1c2UgdHJ5X2J5dGUgaW5zdGVhZCBvZiBnZXRfYnl0ZS4KKyAgICAgKi8KKyAgICBpZiAoZm9yY2UgJiYgdG9fc3Rkb3V0KSB7CisJbWFnaWNbMF0gPSAoY2hhcil0cnlfYnl0ZSgpOworCW1hZ2ljWzFdID0gKGNoYXIpdHJ5X2J5dGUoKTsKKwkvKiBJZiB0cnlfYnl0ZSByZXR1cm5lZCBFT0YsIG1hZ2ljWzFdID09IDB4ZmYgKi8KKyAgICB9IGVsc2UgeworCW1hZ2ljWzBdID0gKGNoYXIpZ2V0X2J5dGUoKTsKKwltYWdpY1sxXSA9IChjaGFyKWdldF9ieXRlKCk7CisgICAgfQorICAgIG1ldGhvZCA9IC0xOyAgICAgICAgICAgICAgICAgLyogdW5rbm93biB5ZXQgKi8KKyAgICBwYXJ0X25iKys7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwYXJ0cyBpbiBnemlwIGZpbGUgKi8KKyAgICBoZWFkZXJfYnl0ZXMgPSAwOworICAgIGxhc3RfbWVtYmVyID0gUkVDT1JEX0lPOworICAgIC8qIGFzc3VtZSBtdWx0aXBsZSBtZW1iZXJzIGluIGd6aXAgZmlsZSBleGNlcHQgZm9yIHJlY29yZCBvcmllbnRlZCBJL08gKi8KKworICAgIGlmIChtZW1jbXAobWFnaWMsIEdaSVBfTUFHSUMsIDIpID09IDAKKyAgICAgICAgfHwgbWVtY21wKG1hZ2ljLCBPTERfR1pJUF9NQUdJQywgMikgPT0gMCkgeworCisJbWV0aG9kID0gKGludClnZXRfYnl0ZSgpOworCWlmIChtZXRob2QgIT0gREVGTEFURUQpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsCisJCSAgICAiJXM6ICVzOiB1bmtub3duIG1ldGhvZCAlZCAtLSBnZXQgbmV3ZXIgdmVyc2lvbiBvZiBnemlwXG4iLAorCQkgICAgcHJvZ25hbWUsIGlmbmFtZSwgbWV0aG9kKTsKKwkgICAgZXhpdF9jb2RlID0gRVJST1I7CisJICAgIHJldHVybiAtMTsKKwl9CisJd29yayA9IHVuemlwOworCWZsYWdzICA9ICh1Y2gpZ2V0X2J5dGUoKTsKKworCWlmICgoZmxhZ3MgJiBFTkNSWVBURUQpICE9IDApIHsKKwkgICAgZnByaW50ZihzdGRlcnIsCisJCSAgICAiJXM6ICVzIGlzIGVuY3J5cHRlZCAtLSBnZXQgbmV3ZXIgdmVyc2lvbiBvZiBnemlwXG4iLAorCQkgICAgcHJvZ25hbWUsIGlmbmFtZSk7CisJICAgIGV4aXRfY29kZSA9IEVSUk9SOworCSAgICByZXR1cm4gLTE7CisJfQorCWlmICgoZmxhZ3MgJiBDT05USU5VQVRJT04pICE9IDApIHsKKwkgICAgZnByaW50ZihzdGRlcnIsCisJICAgIiVzOiAlcyBpcyBhIGEgbXVsdGktcGFydCBnemlwIGZpbGUgLS0gZ2V0IG5ld2VyIHZlcnNpb24gb2YgZ3ppcFxuIiwKKwkJICAgIHByb2duYW1lLCBpZm5hbWUpOworCSAgICBleGl0X2NvZGUgPSBFUlJPUjsKKwkgICAgaWYgKGZvcmNlIDw9IDEpIHJldHVybiAtMTsKKwl9CisJaWYgKChmbGFncyAmIFJFU0VSVkVEKSAhPSAwKSB7CisJICAgIGZwcmludGYoc3RkZXJyLAorCQkgICAgIiVzOiAlcyBoYXMgZmxhZ3MgMHgleCAtLSBnZXQgbmV3ZXIgdmVyc2lvbiBvZiBnemlwXG4iLAorCQkgICAgcHJvZ25hbWUsIGlmbmFtZSwgZmxhZ3MpOworCSAgICBleGl0X2NvZGUgPSBFUlJPUjsKKwkgICAgaWYgKGZvcmNlIDw9IDEpIHJldHVybiAtMTsKKwl9CisJc3RhbXAgID0gKHVsZylnZXRfYnl0ZSgpOworCXN0YW1wIHw9ICgodWxnKWdldF9ieXRlKCkpIDw8IDg7CisJc3RhbXAgfD0gKCh1bGcpZ2V0X2J5dGUoKSkgPDwgMTY7CisJc3RhbXAgfD0gKCh1bGcpZ2V0X2J5dGUoKSkgPDwgMjQ7CisJaWYgKHN0YW1wICE9IDAgJiYgIW5vX3RpbWUpIHRpbWVfc3RhbXAgPSBzdGFtcDsKKworCSh2b2lkKWdldF9ieXRlKCk7ICAvKiBJZ25vcmUgZXh0cmEgZmxhZ3MgZm9yIHRoZSBtb21lbnQgKi8KKwkodm9pZClnZXRfYnl0ZSgpOyAgLyogSWdub3JlIE9TIHR5cGUgZm9yIHRoZSBtb21lbnQgKi8KKworCWlmICgoZmxhZ3MgJiBDT05USU5VQVRJT04pICE9IDApIHsKKwkgICAgdW5zaWduZWQgcGFydCA9ICh1bnNpZ25lZClnZXRfYnl0ZSgpOworCSAgICBwYXJ0IHw9ICgodW5zaWduZWQpZ2V0X2J5dGUoKSk8PDg7CisJICAgIGlmICh2ZXJib3NlKSB7CisJCWZwcmludGYoc3RkZXJyLCIlczogJXM6IHBhcnQgbnVtYmVyICV1XG4iLAorCQkJcHJvZ25hbWUsIGlmbmFtZSwgcGFydCk7CisJICAgIH0KKwl9CisJaWYgKChmbGFncyAmIEVYVFJBX0ZJRUxEKSAhPSAwKSB7CisJICAgIHVuc2lnbmVkIGxlbiA9ICh1bnNpZ25lZClnZXRfYnl0ZSgpOworCSAgICBsZW4gfD0gKCh1bnNpZ25lZClnZXRfYnl0ZSgpKTw8ODsKKwkgICAgaWYgKHZlcmJvc2UpIHsKKwkJZnByaW50ZihzdGRlcnIsIiVzOiAlczogZXh0cmEgZmllbGQgb2YgJXUgYnl0ZXMgaWdub3JlZFxuIiwKKwkJCXByb2duYW1lLCBpZm5hbWUsIGxlbik7CisJICAgIH0KKwkgICAgd2hpbGUgKGxlbi0tKSAodm9pZClnZXRfYnl0ZSgpOworCX0KKworCS8qIEdldCBvcmlnaW5hbCBmaWxlIG5hbWUgaWYgaXQgd2FzIHRydW5jYXRlZCAqLworCWlmICgoZmxhZ3MgJiBPUklHX05BTUUpICE9IDApIHsKKwkgICAgaWYgKG5vX25hbWUgfHwgdG9fc3Rkb3V0IHx8IHBhcnRfbmIgPiAxKSB7CisJCS8qIERpc2NhcmQgdGhlIG9sZCBuYW1lICovCisJCWNoYXIgYzsgLyogZHVtbXkgdXNlZCBmb3IgTmVYVHN0ZXAgMy4wIGNjIG9wdGltaXplciBidWcgKi8KKwkJZG8ge2M9Z2V0X2J5dGUoKTt9IHdoaWxlIChjICE9IDApOworCSAgICB9IGVsc2UgeworCQkvKiBDb3B5IHRoZSBiYXNlIG5hbWUuIEtlZXAgYSBkaXJlY3RvcnkgcHJlZml4IGludGFjdC4gKi8KKyAgICAgICAgICAgICAgICBjaGFyICpwID0gYmFzZW5hbWUob2ZuYW1lKTsKKwkJZm9yICg7OykgeworCQkgICAgKnAgPSAoY2hhcilnZXRfY2hhcigpOworCQkgICAgaWYgKCpwKysgPT0gJ1wwJykgYnJlYWs7CisJCSAgICBpZiAocCA+PSBvZm5hbWUrc2l6ZW9mKG9mbmFtZSkpIHsKKwkJCWVycm9yKCJjb3JydXB0ZWQgaW5wdXQgLS0gZmlsZSBuYW1lIHRvbyBsYXJnZSIpOworCQkgICAgfQorCQl9CisJICAgIH0gLyogbm9fbmFtZSB8fCB0b19zdGRvdXQgKi8KKwl9IC8qIE9SSUdfTkFNRSAqLworCisJLyogRGlzY2FyZCBmaWxlIGNvbW1lbnQgaWYgYW55ICovCisJaWYgKChmbGFncyAmIENPTU1FTlQpICE9IDApIHsKKwkgICAgd2hpbGUgKGdldF9jaGFyKCkgIT0gMCkgLyogbnVsbCAqLyA7CisJfQorCWlmIChwYXJ0X25iID09IDEpIHsKKwkgICAgaGVhZGVyX2J5dGVzID0gaW5wdHIgKyAyKnNpemVvZihsb25nKTsgLyogaW5jbHVkZSBjcmMgYW5kIHNpemUgKi8KKwl9CisgICAgfSBlbHNlIGlmIChmb3JjZSAmJiB0b19zdGRvdXQpIHsgLyogcGFzcyBpbnB1dCB1bmNoYW5nZWQgKi8KKwltZXRob2QgPSBTVE9SRUQ7CisJd29yayA9IGNvcHk7CisgICAgICAgIGlucHRyID0gMDsKKwlsYXN0X21lbWJlciA9IDE7CisgICAgfQorICAgIGlmIChtZXRob2QgPj0gMCkgcmV0dXJuIG1ldGhvZDsKKworICAgIGlmIChwYXJ0X25iID09IDEpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuJXM6ICVzOiBub3QgaW4gZ3ppcCBmb3JtYXRcbiIsIHByb2duYW1lLCBpZm5hbWUpOworCWV4aXRfY29kZSA9IEVSUk9SOworCXJldHVybiAtMTsKKyAgICB9IGVsc2UgeworCVdBUk4oKHN0ZGVyciwgIlxuJXM6ICVzOiBkZWNvbXByZXNzaW9uIE9LLCB0cmFpbGluZyBnYXJiYWdlIGlnbm9yZWRcbiIsCisJICAgICAgcHJvZ25hbWUsIGlmbmFtZSkpOworCXJldHVybiAtMjsKKyAgICB9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIHN0YXQgc3RydWN0dXJlcyBjb3JyZXNwb25kIHRvIHRoZSBzYW1lIGZpbGUuCisgKi8KK2xvY2FsIGludCBzYW1lX2ZpbGUoc3RhdDEsIHN0YXQyKQorICAgIHN0cnVjdCBzdGF0ICpzdGF0MTsKKyAgICBzdHJ1Y3Qgc3RhdCAqc3RhdDI7Cit7CisgICAgcmV0dXJuIHN0YXQxLT5zdF9pbm8gICA9PSBzdGF0Mi0+c3RfaW5vCisJJiYgc3RhdDEtPnN0X2RldiAgID09IHN0YXQyLT5zdF9kZXYKKyNpZmRlZiBOT19TVF9JTk8KKyAgICAgICAgLyogQ2FuJ3QgcmVseSBvbiBzdF9pbm8gYW5kIHN0X2RldiwgdXNlIG90aGVyIGZpZWxkczogKi8KKwkmJiBzdGF0MS0+c3RfbW9kZSAgPT0gc3RhdDItPnN0X21vZGUKKwkmJiBzdGF0MS0+c3RfdWlkICAgPT0gc3RhdDItPnN0X3VpZAorCSYmIHN0YXQxLT5zdF9naWQgICA9PSBzdGF0Mi0+c3RfZ2lkCisJJiYgc3RhdDEtPnN0X3NpemUgID09IHN0YXQyLT5zdF9zaXplCisJJiYgc3RhdDEtPnN0X2F0aW1lID09IHN0YXQyLT5zdF9hdGltZQorCSYmIHN0YXQxLT5zdF9tdGltZSA9PSBzdGF0Mi0+c3RfbXRpbWUKKwkmJiBzdGF0MS0+c3RfY3RpbWUgPT0gc3RhdDItPnN0X2N0aW1lCisjZW5kaWYKKwkgICAgOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldHVybiB0cnVlIGlmIGEgZmlsZSBuYW1lIGlzIGFtYmlndW91cyBiZWNhdXNlIHRoZSBvcGVyYXRpbmcgc3lzdGVtCisgKiB0cnVuY2F0ZXMgZmlsZSBuYW1lcy4KKyAqLworbG9jYWwgaW50IG5hbWVfdG9vX2xvbmcobmFtZSwgc3RhdGIpCisgICAgY2hhciAqbmFtZTsgICAgICAgICAgIC8qIGZpbGUgbmFtZSB0byBjaGVjayAqLworICAgIHN0cnVjdCBzdGF0ICpzdGF0YjsgICAvKiBzdGF0IGJ1ZiBmb3IgdGhpcyBmaWxlIG5hbWUgKi8KK3sKKyAgICBpbnQgcyA9IHN0cmxlbihuYW1lKTsKKyAgICBjaGFyIGMgPSBuYW1lW3MtMV07CisgICAgc3RydWN0IHN0YXQJdHN0YXQ7IC8qIHN0YXQgZm9yIHRydW5jYXRlZCBuYW1lICovCisgICAgaW50IHJlczsKKworICAgIHRzdGF0ID0gKnN0YXRiOyAgICAgIC8qIEp1c3QgaW4gY2FzZSBPUyBkb2VzIG5vdCBmaWxsIGFsbCBmaWVsZHMgKi8KKyAgICBuYW1lW3MtMV0gPSAnXDAnOworICAgIHJlcyA9IHN0YXQobmFtZSwgJnRzdGF0KSA9PSAwICYmIHNhbWVfZmlsZShzdGF0YiwgJnRzdGF0KTsKKyAgICBuYW1lW3MtMV0gPSBjOworICAgIFRyYWNlKChzdGRlcnIsICIgdG9vX2xvbmcoJXMpID0+ICVkXG4iLCBuYW1lLCByZXMpKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNob3J0ZW4gdGhlIGdpdmVuIG5hbWUgYnkgb25lIGNoYXJhY3Rlciwgb3IgcmVwbGFjZSBhIC50YXIgZXh0ZW5zaW9uCisgKiB3aXRoIC50Z3ouIFRydW5jYXRlIHRoZSBsYXN0IHBhcnQgb2YgdGhlIG5hbWUgd2hpY2ggaXMgbG9uZ2VyIHRoYW4KKyAqIE1JTl9QQVJUIGNoYXJhY3RlcnM6IDEyMzQuNjc4LjAxMi5neiAtPiAxMjMuNjc4LjAxMi5nei4gSWYgdGhlIG5hbWUKKyAqIGhhcyBvbmx5IHBhcnRzIHNob3J0ZXIgdGhhbiBNSU5fUEFSVCB0cnVuY2F0ZSB0aGUgbG9uZ2VzdCBwYXJ0LgorICogRm9yIGRlY29tcHJlc3Npb24sIGp1c3QgcmVtb3ZlIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbmFtZS4KKyAqCisgKiBJTiBhc3NlcnRpb246IGZvciBjb21wcmVzc2lvbiwgdGhlIHN1ZmZpeCBvZiB0aGUgZ2l2ZW4gbmFtZSBpcyB6X3N1ZmZpeC4KKyAqLworbG9jYWwgdm9pZCBzaG9ydGVuX25hbWUobmFtZSkKKyAgICBjaGFyICpuYW1lOworeworICAgIGludCBsZW47ICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgbmFtZSB3aXRob3V0IHpfc3VmZml4ICovCisgICAgY2hhciAqdHJ1bmMgPSBOVUxMOyAgICAgIC8qIGNoYXJhY3RlciB0byBiZSB0cnVuY2F0ZWQgKi8KKyAgICBpbnQgcGxlbjsgICAgICAgICAgICAgICAgLyogY3VycmVudCBwYXJ0IGxlbmd0aCAqLworICAgIGludCBtaW5fcGFydCA9IE1JTl9QQVJUOyAvKiBjdXJyZW50IG1pbmltdW0gcGFydCBsZW5ndGggKi8KKyAgICBjaGFyICpwOworCisgICAgbGVuID0gc3RybGVuKG5hbWUpOworICAgIGlmIChkZWNvbXByZXNzKSB7CisJaWYgKGxlbiA8PSAxKSBlcnJvcigibmFtZSB0b28gc2hvcnQiKTsKKwluYW1lW2xlbi0xXSA9ICdcMCc7CisJcmV0dXJuOworICAgIH0KKyAgICBwID0gZ2V0X3N1ZmZpeChuYW1lKTsKKyAgICBpZiAocCA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgcmVjb3ZlciBzdWZmaXhcbiIpOworICAgICpwID0gJ1wwJzsKKyAgICBzYXZlX29yaWdfbmFtZSA9IDE7CisKKyAgICAvKiBjb21wcmVzcyAxMjM0NTY3ODkwLnRhciB0byAxMjM0NTY3ODkwLnRneiAqLworICAgIGlmIChsZW4gPiA0ICYmIHN0cmVxdShwLTQsICIudGFyIikpIHsKKwlzdHJjcHkocC00LCAiLnRneiIpOworCXJldHVybjsKKyAgICB9CisgICAgLyogVHJ5IGtlZXBpbmcgc2hvcnQgZXh0ZW5zaW9ucyBpbnRhY3Q6CisgICAgICogMTIzNC42NzguMDEyLmd6IC0+IDEyMy42NzguMDEyLmd6CisgICAgICovCisgICAgZG8geworCXAgPSBzdHJyY2hyKG5hbWUsIFBBVEhfU0VQKTsKKwlwID0gcCA/IHArMSA6IG5hbWU7CisJd2hpbGUgKCpwKSB7CisJICAgIHBsZW4gPSBzdHJjc3BuKHAsICIuIik7CisJICAgIHAgKz0gcGxlbjsKKwkgICAgaWYgKHBsZW4gPiBtaW5fcGFydCkgdHJ1bmMgPSBwLTE7CisJICAgIGlmICgqcCkgcCsrOworCX0KKyAgICB9IHdoaWxlICh0cnVuYyA9PSBOVUxMICYmIC0tbWluX3BhcnQgIT0gMCk7CisKKyAgICBpZiAodHJ1bmMgIT0gTlVMTCkgeworCWRvIHsKKwkgICAgdHJ1bmNbMF0gPSB0cnVuY1sxXTsKKwl9IHdoaWxlICgqdHJ1bmMrKyk7CisJdHJ1bmMtLTsKKyAgICB9IGVsc2UgeworCXRydW5jID0gc3RycmNocihuYW1lLCAnLicpOworCWlmICh0cnVuYyA9PSBOVUxMKSBlcnJvcigiaW50ZXJuYWwgZXJyb3IgaW4gc2hvcnRlbl9uYW1lIik7CisJaWYgKHRydW5jWzFdID09ICdcMCcpIHRydW5jLS07IC8qIGZvcmNlIHRydW5jYXRpb24gKi8KKyAgICB9CisgICAgc3RyY3B5KHRydW5jLCB6X3N1ZmZpeCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSWYgY29tcHJlc3NpbmcgdG8gYSBmaWxlLCBjaGVjayBpZiBvZm5hbWUgaXMgbm90IGFtYmlndW91cworICogYmVjYXVzZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0cnVuY2F0ZXMgbmFtZXMuIE90aGVyd2lzZSwgZ2VuZXJhdGUKKyAqIGEgbmV3IG9mbmFtZSBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgbmFtZSBpbiB0aGUgY29tcHJlc3NlZCBmaWxlLgorICogSWYgdGhlIGNvbXByZXNzZWQgZmlsZSBhbHJlYWR5IGV4aXN0cywgYXNrIGZvciBjb25maXJtYXRpb24uCisgKiAgICBUaGUgY2hlY2sgZm9yIG5hbWUgdHJ1bmNhdGlvbiBpcyBtYWRlIGR5bmFtaWNhbGx5LCBiZWNhdXNlIGRpZmZlcmVudAorICogZmlsZSBzeXN0ZW1zIG9uIHRoZSBzYW1lIE9TIG1pZ2h0IHVzZSBkaWZmZXJlbnQgdHJ1bmNhdGlvbiBydWxlcyAob24gU1ZSNAorICogczUgdHJ1bmNhdGVzIHRvIDE0IGNoYXJzIGFuZCB1ZnMgZG9lcyBub3QgdHJ1bmNhdGUpLgorICogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIC0xIGlmIHRoZSBmaWxlIG11c3QgYmUgc2tpcHBlZCwgYW5kCisgKiB1cGRhdGVzIHNhdmVfb3JpZ19uYW1lIGlmIG5lY2Vzc2FyeS4KKyAqIElOIGFzc2VydGlvbnM6IHNhdmVfb3JpZ19uYW1lIGlzIGFscmVhZHkgc2V0IGlmIG9mbmFtZSBoYXMgYmVlbgorICogYWxyZWFkeSB0cnVuY2F0ZWQgYmVjYXVzZSBvZiBOT19NVUxUSVBMRV9ET1RTLiBUaGUgaW5wdXQgZmlsZSBoYXMKKyAqIGFscmVhZHkgYmVlbiBvcGVuIGFuZCBpc3RhdCBpcyBzZXQuCisgKi8KK2xvY2FsIGludCBjaGVja19vZm5hbWUoKQoreworICAgIHN0cnVjdCBzdGF0CW9zdGF0OyAvKiBzdGF0IGZvciBvZm5hbWUgKi8KKworI2lmZGVmIEVOQU1FVE9PTE9ORworICAgIC8qIENoZWNrIGZvciBzdHJpY3RseSBjb25mb3JtaW5nIFBvc2l4IHN5c3RlbXMgKHdoaWNoIHJldHVybiBFTkFNRVRPT0xPTkcKKyAgICAgKiBpbnN0ZWFkIG9mIHNpbGVudGx5IHRydW5jYXRpbmcgZmlsZW5hbWVzKS4KKyAgICAgKi8KKyAgICBlcnJubyA9IDA7CisgICAgd2hpbGUgKHN0YXQob2ZuYW1lLCAmb3N0YXQpICE9IDApIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVOQU1FVE9PTE9ORykgcmV0dXJuIDA7IC8qIG9mbmFtZSBkb2VzIG5vdCBleGlzdCAqLworCXNob3J0ZW5fbmFtZShvZm5hbWUpOworICAgIH0KKyNlbHNlCisgICAgaWYgKHN0YXQob2ZuYW1lLCAmb3N0YXQpICE9IDApIHJldHVybiAwOworI2VuZGlmCisgICAgLyogQ2hlY2sgZm9yIG5hbWUgdHJ1bmNhdGlvbiBvbiBleGlzdGluZyBmaWxlLiBEbyB0aGlzIGV2ZW4gb24gc3lzdGVtcworICAgICAqIGRlZmluaW5nIEVOQU1FVE9PTE9ORywgYmVjYXVzZSBvbiBtb3N0IHN5c3RlbXMgdGhlIHN0cmljdCBQb3NpeAorICAgICAqIGJlaGF2aW9yIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgKHNpbGVudCBuYW1lIHRydW5jYXRpb24gYWxsb3dlZCkuCisgICAgICovCisgICAgaWYgKCFkZWNvbXByZXNzICYmIG5hbWVfdG9vX2xvbmcob2ZuYW1lLCAmb3N0YXQpKSB7CisJc2hvcnRlbl9uYW1lKG9mbmFtZSk7CisJaWYgKHN0YXQob2ZuYW1lLCAmb3N0YXQpICE9IDApIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIGRpZmZlcmVudCAoY291bGQgYmUKKyAgICAgKiB0aGUgc2FtZSBieSBuYW1lIHRydW5jYXRpb24gb3IgbGlua3MpLgorICAgICAqLworICAgIGlmIChzYW1lX2ZpbGUoJmlzdGF0LCAmb3N0YXQpKSB7CisJaWYgKHN0cmVxdShpZm5hbWUsIG9mbmFtZSkpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICIlczogJXM6IGNhbm5vdCAlc2NvbXByZXNzIG9udG8gaXRzZWxmXG4iLAorCQkgICAgcHJvZ25hbWUsIGlmbmFtZSwgZGVjb21wcmVzcyA/ICJkZSIgOiAiIik7CisJfSBlbHNlIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgYW5kICVzIGFyZSB0aGUgc2FtZSBmaWxlXG4iLAorCQkgICAgcHJvZ25hbWUsIGlmbmFtZSwgb2ZuYW1lKTsKKwl9CisJZXhpdF9jb2RlID0gRVJST1I7CisJcmV0dXJuIEVSUk9SOworICAgIH0KKyAgICAvKiBBc2sgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGUgKi8KKyAgICBpZiAoIWZvcmNlKSB7CisjaWYgMAorCWNoYXIgcmVzcG9uc2VbODBdOworCXN0cmNweShyZXNwb25zZSwibiIpOworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGFscmVhZHkgZXhpc3RzOyIsIHByb2duYW1lLCBvZm5hbWUpOworCWlmIChmb3JlZ3JvdW5kICYmIGlzYXR0eShmaWxlbm8oc3RkaW4pKSkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiBkbyB5b3Ugd2lzaCB0byBvdmVyd3JpdGUgKHkgb3Igbik/ICIpOworCSAgICAodm9pZClmZ2V0cyhyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKS0xLCBzdGRpbik7CisJfQorCWlmICh0b2xvdygqcmVzcG9uc2UpICE9ICd5JykgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIlx0bm90IG92ZXJ3cml0dGVuXG4iKTsKKyNlbmRpZgorCSAgICBpZiAoZXhpdF9jb2RlID09IE9LKSBleGl0X2NvZGUgPSBXQVJOSU5HOworCSAgICByZXR1cm4gRVJST1I7CisjaWYgMAorCX0KKyNlbmRpZgorICAgIH0KKyAgICAodm9pZCkgY2htb2Qob2ZuYW1lLCAwNzc3KTsKKyAgICBpZiAodW5saW5rKG9mbmFtZSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisJcGVycm9yKG9mbmFtZSk7CisJZXhpdF9jb2RlID0gRVJST1I7CisJcmV0dXJuIEVSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzIGZyb20gdGhlIGdpdmVuIHN0YXQgYnVmZmVyLgorICovCitsb2NhbCB2b2lkIHJlc2V0X3RpbWVzIChuYW1lLCBzdGF0YikKKyAgICBjaGFyICpuYW1lOworICAgIHN0cnVjdCBzdGF0ICpzdGF0YjsKK3sKKyAgICBzdHJ1Y3QgdXRpbWJ1Zgl0aW1lcDsKKworICAgIC8qIENvcHkgdGhlIHRpbWUgc3RhbXAgKi8KKyAgICB0aW1lcC5hY3RpbWUgID0gc3RhdGItPnN0X2F0aW1lOworICAgIHRpbWVwLm1vZHRpbWUgPSBzdGF0Yi0+c3RfbXRpbWU7CisKKyAgICAvKiBTb21lIHN5c3RlbXMgKGF0IGxlYXN0IE9TLzIpIGRvIG5vdCBzdXBwb3J0IHV0aW1lIG9uIGRpcmVjdG9yaWVzICovCisgICAgaWYgKHV0aW1lKG5hbWUsICZ0aW1lcCkgJiYgIVNfSVNESVIoc3RhdGItPnN0X21vZGUpKSB7CisJV0FSTigoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKSk7CisJaWYgKCFxdWlldCkgcGVycm9yKG9mbmFtZSk7CisgICAgfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSBtb2RlcywgdGltZXMsIG93bmVyc2hpcCBmcm9tIGlucHV0IGZpbGUgdG8gb3V0cHV0IGZpbGUuCisgKiBJTiBhc3NlcnRpb246IHRvX3N0ZG91dCBpcyBmYWxzZS4KKyAqLworbG9jYWwgdm9pZCBjb3B5X3N0YXQoaWZzdGF0KQorICAgIHN0cnVjdCBzdGF0ICppZnN0YXQ7Cit7CisgICAgaWYgKGRlY29tcHJlc3MgJiYgdGltZV9zdGFtcCAhPSAwICYmIGlmc3RhdC0+c3RfbXRpbWUgIT0gdGltZV9zdGFtcCkgeworCWlmc3RhdC0+c3RfbXRpbWUgPSB0aW1lX3N0YW1wOworCWlmICh2ZXJib3NlID4gMSkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB0aW1lIHN0YW1wIHJlc3RvcmVkXG4iLCBvZm5hbWUpOworCX0KKyAgICB9CisgICAgcmVzZXRfdGltZXMob2ZuYW1lLCBpZnN0YXQpOworCisgICAgLyogQ29weSB0aGUgcHJvdGVjdGlvbiBtb2RlcyAqLworICAgIGlmIChjaG1vZChvZm5hbWUsIGlmc3RhdC0+c3RfbW9kZSAmIDA3Nzc3KSkgeworCVdBUk4oKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSkpOworCWlmICghcXVpZXQpIHBlcnJvcihvZm5hbWUpOworICAgIH0KKworICAgIGNob3duKG9mbmFtZSwgaWZzdGF0LT5zdF91aWQsIGlmc3RhdC0+c3RfZ2lkKTsgIC8qIENvcHkgb3duZXJzaGlwICovCisKKyAgICByZW1vdmVfb2ZuYW1lID0gMDsKKyAgICAvKiBJdCdzIG5vdyBzYWZlIHRvIHJlbW92ZSB0aGUgaW5wdXQgZmlsZTogKi8KKyAgICAodm9pZCkgY2htb2QoaWZuYW1lLCAwNzc3KTsKKyAgICBpZiAodW5saW5rKGlmbmFtZSkpIHsKKwlXQVJOKChzdGRlcnIsICIlczogIiwgcHJvZ25hbWUpKTsKKwlpZiAoIXF1aWV0KSBwZXJyb3IoaWZuYW1lKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnJlZSBhbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHZhcmlhYmxlcyBhbmQgZXhpdCB3aXRoIHRoZSBnaXZlbiBjb2RlLgorICovCitsb2NhbCB2b2lkIGRvX2V4aXQoZXhpdGNvZGUpCisgICAgaW50IGV4aXRjb2RlOworeworICAgIHN0YXRpYyBpbnQgaW5fZXhpdCA9IDA7CisKKyAgICBpZiAoaW5fZXhpdCkgZXhpdChleGl0Y29kZSk7CisgICAgaW5fZXhpdCA9IDE7CisgICAgaWYgKGVudiAhPSBOVUxMKSAgZnJlZShlbnYpLCAgZW52ICA9IE5VTEw7CisgICAgaWYgKGFyZ3MgIT0gTlVMTCkgZnJlZSgoY2hhciopYXJncyksIGFyZ3MgPSBOVUxMOworICAgIEZSRUUoaW5idWYpOworICAgIEZSRUUob3V0YnVmKTsKKyAgICBGUkVFKGRfYnVmKTsKKyAgICBGUkVFKHdpbmRvdyk7CisgICAgRlJFRSh0YWJfcHJlZml4KTsKKyAgICBleGl0KGV4aXRjb2RlKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTaWduYWwgYW5kIGVycm9yIGhhbmRsZXIuCisgKi8KK3ZvaWQgYWJvcnRfZ3ppcCgpCit7CisgICBpZiAocmVtb3ZlX29mbmFtZSkgeworICAgICAgIGNsb3NlKG9mZCk7CisgICAgICAgdW5saW5rIChvZm5hbWUpOworICAgfQorICAgZG9fZXhpdChFUlJPUik7Cit9CmRpZmYgLS1naXQgYS91c3IvZ3ppcC9nemlwLmggYi91c3IvZ3ppcC9nemlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkMmZiZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL2d6aXAuaApAQCAtMCwwICsxLDI5OCBAQAorLyogZ3ppcC5oIC0tIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIGFsbCBnemlwIG1vZHVsZXMKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkuCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKFBST1RPKQorIyAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjZWxzZQorIyAgZGVmaW5lIE9GKGFyZ3MpICAoKQorI2VuZGlmCisKKyNpZmRlZiBfX1NURENfXworICAgdHlwZWRlZiB2b2lkICp2b2lkcDsKKyNlbHNlCisgICB0eXBlZGVmIGNoYXIgKnZvaWRwOworI2VuZGlmCisKKy8qIEkgZG9uJ3QgbGlrZSBuZXN0ZWQgaW5jbHVkZXMsIGJ1dCB0aGUgc3RyaW5nIGFuZCBpbyBmdW5jdGlvbnMgYXJlIHVzZWQKKyAqIHRvbyBvZnRlbgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNkZWZpbmUgbWVtemVybyhzLCBuKSAgICAgbWVtc2V0ICgodm9pZHApKHMpLCAwLCAobikpCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdWNoOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVsZzsKKworLyogUmV0dXJuIGNvZGVzIGZyb20gZ3ppcCAqLworI2RlZmluZSBPSyAgICAgIDAKKyNkZWZpbmUgRVJST1IgICAxCisjZGVmaW5lIFdBUk5JTkcgMgorCisvKiBDb21wcmVzc2lvbiBtZXRob2RzIChzZWUgYWxnb3JpdGhtLmRvYykgKi8KKyNkZWZpbmUgU1RPUkVEICAgICAgMAorI2RlZmluZSBDT01QUkVTU0VEICAxCisjZGVmaW5lIFBBQ0tFRCAgICAgIDIKKyNkZWZpbmUgTFpIRUQgICAgICAgMworLyogbWV0aG9kcyA0IHRvIDcgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgREVGTEFURUQgICAgOAorI2RlZmluZSBNQVhfTUVUSE9EUyA5CitleHRlcm4gaW50IG1ldGhvZDsgICAgICAgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgKi8KKworLyogVG8gc2F2ZSBtZW1vcnkgZm9yIDE2IGJpdCBzeXN0ZW1zLCBzb21lIGFycmF5cyBhcmUgb3ZlcmxhaWQgYmV0d2VlbgorICogdGhlIHZhcmlvdXMgbW9kdWxlczoKKyAqIGRlZmxhdGU6ICBwcmV2K2hlYWQgICB3aW5kb3cgICAgICBkX2J1ZiAgbF9idWYgIG91dGJ1ZgorICogdW5senc6ICAgIHRhYl9wcmVmaXggIHRhYl9zdWZmaXggIHN0YWNrICBpbmJ1ZiAgb3V0YnVmCisgKiBpbmZsYXRlOiAgICAgICAgICAgICAgd2luZG93ICAgICAgICAgICAgIGluYnVmCisgKiB1bnBhY2s6ICAgICAgICAgICAgICAgd2luZG93ICAgICAgICAgICAgIGluYnVmICBwcmVmaXhfbGVuCisgKiB1bmx6aDogICAgbGVmdCtyaWdodCAgd2luZG93ICAgICAgY190YWJsZSBpbmJ1ZiBjX2xlbgorICogRm9yIGNvbXByZXNzaW9uLCBpbnB1dCBpcyBkb25lIGluIHdpbmRvd1tdLiBGb3IgZGVjb21wcmVzc2lvbiwgb3V0cHV0CisgKiBpcyBkb25lIGluIHdpbmRvdyBleGNlcHQgZm9yIHVubHp3LgorICovCisKKyNpZm5kZWYJSU5CVUZTSVoKKyMgIGlmZGVmIFNNQUxMX01FTQorIyAgICBkZWZpbmUgSU5CVUZTSVogIDB4MjAwMCAgLyogaW5wdXQgYnVmZmVyIHNpemUgKi8KKyMgIGVsc2UKKyMgICAgZGVmaW5lIElOQlVGU0laICAweDgwMDAgIC8qIGlucHV0IGJ1ZmZlciBzaXplICovCisjICBlbmRpZgorI2VuZGlmCisjZGVmaW5lIElOQlVGX0VYVFJBICA2NCAgICAgLyogcmVxdWlyZWQgYnkgdW5sencoKSAqLworCisjaWZuZGVmCU9VVEJVRlNJWgorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBPVVRCVUZTSVogICA4MTkyICAvKiBvdXRwdXQgYnVmZmVyIHNpemUgKi8KKyMgIGVsc2UKKyMgICAgZGVmaW5lIE9VVEJVRlNJWiAgMTYzODQgIC8qIG91dHB1dCBidWZmZXIgc2l6ZSAqLworIyAgZW5kaWYKKyNlbmRpZgorI2RlZmluZSBPVVRCVUZfRVhUUkEgMjA0OCAgIC8qIHJlcXVpcmVkIGJ5IHVubHp3KCkgKi8KKworI2lmbmRlZiBESVNUX0JVRlNJWkUKKyMgIGlmZGVmIFNNQUxMX01FTQorIyAgICBkZWZpbmUgRElTVF9CVUZTSVpFIDB4MjAwMCAvKiBidWZmZXIgZm9yIGRpc3RhbmNlcywgc2VlIHRyZWVzLmMgKi8KKyMgIGVsc2UKKyMgICAgZGVmaW5lIERJU1RfQlVGU0laRSAweDgwMDAgLyogYnVmZmVyIGZvciBkaXN0YW5jZXMsIHNlZSB0cmVlcy5jICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBEWU5fQUxMT0MKKyMgIGRlZmluZSBFWFRFUk4odHlwZSwgYXJyYXkpICBleHRlcm4gdHlwZSAqIG5lYXIgYXJyYXkKKyMgIGRlZmluZSBERUNMQVJFKHR5cGUsIGFycmF5LCBzaXplKSAgdHlwZSAqIG5lYXIgYXJyYXkKKyMgIGRlZmluZSBBTExPQyh0eXBlLCBhcnJheSwgc2l6ZSkgeyBcCisgICAgICBhcnJheSA9ICh0eXBlKilmY2FsbG9jKChzaXplX3QpKCgoc2l6ZSkrMUwpLzIpLCAyKnNpemVvZih0eXBlKSk7IFwKKyAgICAgIGlmIChhcnJheSA9PSBOVUxMKSBlcnJvcigiaW5zdWZmaWNpZW50IG1lbW9yeSIpOyBcCisgICB9CisjICBkZWZpbmUgRlJFRShhcnJheSkge2lmIChhcnJheSAhPSBOVUxMKSBmY2ZyZWUoYXJyYXkpLCBhcnJheT1OVUxMO30KKyNlbHNlCisjICBkZWZpbmUgRVhURVJOKHR5cGUsIGFycmF5KSAgZXh0ZXJuIHR5cGUgYXJyYXlbXQorIyAgZGVmaW5lIERFQ0xBUkUodHlwZSwgYXJyYXksIHNpemUpICB0eXBlIGFycmF5W3NpemVdCisjICBkZWZpbmUgQUxMT0ModHlwZSwgYXJyYXksIHNpemUpCisjICBkZWZpbmUgRlJFRShhcnJheSkKKyNlbmRpZgorCitFWFRFUk4odWNoLCBpbmJ1Zik7ICAgICAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworRVhURVJOKHVjaCwgb3V0YnVmKTsgICAgICAgICAvKiBvdXRwdXQgYnVmZmVyICovCitFWFRFUk4odXNoLCBkX2J1Zik7ICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgZGlzdGFuY2VzLCBzZWUgdHJlZXMuYyAqLworRVhURVJOKHVjaCwgd2luZG93KTsgICAgICAgICAvKiBTbGlkaW5nIHdpbmRvdyBhbmQgc3VmZml4IHRhYmxlICh1bmx6dykgKi8KKyNkZWZpbmUgdGFiX3N1ZmZpeCB3aW5kb3cKKyNpZm5kZWYgTUFYU0VHXzY0SworIyAgZGVmaW5lIHRhYl9wcmVmaXggcHJldiAgICAvKiBoYXNoIGxpbmsgKHNlZSBkZWZsYXRlLmMpICovCisjICBkZWZpbmUgaGVhZCAocHJlditXU0laRSkgIC8qIGhhc2ggaGVhZCAoc2VlIGRlZmxhdGUuYykgKi8KKyAgIEVYVEVSTih1c2gsIHRhYl9wcmVmaXgpOyAgLyogcHJlZml4IGNvZGUgKHNlZSB1bmx6dy5jKSAqLworI2Vsc2UKKyMgIGRlZmluZSB0YWJfcHJlZml4MCBwcmV2CisjICBkZWZpbmUgaGVhZCB0YWJfcHJlZml4MQorICAgRVhURVJOKHVzaCwgdGFiX3ByZWZpeDApOyAvKiBwcmVmaXggZm9yIGV2ZW4gY29kZXMgKi8KKyAgIEVYVEVSTih1c2gsIHRhYl9wcmVmaXgxKTsgLyogcHJlZml4IGZvciBvZGQgIGNvZGVzICovCisjZW5kaWYKKworZXh0ZXJuIHVuc2lnbmVkIGluc2l6ZTsgLyogdmFsaWQgYnl0ZXMgaW4gaW5idWYgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnB0cjsgIC8qIGluZGV4IG9mIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQgaW4gaW5idWYgKi8KK2V4dGVybiB1bnNpZ25lZCBvdXRjbnQ7IC8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKworZXh0ZXJuIGxvbmcgYnl0ZXNfaW47ICAgLyogbnVtYmVyIG9mIGlucHV0IGJ5dGVzICovCitleHRlcm4gbG9uZyBieXRlc19vdXQ7ICAvKiBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzICovCitleHRlcm4gbG9uZyBoZWFkZXJfYnl0ZXM7LyogbnVtYmVyIG9mIGJ5dGVzIGluIGd6aXAgaGVhZGVyICovCisKKyNkZWZpbmUgaXNpemUgYnl0ZXNfaW4KKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHppcCBzb3VyY2VzICh0byBiZSBjbGVhbmVkKSAqLworCitleHRlcm4gaW50ICBpZmQ7ICAgICAgICAvKiBpbnB1dCBmaWxlIGRlc2NyaXB0b3IgKi8KK2V4dGVybiBpbnQgIG9mZDsgICAgICAgIC8qIG91dHB1dCBmaWxlIGRlc2NyaXB0b3IgKi8KK2V4dGVybiBjaGFyIGlmbmFtZVtdOyAgIC8qIGlucHV0IGZpbGUgbmFtZSBvciAic3RkaW4iICovCitleHRlcm4gY2hhciBvZm5hbWVbXTsgICAvKiBvdXRwdXQgZmlsZSBuYW1lIG9yICJzdGRvdXQiICovCitleHRlcm4gY2hhciAqcHJvZ25hbWU7ICAvKiBwcm9ncmFtIG5hbWUgKi8KKworZXh0ZXJuIHRpbWVfdCB0aW1lX3N0YW1wOyAvKiBvcmlnaW5hbCB0aW1lIHN0YW1wIChtb2RpZmljYXRpb24gdGltZSkgKi8KK2V4dGVybiBsb25nIGlmaWxlX3NpemU7IC8qIGlucHV0IGZpbGUgc2l6ZSwgLTEgZm9yIGRldmljZXMgKGRlYnVnIG9ubHkpICovCisKK3R5cGVkZWYgaW50IGZpbGVfdDsgICAgIC8qIERvIG5vdCB1c2Ugc3RkaW8gKi8KKyNkZWZpbmUgTk9fRklMRSAgKC0xKSAgIC8qIGluIG1lbW9yeSBjb21wcmVzc2lvbiAqLworCisKKyNkZWZpbmUJUEFDS19NQUdJQyAgICAgIlwwMzdcMDM2IiAvKiBNYWdpYyBoZWFkZXIgZm9yIHBhY2tlZCBmaWxlcyAqLworI2RlZmluZQlHWklQX01BR0lDICAgICAiXDAzN1wyMTMiIC8qIE1hZ2ljIGhlYWRlciBmb3IgZ3ppcCBmaWxlcywgMUYgOEIgKi8KKyNkZWZpbmUJT0xEX0daSVBfTUFHSUMgIlwwMzdcMjM2IiAvKiBNYWdpYyBoZWFkZXIgZm9yIGd6aXAgMC41ID0gZnJlZXplIDEueCAqLworI2RlZmluZQlMWkhfTUFHSUMgICAgICAiXDAzN1wyNDAiIC8qIE1hZ2ljIGhlYWRlciBmb3IgU0NPIExaSCBDb21wcmVzcyBmaWxlcyovCisjZGVmaW5lIFBLWklQX01BR0lDICAgICJcMTIwXDExM1wwMDNcMDA0IiAvKiBNYWdpYyBoZWFkZXIgZm9yIHBremlwIGZpbGVzICovCisKKy8qIGd6aXAgZmxhZyBieXRlICovCisjZGVmaW5lIEFTQ0lJX0ZMQUcgICAweDAxIC8qIGJpdCAwIHNldDogZmlsZSBwcm9iYWJseSBhc2NpaSB0ZXh0ICovCisjZGVmaW5lIENPTlRJTlVBVElPTiAweDAyIC8qIGJpdCAxIHNldDogY29udGludWF0aW9uIG9mIG11bHRpLXBhcnQgZ3ppcCBmaWxlICovCisjZGVmaW5lIEVYVFJBX0ZJRUxEICAweDA0IC8qIGJpdCAyIHNldDogZXh0cmEgZmllbGQgcHJlc2VudCAqLworI2RlZmluZSBPUklHX05BTUUgICAgMHgwOCAvKiBiaXQgMyBzZXQ6IG9yaWdpbmFsIGZpbGUgbmFtZSBwcmVzZW50ICovCisjZGVmaW5lIENPTU1FTlQgICAgICAweDEwIC8qIGJpdCA0IHNldDogZmlsZSBjb21tZW50IHByZXNlbnQgKi8KKyNkZWZpbmUgRU5DUllQVEVEICAgIDB4MjAgLyogYml0IDUgc2V0OiBmaWxlIGlzIGVuY3J5cHRlZCAqLworI2RlZmluZSBSRVNFUlZFRCAgICAgMHhDMCAvKiBiaXQgNiw3OiAgIHJlc2VydmVkICovCisKKy8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlICovCisjZGVmaW5lIFVOS05PV04gMHhmZmZmCisjZGVmaW5lIEJJTkFSWSAgMAorI2RlZmluZSBBU0NJSSAgIDEKKworI2lmbmRlZiBXU0laRQorIyAgZGVmaW5lIFdTSVpFIDB4ODAwMCAgICAgLyogd2luZG93IHNpemUtLW11c3QgYmUgYSBwb3dlciBvZiB0d28sIGFuZCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgLyogIGF0IGxlYXN0IDMySyBmb3IgemlwJ3MgZGVmbGF0ZSBtZXRob2QgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisvKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgorICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgorICovCisKKyNkZWZpbmUgTUFYX0RJU1QgIChXU0laRS1NSU5fTE9PS0FIRUFEKQorLyogSW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIGNvZGUsIHBhcnRpY3VsYXJseSBvbiAxNiBiaXQgbWFjaGluZXMsIG1hdGNoCisgKiBkaXN0YW5jZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0RJU1QgaW5zdGVhZCBvZiBXU0laRS4KKyAqLworCitleHRlcm4gaW50IGRlY3J5cHQ7ICAgICAgICAvKiBmbGFnIHRvIHR1cm4gb24gZGVjcnlwdGlvbiAqLworZXh0ZXJuIGludCBleGl0X2NvZGU7ICAgICAgLyogcHJvZ3JhbSBleGl0IGNvZGUgKi8KK2V4dGVybiBpbnQgdmVyYm9zZTsgICAgICAgIC8qIGJlIHZlcmJvc2UgKC12KSAqLworZXh0ZXJuIGludCBxdWlldDsgICAgICAgICAgLyogYmUgcXVpZXQgKC1xKSAqLworZXh0ZXJuIGludCBsZXZlbDsgICAgICAgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKi8KK2V4dGVybiBpbnQgdGVzdDsgICAgICAgICAgIC8qIGNoZWNrIC56IGZpbGUgaW50ZWdyaXR5ICovCitleHRlcm4gaW50IHRvX3N0ZG91dDsgICAgICAvKiBvdXRwdXQgdG8gc3Rkb3V0ICgtYykgKi8KK2V4dGVybiBpbnQgc2F2ZV9vcmlnX25hbWU7IC8qIHNldCBpZiBvcmlnaW5hbCBuYW1lIG11c3QgYmUgc2F2ZWQgKi8KKworI2RlZmluZSBnZXRfYnl0ZSgpICAoaW5wdHIgPCBpbnNpemUgPyBpbmJ1ZltpbnB0cisrXSA6IGZpbGxfaW5idWYoMCkpCisjZGVmaW5lIHRyeV9ieXRlKCkgIChpbnB0ciA8IGluc2l6ZSA/IGluYnVmW2lucHRyKytdIDogZmlsbF9pbmJ1ZigxKSkKKworLyogcHV0X2J5dGUgaXMgdXNlZCBmb3IgdGhlIGNvbXByZXNzZWQgb3V0cHV0LCBwdXRfdWJ5dGUgZm9yIHRoZQorICogdW5jb21wcmVzc2VkIG91dHB1dC4gSG93ZXZlciB1bmx6dygpIHVzZXMgd2luZG93IGZvciBpdHMKKyAqIHN1ZmZpeCB0YWJsZSBpbnN0ZWFkIG9mIGl0cyBvdXRwdXQgYnVmZmVyLCBzbyBpdCBkb2VzIG5vdCB1c2UgcHV0X3VieXRlCisgKiAodG8gYmUgY2xlYW5lZCB1cCkuCisgKi8KKyNkZWZpbmUgcHV0X2J5dGUoYykge291dGJ1ZltvdXRjbnQrK109KHVjaCkoYyk7IGlmIChvdXRjbnQ9PU9VVEJVRlNJWilcCisgICBmbHVzaF9vdXRidWYoKTt9CisjZGVmaW5lIHB1dF91Ynl0ZShjKSB7d2luZG93W291dGNudCsrXT0odWNoKShjKTsgaWYgKG91dGNudD09V1NJWkUpXAorICAgZmx1c2hfd2luZG93KCk7fQorCisvKiBPdXRwdXQgYSAxNiBiaXQgdmFsdWUsIGxzYiBmaXJzdCAqLworI2RlZmluZSBwdXRfc2hvcnQodykgXAoreyBpZiAob3V0Y250IDwgT1VUQlVGU0laLTIpIHsgXAorICAgIG91dGJ1ZltvdXRjbnQrK10gPSAodWNoKSAoKHcpICYgMHhmZik7IFwKKyAgICBvdXRidWZbb3V0Y250KytdID0gKHVjaCkgKCh1c2gpKHcpID4+IDgpOyBcCisgIH0gZWxzZSB7IFwKKyAgICBwdXRfYnl0ZSgodWNoKSgodykgJiAweGZmKSk7IFwKKyAgICBwdXRfYnl0ZSgodWNoKSgodXNoKSh3KSA+PiA4KSk7IFwKKyAgfSBcCit9CisKKy8qIE91dHB1dCBhIDMyIGJpdCB2YWx1ZSB0byB0aGUgYml0IHN0cmVhbSwgbHNiIGZpcnN0ICovCisjZGVmaW5lIHB1dF9sb25nKG4pIHsgXAorICAgIHB1dF9zaG9ydCgobikgJiAweGZmZmYpOyBcCisgICAgcHV0X3Nob3J0KCgodWxnKShuKSkgPj4gMTYpOyBcCit9CisKKyNkZWZpbmUgc2Vla2FibGUoKSAgICAwICAvKiBmb3JjZSBzZXF1ZW50aWFsIG91dHB1dCAqLworI2RlZmluZSB0cmFuc2xhdGVfZW9sIDAgIC8qIG5vIG9wdGlvbiAtYSB5ZXQgKi8KKworI2RlZmluZSB0b2xvdyhjKSAgKGlzdXBwZXIoYykgPyAoYyktJ0EnKydhJyA6IChjKSkgICAgLyogZm9yY2UgdG8gbG93ZXIgY2FzZSAqLworCisvKiBNYWNyb3MgZm9yIGdldHRpbmcgdHdvLWJ5dGUgYW5kIGZvdXItYnl0ZSBoZWFkZXIgdmFsdWVzICovCisjZGVmaW5lIFNIKHApICgodXNoKSh1Y2gpKChwKVswXSkgfCAoKHVzaCkodWNoKSgocClbMV0pIDw8IDgpKQorI2RlZmluZSBMRyhwKSAoKHVsZykoU0gocCkpIHwgKCh1bGcpKFNIKChwKSsyKSkgPDwgMTYpKQorCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgZXJyb3IobXNnKTt9CisjICBkZWZpbmUgVHJhY2UoeCkgZnByaW50ZiB4CisjICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAodmVyYm9zZSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHZlcmJvc2U+MSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh2ZXJib3NlICYmIChjKSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAodmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKKyMgIGRlZmluZSBUcmFjZSh4KQorIyAgZGVmaW5lIFRyYWNldih4KQorIyAgZGVmaW5lIFRyYWNldnYoeCkKKyMgIGRlZmluZSBUcmFjZWMoYyx4KQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQorI2VuZGlmCisKKyNkZWZpbmUgV0FSTihtc2cpIHtpZiAoIXF1aWV0KSBmcHJpbnRmIG1zZyA7IFwKKwkJICAgaWYgKGV4aXRfY29kZSA9PSBPSykgZXhpdF9jb2RlID0gV0FSTklORzt9CisKKwkvKiBpbiB6aXAuYzogKi8KK2V4dGVybiBpbnQgemlwICAgICAgICBPRigoaW50IGluLCBpbnQgb3V0KSk7CitleHRlcm4gaW50IGZpbGVfcmVhZCAgT0YoKGNoYXIgKmJ1ZiwgIHVuc2lnbmVkIHNpemUpKTsKKworCS8qIGluIHVuemlwLmMgKi8KK2V4dGVybiBpbnQgdW56aXAgICAgICBPRigoaW50IGluLCBpbnQgb3V0KSk7CitleHRlcm4gaW50IGNoZWNrX3ppcGZpbGUgT0YoKGludCBpbikpOworCisJLyogaW4gZ3ppcC5jICovCit2b2lkIGFib3J0X2d6aXAgT0YoKHZvaWQpKTsKKworICAgICAgICAvKiBpbiBkZWZsYXRlLmMgKi8KK3ZvaWQgbG1faW5pdCBPRigoaW50IHBhY2tfbGV2ZWwsIHVzaCAqZmxhZ3MpKTsKK3VsZyAgZGVmbGF0ZSBPRigodm9pZCkpOworCisgICAgICAgIC8qIGluIHRyZWVzLmMgKi8KK3ZvaWQgY3RfaW5pdCAgICAgT0YoKHVzaCAqYXR0ciwgaW50ICptZXRob2QpKTsKK2ludCAgY3RfdGFsbHkgICAgT0YoKGludCBkaXN0LCBpbnQgbGMpKTsKK3VsZyAgZmx1c2hfYmxvY2sgT0YoKGNoYXIgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sIGludCBlb2YpKTsKKworICAgICAgICAvKiBpbiBiaXRzLmMgKi8KK3ZvaWQgICAgIGJpX2luaXQgICAgT0YoKGZpbGVfdCB6aXBmaWxlKSk7Cit2b2lkICAgICBzZW5kX2JpdHMgIE9GKChpbnQgdmFsdWUsIGludCBsZW5ndGgpKTsKK3Vuc2lnbmVkIGJpX3JldmVyc2UgT0YoKHVuc2lnbmVkIHZhbHVlLCBpbnQgbGVuZ3RoKSk7Cit2b2lkICAgICBiaV93aW5kdXAgIE9GKCh2b2lkKSk7Cit2b2lkICAgICBjb3B5X2Jsb2NrIE9GKChjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgaW50IGhlYWRlcikpOworZXh0ZXJuICAgaW50ICgqcmVhZF9idWYpIE9GKChjaGFyICpidWYsIHVuc2lnbmVkIHNpemUpKTsKKworCS8qIGluIHV0aWwuYzogKi8KK2V4dGVybiBpbnQgY29weSAgICAgICAgICAgT0YoKGludCBpbiwgaW50IG91dCkpOworZXh0ZXJuIHVsZyAgdXBkY3JjICAgICAgICBPRigodWNoICpzLCB1bnNpZ25lZCBuKSk7CitleHRlcm4gdm9pZCBjbGVhcl9idWZzICAgIE9GKCh2b2lkKSk7CitleHRlcm4gaW50ICBmaWxsX2luYnVmICAgIE9GKChpbnQgZW9mX29rKSk7CitleHRlcm4gdm9pZCBmbHVzaF9vdXRidWYgIE9GKCh2b2lkKSk7CitleHRlcm4gdm9pZCBmbHVzaF93aW5kb3cgIE9GKCh2b2lkKSk7CitleHRlcm4gdm9pZCB3cml0ZV9idWYgICAgIE9GKChpbnQgZmQsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgY250KSk7CitleHRlcm4gY2hhciAqc3RybHdyICAgICAgIE9GKChjaGFyICpzKSk7CitleHRlcm4gY2hhciAqYmFzZW5hbWUgICAgIE9GKChjaGFyICpmbmFtZSkpOworZXh0ZXJuIHZvaWQgbWFrZV9zaW1wbGVfbmFtZSBPRigoY2hhciAqbmFtZSkpOworZXh0ZXJuIGNoYXIgKmFkZF9lbnZvcHQgICBPRigoaW50ICphcmdjcCwgY2hhciAqKiphcmd2cCwgY2hhciAqZW52KSk7CitleHRlcm4gdm9pZCBlcnJvciAgICAgICAgIE9GKChjaGFyICptKSk7CitleHRlcm4gdm9pZCB3YXJuICAgICAgICAgIE9GKChjaGFyICphLCBjaGFyICpiKSk7CitleHRlcm4gdm9pZCByZWFkX2Vycm9yICAgIE9GKCh2b2lkKSk7CitleHRlcm4gdm9pZCB3cml0ZV9lcnJvciAgIE9GKCh2b2lkKSk7CitleHRlcm4gdm9pZCBkaXNwbGF5X3JhdGlvIE9GKChsb25nIG51bSwgbG9uZyBkZW4sIEZJTEUgKmZpbGUpKTsKK2V4dGVybiB2b2lkcCB4bWFsbG9jICAgICAgT0YoKHVuc2lnbmVkIGludCBzaXplKSk7CisKKwkvKiBpbiBpbmZsYXRlLmMgKi8KK2V4dGVybiBpbnQgaW5mbGF0ZSBPRigodm9pZCkpOworCisvKiBzdHVmZiBmcm9tIGx6dy5oICovCisjaWZuZGVmIEJJVFMKKyMgIGRlZmluZSBCSVRTIDE2CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9nemlwL2luZmxhdGUuYyBiL3Vzci9nemlwL2luZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQwNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvaW5mbGF0ZS5jCkBAIC0wLDAgKzEsOTUwIEBACisvKiBpbmZsYXRlLmMgLS0gTm90IGNvcHlyaWdodGVkIDE5OTIgYnkgTWFyayBBZGxlcgorICAgdmVyc2lvbiBjMTBwMSwgMTAgSmFudWFyeSAxOTkzICovCisKKy8qIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IGxpa2Ugd2l0aCB0aGlzIHNvdXJjZSBmaWxlLCB0aG91Z2ggSSB3b3VsZAorICAgcHJlZmVyIHRoYXQgaWYgeW91IG1vZGlmeSBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IHRoYXQgeW91IGluY2x1ZGUKKyAgIGNvbW1lbnRzIHRvIHRoYXQgZWZmZWN0IHdpdGggeW91ciBuYW1lIGFuZCB0aGUgZGF0ZS4gIFRoYW5rIHlvdS4KKyAgIFtUaGUgaGlzdG9yeSBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgZmlsZSBDaGFuZ2VMb2cuXQorICovCisKKy8qCisgICBJbmZsYXRlIGRlZmxhdGVkIChQS1pJUCdzIG1ldGhvZCA4IGNvbXByZXNzZWQpIGRhdGEuICBUaGUgY29tcHJlc3Npb24KKyAgIG1ldGhvZCBzZWFyY2hlcyBmb3IgYXMgbXVjaCBvZiB0aGUgY3VycmVudCBzdHJpbmcgb2YgYnl0ZXMgKHVwIHRvIGEKKyAgIGxlbmd0aCBvZiAyNTgpIGluIHRoZSBwcmV2aW91cyAzMksgYnl0ZXMuICBJZiBpdCBkb2Vzbid0IGZpbmQgYW55CisgICBtYXRjaGVzIChvZiBhdCBsZWFzdCBsZW5ndGggMyksIGl0IGNvZGVzIHRoZSBuZXh0IGJ5dGUuICBPdGhlcndpc2UsIGl0CisgICBjb2RlcyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHN0cmluZyBhbmQgaXRzIGRpc3RhbmNlIGJhY2t3YXJkcyBmcm9tCisgICB0aGUgY3VycmVudCBwb3NpdGlvbi4gIFRoZXJlIGlzIGEgc2luZ2xlIEh1ZmZtYW4gY29kZSB0aGF0IGNvZGVzIGJvdGgKKyAgIHNpbmdsZSBieXRlcyAoY2FsbGVkICJsaXRlcmFscyIpIGFuZCBtYXRjaCBsZW5ndGhzLiAgQSBzZWNvbmQgSHVmZm1hbgorICAgY29kZSBjb2RlcyB0aGUgZGlzdGFuY2UgaW5mb3JtYXRpb24sIHdoaWNoIGZvbGxvd3MgYSBsZW5ndGggY29kZS4gIEVhY2gKKyAgIGxlbmd0aCBvciBkaXN0YW5jZSBjb2RlIGFjdHVhbGx5IHJlcHJlc2VudHMgYSBiYXNlIHZhbHVlIGFuZCBhIG51bWJlcgorICAgb2YgImV4dHJhIiAoc29tZXRpbWVzIHplcm8pIGJpdHMgdG8gZ2V0IHRvIGFkZCB0byB0aGUgYmFzZSB2YWx1ZS4gIEF0CisgICB0aGUgZW5kIG9mIGVhY2ggZGVmbGF0ZWQgYmxvY2sgaXMgYSBzcGVjaWFsIGVuZC1vZi1ibG9jayAoRU9CKSBsaXRlcmFsLworICAgbGVuZ3RoIGNvZGUuICBUaGUgZGVjb2RpbmcgcHJvY2VzcyBpcyBiYXNpY2FsbHk6IGdldCBhIGxpdGVyYWwvbGVuZ3RoCisgICBjb2RlOyBpZiBFT0IgdGhlbiBkb25lOyBpZiBhIGxpdGVyYWwsIGVtaXQgdGhlIGRlY29kZWQgYnl0ZTsgaWYgYQorICAgbGVuZ3RoIHRoZW4gZ2V0IHRoZSBkaXN0YW5jZSBhbmQgZW1pdCB0aGUgcmVmZXJyZWQtdG8gYnl0ZXMgZnJvbSB0aGUKKyAgIHNsaWRpbmcgd2luZG93IG9mIHByZXZpb3VzbHkgZW1pdHRlZCBkYXRhLgorCisgICBUaGVyZSBhcmUgKGN1cnJlbnRseSkgdGhyZWUga2luZHMgb2YgaW5mbGF0ZSBibG9ja3M6IHN0b3JlZCwgZml4ZWQsIGFuZAorICAgZHluYW1pYy4gIFRoZSBjb21wcmVzc29yIGRlYWxzIHdpdGggc29tZSBjaHVuayBvZiBkYXRhIGF0IGEgdGltZSwgYW5kCisgICBkZWNpZGVzIHdoaWNoIG1ldGhvZCB0byB1c2Ugb24gYSBjaHVuay1ieS1jaHVuayBiYXNpcy4gIEEgY2h1bmsgbWlnaHQKKyAgIHR5cGljYWxseSBiZSAzMksgb3IgNjRLLiAgSWYgdGhlIGNodW5rIGlzIHVuY29tcHJlc3NpYmxlLCB0aGVuIHRoZQorICAgInN0b3JlZCIgbWV0aG9kIGlzIHVzZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBieXRlcyBhcmUgc2ltcGx5IHN0b3JlZCBhcworICAgaXMsIGVpZ2h0IGJpdHMgcGVyIGJ5dGUsIHdpdGggbm9uZSBvZiB0aGUgYWJvdmUgY29kaW5nLiAgVGhlIGJ5dGVzIGFyZQorICAgcHJlY2VkZWQgYnkgYSBjb3VudCwgc2luY2UgdGhlcmUgaXMgbm8gbG9uZ2VyIGFuIEVPQiBjb2RlLgorCisgICBJZiB0aGUgZGF0YSBpcyBjb21wcmVzc2libGUsIHRoZW4gZWl0aGVyIHRoZSBmaXhlZCBvciBkeW5hbWljIG1ldGhvZHMKKyAgIGFyZSB1c2VkLiAgSW4gdGhlIGR5bmFtaWMgbWV0aG9kLCB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIHByZWNlZGVkIGJ5CisgICBhbiBlbmNvZGluZyBvZiB0aGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIEh1ZmZtYW4gY29kZXMgdGhhdCBhcmUKKyAgIHRvIGJlIHVzZWQgdG8gZGVjb2RlIHRoaXMgYmxvY2suICBUaGUgcmVwcmVzZW50YXRpb24gaXMgaXRzZWxmIEh1ZmZtYW4KKyAgIGNvZGVkLCBhbmQgc28gaXMgcHJlY2VkZWQgYnkgYSBkZXNjcmlwdGlvbiBvZiB0aGF0IGNvZGUuICBUaGVzZSBjb2RlCisgICBkZXNjcmlwdGlvbnMgdGFrZSB1cCBhIGxpdHRsZSBzcGFjZSwgYW5kIHNvIGZvciBzbWFsbCBibG9ja3MsIHRoZXJlIGlzCisgICBhIHByZWRlZmluZWQgc2V0IG9mIGNvZGVzLCBjYWxsZWQgdGhlIGZpeGVkIGNvZGVzLiAgVGhlIGZpeGVkIG1ldGhvZCBpcworICAgdXNlZCBpZiB0aGUgYmxvY2sgY29kZXMgdXAgc21hbGxlciB0aGF0IHdheSAodXN1YWxseSBmb3IgcXVpdGUgc21hbGwKKyAgIGNodW5rcyksIG90aGVyd2lzZSB0aGUgZHluYW1pYyBtZXRob2QgaXMgdXNlZC4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCisgICBjb2RlcyBhcmUgY3VzdG9taXplZCB0byB0aGUgcHJvYmFiaWxpdGllcyBpbiB0aGUgY3VycmVudCBibG9jaywgYW5kIHNvCisgICBjYW4gY29kZSBpdCBtdWNoIGJldHRlciB0aGFuIHRoZSBwcmUtZGV0ZXJtaW5lZCBmaXhlZCBjb2Rlcy4KKworICAgVGhlIEh1ZmZtYW4gY29kZXMgdGhlbXNlbHZlcyBhcmUgZGVjb2RlZCB1c2luZyBhIG11dGxpLWxldmVsIHRhYmxlCisgICBsb29rdXAsIGluIG9yZGVyIHRvIG1heGltaXplIHRoZSBzcGVlZCBvZiBkZWNvZGluZyBwbHVzIHRoZSBzcGVlZCBvZgorICAgYnVpbGRpbmcgdGhlIGRlY29kaW5nIHRhYmxlcy4gIFNlZSB0aGUgY29tbWVudHMgYmVsb3cgdGhhdCBwcmVjZWRlIHRoZQorICAgbGJpdHMgYW5kIGRiaXRzIHR1bmluZyBwYXJhbWV0ZXJzLgorICovCisKKworLyoKKyAgIE5vdGVzIGJleW9uZCB0aGUgMS45M2EgYXBwbm90ZS50eHQ6CisKKyAgIDEuIERpc3RhbmNlIHBvaW50ZXJzIG5ldmVyIHBvaW50IGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQKKyAgICAgIHN0cmVhbS4KKyAgIDIuIERpc3RhbmNlIHBvaW50ZXJzIGNhbiBwb2ludCBiYWNrIGFjcm9zcyBibG9ja3MsIHVwIHRvIDMyayBhd2F5LgorICAgMy4gVGhlcmUgaXMgYW4gaW1wbGllZCBtYXhpbXVtIG9mIDcgYml0cyBmb3IgdGhlIGJpdCBsZW5ndGggdGFibGUgYW5kCisgICAgICAxNSBiaXRzIGZvciB0aGUgYWN0dWFsIGRhdGEuCisgICA0LiBJZiBvbmx5IG9uZSBjb2RlIGV4aXN0cywgdGhlbiBpdCBpcyBlbmNvZGVkIHVzaW5nIG9uZSBiaXQuICAoWmVybworICAgICAgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsIGJ1dCBwZXJoYXBzIGEgbGl0dGxlIGNvbmZ1c2luZy4pICBJZiB0d28KKyAgICAgIGNvZGVzIGV4aXN0LCB0aGV5IGFyZSBjb2RlZCB1c2luZyBvbmUgYml0IGVhY2ggKDAgYW5kIDEpLgorICAgNS4gVGhlcmUgaXMgbm8gd2F5IG9mIHNlbmRpbmcgemVybyBkaXN0YW5jZSBjb2Rlcy0tYSBkdW1teSBtdXN0IGJlCisgICAgICBzZW50IGlmIHRoZXJlIGFyZSBub25lLiAgKEhpc3Rvcnk6IGEgcHJlIDIuMCB2ZXJzaW9uIG9mIFBLWklQIHdvdWxkCisgICAgICBzdG9yZSBibG9ja3Mgd2l0aCBubyBkaXN0YW5jZSBjb2RlcywgYnV0IHRoaXMgd2FzIGRpc2NvdmVyZWQgdG8gYmUKKyAgICAgIHRvbyBoYXJzaCBhIGNyaXRlcmlvbi4pICBWYWxpZCBvbmx5IGZvciAxLjkzYS4gIDIuMDRjIGRvZXMgYWxsb3cKKyAgICAgIHplcm8gZGlzdGFuY2UgY29kZXMsIHdoaWNoIGlzIHNlbnQgYXMgb25lIGNvZGUgb2YgemVybyBiaXRzIGluCisgICAgICBsZW5ndGguCisgICA2LiBUaGVyZSBhcmUgdXAgdG8gMjg2IGxpdGVyYWwvbGVuZ3RoIGNvZGVzLiAgQ29kZSAyNTYgcmVwcmVzZW50cyB0aGUKKyAgICAgIGVuZC1vZi1ibG9jay4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBzdGF0aWMgbGVuZ3RoIHRyZWUgZGVmaW5lcworICAgICAgMjg4IGNvZGVzIGp1c3QgdG8gZmlsbCBvdXQgdGhlIEh1ZmZtYW4gY29kZXMuICBDb2RlcyAyODYgYW5kIDI4NworICAgICAgY2Fubm90IGJlIHVzZWQgdGhvdWdoLCBzaW5jZSB0aGVyZSBpcyBubyBsZW5ndGggYmFzZSBvciBleHRyYSBiaXRzCisgICAgICBkZWZpbmVkIGZvciB0aGVtLiAgU2ltaWxhcmx5LCB0aGVyZSBhcmUgdXAgdG8gMzAgZGlzdGFuY2UgY29kZXMuCisgICAgICBIb3dldmVyLCBzdGF0aWMgdHJlZXMgZGVmaW5lIDMyIGNvZGVzIChhbGwgNSBiaXRzKSB0byBmaWxsIG91dCB0aGUKKyAgICAgIEh1ZmZtYW4gY29kZXMsIGJ1dCB0aGUgbGFzdCB0d28gaGFkIGJldHRlciBub3Qgc2hvdyB1cCBpbiB0aGUgZGF0YS4KKyAgIDcuIFVuemlwIGNhbiBjaGVjayBkeW5hbWljIEh1ZmZtYW4gYmxvY2tzIGZvciBjb21wbGV0ZSBjb2RlIHNldHMuCisgICAgICBUaGUgZXhjZXB0aW9uIGlzIHRoYXQgYSBzaW5nbGUgY29kZSB3b3VsZCBub3QgYmUgY29tcGxldGUgKHNlZSAjNCkuCisgICA4LiBUaGUgZml2ZSBiaXRzIGZvbGxvd2luZyB0aGUgYmxvY2sgdHlwZSBpcyByZWFsbHkgdGhlIG51bWJlciBvZgorICAgICAgbGl0ZXJhbCBjb2RlcyBzZW50IG1pbnVzIDI1Ny4KKyAgIDkuIExlbmd0aCBjb2RlcyA4LDE2LDE2IGFyZSBpbnRlcnByZXRlZCBhcyAxMyBsZW5ndGggY29kZXMgb2YgOCBiaXRzCisgICAgICAoMSs2KzYpLiAgVGhlcmVmb3JlLCB0byBvdXRwdXQgdGhyZWUgdGltZXMgdGhlIGxlbmd0aCwgeW91IG91dHB1dAorICAgICAgdGhyZWUgY29kZXMgKDErMSsxKSwgd2hlcmVhcyB0byBvdXRwdXQgZm91ciB0aW1lcyB0aGUgc2FtZSBsZW5ndGgsCisgICAgICB5b3Ugb25seSBuZWVkIHR3byBjb2RlcyAoMSszKS4gIEhtbS4KKyAgMTAuIEluIHRoZSB0cmVlIHJlY29uc3RydWN0aW9uIGFsZ29yaXRobSwgQ29kZSA9IENvZGUgKyBJbmNyZW1lbnQKKyAgICAgIG9ubHkgaWYgQml0TGVuZ3RoKGkpIGlzIG5vdCB6ZXJvLiAgKFByZXR0eSBvYnZpb3VzLikKKyAgMTEuIENvcnJlY3Rpb246IDQgQml0czogIyBvZiBCaXQgTGVuZ3RoIGNvZGVzIC0gNCAgICAgKDQgLSAxOSkKKyAgMTIuIE5vdGU6IGxlbmd0aCBjb2RlIDI4NCBjYW4gcmVwcmVzZW50IDIyNy0yNTgsIGJ1dCBsZW5ndGggY29kZSAyODUKKyAgICAgIHJlYWxseSBpcyAyNTguICBUaGUgbGFzdCBsZW5ndGggZGVzZXJ2ZXMgaXRzIG93biwgc2hvcnQgY29kZQorICAgICAgc2luY2UgaXQgZ2V0cyB1c2VkIGEgbG90IGluIHZlcnkgcmVkdW5kYW50IGZpbGVzLiAgVGhlIGxlbmd0aAorICAgICAgMjU4IGlzIHNwZWNpYWwgc2luY2UgMjU4IC0gMyAodGhlIG1pbiBtYXRjaCBsZW5ndGgpIGlzIDI1NS4KKyAgMTMuIFRoZSBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBiaXQgbGVuZ3RocyBhcmUgcmVhZCBhcyBhCisgICAgICBzaW5nbGUgc3RyZWFtIG9mIGxlbmd0aHMuICBJdCBpcyBwb3NzaWJsZSAoYW5kIGFkdmFudGFnZW91cykgZm9yCisgICAgICBhIHJlcGVhdCBjb2RlICgxNiwgMTcsIG9yIDE4KSB0byBnbyBhY3Jvc3MgdGhlIGJvdW5kYXJ5IGJldHdlZW4KKyAgICAgIHRoZSB0d28gc2V0cyBvZiBsZW5ndGhzLgorICovCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGluZmxhdGUuYyx2IDEuMSAyMDAyLzA4LzE4IDAwOjU5OjIxIGhwYSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidGFpbG9yLmgiCisjaW5jbHVkZSAiZ3ppcC5oIgorI2RlZmluZSBzbGlkZSB3aW5kb3cKKworLyogSHVmZm1hbiBjb2RlIGxvb2t1cCB0YWJsZSBlbnRyeS0tdGhpcyBlbnRyeSBpcyBmb3VyIGJ5dGVzIGZvciBtYWNoaW5lcworICAgdGhhdCBoYXZlIDE2LWJpdCBwb2ludGVycyAoZS5nLiBQQydzIGluIHRoZSBzbWFsbCBvciBtZWRpdW0gbW9kZWwpLgorICAgVmFsaWQgZXh0cmEgYml0cyBhcmUgMC4uMTMuICBlID09IDE1IGlzIEVPQiAoZW5kIG9mIGJsb2NrKSwgZSA9PSAxNgorICAgbWVhbnMgdGhhdCB2IGlzIGEgbGl0ZXJhbCwgMTYgPCBlIDwgMzIgbWVhbnMgdGhhdCB2IGlzIGEgcG9pbnRlciB0bworICAgdGhlIG5leHQgdGFibGUsIHdoaWNoIGNvZGVzIGUgLSAxNiBiaXRzLCBhbmQgbGFzdGx5IGUgPT0gOTkgaW5kaWNhdGVzCisgICBhbiB1bnVzZWQgY29kZS4gIElmIGEgY29kZSB3aXRoIGUgPT0gOTkgaXMgbG9va2VkIHVwLCB0aGlzIGltcGxpZXMgYW4KKyAgIGVycm9yIGluIHRoZSBkYXRhLiAqLworc3RydWN0IGh1ZnQgeworICB1Y2ggZTsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCisgIHVjaCBiOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3Igc3ViY29kZSAqLworICB1bmlvbiB7CisgICAgdXNoIG47ICAgICAgICAgICAgICAvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgb3IgZGlzdGFuY2UgYmFzZSAqLworICAgIHN0cnVjdCBodWZ0ICp0OyAgICAgLyogcG9pbnRlciB0byBuZXh0IGxldmVsIG9mIHRhYmxlICovCisgIH0gdjsKK307CisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworaW50IGh1ZnRfYnVpbGQgT0YoKHVuc2lnbmVkICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgdXNoICosIHVzaCAqLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBodWZ0ICoqLCBpbnQgKikpOworaW50IGh1ZnRfZnJlZSBPRigoc3RydWN0IGh1ZnQgKikpOworaW50IGluZmxhdGVfY29kZXMgT0YoKHN0cnVjdCBodWZ0ICosIHN0cnVjdCBodWZ0ICosIGludCwgaW50KSk7CitpbnQgaW5mbGF0ZV9zdG9yZWQgT0YoKHZvaWQpKTsKK2ludCBpbmZsYXRlX2ZpeGVkIE9GKCh2b2lkKSk7CitpbnQgaW5mbGF0ZV9keW5hbWljIE9GKCh2b2lkKSk7CitpbnQgaW5mbGF0ZV9ibG9jayBPRigoaW50ICopKTsKK2ludCBpbmZsYXRlIE9GKCh2b2lkKSk7CisKKworLyogVGhlIGluZmxhdGUgYWxnb3JpdGhtIHVzZXMgYSBzbGlkaW5nIDMySyBieXRlIHdpbmRvdyBvbiB0aGUgdW5jb21wcmVzc2VkCisgICBzdHJlYW0gdG8gZmluZCByZXBlYXRlZCBieXRlIHN0cmluZ3MuICBUaGlzIGlzIGltcGxlbWVudGVkIGhlcmUgYXMgYQorICAgY2lyY3VsYXIgYnVmZmVyLiAgVGhlIGluZGV4IGlzIHVwZGF0ZWQgc2ltcGx5IGJ5IGluY3JlbWVudGluZyBhbmQgdGhlbgorICAgYW5kJ2luZyB3aXRoIDB4N2ZmZiAoMzJLLTEpLiAqLworLyogSXQgaXMgbGVmdCB0byBvdGhlciBtb2R1bGVzIHRvIHN1cHBseSB0aGUgMzJLIGFyZWEuICBJdCBpcyBhc3N1bWVkCisgICB0byBiZSB1c2FibGUgYXMgaWYgaXQgd2VyZSBkZWNsYXJlZCAidWNoIHNsaWRlWzMyNzY4XTsiIG9yIGFzIGp1c3QKKyAgICJ1Y2ggKnNsaWRlOyIgYW5kIHRoZW4gbWFsbG9jJ2VkIGluIHRoZSBsYXR0ZXIgY2FzZS4gIFRoZSBkZWZpbml0aW9uCisgICBtdXN0IGJlIGluIHVuemlwLmgsIGluY2x1ZGVkIGFib3ZlLiAqLworLyogdW5zaWduZWQgd3A7ICAgICAgICAgICAgIGN1cnJlbnQgcG9zaXRpb24gaW4gc2xpZGUgKi8KKyNkZWZpbmUgd3Agb3V0Y250CisjZGVmaW5lIGZsdXNoX291dHB1dCh3KSAod3A9KHcpLGZsdXNoX3dpbmRvdygpKQorCisvKiBUYWJsZXMgZm9yIGRlZmxhdGUgZnJvbSBQS1pJUCdzIGFwcG5vdGUudHh0LiAqLworc3RhdGljIHVuc2lnbmVkIGJvcmRlcltdID0geyAgICAvKiBPcmRlciBvZiB0aGUgYml0IGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07CitzdGF0aWMgdXNoIGNwbGVuc1tdID0geyAgICAgICAgIC8qIENvcHkgbGVuZ3RocyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisgICAgICAgIC8qIG5vdGU6IHNlZSBub3RlICMxMyBhYm92ZSBhYm91dCB0aGUgMjU4IGluIHRoaXMgbGlzdC4gKi8KK3N0YXRpYyB1c2ggY3BsZXh0W10gPSB7ICAgICAgICAgLyogRXh0cmEgYml0cyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLAorICAgICAgICAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwLCA5OSwgOTl9OyAvKiA5OT09aW52YWxpZCAqLworc3RhdGljIHVzaCBjcGRpc3RbXSA9IHsgICAgICAgICAvKiBDb3B5IG9mZnNldHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKK3N0YXRpYyB1c2ggY3BkZXh0W10gPSB7ICAgICAgICAgLyogRXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgY29kZXMgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwKKyAgICAgICAgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsCisgICAgICAgIDEyLCAxMiwgMTMsIDEzfTsKKworCisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZSgpIGJpdCBwZWVraW5nIGFuZCBncmFiYmluZy4KKyAgIFRoZSB1c2FnZSBpczoKKworICAgICAgICBORUVEQklUUyhqKQorICAgICAgICB4ID0gYiAmIG1hc2tfYml0c1tqXTsKKyAgICAgICAgRFVNUEJJVFMoaikKKworICAgd2hlcmUgTkVFREJJVFMgbWFrZXMgc3VyZSB0aGF0IGIgaGFzIGF0IGxlYXN0IGogYml0cyBpbiBpdCwgYW5kCisgICBEVU1QQklUUyByZW1vdmVzIHRoZSBiaXRzIGZyb20gYi4gIFRoZSBtYWNyb3MgdXNlIHRoZSB2YXJpYWJsZSBrCisgICBmb3IgdGhlIG51bWJlciBvZiBiaXRzIGluIGIuICBOb3JtYWxseSwgYiBhbmQgayBhcmUgcmVnaXN0ZXIKKyAgIHZhcmlhYmxlcyBmb3Igc3BlZWQsIGFuZCBhcmUgaW5pdGlhbGl6ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgICByb3V0aW5lIHRoYXQgdXNlcyB0aGVzZSBtYWNyb3MgZnJvbSBhIGdsb2JhbCBiaXQgYnVmZmVyIGFuZCBjb3VudC4KKworICAgSWYgd2UgYXNzdW1lIHRoYXQgRU9CIHdpbGwgYmUgdGhlIGxvbmdlc3QgY29kZSwgdGhlbiB3ZSB3aWxsIG5ldmVyCisgICBhc2sgZm9yIGJpdHMgd2l0aCBORUVEQklUUyB0aGF0IGFyZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICAgU28sIE5FRURCSVRTIHNob3VsZCBub3QgcmVhZCBhbnkgbW9yZSBieXRlcyB0aGFuIGFyZSBuZWVkZWQgdG8KKyAgIG1lZXQgdGhlIHJlcXVlc3QuICBUaGVuIG5vIGJ5dGVzIG5lZWQgdG8gYmUgInJldHVybmVkIiB0byB0aGUgYnVmZmVyCisgICBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGJsb2NrLgorCisgICBIb3dldmVyLCB0aGlzIGFzc3VtcHRpb24gaXMgbm90IHRydWUgZm9yIGZpeGVkIGJsb2Nrcy0tdGhlIEVPQiBjb2RlCisgICBpcyA3IGJpdHMsIGJ1dCB0aGUgb3RoZXIgbGl0ZXJhbC9sZW5ndGggY29kZXMgY2FuIGJlIDggb3IgOSBiaXRzLgorICAgKFRoZSBFT0IgY29kZSBpcyBzaG9ydGVyIHRoYW4gb3RoZXIgY29kZXMgYmVjYXVzZSBmaXhlZCBibG9ja3MgYXJlCisgICBnZW5lcmFsbHkgc2hvcnQuICBTbywgd2hpbGUgYSBibG9jayBhbHdheXMgaGFzIGFuIEVPQiwgbWFueSBvdGhlcgorICAgbGl0ZXJhbC9sZW5ndGggY29kZXMgaGF2ZSBhIHNpZ25pZmljYW50bHkgbG93ZXIgcHJvYmFiaWxpdHkgb2YKKyAgIHNob3dpbmcgdXAgYXQgYWxsLikgIEhvd2V2ZXIsIGJ5IG1ha2luZyB0aGUgZmlyc3QgdGFibGUgaGF2ZSBhCisgICBsb29rdXAgb2Ygc2V2ZW4gYml0cywgdGhlIEVPQiBjb2RlIHdpbGwgYmUgZm91bmQgaW4gdGhhdCBmaXJzdAorICAgbG9va3VwLCBhbmQgc28gd2lsbCBub3QgcmVxdWlyZSB0aGF0IHRvbyBtYW55IGJpdHMgYmUgcHVsbGVkIGZyb20KKyAgIHRoZSBzdHJlYW0uCisgKi8KKwordWxnIGJiOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCit1bnNpZ25lZCBiazsgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCit1c2ggbWFza19iaXRzW10gPSB7CisgICAgMHgwMDAwLAorICAgIDB4MDAwMSwgMHgwMDAzLCAweDAwMDcsIDB4MDAwZiwgMHgwMDFmLCAweDAwM2YsIDB4MDA3ZiwgMHgwMGZmLAorICAgIDB4MDFmZiwgMHgwM2ZmLCAweDA3ZmYsIDB4MGZmZiwgMHgxZmZmLCAweDNmZmYsIDB4N2ZmZiwgMHhmZmZmCit9OworCisjaWZkZWYgQ1JZUFQKKyAgdWNoIGNjOworIyAgZGVmaW5lIE5FWFRCWVRFKCkgXAorICAgICAoZGVjcnlwdCA/IChjYyA9IGdldF9ieXRlKCksIGNjKSA6IGdldF9ieXRlKCkpCisjZWxzZQorIyAgZGVmaW5lIE5FWFRCWVRFKCkgICh1Y2gpZ2V0X2J5dGUoKQorI2VuZGlmCisjZGVmaW5lIE5FRURCSVRTKG4pIHt3aGlsZShrPChuKSl7Ynw9KCh1bGcpTkVYVEJZVEUoKSk8PGs7ays9ODt9fQorI2RlZmluZSBEVU1QQklUUyhuKSB7Yj4+PShuKTtrLT0obik7fQorCisKKy8qCisgICBIdWZmbWFuIGNvZGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIGEgbXVsdGktbGV2ZWwgdGFibGUgbG9va3VwLgorICAgVGhlIGZhc3Rlc3Qgd2F5IHRvIGRlY29kZSBpcyB0byBzaW1wbHkgYnVpbGQgYSBsb29rdXAgdGFibGUgd2hvc2UKKyAgIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwgdGhlIHRpbWUgaXQgdGFrZXMKKyAgIHRvIGJ1aWxkIHRoaXMgdGFibGUgY2FuIGFsc28gYmUgYSBmYWN0b3IgaWYgdGhlIGRhdGEgYmVpbmcgZGVjb2RlZAorICAgaXMgbm90IHZlcnkgbG9uZy4gIFRoZSBtb3N0IGNvbW1vbiBjb2RlcyBhcmUgbmVjZXNzYXJpbHkgdGhlCisgICBzaG9ydGVzdCBjb2Rlcywgc28gdGhvc2UgY29kZXMgZG9taW5hdGUgdGhlIGRlY29kaW5nIHRpbWUsIGFuZCBoZW5jZQorICAgdGhlIHNwZWVkLiAgVGhlIGlkZWEgaXMgeW91IGNhbiBoYXZlIGEgc2hvcnRlciB0YWJsZSB0aGF0IGRlY29kZXMgdGhlCisgICBzaG9ydGVyLCBtb3JlIHByb2JhYmxlIGNvZGVzLCBhbmQgdGhlbiBwb2ludCB0byBzdWJzaWRpYXJ5IHRhYmxlcyBmb3IKKyAgIHRoZSBsb25nZXIgY29kZXMuICBUaGUgdGltZSBpdCBjb3N0cyB0byBkZWNvZGUgdGhlIGxvbmdlciBjb2RlcyBpcworICAgdGhlbiB0cmFkZWQgYWdhaW5zdCB0aGUgdGltZSBpdCB0YWtlcyB0byBtYWtlIGxvbmdlciB0YWJsZXMuCisKKyAgIFRoaXMgcmVzdWx0cyBvZiB0aGlzIHRyYWRlIGFyZSBpbiB0aGUgdmFyaWFibGVzIGxiaXRzIGFuZCBkYml0cworICAgYmVsb3cuICBsYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIGZpcnN0IGxldmVsIHRhYmxlIGZvciBsaXRlcmFsLworICAgbGVuZ3RoIGNvZGVzIGNhbiBkZWNvZGUgaW4gb25lIHN0ZXAsIGFuZCBkYml0cyBpcyB0aGUgc2FtZSB0aGluZyBmb3IKKyAgIHRoZSBkaXN0YW5jZSBjb2Rlcy4gIFN1YnNlcXVlbnQgdGFibGVzIGFyZSBhbHNvIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgdGhvc2Ugc2l6ZXMuICBUaGVzZSB2YWx1ZXMgbWF5IGJlIGFkanVzdGVkIGVpdGhlciB3aGVuIGFsbCBvZiB0aGUKKyAgIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gdGhhdCwgaW4gd2hpY2ggY2FzZSB0aGUgbG9uZ2VzdCBjb2RlIGxlbmd0aCBpbgorICAgYml0cyBpcyB1c2VkLCBvciB3aGVuIHRoZSBzaG9ydGVzdCBjb2RlIGlzICpsb25nZXIqIHRoYW4gdGhlIHJlcXVlc3RlZAorICAgdGFibGUgc2l6ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBjb2RlIGluIGJpdHMgaXMKKyAgIHVzZWQuCisKKyAgIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIHR3byB0YWJsZXMsIHNpbmNlIHRoZXkgY29kZSBhCisgICBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvc3NpYmlsaXRpZXMgZWFjaC4gIFRoZSBsaXRlcmFsL2xlbmd0aCB0YWJsZQorICAgY29kZXMgMjg2IHBvc3NpYmxlIHZhbHVlcywgb3IgaW4gYSBmbGF0IGNvZGUsIGEgbGl0dGxlIG92ZXIgZWlnaHQKKyAgIGJpdHMuICBUaGUgZGlzdGFuY2UgdGFibGUgY29kZXMgMzAgcG9zc2libGUgdmFsdWVzLCBvciBhIGxpdHRsZSBsZXNzCisgICB0aGFuIGZpdmUgYml0cywgZmxhdC4gIFRoZSBvcHRpbXVtIHZhbHVlcyBmb3Igc3BlZWQgZW5kIHVwIGJlaW5nCisgICBhYm91dCBvbmUgYml0IG1vcmUgdGhhbiB0aG9zZSwgc28gbGJpdHMgaXMgOCsxIGFuZCBkYml0cyBpcyA1KzEuCisgICBUaGUgb3B0aW11bSB2YWx1ZXMgbWF5IGRpZmZlciB0aG91Z2ggZnJvbSBtYWNoaW5lIHRvIG1hY2hpbmUsIGFuZAorICAgcG9zc2libHkgZXZlbiBiZXR3ZWVuIGNvbXBpbGVycy4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KKyAqLworCisKK2ludCBsYml0cyA9IDk7ICAgICAgICAgIC8qIGJpdHMgaW4gYmFzZSBsaXRlcmFsL2xlbmd0aCBsb29rdXAgdGFibGUgKi8KK2ludCBkYml0cyA9IDY7ICAgICAgICAgIC8qIGJpdHMgaW4gYmFzZSBkaXN0YW5jZSBsb29rdXAgdGFibGUgKi8KKworCisvKiBJZiBCTUFYIG5lZWRzIHRvIGJlIGxhcmdlciB0aGFuIDE2LCB0aGVuIGggYW5kIHhbXSBzaG91bGQgYmUgdWxnLiAqLworI2RlZmluZSBCTUFYIDE2ICAgICAgICAgLyogbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGFueSBjb2RlICgxNiBmb3IgZXhwbG9kZSkgKi8KKyNkZWZpbmUgTl9NQVggMjg4ICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGNvZGVzIGluIGFueSBzZXQgKi8KKworCit1bnNpZ25lZCBodWZ0czsgICAgICAgICAvKiB0cmFjayBtZW1vcnkgdXNhZ2UgKi8KKworCitpbnQgaHVmdF9idWlsZChiLCBuLCBzLCBkLCBlLCB0LCBtKQordW5zaWduZWQgKmI7ICAgICAgICAgICAgLyogY29kZSBsZW5ndGhzIGluIGJpdHMgKGFsbCBhc3N1bWVkIDw9IEJNQVgpICovCit1bnNpZ25lZCBuOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgKGFzc3VtZWQgPD0gTl9NQVgpICovCit1bnNpZ25lZCBzOyAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2ltcGxlLXZhbHVlZCBjb2RlcyAoMC4ucy0xKSAqLwordXNoICpkOyAgICAgICAgICAgICAgICAgLyogbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLwordXNoICplOyAgICAgICAgICAgICAgICAgLyogbGlzdCBvZiBleHRyYSBiaXRzIGZvciBub24tc2ltcGxlIGNvZGVzICovCitzdHJ1Y3QgaHVmdCAqKnQ7ICAgICAgICAvKiByZXN1bHQ6IHN0YXJ0aW5nIHRhYmxlICovCitpbnQgKm07ICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGxvb2t1cCBiaXRzLCByZXR1cm5zIGFjdHVhbCAqLworLyogR2l2ZW4gYSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBhbmQgYSBtYXhpbXVtIHRhYmxlIHNpemUsIG1ha2UgYSBzZXQgb2YKKyAgIHRhYmxlcyB0byBkZWNvZGUgdGhhdCBzZXQgb2YgY29kZXMuICBSZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvbmUgaWYKKyAgIHRoZSBnaXZlbiBjb2RlIHNldCBpcyBpbmNvbXBsZXRlICh0aGUgdGFibGVzIGFyZSBzdGlsbCBidWlsdCBpbiB0aGlzCisgICBjYXNlKSwgdHdvIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkIChhbGwgemVybyBsZW5ndGggY29kZXMgb3IgYW4KKyAgIG92ZXJzdWJzY3JpYmVkIHNldCBvZiBsZW5ndGhzKSwgYW5kIHRocmVlIGlmIG5vdCBlbm91Z2ggbWVtb3J5LiAqLworeworICB1bnNpZ25lZCBhOyAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVyIGZvciBjb2RlcyBvZiBsZW5ndGggayAqLworICB1bnNpZ25lZCBjW0JNQVgrMV07ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoIGNvdW50IHRhYmxlICovCisgIHVuc2lnbmVkIGY7ICAgICAgICAgICAgICAgICAgIC8qIGkgcmVwZWF0cyBpbiB0YWJsZSBldmVyeSBmIGVudHJpZXMgKi8KKyAgaW50IGc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworICBpbnQgaDsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBsZXZlbCAqLworICByZWdpc3RlciB1bnNpZ25lZCBpOyAgICAgICAgICAvKiBjb3VudGVyLCBjdXJyZW50IGNvZGUgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgajsgICAgICAgICAgLyogY291bnRlciAqLworICByZWdpc3RlciBpbnQgazsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBjdXJyZW50IGNvZGUgKi8KKyAgaW50IGw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyBwZXIgdGFibGUgKHJldHVybmVkIGluIG0pICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkICpwOyAgICAgICAgIC8qIHBvaW50ZXIgaW50byBjW10sIGJbXSwgb3IgdltdICovCisgIHJlZ2lzdGVyIHN0cnVjdCBodWZ0ICpxOyAgICAgIC8qIHBvaW50cyB0byBjdXJyZW50IHRhYmxlICovCisgIHN0cnVjdCBodWZ0IHI7ICAgICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBzdHJ1Y3R1cmUgYXNzaWdubWVudCAqLworICBzdHJ1Y3QgaHVmdCAqdVtCTUFYXTsgICAgICAgICAvKiB0YWJsZSBzdGFjayAqLworICB1bnNpZ25lZCB2W05fTUFYXTsgICAgICAgICAgICAvKiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aCAqLworICByZWdpc3RlciBpbnQgdzsgICAgICAgICAgICAgICAvKiBiaXRzIGJlZm9yZSB0aGlzIHRhYmxlID09IChsICogaCkgKi8KKyAgdW5zaWduZWQgeFtCTUFYKzFdOyAgICAgICAgICAgLyogYml0IG9mZnNldHMsIHRoZW4gY29kZSBzdGFjayAqLworICB1bnNpZ25lZCAqeHA7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIGludG8geCAqLworICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZHVtbXkgY29kZXMgYWRkZWQgKi8KKyAgdW5zaWduZWQgejsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gY3VycmVudCB0YWJsZSAqLworCisKKyAgLyogR2VuZXJhdGUgY291bnRzIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgbWVtemVybyhjLCBzaXplb2YoYykpOworICBwID0gYjsgIGkgPSBuOworICBkbyB7CisgICAgVHJhY2VjdigqcCwgKHN0ZGVyciwgKG4taSA+PSAnICcgJiYgbi1pIDw9ICd+JyA/ICIlYyAlZFxuIiA6ICIweCV4ICVkXG4iKSwKKwkgICAgbi1pLCAqcCkpOworICAgIGNbKnBdKys7ICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgYWxsIGVudHJpZXMgPD0gQk1BWCAqLworICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgY29tYmluZSB3aXRoIGFib3ZlIGxpbmUgKFNvbGFyaXMgYnVnKSAqLworICB9IHdoaWxlICgtLWkpOworICBpZiAoY1swXSA9PSBuKSAgICAgICAgICAgICAgICAvKiBudWxsIGlucHV0LS1hbGwgemVybyBsZW5ndGggY29kZXMgKi8KKyAgeworICAgICp0ID0gKHN0cnVjdCBodWZ0ICopTlVMTDsKKyAgICAqbSA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKworCisgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGgsIGJvdW5kICptIGJ5IHRob3NlICovCisgIGwgPSAqbTsKKyAgZm9yIChqID0gMTsgaiA8PSBCTUFYOyBqKyspCisgICAgaWYgKGNbal0pCisgICAgICBicmVhazsKKyAgayA9IGo7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBjb2RlIGxlbmd0aCAqLworICBpZiAoKHVuc2lnbmVkKWwgPCBqKQorICAgIGwgPSBqOworICBmb3IgKGkgPSBCTUFYOyBpOyBpLS0pCisgICAgaWYgKGNbaV0pCisgICAgICBicmVhazsKKyAgZyA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworICBpZiAoKHVuc2lnbmVkKWwgPiBpKQorICAgIGwgPSBpOworICAqbSA9IGw7CisKKworICAvKiBBZGp1c3QgbGFzdCBsZW5ndGggY291bnQgdG8gZmlsbCBvdXQgY29kZXMsIGlmIG5lZWRlZCAqLworICBmb3IgKHkgPSAxIDw8IGo7IGogPCBpOyBqKyssIHkgPDw9IDEpCisgICAgaWYgKCh5IC09IGNbal0pIDwgMCkKKyAgICAgIHJldHVybiAyOyAgICAgICAgICAgICAgICAgLyogYmFkIGlucHV0OiBtb3JlIGNvZGVzIHRoYW4gYml0cyAqLworICBpZiAoKHkgLT0gY1tpXSkgPCAwKQorICAgIHJldHVybiAyOworICBjW2ldICs9IHk7CisKKworICAvKiBHZW5lcmF0ZSBzdGFydGluZyBvZmZzZXRzIGludG8gdGhlIHZhbHVlIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLworICB4WzFdID0gaiA9IDA7CisgIHAgPSBjICsgMTsgIHhwID0geCArIDI7CisgIHdoaWxlICgtLWkpIHsgICAgICAgICAgICAgICAgIC8qIG5vdGUgdGhhdCBpID09IGcgZnJvbSBhYm92ZSAqLworICAgICp4cCsrID0gKGogKz0gKnArKyk7CisgIH0KKworCisgIC8qIE1ha2UgYSB0YWJsZSBvZiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aHMgKi8KKyAgcCA9IGI7ICBpID0gMDsKKyAgZG8geworICAgIGlmICgoaiA9ICpwKyspICE9IDApCisgICAgICB2W3hbal0rK10gPSBpOworICB9IHdoaWxlICgrK2kgPCBuKTsKKworCisgIC8qIEdlbmVyYXRlIHRoZSBIdWZmbWFuIGNvZGVzIGFuZCBmb3IgZWFjaCwgbWFrZSB0aGUgdGFibGUgZW50cmllcyAqLworICB4WzBdID0gaSA9IDA7ICAgICAgICAgICAgICAgICAvKiBmaXJzdCBIdWZmbWFuIGNvZGUgaXMgemVybyAqLworICBwID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmFiIHZhbHVlcyBpbiBiaXQgb3JkZXIgKi8KKyAgaCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gdGFibGVzIHlldC0tbGV2ZWwgLTEgKi8KKyAgdyA9IC1sOyAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyBkZWNvZGVkID09IChsICogaCkgKi8KKyAgdVswXSA9IChzdHJ1Y3QgaHVmdCAqKU5VTEw7ICAgLyoganVzdCB0byBrZWVwIGNvbXBpbGVycyBoYXBweSAqLworICBxID0gKHN0cnVjdCBodWZ0ICopTlVMTDsgICAgICAvKiBkaXR0byAqLworICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXR0byAqLworCisgIC8qIGdvIHRocm91Z2ggdGhlIGJpdCBsZW5ndGhzIChrIGFscmVhZHkgaXMgYml0cyBpbiBzaG9ydGVzdCBjb2RlKSAqLworICBmb3IgKDsgayA8PSBnOyBrKyspCisgIHsKKyAgICBhID0gY1trXTsKKyAgICB3aGlsZSAoYS0tKQorICAgIHsKKyAgICAgIC8qIGhlcmUgaSBpcyB0aGUgSHVmZm1hbiBjb2RlIG9mIGxlbmd0aCBrIGJpdHMgZm9yIHZhbHVlICpwICovCisgICAgICAvKiBtYWtlIHRhYmxlcyB1cCB0byByZXF1aXJlZCBsZXZlbCAqLworICAgICAgd2hpbGUgKGsgPiB3ICsgbCkKKyAgICAgIHsKKyAgICAgICAgaCsrOworICAgICAgICB3ICs9IGw7ICAgICAgICAgICAgICAgICAvKiBwcmV2aW91cyB0YWJsZSBhbHdheXMgbCBiaXRzICovCisKKyAgICAgICAgLyogY29tcHV0ZSBtaW5pbXVtIHNpemUgdGFibGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGwgYml0cyAqLworICAgICAgICB6ID0gKHogPSBnIC0gdykgPiAodW5zaWduZWQpbCA/ICh1bnNpZ25lZClsIDogejsgIC8qIHVwcGVyIGxpbWl0IG9uIHRhYmxlIHNpemUgKi8KKyAgICAgICAgaWYgKChmID0gMSA8PCAoaiA9IGsgLSB3KSkgPiBhICsgMSkgICAgIC8qIHRyeSBhIGstdyBiaXQgdGFibGUgKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogdG9vIGZldyBjb2RlcyBmb3Igay13IGJpdCB0YWJsZSAqLworICAgICAgICAgIGYgLT0gYSArIDE7ICAgICAgICAgICAvKiBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyBsZWZ0ICovCisgICAgICAgICAgeHAgPSBjICsgazsKKyAgICAgICAgICB3aGlsZSAoKytqIDwgeikgICAgICAgLyogdHJ5IHNtYWxsZXIgdGFibGVzIHVwIHRvIHogYml0cyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZiA8PD0gMSkgPD0gKisreHApCisgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIC8qIGVub3VnaCBjb2RlcyB0byB1c2UgdXAgaiBiaXRzICovCisgICAgICAgICAgICBmIC09ICp4cDsgICAgICAgICAgIC8qIGVsc2UgZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeiA9IDEgPDwgajsgICAgICAgICAgICAgLyogdGFibGUgZW50cmllcyBmb3Igai1iaXQgdGFibGUgKi8KKworICAgICAgICAvKiBhbGxvY2F0ZSBhbmQgbGluayBpbiBuZXcgdGFibGUgKi8KKyAgICAgICAgaWYgKChxID0gKHN0cnVjdCBodWZ0ICopbWFsbG9jKCh6ICsgMSkqc2l6ZW9mKHN0cnVjdCBodWZ0KSkpID09CisgICAgICAgICAgICAoc3RydWN0IGh1ZnQgKilOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGgpCisgICAgICAgICAgICBodWZ0X2ZyZWUodVswXSk7CisgICAgICAgICAgcmV0dXJuIDM7ICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCisgICAgICAgIH0KKyAgICAgICAgaHVmdHMgKz0geiArIDE7ICAgICAgICAgLyogdHJhY2sgbWVtb3J5IHVzYWdlICovCisgICAgICAgICp0ID0gcSArIDE7ICAgICAgICAgICAgIC8qIGxpbmsgdG8gbGlzdCBmb3IgaHVmdF9mcmVlKCkgKi8KKyAgICAgICAgKih0ID0gJihxLT52LnQpKSA9IChzdHJ1Y3QgaHVmdCAqKU5VTEw7CisgICAgICAgIHVbaF0gPSArK3E7ICAgICAgICAgICAgIC8qIHRhYmxlIHN0YXJ0cyBhZnRlciBsaW5rICovCisKKyAgICAgICAgLyogY29ubmVjdCB0byBsYXN0IHRhYmxlLCBpZiB0aGVyZSBpcyBvbmUgKi8KKyAgICAgICAgaWYgKGgpCisgICAgICAgIHsKKyAgICAgICAgICB4W2hdID0gaTsgICAgICAgICAgICAgLyogc2F2ZSBwYXR0ZXJuIGZvciBiYWNraW5nIHVwICovCisgICAgICAgICAgci5iID0gKHVjaClsOyAgICAgICAgIC8qIGJpdHMgdG8gZHVtcCBiZWZvcmUgdGhpcyB0YWJsZSAqLworICAgICAgICAgIHIuZSA9ICh1Y2gpKDE2ICsgaik7ICAvKiBiaXRzIGluIHRoaXMgdGFibGUgKi8KKyAgICAgICAgICByLnYudCA9IHE7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGlzIHRhYmxlICovCisgICAgICAgICAgaiA9IGkgPj4gKHcgLSBsKTsgICAgIC8qIChnZXQgYXJvdW5kIFR1cmJvIEMgYnVnKSAqLworICAgICAgICAgIHVbaC0xXVtqXSA9IHI7ICAgICAgICAvKiBjb25uZWN0IHRvIGxhc3QgdGFibGUgKi8KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBzZXQgdXAgdGFibGUgZW50cnkgaW4gciAqLworICAgICAgci5iID0gKHVjaCkoayAtIHcpOworICAgICAgaWYgKHAgPj0gdiArIG4pCisgICAgICAgIHIuZSA9IDk5OyAgICAgICAgICAgICAgIC8qIG91dCBvZiB2YWx1ZXMtLWludmFsaWQgY29kZSAqLworICAgICAgZWxzZSBpZiAoKnAgPCBzKQorICAgICAgeworICAgICAgICByLmUgPSAodWNoKSgqcCA8IDI1NiA/IDE2IDogMTUpOyAgICAvKiAyNTYgaXMgZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgICAgICAgci52Lm4gPSAodXNoKSgqcCk7ICAgICAgICAgICAgIC8qIHNpbXBsZSBjb2RlIGlzIGp1c3QgdGhlIHZhbHVlICovCisJcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uZSBjb21waWxlciBkb2VzIG5vdCBsaWtlICpwKysgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgci5lID0gKHVjaCllWypwIC0gc107ICAgLyogbm9uLXNpbXBsZS0tbG9vayB1cCBpbiBsaXN0cyAqLworICAgICAgICByLnYubiA9IGRbKnArKyAtIHNdOworICAgICAgfQorCisgICAgICAvKiBmaWxsIGNvZGUtbGlrZSBlbnRyaWVzIHdpdGggciAqLworICAgICAgZiA9IDEgPDwgKGsgLSB3KTsKKyAgICAgIGZvciAoaiA9IGkgPj4gdzsgaiA8IHo7IGogKz0gZikKKyAgICAgICAgcVtqXSA9IHI7CisKKyAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGstYml0IGNvZGUgaSAqLworICAgICAgZm9yIChqID0gMSA8PCAoayAtIDEpOyBpICYgajsgaiA+Pj0gMSkKKyAgICAgICAgaSBePSBqOworICAgICAgaSBePSBqOworCisgICAgICAvKiBiYWNrdXAgb3ZlciBmaW5pc2hlZCB0YWJsZXMgKi8KKyAgICAgIHdoaWxlICgoaSAmICgoMSA8PCB3KSAtIDEpKSAhPSB4W2hdKQorICAgICAgeworICAgICAgICBoLS07ICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBuZWVkIHRvIHVwZGF0ZSBxICovCisgICAgICAgIHcgLT0gbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIC8qIFJldHVybiB0cnVlICgxKSBpZiB3ZSB3ZXJlIGdpdmVuIGFuIGluY29tcGxldGUgdGFibGUgKi8KKyAgcmV0dXJuIHkgIT0gMCAmJiBnICE9IDE7Cit9CisKKworCitpbnQgaHVmdF9mcmVlKHQpCitzdHJ1Y3QgaHVmdCAqdDsgICAgICAgICAvKiB0YWJsZSB0byBmcmVlICovCisvKiBGcmVlIHRoZSBtYWxsb2MnZWQgdGFibGVzIGJ1aWx0IGJ5IGh1ZnRfYnVpbGQoKSwgd2hpY2ggbWFrZXMgYSBsaW5rZWQKKyAgIGxpc3Qgb2YgdGhlIHRhYmxlcyBpdCBtYWRlLCB3aXRoIHRoZSBsaW5rcyBpbiBhIGR1bW15IGZpcnN0IGVudHJ5IG9mCisgICBlYWNoIHRhYmxlLiAqLworeworICByZWdpc3RlciBzdHJ1Y3QgaHVmdCAqcCwgKnE7CisKKworICAvKiBHbyB0aHJvdWdoIGxpbmtlZCBsaXN0LCBmcmVlaW5nIGZyb20gdGhlIG1hbGxvY2VkICh0Wy0xXSkgYWRkcmVzcy4gKi8KKyAgcCA9IHQ7CisgIHdoaWxlIChwICE9IChzdHJ1Y3QgaHVmdCAqKU5VTEwpCisgIHsKKyAgICBxID0gKC0tcCktPnYudDsKKyAgICBmcmVlKChjaGFyKilwKTsKKyAgICBwID0gcTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCitpbnQgaW5mbGF0ZV9jb2Rlcyh0bCwgdGQsIGJsLCBiZCkKK3N0cnVjdCBodWZ0ICp0bCwgKnRkOyAgIC8qIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGVyIHRhYmxlcyAqLworaW50IGJsLCBiZDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgZGVjb2RlZCBieSB0bFtdIGFuZCB0ZFtdICovCisvKiBpbmZsYXRlIChkZWNvbXByZXNzKSB0aGUgY29kZXMgaW4gYSBkZWZsYXRlZCAoY29tcHJlc3NlZCkgYmxvY2suCisgICBSZXR1cm4gYW4gZXJyb3IgY29kZSBvciB6ZXJvIGlmIGl0IGFsbCBnb2VzIG9rLiAqLworeworICByZWdpc3RlciB1bnNpZ25lZCBlOyAgLyogdGFibGUgZW50cnkgZmxhZy9udW1iZXIgb2YgZXh0cmEgYml0cyAqLworICB1bnNpZ25lZCBuLCBkOyAgICAgICAgLyogbGVuZ3RoIGFuZCBpbmRleCBmb3IgY29weSAqLworICB1bnNpZ25lZCB3OyAgICAgICAgICAgLyogY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KKyAgc3RydWN0IGh1ZnQgKnQ7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGFibGUgZW50cnkgKi8KKyAgdW5zaWduZWQgbWwsIG1kOyAgICAgIC8qIG1hc2tzIGZvciBibCBhbmQgYmQgYml0cyAqLworICByZWdpc3RlciB1bGcgYjsgICAgICAgLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOyAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisKKyAgLyogbWFrZSBsb2NhbCBjb3BpZXMgb2YgZ2xvYmFscyAqLworICBiID0gYmI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIGJpdCBidWZmZXIgKi8KKyAgayA9IGJrOworICB3ID0gd3A7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHdpbmRvdyBwb3NpdGlvbiAqLworCisgIC8qIGluZmxhdGUgdGhlIGNvZGVkIGRhdGEgKi8KKyAgbWwgPSBtYXNrX2JpdHNbYmxdOyAgICAgICAgICAgLyogcHJlY29tcHV0ZSBtYXNrcyBmb3Igc3BlZWQgKi8KKyAgbWQgPSBtYXNrX2JpdHNbYmRdOworICBmb3IgKDs7KSAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB1bnRpbCBlbmQgb2YgYmxvY2sgKi8KKyAgeworICAgIE5FRURCSVRTKCh1bnNpZ25lZClibCkKKyAgICBpZiAoKGUgPSAodCA9IHRsICsgKCh1bnNpZ25lZCliICYgbWwpKS0+ZSkgPiAxNikKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKGUgPT0gOTkpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIERVTVBCSVRTKHQtPmIpCisgICAgICAgIGUgLT0gMTY7CisgICAgICAgIE5FRURCSVRTKGUpCisgICAgICB9IHdoaWxlICgoZSA9ICh0ID0gdC0+di50ICsgKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKSktPmUpID4gMTYpOworICAgIERVTVBCSVRTKHQtPmIpCisgICAgaWYgKGUgPT0gMTYpICAgICAgICAgICAgICAgIC8qIHRoZW4gaXQncyBhIGxpdGVyYWwgKi8KKyAgICB7CisgICAgICBzbGlkZVt3KytdID0gKHVjaCl0LT52Lm47CisgICAgICBUcmFjZXZ2KChzdGRlcnIsICIlYyIsIHNsaWRlW3ctMV0pKTsKKyAgICAgIGlmICh3ID09IFdTSVpFKQorICAgICAgeworICAgICAgICBmbHVzaF9vdXRwdXQodyk7CisgICAgICAgIHcgPSAwOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogaXQncyBhbiBFT0Igb3IgYSBsZW5ndGggKi8KKyAgICB7CisgICAgICAvKiBleGl0IGlmIGVuZCBvZiBibG9jayAqLworICAgICAgaWYgKGUgPT0gMTUpCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBnZXQgbGVuZ3RoIG9mIGJsb2NrIHRvIGNvcHkgKi8KKyAgICAgIE5FRURCSVRTKGUpCisgICAgICBuID0gdC0+di5uICsgKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKTsKKyAgICAgIERVTVBCSVRTKGUpOworCisgICAgICAvKiBkZWNvZGUgZGlzdGFuY2Ugb2YgYmxvY2sgdG8gY29weSAqLworICAgICAgTkVFREJJVFMoKHVuc2lnbmVkKWJkKQorICAgICAgaWYgKChlID0gKHQgPSB0ZCArICgodW5zaWduZWQpYiAmIG1kKSktPmUpID4gMTYpCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAoZSA9PSA5OSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIERVTVBCSVRTKHQtPmIpCisgICAgICAgICAgZSAtPSAxNjsKKyAgICAgICAgICBORUVEQklUUyhlKQorICAgICAgICB9IHdoaWxlICgoZSA9ICh0ID0gdC0+di50ICsgKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKSktPmUpID4gMTYpOworICAgICAgRFVNUEJJVFModC0+YikKKyAgICAgIE5FRURCSVRTKGUpCisgICAgICBkID0gdyAtIHQtPnYubiAtICgodW5zaWduZWQpYiAmIG1hc2tfYml0c1tlXSk7CisgICAgICBEVU1QQklUUyhlKQorICAgICAgVHJhY2V2digoc3RkZXJyLCJcXFslZCwlZF0iLCB3LWQsIG4pKTsKKworICAgICAgLyogZG8gdGhlIGNvcHkgKi8KKyAgICAgIGRvIHsKKyAgICAgICAgbiAtPSAoZSA9IChlID0gV1NJWkUgLSAoKGQgJj0gV1NJWkUtMSkgPiB3ID8gZCA6IHcpKSA+IG4gPyBuIDogZSk7CisjaWYgIWRlZmluZWQoTk9NRU1DUFkpICYmICFkZWZpbmVkKERFQlVHKQorICAgICAgICBpZiAodyAtIGQgPj0gZSkgICAgICAgICAvKiAodGhpcyB0ZXN0IGFzc3VtZXMgdW5zaWduZWQgY29tcGFyaXNvbikgKi8KKyAgICAgICAgeworICAgICAgICAgIG1lbWNweShzbGlkZSArIHcsIHNsaWRlICsgZCwgZSk7CisgICAgICAgICAgdyArPSBlOworICAgICAgICAgIGQgKz0gZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGl0IHNsb3cgdG8gYXZvaWQgbWVtY3B5KCkgb3ZlcmxhcCAqLworI2VuZGlmIC8qICFOT01FTUNQWSAqLworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHNsaWRlW3crK10gPSBzbGlkZVtkKytdOworCSAgICBUcmFjZXZ2KChzdGRlcnIsICIlYyIsIHNsaWRlW3ctMV0pKTsKKyAgICAgICAgICB9IHdoaWxlICgtLWUpOworICAgICAgICBpZiAodyA9PSBXU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGZsdXNoX291dHB1dCh3KTsKKyAgICAgICAgICB3ID0gMDsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAobik7CisgICAgfQorICB9CisKKworICAvKiByZXN0b3JlIHRoZSBnbG9iYWxzIGZyb20gdGhlIGxvY2FscyAqLworICB3cCA9IHc7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGdsb2JhbCB3aW5kb3cgcG9pbnRlciAqLworICBiYiA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGdsb2JhbCBiaXQgYnVmZmVyICovCisgIGJrID0gazsKKworICAvKiBkb25lICovCisgIHJldHVybiAwOworfQorCisKKworaW50IGluZmxhdGVfc3RvcmVkKCkKKy8qICJkZWNvbXByZXNzIiBhbiBpbmZsYXRlZCB0eXBlIDAgKHN0b3JlZCkgYmxvY2suICovCit7CisgIHVuc2lnbmVkIG47ICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYmxvY2sgKi8KKyAgdW5zaWduZWQgdzsgICAgICAgICAgIC8qIGN1cnJlbnQgd2luZG93IHBvc2l0aW9uICovCisgIHJlZ2lzdGVyIHVsZyBiOyAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGs7ICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKworICAvKiBtYWtlIGxvY2FsIGNvcGllcyBvZiBnbG9iYWxzICovCisgIGIgPSBiYjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgYml0IGJ1ZmZlciAqLworICBrID0gYms7CisgIHcgPSB3cDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgd2luZG93IHBvc2l0aW9uICovCisKKworICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgIG4gPSBrICYgNzsKKyAgRFVNUEJJVFMobik7CisKKworICAvKiBnZXQgdGhlIGxlbmd0aCBhbmQgaXRzIGNvbXBsZW1lbnQgKi8KKyAgTkVFREJJVFMoMTYpCisgIG4gPSAoKHVuc2lnbmVkKWIgJiAweGZmZmYpOworICBEVU1QQklUUygxNikKKyAgTkVFREJJVFMoMTYpCisgIGlmIChuICE9ICh1bnNpZ25lZCkoKH5iKSAmIDB4ZmZmZikpCisgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIGluIGNvbXByZXNzZWQgZGF0YSAqLworICBEVU1QQklUUygxNikKKworCisgIC8qIHJlYWQgYW5kIG91dHB1dCB0aGUgY29tcHJlc3NlZCBkYXRhICovCisgIHdoaWxlIChuLS0pCisgIHsKKyAgICBORUVEQklUUyg4KQorICAgIHNsaWRlW3crK10gPSAodWNoKWI7CisgICAgaWYgKHcgPT0gV1NJWkUpCisgICAgeworICAgICAgZmx1c2hfb3V0cHV0KHcpOworICAgICAgdyA9IDA7CisgICAgfQorICAgIERVTVBCSVRTKDgpCisgIH0KKworCisgIC8qIHJlc3RvcmUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgbG9jYWxzICovCisgIHdwID0gdzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgZ2xvYmFsIHdpbmRvdyBwb2ludGVyICovCisgIGJiID0gYjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKyAgYmsgPSBrOworICByZXR1cm4gMDsKK30KKworCisKK2ludCBpbmZsYXRlX2ZpeGVkKCkKKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgdHlwZSAxIChmaXhlZCBIdWZmbWFuIGNvZGVzKSBibG9jay4gIFdlIHNob3VsZAorICAgZWl0aGVyIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGRlY29kZXIsIG9yIGF0IGxlYXN0IHByZWNvbXB1dGUgdGhlCisgICBIdWZmbWFuIHRhYmxlcy4gKi8KK3sKKyAgaW50IGk7ICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworICBzdHJ1Y3QgaHVmdCAqdGw7ICAgICAgLyogbGl0ZXJhbC9sZW5ndGggY29kZSB0YWJsZSAqLworICBzdHJ1Y3QgaHVmdCAqdGQ7ICAgICAgLyogZGlzdGFuY2UgY29kZSB0YWJsZSAqLworICBpbnQgYmw7ICAgICAgICAgICAgICAgLyogbG9va3VwIGJpdHMgZm9yIHRsICovCisgIGludCBiZDsgICAgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGQgKi8KKyAgdW5zaWduZWQgbFsyODhdOyAgICAgIC8qIGxlbmd0aCBsaXN0IGZvciBodWZ0X2J1aWxkICovCisKKworICAvKiBzZXQgdXAgbGl0ZXJhbCB0YWJsZSAqLworICBmb3IgKGkgPSAwOyBpIDwgMTQ0OyBpKyspCisgICAgbFtpXSA9IDg7CisgIGZvciAoOyBpIDwgMjU2OyBpKyspCisgICAgbFtpXSA9IDk7CisgIGZvciAoOyBpIDwgMjgwOyBpKyspCisgICAgbFtpXSA9IDc7CisgIGZvciAoOyBpIDwgMjg4OyBpKyspICAgICAgICAgIC8qIG1ha2UgYSBjb21wbGV0ZSwgYnV0IHdyb25nIGNvZGUgc2V0ICovCisgICAgbFtpXSA9IDg7CisgIGJsID0gNzsKKyAgaWYgKChpID0gaHVmdF9idWlsZChsLCAyODgsIDI1NywgY3BsZW5zLCBjcGxleHQsICZ0bCwgJmJsKSkgIT0gMCkKKyAgICByZXR1cm4gaTsKKworCisgIC8qIHNldCB1cCBkaXN0YW5jZSB0YWJsZSAqLworICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykgICAgICAvKiBtYWtlIGFuIGluY29tcGxldGUgY29kZSBzZXQgKi8KKyAgICBsW2ldID0gNTsKKyAgYmQgPSA1OworICBpZiAoKGkgPSBodWZ0X2J1aWxkKGwsIDMwLCAwLCBjcGRpc3QsIGNwZGV4dCwgJnRkLCAmYmQpKSA+IDEpCisgIHsKKyAgICBodWZ0X2ZyZWUodGwpOworICAgIHJldHVybiBpOworICB9CisKKworICAvKiBkZWNvbXByZXNzIHVudGlsIGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChpbmZsYXRlX2NvZGVzKHRsLCB0ZCwgYmwsIGJkKSkKKyAgICByZXR1cm4gMTsKKworCisgIC8qIGZyZWUgdGhlIGRlY29kaW5nIHRhYmxlcywgcmV0dXJuICovCisgIGh1ZnRfZnJlZSh0bCk7CisgIGh1ZnRfZnJlZSh0ZCk7CisgIHJldHVybiAwOworfQorCisKKworaW50IGluZmxhdGVfZHluYW1pYygpCisvKiBkZWNvbXByZXNzIGFuIGluZmxhdGVkIHR5cGUgMiAoZHluYW1pYyBIdWZmbWFuIGNvZGVzKSBibG9jay4gKi8KK3sKKyAgaW50IGk7ICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdW5zaWduZWQgajsKKyAgdW5zaWduZWQgbDsgICAgICAgICAgIC8qIGxhc3QgbGVuZ3RoICovCisgIHVuc2lnbmVkIG07ICAgICAgICAgICAvKiBtYXNrIGZvciBiaXQgbGVuZ3RocyB0YWJsZSAqLworICB1bnNpZ25lZCBuOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aHMgdG8gZ2V0ICovCisgIHN0cnVjdCBodWZ0ICp0bDsgICAgICAvKiBsaXRlcmFsL2xlbmd0aCBjb2RlIHRhYmxlICovCisgIHN0cnVjdCBodWZ0ICp0ZDsgICAgICAvKiBkaXN0YW5jZSBjb2RlIHRhYmxlICovCisgIGludCBibDsgICAgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGwgKi8KKyAgaW50IGJkOyAgICAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0ZCAqLworICB1bnNpZ25lZCBuYjsgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgKi8KKyAgdW5zaWduZWQgbmw7ICAgICAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworICB1bnNpZ25lZCBuZDsgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisjaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgdW5zaWduZWQgbGxbMjg4KzMyXTsgIC8qIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyNlbHNlCisgIHVuc2lnbmVkIGxsWzI4NiszMF07ICAvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisjZW5kaWYKKyAgcmVnaXN0ZXIgdWxnIGI7ICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgazsgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworCisgIC8qIG1ha2UgbG9jYWwgYml0IGJ1ZmZlciAqLworICBiID0gYmI7CisgIGsgPSBiazsKKworCisgIC8qIHJlYWQgaW4gdGFibGUgbGVuZ3RocyAqLworICBORUVEQklUUyg1KQorICBubCA9IDI1NyArICgodW5zaWduZWQpYiAmIDB4MWYpOyAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworICBEVU1QQklUUyg1KQorICBORUVEQklUUyg1KQorICBuZCA9IDEgKyAoKHVuc2lnbmVkKWIgJiAweDFmKTsgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworICBEVU1QQklUUyg1KQorICBORUVEQklUUyg0KQorICBuYiA9IDQgKyAoKHVuc2lnbmVkKWIgJiAweGYpOyAgICAgICAgIC8qIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzICovCisgIERVTVBCSVRTKDQpCisjaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgaWYgKG5sID4gMjg4IHx8IG5kID4gMzIpCisjZWxzZQorICBpZiAobmwgPiAyODYgfHwgbmQgPiAzMCkKKyNlbmRpZgorICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAvKiBiYWQgbGVuZ3RocyAqLworCisKKyAgLyogcmVhZCBpbiBiaXQtbGVuZ3RoLWNvZGUgbGVuZ3RocyAqLworICBmb3IgKGogPSAwOyBqIDwgbmI7IGorKykKKyAgeworICAgIE5FRURCSVRTKDMpCisgICAgbGxbYm9yZGVyW2pdXSA9ICh1bnNpZ25lZCliICYgNzsKKyAgICBEVU1QQklUUygzKQorICB9CisgIGZvciAoOyBqIDwgMTk7IGorKykKKyAgICBsbFtib3JkZXJbal1dID0gMDsKKworCisgIC8qIGJ1aWxkIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcy0tc2luZ2xlIGxldmVsLCA3IGJpdCBsb29rdXAgKi8KKyAgYmwgPSA3OworICBpZiAoKGkgPSBodWZ0X2J1aWxkKGxsLCAxOSwgMTksIE5VTEwsIE5VTEwsICZ0bCwgJmJsKSkgIT0gMCkKKyAgeworICAgIGlmIChpID09IDEpCisgICAgICBodWZ0X2ZyZWUodGwpOworICAgIHJldHVybiBpOyAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisgIH0KKworCisgIC8qIHJlYWQgaW4gbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgIG4gPSBubCArIG5kOworICBtID0gbWFza19iaXRzW2JsXTsKKyAgaSA9IGwgPSAwOworICB3aGlsZSAoKHVuc2lnbmVkKWkgPCBuKQorICB7CisgICAgTkVFREJJVFMoKHVuc2lnbmVkKWJsKQorICAgIGogPSAodGQgPSB0bCArICgodW5zaWduZWQpYiAmIG0pKS0+YjsKKyAgICBEVU1QQklUUyhqKQorICAgIGogPSB0ZC0+di5uOworICAgIGlmIChqIDwgMTYpICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY29kZSBpbiBiaXRzICgwLi4xNSkgKi8KKyAgICAgIGxsW2krK10gPSBsID0gajsgICAgICAgICAgLyogc2F2ZSBsYXN0IGxlbmd0aCBpbiBsICovCisgICAgZWxzZSBpZiAoaiA9PSAxNikgICAgICAgICAgIC8qIHJlcGVhdCBsYXN0IGxlbmd0aCAzIHRvIDYgdGltZXMgKi8KKyAgICB7CisgICAgICBORUVEQklUUygyKQorICAgICAgaiA9IDMgKyAoKHVuc2lnbmVkKWIgJiAzKTsKKyAgICAgIERVTVBCSVRTKDIpCisgICAgICBpZiAoKHVuc2lnbmVkKWkgKyBqID4gbikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB3aGlsZSAoai0tKQorICAgICAgICBsbFtpKytdID0gbDsKKyAgICB9CisgICAgZWxzZSBpZiAoaiA9PSAxNykgICAgICAgICAgIC8qIDMgdG8gMTAgemVybyBsZW5ndGggY29kZXMgKi8KKyAgICB7CisgICAgICBORUVEQklUUygzKQorICAgICAgaiA9IDMgKyAoKHVuc2lnbmVkKWIgJiA3KTsKKyAgICAgIERVTVBCSVRTKDMpCisgICAgICBpZiAoKHVuc2lnbmVkKWkgKyBqID4gbikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB3aGlsZSAoai0tKQorICAgICAgICBsbFtpKytdID0gMDsKKyAgICAgIGwgPSAwOworICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogaiA9PSAxODogMTEgdG8gMTM4IHplcm8gbGVuZ3RoIGNvZGVzICovCisgICAgeworICAgICAgTkVFREJJVFMoNykKKyAgICAgIGogPSAxMSArICgodW5zaWduZWQpYiAmIDB4N2YpOworICAgICAgRFVNUEJJVFMoNykKKyAgICAgIGlmICgodW5zaWduZWQpaSArIGogPiBuKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIGxsW2krK10gPSAwOworICAgICAgbCA9IDA7CisgICAgfQorICB9CisKKworICAvKiBmcmVlIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcyAqLworICBodWZ0X2ZyZWUodGwpOworCisKKyAgLyogcmVzdG9yZSB0aGUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKyAgYmIgPSBiOworICBiayA9IGs7CisKKworICAvKiBidWlsZCB0aGUgZGVjb2RpbmcgdGFibGVzIGZvciBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZXMgKi8KKyAgYmwgPSBsYml0czsKKyAgaWYgKChpID0gaHVmdF9idWlsZChsbCwgbmwsIDI1NywgY3BsZW5zLCBjcGxleHQsICZ0bCwgJmJsKSkgIT0gMCkKKyAgeworICAgIGlmIChpID09IDEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiIGluY29tcGxldGUgbGl0ZXJhbCB0cmVlXG4iKTsKKyAgICAgIGh1ZnRfZnJlZSh0bCk7CisgICAgfQorICAgIHJldHVybiBpOyAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisgIH0KKyAgYmQgPSBkYml0czsKKyAgaWYgKChpID0gaHVmdF9idWlsZChsbCArIG5sLCBuZCwgMCwgY3BkaXN0LCBjcGRleHQsICZ0ZCwgJmJkKSkgIT0gMCkKKyAgeworICAgIGlmIChpID09IDEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiIGluY29tcGxldGUgZGlzdGFuY2UgdHJlZVxuIik7CisjaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgIGkgPSAwOworICAgIH0KKyNlbHNlCisgICAgICBodWZ0X2ZyZWUodGQpOworICAgIH0KKyAgICBodWZ0X2ZyZWUodGwpOworICAgIHJldHVybiBpOyAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisjZW5kaWYKKyAgfQorCisKKyAgLyogZGVjb21wcmVzcyB1bnRpbCBhbiBlbmQtb2YtYmxvY2sgY29kZSAqLworICBpZiAoaW5mbGF0ZV9jb2Rlcyh0bCwgdGQsIGJsLCBiZCkpCisgICAgcmV0dXJuIDE7CisKKworICAvKiBmcmVlIHRoZSBkZWNvZGluZyB0YWJsZXMsIHJldHVybiAqLworICBodWZ0X2ZyZWUodGwpOworICBodWZ0X2ZyZWUodGQpOworICByZXR1cm4gMDsKK30KKworCisKK2ludCBpbmZsYXRlX2Jsb2NrKGUpCitpbnQgKmU7ICAgICAgICAgICAgICAgICAvKiBsYXN0IGJsb2NrIGZsYWcgKi8KKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgYmxvY2sgKi8KK3sKKyAgdW5zaWduZWQgdDsgICAgICAgICAgIC8qIGJsb2NrIHR5cGUgKi8KKyAgcmVnaXN0ZXIgdWxnIGI7ICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgazsgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworCisgIC8qIG1ha2UgbG9jYWwgYml0IGJ1ZmZlciAqLworICBiID0gYmI7CisgIGsgPSBiazsKKworCisgIC8qIHJlYWQgaW4gbGFzdCBibG9jayBiaXQgKi8KKyAgTkVFREJJVFMoMSkKKyAgKmUgPSAoaW50KWIgJiAxOworICBEVU1QQklUUygxKQorCisKKyAgLyogcmVhZCBpbiBibG9jayB0eXBlICovCisgIE5FRURCSVRTKDIpCisgIHQgPSAodW5zaWduZWQpYiAmIDM7CisgIERVTVBCSVRTKDIpCisKKworICAvKiByZXN0b3JlIHRoZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworICBiYiA9IGI7CisgIGJrID0gazsKKworCisgIC8qIGluZmxhdGUgdGhhdCBibG9jayB0eXBlICovCisgIGlmICh0ID09IDIpCisgICAgcmV0dXJuIGluZmxhdGVfZHluYW1pYygpOworICBpZiAodCA9PSAwKQorICAgIHJldHVybiBpbmZsYXRlX3N0b3JlZCgpOworICBpZiAodCA9PSAxKQorICAgIHJldHVybiBpbmZsYXRlX2ZpeGVkKCk7CisKKworICAvKiBiYWQgYmxvY2sgdHlwZSAqLworICByZXR1cm4gMjsKK30KKworCisKK2ludCBpbmZsYXRlKCkKKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgZW50cnkgKi8KK3sKKyAgaW50IGU7ICAgICAgICAgICAgICAgIC8qIGxhc3QgYmxvY2sgZmxhZyAqLworICBpbnQgcjsgICAgICAgICAgICAgICAgLyogcmVzdWx0IGNvZGUgKi8KKyAgdW5zaWduZWQgaDsgICAgICAgICAgIC8qIG1heGltdW0gc3RydWN0IGh1ZnQncyBtYWxsb2MnZWQgKi8KKworCisgIC8qIGluaXRpYWxpemUgd2luZG93LCBiaXQgYnVmZmVyICovCisgIHdwID0gMDsKKyAgYmsgPSAwOworICBiYiA9IDA7CisKKworICAvKiBkZWNvbXByZXNzIHVudGlsIHRoZSBsYXN0IGJsb2NrICovCisgIGggPSAwOworICBkbyB7CisgICAgaHVmdHMgPSAwOworICAgIGlmICgociA9IGluZmxhdGVfYmxvY2soJmUpKSAhPSAwKQorICAgICAgcmV0dXJuIHI7CisgICAgaWYgKGh1ZnRzID4gaCkKKyAgICAgIGggPSBodWZ0czsKKyAgfSB3aGlsZSAoIWUpOworCisgIC8qIFVuZG8gdG9vIG11Y2ggbG9va2FoZWFkLiBUaGUgbmV4dCByZWFkIHdpbGwgYmUgYnl0ZSBhbGlnbmVkIHNvIHdlCisgICAqIGNhbiBkaXNjYXJkIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IG1lYW5pbmdmdWwgYnl0ZS4KKyAgICovCisgIHdoaWxlIChiayA+PSA4KSB7CisgICAgYmsgLT0gODsKKyAgICBpbnB0ci0tOworICB9CisKKyAgLyogZmx1c2ggb3V0IHNsaWRlICovCisgIGZsdXNoX291dHB1dCh3cCk7CisKKworICAvKiByZXR1cm4gc3VjY2VzcyAqLworI2lmZGVmIERFQlVHCisgIGZwcmludGYoc3RkZXJyLCAiPCV1PiAiLCBoKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9nemlwL3JldmlzaW9uLmggYi91c3IvZ3ppcC9yZXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjAyMGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC9yZXZpc2lvbi5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qIHJldmlzaW9uLmggLS0gZGVmaW5lIHRoZSB2ZXJzaW9uIG51bWJlcgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseS4KKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKi8KKworI2RlZmluZSBWRVJTSU9OICIxLjIuNCIKKyNkZWZpbmUgUEFUQ0hMRVZFTCAwCisjZGVmaW5lIFJFVkRBVEUgIjE4IEF1ZyA5MyIKKworLyogJElkOiByZXZpc2lvbi5oLHYgMS4xIDIwMDIvMDgvMTggMDA6NTk6MjEgaHBhIEV4cCAkICovCmRpZmYgLS1naXQgYS91c3IvZ3ppcC90YWlsb3IuaCBiL3Vzci9nemlwL3RhaWxvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OWU1ODkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC90YWlsb3IuaApAQCAtMCwwICsxLDUwIEBACisvKiB0YWlsb3IuaCAtLSB0YXJnZXQgZGVwZW5kZW50IGRlZmluaXRpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5LgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisvKiBUaGUgdGFyZ2V0IGRlcGVuZGVudCBkZWZpbml0aW9ucyBzaG91bGQgYmUgZGVmaW5lZCBoZXJlIG9ubHkuCisgKiBUaGUgdGFyZ2V0IGRlcGVuZGVudCBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQgaW4gdGFpbG9yLmMuCisgKi8KKworLyogJElkOiB0YWlsb3IuaCx2IDEuMSAyMDAyLzA4LzE4IDAwOjU5OjIxIGhwYSBFeHAgJCAqLworCisJLyogQ29tbW9uIGRlZmF1bHRzICovCisKKyNpZm5kZWYgT1NfQ09ERQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCisjZW5kaWYKKworI2RlZmluZSBQQVRIX1NFUCAnLycKKworI2lmbmRlZiBjYXNlbWFwCisjICBkZWZpbmUgY2FzZW1hcChjKSAoYykKKyNlbmRpZgorCisjaWZuZGVmIE9QVElPTlNfVkFSCisjICBkZWZpbmUgT1BUSU9OU19WQVIgIkdaSVAiCisjZW5kaWYKKworI2lmbmRlZiBaX1NVRkZJWAorIyAgZGVmaW5lIFpfU1VGRklYICIuZ3oiCisjZW5kaWYKKworI2RlZmluZSBNQVhfU1VGRklYICAzMAorCisjaWZuZGVmIE1JTl9QQVJUCisjICBkZWZpbmUgTUlOX1BBUlQgMworICAgLyoga2VlcCBhdCBsZWFzdCBNSU5fUEFSVCBjaGFycyBiZXR3ZWVuIGRvdHMgaW4gYSBmaWxlIG5hbWUuICovCisjZW5kaWYKKworI2lmbmRlZiBSRUNPUkRfSU8KKyMgIGRlZmluZSBSRUNPUkRfSU8gMAorI2VuZGlmCisKKyNpZm5kZWYgZ2V0X2NoYXIKKyMgIGRlZmluZSBnZXRfY2hhcigpIGdldF9ieXRlKCkKKyNlbmRpZgorCisjaWZuZGVmIHB1dF9jaGFyCisjICBkZWZpbmUgcHV0X2NoYXIoYykgcHV0X2J5dGUoYykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvdHJlZXMuYyBiL3Vzci9nemlwL3RyZWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlZmM5NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL3RyZWVzLmMKQEAgLTAsMCArMSwxMDc1IEBACisvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKy8qCisgKiAgUFVSUE9TRQorICoKKyAqICAgICAgRW5jb2RlIHZhcmlvdXMgc2V0cyBvZiBzb3VyY2UgdmFsdWVzIHVzaW5nIHZhcmlhYmxlLWxlbmd0aAorICogICAgICBiaW5hcnkgY29kZSB0cmVlcy4KKyAqCisgKiAgRElTQ1VTU0lPTgorICoKKyAqICAgICAgVGhlIFBLWklQICJkZWZsYXRpb24iIHByb2Nlc3MgdXNlcyBzZXZlcmFsIEh1ZmZtYW4gdHJlZXMuIFRoZSBtb3JlCisgKiAgICAgIGNvbW1vbiBzb3VyY2UgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBieSBzaG9ydGVyIGJpdCBzZXF1ZW5jZXMuCisgKgorICogICAgICBFYWNoIGNvZGUgdHJlZSBpcyBzdG9yZWQgaW4gdGhlIFpJUCBmaWxlIGluIGEgY29tcHJlc3NlZCBmb3JtCisgKiAgICAgIHdoaWNoIGlzIGl0c2VsZiBhIEh1ZmZtYW4gZW5jb2Rpbmcgb2YgdGhlIGxlbmd0aHMgb2YKKyAqICAgICAgYWxsIHRoZSBjb2RlIHN0cmluZ3MgKGluIGFzY2VuZGluZyBvcmRlciBieSBzb3VyY2UgdmFsdWVzKS4KKyAqICAgICAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgbGVuZ3RocyBpbgorICogICAgICB0aGUgVU5aSVAgcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIHRoZSAiYXBwbGljYXRpb24gbm90ZSIKKyAqICAgICAgKEFQUE5PVEUuVFhUKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIFBLV0FSRSdzIFBLWklQIHByb2dyYW0uCisgKgorICogIFJFRkVSRU5DRVMKKyAqCisgKiAgICAgIEx5bmNoLCBUaG9tYXMgSi4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBUZWNobmlxdWVzIGFuZCBBcHBsaWNhdGlvbnMsIHBwLiA1My01NS4KKyAqICAgICAgICAgIExpZmV0aW1lIExlYXJuaW5nIFB1YmxpY2F0aW9ucywgMTk4NS4gIElTQk4gMC01MzQtMDM0MTgtNy4KKyAqCisgKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KKyAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCisgKgorICogICAgICBTZWRnZXdpY2ssIFIuCisgKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgorICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KKyAqCisgKiAgSU5URVJGQUNFCisgKgorICogICAgICB2b2lkIGN0X2luaXQgKHVzaCAqYXR0ciwgaW50ICptZXRob2RwKQorICogICAgICAgICAgQWxsb2NhdGUgdGhlIG1hdGNoIGJ1ZmZlciwgaW5pdGlhbGl6ZSB0aGUgdmFyaW91cyB0YWJsZXMgYW5kIHNhdmUKKyAqICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGUgKGFzY2lpL2JpbmFyeSkgYW5kCisgKiAgICAgICAgICBtZXRob2QgKERFRkxBVEUvU1RPUkUpCisgKgorICogICAgICB2b2lkIGN0X3RhbGx5IChpbnQgZGlzdCwgaW50IGxjKTsKKyAqICAgICAgICAgIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLgorICoKKyAqICAgICAgbG9uZyBmbHVzaF9ibG9jayAoY2hhciAqYnVmLCB1bGcgc3RvcmVkX2xlbiwgaW50IGVvZikKKyAqICAgICAgICAgIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsCisgKiAgICAgICAgICBzdGF0aWMgdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcAorICogICAgICAgICAgZmlsZS4gUmV0dXJucyB0aGUgdG90YWwgY29tcHJlc3NlZCBsZW5ndGggZm9yIHRoZSBmaWxlIHNvIGZhci4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJ0YWlsb3IuaCIKKyNpbmNsdWRlICJnemlwLmgiCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHRyZWVzLmMsdiAxLjEgMjAwMi8wOC8xOCAwMDo1OToyMSBocGEgRXhwICQiOworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RhbnRzCisgKi8KKworI2RlZmluZSBNQVhfQklUUyAxNQorLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovCisKKyNkZWZpbmUgTUFYX0JMX0JJVFMgNworLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqLworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgRU5EX0JMT0NLIDI1NgorLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqLworCisjZGVmaW5lIExfQ09ERVMgKExJVEVSQUxTKzErTEVOR1RIX0NPREVTKQorLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgRF9DT0RFUyAgIDMwCisvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKworI2RlZmluZSBCTF9DT0RFUyAgMTkKKy8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqLworCisKK2xvY2FsIGludCBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMH07CisKK2xvY2FsIGludCBleHRyYV9kYml0c1tEX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTN9OworCitsb2NhbCBpbnQgZXh0cmFfYmxiaXRzW0JMX0NPREVTXS8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovCisgICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3fTsKKworI2RlZmluZSBTVE9SRURfQkxPQ0sgMAorI2RlZmluZSBTVEFUSUNfVFJFRVMgMQorI2RlZmluZSBEWU5fVFJFRVMgICAgMgorLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi8KKworI2lmbmRlZiBMSVRfQlVGU0laRQorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHgyMDAwCisjICBlbHNlCisjICBpZmRlZiBNRURJVU1fTUVNCisjICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHg0MDAwCisjICBlbHNlCisjICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHg4MDAwCisjICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBESVNUX0JVRlNJWkUKKyMgIGRlZmluZSBESVNUX0JVRlNJWkUgIExJVF9CVUZTSVpFCisjZW5kaWYKKy8qIFNpemVzIG9mIG1hdGNoIGJ1ZmZlcnMgZm9yIGxpdGVyYWxzL2xlbmd0aHMgYW5kIGRpc3RhbmNlcy4gIFRoZXJlIGFyZQorICogNCByZWFzb25zIGZvciBsaW1pdGluZyBMSVRfQlVGU0laRSB0byA2NEs6CisgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzCisgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0IGRhdGEgaXMKKyAqICAgICBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4gd2hlbiBpbnB1dAorICogICAgIGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvciBhbGwgYmxvY2tzIGlmCisgKiAgICAgTElUX0JVRlNJWkUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQorICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCisgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLgorICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAorICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3IKKyAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnkKKyAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZQorICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZyB0cmVlcworICogICAgIG1vcmUgZnJlcXVlbnRseS4KKyAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKKyAqIFRoZSBjdXJyZW50IGNvZGUgaXMgZ2VuZXJhbCBhbmQgYWxsb3dzIERJU1RfQlVGU0laRSA8IExJVF9CVUZTSVpFICh0byBzYXZlCisgKiBtZW1vcnkgYXQgdGhlIGV4cGVuc2Ugb2YgY29tcHJlc3Npb24pLiBTb21lIG9wdGltaXphdGlvbnMgd291bGQgYmUgcG9zc2libGUKKyAqIGlmIHdlIHJlbHkgb24gRElTVF9CVUZTSVpFID09IExJVF9CVUZTSVpFLgorICovCisjaWYgTElUX0JVRlNJWkUgPiBJTkJVRlNJWgorICAgIGVycm9yIGNhbm5vdCBvdmVybGF5IGxfYnVmIGFuZCBpbmJ1ZgorI2VuZGlmCisKKyNkZWZpbmUgUkVQXzNfNiAgICAgIDE2CisvKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKKyNkZWZpbmUgUkVQWl8zXzEwICAgIDE3CisvKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzExXzEzOCAgMTgKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YQorICovCisKKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBzaW5nbGUgdmFsdWUgYW5kIGl0cyBjb2RlIHN0cmluZy4gKi8KK3R5cGVkZWYgc3RydWN0IGN0X2RhdGEgeworICAgIHVuaW9uIHsKKyAgICAgICAgdXNoICBmcmVxOyAgICAgICAvKiBmcmVxdWVuY3kgY291bnQgKi8KKyAgICAgICAgdXNoICBjb2RlOyAgICAgICAvKiBiaXQgc3RyaW5nICovCisgICAgfSBmYzsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZGFkOyAgICAgICAgLyogZmF0aGVyIG5vZGUgaW4gSHVmZm1hbiB0cmVlICovCisgICAgICAgIHVzaCAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KKyAgICB9IGRsOworfSBjdF9kYXRhOworCisjZGVmaW5lIEZyZXEgZmMuZnJlcQorI2RlZmluZSBDb2RlIGZjLmNvZGUKKyNkZWZpbmUgRGFkICBkbC5kYWQKKyNkZWZpbmUgTGVuICBkbC5sZW4KKworI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9DT0RFUysxKQorLyogbWF4aW11bSBoZWFwIHNpemUgKi8KKworbG9jYWwgY3RfZGF0YSBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqLworbG9jYWwgY3RfZGF0YSBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCisKK2xvY2FsIGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl07CisvKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBubworICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXIKKyAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBjdF9pbml0CisgKiBiZWxvdykuCisgKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107CisvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlCisgKiA1IGJpdHMuKQorICovCisKK2xvY2FsIGN0X2RhdGEgYmxfdHJlZVsyKkJMX0NPREVTKzFdOworLyogSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdHJlZV9kZXNjIHsKKyAgICBjdF9kYXRhICpkeW5fdHJlZTsgICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovCisgICAgY3RfZGF0YSAqc3RhdGljX3RyZWU7ICAgLyogY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSBvciBOVUxMICovCisgICAgaW50ICAgICAqZXh0cmFfYml0czsgICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi8KKyAgICBpbnQgICAgIGV4dHJhX2Jhc2U7ICAgICAgICAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi8KKyAgICBpbnQgICAgIGVsZW1zOyAgICAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi8KKyAgICBpbnQgICAgIG1heF9sZW5ndGg7ICAgICAgICAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KKyAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworfSB0cmVlX2Rlc2M7CisKK2xvY2FsIHRyZWVfZGVzYyBsX2Rlc2MgPQore2R5bl9sdHJlZSwgc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMrMSwgTF9DT0RFUywgTUFYX0JJVFMsIDB9OworCitsb2NhbCB0cmVlX2Rlc2MgZF9kZXNjID0KK3tkeW5fZHRyZWUsIHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTLCAwfTsKKworbG9jYWwgdHJlZV9kZXNjIGJsX2Rlc2MgPQore2JsX3RyZWUsIChjdF9kYXRhICopMCwgZXh0cmFfYmxiaXRzLCAwLCAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUywgMH07CisKKworbG9jYWwgdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdOworLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCisKK2xvY2FsIHVjaCBibF9vcmRlcltCTF9DT0RFU10KKyAgID0gezE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTV9OworLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZworICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuCisgKi8KKworbG9jYWwgaW50IGhlYXBbMipMX0NPREVTKzFdOyAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KK2xvY2FsIGludCBoZWFwX2xlbjsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi8KK2xvY2FsIGludCBoZWFwX21heDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovCisvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy4KKyAqLworCitsb2NhbCB1Y2ggZGVwdGhbMipMX0NPREVTKzFdOworLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeSAqLworCitsb2NhbCB1Y2ggbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXTsKKy8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi8KKworbG9jYWwgdWNoIGRpc3RfY29kZVs1MTJdOworLyogZGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcworICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgorICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuCisgKi8KKworbG9jYWwgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU107CisvKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqLworCitsb2NhbCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdOworLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi8KKworI2RlZmluZSBsX2J1ZiBpbmJ1ZgorLyogREVDTEFSRSh1Y2gsIGxfYnVmLCBMSVRfQlVGU0laRSk7ICBidWZmZXIgZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi8KKworLyogREVDTEFSRSh1c2gsIGRfYnVmLCBESVNUX0JVRlNJWkUpOyBidWZmZXIgZm9yIGRpc3RhbmNlcyAqLworCitsb2NhbCB1Y2ggZmxhZ19idWZbKExJVF9CVUZTSVpFLzgpXTsKKy8qIGZsYWdfYnVmIGlzIGEgYml0IGFycmF5IGRpc3Rpbmd1aXNoaW5nIGxpdGVyYWxzIGZyb20gbGVuZ3RocyBpbgorICogbF9idWYsIHRodXMgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhIGRpc3RhbmNlLgorICovCisKK2xvY2FsIHVuc2lnbmVkIGxhc3RfbGl0OyAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCitsb2NhbCB1bnNpZ25lZCBsYXN0X2Rpc3Q7ICAgLyogcnVubmluZyBpbmRleCBpbiBkX2J1ZiAqLworbG9jYWwgdW5zaWduZWQgbGFzdF9mbGFnczsgIC8qIHJ1bm5pbmcgaW5kZXggaW4gZmxhZ19idWYgKi8KK2xvY2FsIHVjaCBmbGFnczsgICAgICAgICAgICAvKiBjdXJyZW50IGZsYWdzIG5vdCB5ZXQgc2F2ZWQgaW4gZmxhZ19idWYgKi8KK2xvY2FsIHVjaCBmbGFnX2JpdDsgICAgICAgICAvKiBjdXJyZW50IGJpdCB1c2VkIGluIGZsYWdzICovCisvKiBiaXRzIGFyZSBmaWxsZWQgaW4gZmxhZ3Mgc3RhcnRpbmcgYXQgYml0IDAgKGxlYXN0IHNpZ25pZmljYW50KS4KKyAqIE5vdGU6IHRoZXNlIGZsYWdzIGFyZSBvdmVya2lsbCBpbiB0aGUgY3VycmVudCBjb2RlIHNpbmNlIHdlIGRvbid0CisgKiB0YWtlIGFkdmFudGFnZSBvZiBESVNUX0JVRlNJWkUgPT0gTElUX0JVRlNJWkUuCisgKi8KKworbG9jYWwgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCitsb2NhbCB1bGcgc3RhdGljX2xlbjsgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqLworCitsb2NhbCB1bGcgY29tcHJlc3NlZF9sZW47IC8qIHRvdGFsIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBmaWxlICovCisKK2xvY2FsIHVsZyBpbnB1dF9sZW47ICAgICAgLyogdG90YWwgYnl0ZSBsZW5ndGggb2YgaW5wdXQgZmlsZSAqLworLyogaW5wdXRfbGVuIGlzIGZvciBkZWJ1Z2dpbmcgb25seSBzaW5jZSB3ZSBjYW4gZ2V0IGl0IGJ5IG90aGVyIG1lYW5zLiAqLworCit1c2ggKmZpbGVfdHlwZTsgICAgICAgIC8qIHBvaW50ZXIgdG8gVU5LTk9XTiwgQklOQVJZIG9yIEFTQ0lJICovCitpbnQgKmZpbGVfbWV0aG9kOyAgICAgIC8qIHBvaW50ZXIgdG8gREVGTEFURSBvciBTVE9SRSAqLworCisjaWZkZWYgREVCVUcKK2V4dGVybiB1bGcgYml0c19zZW50OyAgLyogYml0IGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhICovCitleHRlcm4gbG9uZyBpc2l6ZTsgICAgIC8qIGJ5dGUgbGVuZ3RoIG9mIGlucHV0IGZpbGUgKi8KKyNlbmRpZgorCitleHRlcm4gbG9uZyBibG9ja19zdGFydDsgICAgICAgLyogd2luZG93IG9mZnNldCBvZiBjdXJyZW50IGJsb2NrICovCitleHRlcm4gdW5zaWduZWQgc3Ryc3RhcnQ7IC8qIHdpbmRvdyBvZmZzZXQgb2YgY3VycmVudCBzdHJpbmcgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCAoc3RhdGljKSByb3V0aW5lcyBpbiB0aGlzIGZpbGUuCisgKi8KKworbG9jYWwgdm9pZCBpbml0X2Jsb2NrICAgICBPRigodm9pZCkpOworbG9jYWwgdm9pZCBwcWRvd25oZWFwICAgICBPRigoY3RfZGF0YSAqdHJlZSwgaW50IGspKTsKK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbiAgICAgT0YoKHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBnZW5fY29kZXMgICAgICBPRigoY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Citsb2NhbCB2b2lkIGJ1aWxkX3RyZWUgICAgIE9GKCh0cmVlX2Rlc2MgKmRlc2MpKTsKK2xvY2FsIHZvaWQgc2Nhbl90cmVlICAgICAgT0YoKGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSkpOworbG9jYWwgdm9pZCBzZW5kX3RyZWUgICAgICBPRigoY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Citsb2NhbCBpbnQgIGJ1aWxkX2JsX3RyZWUgIE9GKCh2b2lkKSk7Citsb2NhbCB2b2lkIHNlbmRfYWxsX3RyZWVzIE9GKChpbnQgbGNvZGVzLCBpbnQgZGNvZGVzLCBpbnQgYmxjb2RlcykpOworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoY3RfZGF0YSAqbHRyZWUsIGN0X2RhdGEgKmR0cmVlKSk7Citsb2NhbCB2b2lkIHNldF9maWxlX3R5cGUgIE9GKCh2b2lkKSk7CisKKworI2lmbmRlZiBERUJVRworIyAgZGVmaW5lIHNlbmRfY29kZShjLCB0cmVlKSBzZW5kX2JpdHModHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbikKKyAgIC8qIFNlbmQgYSBjb2RlIG9mIHRoZSBnaXZlbiB0cmVlLiBjIGFuZCB0cmVlIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCisKKyNlbHNlIC8qIERFQlVHICovCisjICBkZWZpbmUgc2VuZF9jb2RlKGMsIHRyZWUpIFwKKyAgICAgeyBpZiAodmVyYm9zZT4xKSBmcHJpbnRmKHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCisgICAgICAgc2VuZF9iaXRzKHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyB9CisjZW5kaWYKKworI2RlZmluZSBkX2NvZGUoZGlzdCkgXAorICAgKChkaXN0KSA8IDI1NiA/IGRpc3RfY29kZVtkaXN0XSA6IGRpc3RfY29kZVsyNTYrKChkaXN0KT4+NyldKQorLyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRoZSBkaXN0YW5jZSAtIDEgYW5kCisgKiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gZGlzdF9jb2RlWzI1Nl0gYW5kIGRpc3RfY29kZVsyNTddIGFyZSBuZXZlcgorICogdXNlZC4KKyAqLworCisjZGVmaW5lIE1BWChhLGIpIChhID49IGIgPyBhIDogYikKKy8qIHRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBbGxvY2F0ZSB0aGUgbWF0Y2ggYnVmZmVyLCBpbml0aWFsaXplIHRoZSB2YXJpb3VzIHRhYmxlcyBhbmQgc2F2ZSB0aGUKKyAqIGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZSAoYXNjaWkvYmluYXJ5KSBhbmQgbWV0aG9kCisgKiAoREVGTEFURS9TVE9SRSkuCisgKi8KK3ZvaWQgY3RfaW5pdChhdHRyLCBtZXRob2RwKQorICAgIHVzaCAgKmF0dHI7ICAgLyogcG9pbnRlciB0byBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZSAqLworICAgIGludCAgKm1ldGhvZHA7IC8qIHBvaW50ZXIgdG8gY29tcHJlc3Npb24gbWV0aG9kICovCit7CisgICAgaW50IG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovCisgICAgaW50IGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi8KKyAgICBpbnQgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovCisKKyAgICBmaWxlX3R5cGUgPSBhdHRyOworICAgIGZpbGVfbWV0aG9kID0gbWV0aG9kcDsKKyAgICBjb21wcmVzc2VkX2xlbiA9IGlucHV0X2xlbiA9IDBMOworCisgICAgaWYgKHN0YXRpY19kdHJlZVswXS5MZW4gIT0gMCkgcmV0dXJuOyAvKiBjdF9pbml0IGFscmVhZHkgY2FsbGVkICovCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovCisgICAgbGVuZ3RoID0gMDsKKyAgICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgTEVOR1RIX0NPREVTLTE7IGNvZGUrKykgeworICAgICAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9sYml0c1tjb2RlXSk7IG4rKykgeworICAgICAgICAgICAgbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAobGVuZ3RoID09IDI1NiwgImN0X2luaXQ6IGxlbmd0aCAhPSAyNTYiKTsKKyAgICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAorICAgICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlCisgICAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOgorICAgICAqLworICAgIGxlbmd0aF9jb2RlW2xlbmd0aC0xXSA9ICh1Y2gpY29kZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqLworICAgIGRpc3QgPSAwOworICAgIGZvciAoY29kZSA9IDAgOyBjb2RlIDwgMTY7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBkaXN0X2NvZGVbZGlzdCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAiY3RfaW5pdDogZGlzdCAhPSAyNTYiKTsKKyAgICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KKyAgICBmb3IgKCA7IGNvZGUgPCBEX0NPREVTOyBjb2RlKyspIHsKKyAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PChleHRyYV9kYml0c1tjb2RlXS03KSk7IG4rKykgeworICAgICAgICAgICAgZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChkaXN0ID09IDI1NiwgImN0X2luaXQ6IDI1NitkaXN0ICE9IDUxMiIpOworCisgICAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgYmxfY291bnRbYml0c10gPSAwOworICAgIG4gPSAwOworICAgIHdoaWxlIChuIDw9IDE0Mykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKKyAgICB3aGlsZSAobiA8PSAyNTUpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDksIGJsX2NvdW50WzldKys7CisgICAgd2hpbGUgKG4gPD0gMjc5KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA3LCBibF9jb3VudFs3XSsrOworICAgIHdoaWxlIChuIDw9IDI4Nykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKKyAgICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUKKyAgICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGUKKyAgICAgKiBhbGwgb25lcykKKyAgICAgKi8KKyAgICBnZW5fY29kZXMoKGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsIExfQ09ERVMrMSk7CisKKyAgICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5MZW4gPSA1OworICAgICAgICBzdGF0aWNfZHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobiwgNSk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovCisgICAgaW5pdF9ibG9jaygpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCisgKi8KK2xvY2FsIHZvaWQgaW5pdF9ibG9jaygpCit7CisgICAgaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCisgICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIGR5bl9sdHJlZVtuXS5GcmVxID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgZHluX2R0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSBibF90cmVlW25dLkZyZXEgPSAwOworCisgICAgZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisgICAgb3B0X2xlbiA9IHN0YXRpY19sZW4gPSAwTDsKKyAgICBsYXN0X2xpdCA9IGxhc3RfZGlzdCA9IGxhc3RfZmxhZ3MgPSAwOworICAgIGZsYWdzID0gMDsgZmxhZ19iaXQgPSAxOworfQorCisjZGVmaW5lIFNNQUxMRVNUIDEKKy8qIEluZGV4IHdpdGhpbiB0aGUgaGVhcCBhcnJheSBvZiBsZWFzdCBmcmVxdWVudCBub2RlIGluIHRoZSBIdWZmbWFuIHRyZWUgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSBoZWFwIGFuZCByZWNyZWF0ZSB0aGUgaGVhcCB3aXRoCisgKiBvbmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgorICovCisjZGVmaW5lIHBxcmVtb3ZlKHRyZWUsIHRvcCkgXAore1wKKyAgICB0b3AgPSBoZWFwW1NNQUxMRVNUXTsgXAorICAgIGhlYXBbU01BTExFU1RdID0gaGVhcFtoZWFwX2xlbi0tXTsgXAorICAgIHBxZG93bmhlYXAodHJlZSwgU01BTExFU1QpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KKyAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgorICovCisjZGVmaW5lIHNtYWxsZXIodHJlZSwgbiwgbSkgXAorICAgKHRyZWVbbl0uRnJlcSA8IHRyZWVbbV0uRnJlcSB8fCBcCisgICAodHJlZVtuXS5GcmVxID09IHRyZWVbbV0uRnJlcSAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssCisgKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMgdHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZworICogd2hlbiB0aGUgaGVhcCBwcm9wZXJ0eSBpcyByZS1lc3RhYmxpc2hlZCAoZWFjaCBmYXRoZXIgc21hbGxlciB0aGFuIGl0cworICogdHdvIHNvbnMpLgorICovCitsb2NhbCB2b2lkIHBxZG93bmhlYXAodHJlZSwgaykKKyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqLworICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovCit7CisgICAgaW50IHYgPSBoZWFwW2tdOworICAgIGludCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLworICAgIHdoaWxlIChqIDw9IGhlYXBfbGVuKSB7CisgICAgICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCisgICAgICAgIGlmIChqIDwgaGVhcF9sZW4gJiYgc21hbGxlcih0cmVlLCBoZWFwW2orMV0sIGhlYXBbal0pKSBqKys7CisKKyAgICAgICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi8KKyAgICAgICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgaGVhcFtqXSkpIGJyZWFrOworCisgICAgICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisgICAgICAgIGhlYXBba10gPSBoZWFwW2pdOyAgayA9IGo7CisKKyAgICAgICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLworICAgICAgICBqIDw8PSAxOworICAgIH0KKyAgICBoZWFwW2tdID0gdjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aAorICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKKyAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlCisgKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCisgKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzCisgKiAgICAgbm90IG51bGwuCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbihkZXNjKQorICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLworeworICAgIGN0X2RhdGEgKnRyZWUgID0gZGVzYy0+ZHluX3RyZWU7CisgICAgaW50ICpleHRyYSAgICAgPSBkZXNjLT5leHRyYV9iaXRzOworICAgIGludCBiYXNlICAgICAgICAgICAgPSBkZXNjLT5leHRyYV9iYXNlOworICAgIGludCBtYXhfY29kZSAgICAgICAgPSBkZXNjLT5tYXhfY29kZTsKKyAgICBpbnQgbWF4X2xlbmd0aCAgICAgID0gZGVzYy0+bWF4X2xlbmd0aDsKKyAgICBjdF9kYXRhICpzdHJlZSA9IGRlc2MtPnN0YXRpY190cmVlOworICAgIGludCBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqLworICAgIGludCBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovCisgICAgaW50IHhiaXRzOyAgICAgICAgICAvKiBleHRyYSBiaXRzICovCisgICAgdXNoIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi8KKyAgICBpbnQgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovCisKKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIGJsX2NvdW50W2JpdHNdID0gMDsKKworICAgIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5CisgICAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuCisgICAgICovCisgICAgdHJlZVtoZWFwW2hlYXBfbWF4XV0uTGVuID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqLworCisgICAgZm9yIChoID0gaGVhcF9tYXgrMTsgaCA8IEhFQVBfU0laRTsgaCsrKSB7CisgICAgICAgIG4gPSBoZWFwW2hdOworICAgICAgICBiaXRzID0gdHJlZVt0cmVlW25dLkRhZF0uTGVuICsgMTsKKyAgICAgICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSBiaXRzID0gbWF4X2xlbmd0aCwgb3ZlcmZsb3crKzsKKyAgICAgICAgdHJlZVtuXS5MZW4gPSAodXNoKWJpdHM7CisgICAgICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovCisKKyAgICAgICAgaWYgKG4gPiBtYXhfY29kZSkgY29udGludWU7IC8qIG5vdCBhIGxlYWYgbm9kZSAqLworCisgICAgICAgIGJsX2NvdW50W2JpdHNdKys7CisgICAgICAgIHhiaXRzID0gMDsKKyAgICAgICAgaWYgKG4gPj0gYmFzZSkgeGJpdHMgPSBleHRyYVtuLWJhc2VdOworICAgICAgICBmID0gdHJlZVtuXS5GcmVxOworICAgICAgICBvcHRfbGVuICs9ICh1bGcpZiAqIChiaXRzICsgeGJpdHMpOworICAgICAgICBpZiAoc3RyZWUpIHN0YXRpY19sZW4gKz0gKHVsZylmICogKHN0cmVlW25dLkxlbiArIHhiaXRzKTsKKyAgICB9CisgICAgaWYgKG92ZXJmbG93ID09IDApIHJldHVybjsKKworICAgIFRyYWNlKChzdGRlcnIsIlxuYml0IGxlbmd0aCBvdmVyZmxvd1xuIikpOworICAgIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovCisKKyAgICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqLworICAgIGRvIHsKKyAgICAgICAgYml0cyA9IG1heF9sZW5ndGgtMTsKKyAgICAgICAgd2hpbGUgKGJsX2NvdW50W2JpdHNdID09IDApIGJpdHMtLTsKKyAgICAgICAgYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi8KKyAgICAgICAgYmxfY291bnRbYml0cysxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovCisgICAgICAgIGJsX2NvdW50W21heF9sZW5ndGhdLS07CisgICAgICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsCisgICAgICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXQorICAgICAgICAgKi8KKyAgICAgICAgb3ZlcmZsb3cgLT0gMjsKKyAgICB9IHdoaWxlIChvdmVyZmxvdyA+IDApOworCisgICAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LgorICAgICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGwKKyAgICAgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlbgorICAgICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKQorICAgICAqLworICAgIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT0gMDsgYml0cy0tKSB7CisgICAgICAgIG4gPSBibF9jb3VudFtiaXRzXTsKKyAgICAgICAgd2hpbGUgKG4gIT0gMCkgeworICAgICAgICAgICAgbSA9IGhlYXBbLS1oXTsKKyAgICAgICAgICAgIGlmIChtID4gbWF4X2NvZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgeworICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsImNvZGUgJWQgYml0cyAlZC0+JWRcbiIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7CisgICAgICAgICAgICAgICAgb3B0X2xlbiArPSAoKGxvbmcpYml0cy0obG9uZyl0cmVlW21dLkxlbikqKGxvbmcpdHJlZVttXS5GcmVxOworICAgICAgICAgICAgICAgIHRyZWVbbV0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbi0tOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZQorICogb3B0aW1hbCkuCisgKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvcgorICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCisgKiAgICAgemVybyBjb2RlIGxlbmd0aC4KKyAqLworbG9jYWwgdm9pZCBnZW5fY29kZXMgKHRyZWUsIG1heF9jb2RlKQorICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqLworICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIHVzaCBuZXh0X2NvZGVbTUFYX0JJVFMrMV07IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCisgICAgdXNoIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovCisgICAgaW50IGJpdHM7ICAgICAgICAgICAgICAgICAgLyogYml0IGluZGV4ICovCisgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqLworCisgICAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzCisgICAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuCisgICAgICovCisgICAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CisgICAgICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMtMV0pIDw8IDE7CisgICAgfQorICAgIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGUKKyAgICAgKiBtdXN0IGJlIGFsbCBvbmVzLgorICAgICAqLworICAgIEFzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSwKKyAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgYml0IGNvdW50cyIpOworICAgIFRyYWNldigoc3RkZXJyLCJcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgIiwgbWF4X2NvZGUpKTsKKworICAgIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgaW50IGxlbiA9IHRyZWVbbl0uTGVuOworICAgICAgICBpZiAobGVuID09IDApIGNvbnRpbnVlOworICAgICAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqLworICAgICAgICB0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7CisKKyAgICAgICAgVHJhY2VjKHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLCJcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgIiwKKyAgICAgICAgICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KKyAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCisgKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKKyAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCisgKi8KK2xvY2FsIHZvaWQgYnVpbGRfdHJlZShkZXNjKQorICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLworeworICAgIGN0X2RhdGEgKnRyZWUgICA9IGRlc2MtPmR5bl90cmVlOworICAgIGN0X2RhdGEgKnN0cmVlICA9IGRlc2MtPnN0YXRpY190cmVlOworICAgIGludCBlbGVtcyAgICAgICAgICAgID0gZGVzYy0+ZWxlbXM7CisgICAgaW50IG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovCisgICAgaW50IG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIGludCBub2RlID0gZWxlbXM7ICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi8KKworICAgIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW4KKyAgICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4KKyAgICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqLworICAgIGhlYXBfbGVuID0gMCwgaGVhcF9tYXggPSBIRUFQX1NJWkU7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykgeworICAgICAgICBpZiAodHJlZVtuXS5GcmVxICE9IDApIHsKKyAgICAgICAgICAgIGhlYXBbKytoZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47CisgICAgICAgICAgICBkZXB0aFtuXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmVlW25dLkxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLAorICAgICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0CisgICAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS4KKyAgICAgKi8KKyAgICB3aGlsZSAoaGVhcF9sZW4gPCAyKSB7CisgICAgICAgIGludCBuZXcgPSBoZWFwWysraGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTsKKyAgICAgICAgdHJlZVtuZXddLkZyZXEgPSAxOworICAgICAgICBkZXB0aFtuZXddID0gMDsKKyAgICAgICAgb3B0X2xlbi0tOyBpZiAoc3RyZWUpIHN0YXRpY19sZW4gLT0gc3RyZWVbbmV3XS5MZW47CisgICAgICAgIC8qIG5ldyBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovCisgICAgfQorICAgIGRlc2MtPm1heF9jb2RlID0gbWF4X2NvZGU7CisKKyAgICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsCisgICAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6CisgICAgICovCisgICAgZm9yIChuID0gaGVhcF9sZW4vMjsgbiA+PSAxOyBuLS0pIHBxZG93bmhlYXAodHJlZSwgbik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvCisgICAgICogZnJlcXVlbnQgbm9kZXMuCisgICAgICovCisgICAgZG8geworICAgICAgICBwcXJlbW92ZSh0cmVlLCBuKTsgICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi8KKyAgICAgICAgbSA9IGhlYXBbU01BTExFU1RdOyAgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi8KKworICAgICAgICBoZWFwWy0taGVhcF9tYXhdID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLworICAgICAgICBoZWFwWy0taGVhcF9tYXhdID0gbTsKKworICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLworICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7CisgICAgICAgIGRlcHRoW25vZGVdID0gKHVjaCkgKE1BWChkZXB0aFtuXSwgZGVwdGhbbV0pICsgMSk7CisgICAgICAgIHRyZWVbbl0uRGFkID0gdHJlZVttXS5EYWQgPSAodXNoKW5vZGU7CisjaWZkZWYgRFVNUF9CTF9UUkVFCisgICAgICAgIGlmICh0cmVlID09IGJsX3RyZWUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcbm5vZGUgJWQoJWQpLCBzb25zICVkKCVkKSAlZCglZCkiLAorICAgICAgICAgICAgICAgICAgICBub2RlLCB0cmVlW25vZGVdLkZyZXEsIG4sIHRyZWVbbl0uRnJlcSwgbSwgdHJlZVttXS5GcmVxKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovCisgICAgICAgIGhlYXBbU01BTExFU1RdID0gbm9kZSsrOworICAgICAgICBwcWRvd25oZWFwKHRyZWUsIFNNQUxMRVNUKTsKKworICAgIH0gd2hpbGUgKGhlYXBfbGVuID49IDIpOworCisgICAgaGVhcFstLWhlYXBfbWF4XSA9IGhlYXBbU01BTExFU1RdOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vdworICAgICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KKyAgICAgKi8KKyAgICBnZW5fYml0bGVuKCh0cmVlX2Rlc2MgKilkZXNjKTsKKworICAgIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KKyAgICBnZW5fY29kZXMgKChjdF9kYXRhICopdHJlZSwgbWF4X2NvZGUpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXMKKyAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuIFVwZGF0ZXMgb3B0X2xlbiB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgcmVwZWF0CisgKiBjb3VudHMuIChUaGUgY29udHJpYnV0aW9uIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIHdpbGwgYmUgYWRkZWQgbGF0ZXIKKyAqIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIGJsX3RyZWUuKQorICovCitsb2NhbCB2b2lkIHNjYW5fdHJlZSAodHJlZSwgbWF4X2NvZGUpCisgICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqLworICAgIGludCBtYXhfY29kZTsgICAgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovCit7CisgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi8KKyAgICBpbnQgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCisgICAgaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLworICAgIGludCBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovCisgICAgaW50IG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqLworICAgIGludCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi8KKworICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKyAgICB0cmVlW21heF9jb2RlKzFdLkxlbiA9ICh1c2gpMHhmZmZmOyAvKiBndWFyZCAqLworCisgICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOworICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKyAgICAgICAgICAgIGJsX3RyZWVbY3VybGVuXS5GcmVxICs9IGNvdW50OworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY3VybGVuICE9IHByZXZsZW4pIGJsX3RyZWVbY3VybGVuXS5GcmVxKys7CisgICAgICAgICAgICBibF90cmVlW1JFUF8zXzZdLkZyZXErKzsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgeworICAgICAgICAgICAgYmxfdHJlZVtSRVBaXzNfMTBdLkZyZXErKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJsX3RyZWVbUkVQWl8xMV8xMzhdLkZyZXErKzsKKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IDA7IHByZXZsZW4gPSBjdXJsZW47CisgICAgICAgIGlmIChuZXh0bGVuID09IDApIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDcsIG1pbl9jb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpbgorICogYmxfdHJlZS4KKyAqLworbG9jYWwgdm9pZCBzZW5kX3RyZWUgKHRyZWUsIG1heF9jb2RlKQorICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi8KKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgZG8geyBzZW5kX2NvZGUoY3VybGVuLCBibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKKworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY3VybGVuICE9IHByZXZsZW4pIHsKKyAgICAgICAgICAgICAgICBzZW5kX2NvZGUoY3VybGVuLCBibF90cmVlKTsgY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsICIgM182PyIpOworICAgICAgICAgICAgc2VuZF9jb2RlKFJFUF8zXzYsIGJsX3RyZWUpOyBzZW5kX2JpdHMoY291bnQtMywgMik7CisKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgeworICAgICAgICAgICAgc2VuZF9jb2RlKFJFUFpfM18xMCwgYmxfdHJlZSk7IHNlbmRfYml0cyhjb3VudC0zLCAzKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZF9jb2RlKFJFUFpfMTFfMTM4LCBibF90cmVlKTsgc2VuZF9iaXRzKGNvdW50LTExLCA3KTsKKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IDA7IHByZXZsZW4gPSBjdXJsZW47CisgICAgICAgIGlmIChuZXh0bGVuID09IDApIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDcsIG1pbl9jb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpbgorICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgKi8KK2xvY2FsIGludCBidWlsZF9ibF90cmVlKCkKK3sKKyAgICBpbnQgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisgICAgc2Nhbl90cmVlKChjdF9kYXRhICopZHluX2x0cmVlLCBsX2Rlc2MubWF4X2NvZGUpOworICAgIHNjYW5fdHJlZSgoY3RfZGF0YSAqKWR5bl9kdHJlZSwgZF9kZXNjLm1heF9jb2RlKTsKKworICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovCisgICAgYnVpbGRfdHJlZSgodHJlZV9kZXNjICopKCZibF9kZXNjKSk7CisgICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAorICAgICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuCisgICAgICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKKyAgICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cworICAgICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKKyAgICAgKi8KKyAgICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMtMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkgeworICAgICAgICBpZiAoYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi8KKyAgICBvcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsgNSs1KzQ7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGQiLCBvcHRfbGVuLCBzdGF0aWNfbGVuKSk7CisKKyAgICByZXR1cm4gbWF4X2JsaW5kZXg7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlCisgKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS4KKyAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC4KKyAqLworbG9jYWwgdm9pZCBzZW5kX2FsbF90cmVlcyhsY29kZXMsIGRjb2RlcywgYmxjb2RlcykKKyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovCit7CisgICAgaW50IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqLworCisgICAgQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKKyAgICBBc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsCisgICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7CisgICAgc2VuZF9iaXRzKGxjb2Rlcy0yNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBzZW5kX2JpdHMoZGNvZGVzLTEsICAgNSk7CisgICAgc2VuZF9iaXRzKGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisgICAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgeworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKKyAgICAgICAgc2VuZF9iaXRzKGJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7CisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIGJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKChjdF9kYXRhICopZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIHNlbmQgdGhlIGxpdGVyYWwgdHJlZSAqLworICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBiaXRzX3NlbnQpKTsKKworICAgIHNlbmRfdHJlZSgoY3RfZGF0YSAqKWR5bl9kdHJlZSwgZGNvZGVzLTEpOyAvKiBzZW5kIHRoZSBkaXN0YW5jZSB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBiaXRzX3NlbnQpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKKyAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS4gVGhpcyBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgdG90YWwgY29tcHJlc3NlZCBsZW5ndGggZm9yIHRoZSBmaWxlIHNvIGZhci4KKyAqLwordWxnIGZsdXNoX2Jsb2NrKGJ1Ziwgc3RvcmVkX2xlbiwgZW9mKQorICAgIGNoYXIgKmJ1ZjsgICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi8KKyAgICB1bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKyAgICBpbnQgZW9mOyAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi8KKyAgICBpbnQgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCisKKyAgICBmbGFnX2J1ZltsYXN0X2ZsYWdzXSA9IGZsYWdzOyAvKiBTYXZlIHRoZSBmbGFncyBmb3IgdGhlIGxhc3QgOCBpdGVtcyAqLworCisgICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGFzY2lpIG9yIGJpbmFyeSAqLworICAgIGlmICgqZmlsZV90eXBlID09ICh1c2gpVU5LTk9XTikgc2V0X2ZpbGVfdHlwZSgpOworCisgICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworICAgIGJ1aWxkX3RyZWUoKHRyZWVfZGVzYyAqKSgmbF9kZXNjKSk7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIG9wdF9sZW4sIHN0YXRpY19sZW4pKTsKKworICAgIGJ1aWxkX3RyZWUoKHRyZWVfZGVzYyAqKSgmZF9kZXNjKSk7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBvcHRfbGVuLCBzdGF0aWNfbGVuKSk7CisgICAgLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCisgICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgKi8KKworICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4CisgICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgICAgICovCisgICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKCk7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgZmlyc3QgdGhlIGJsb2NrIGxlbmd0aCBpbiBieXRlcyAqLworICAgIG9wdF9sZW5iID0gKG9wdF9sZW4rMys3KT4+MzsKKyAgICBzdGF0aWNfbGVuYiA9IChzdGF0aWNfbGVuKzMrNyk+PjM7CisgICAgaW5wdXRfbGVuICs9IHN0b3JlZF9sZW47IC8qIGZvciBkZWJ1Z2dpbmcgb25seSAqLworCisgICAgVHJhY2UoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgZGlzdCAldSAiLAorICAgICAgICAgICAgb3B0X2xlbmIsIG9wdF9sZW4sIHN0YXRpY19sZW5iLCBzdGF0aWNfbGVuLCBzdG9yZWRfbGVuLAorICAgICAgICAgICAgbGFzdF9saXQsIGxhc3RfZGlzdCkpOworCisgICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOworCisgICAgLyogSWYgY29tcHJlc3Npb24gZmFpbGVkIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgbGFzdCBibG9jaywKKyAgICAgKiBhbmQgaWYgdGhlIHppcCBmaWxlIGNhbiBiZSBzZWVrZWQgKHRvIHJld3JpdGUgdGhlIGxvY2FsIGhlYWRlciksCisgICAgICogdGhlIHdob2xlIGZpbGUgaXMgdHJhbnNmb3JtZWQgaW50byBhIHN0b3JlZCBmaWxlOgorICAgICAqLworI2lmZGVmIEZPUkNFX01FVEhPRAorICAgIGlmIChsZXZlbCA9PSAxICYmIGVvZiAmJiBjb21wcmVzc2VkX2xlbiA9PSAwTCkgeyAvKiBmb3JjZSBzdG9yZWQgZmlsZSAqLworI2Vsc2UKKyAgICBpZiAoc3RvcmVkX2xlbiA8PSBvcHRfbGVuYiAmJiBlb2YgJiYgY29tcHJlc3NlZF9sZW4gPT0gMEwgJiYgc2Vla2FibGUoKSkgeworI2VuZGlmCisgICAgICAgIC8qIFNpbmNlIExJVF9CVUZTSVpFIDw9IDIqV1NJWkUsIHRoZSBpbnB1dCBkYXRhIG11c3QgYmUgdGhlcmU6ICovCisgICAgICAgIGlmIChidWYgPT0gKGNoYXIqKTApIGVycm9yICgiYmxvY2sgdmFuaXNoZWQiKTsKKworICAgICAgICBjb3B5X2Jsb2NrKGJ1ZiwgKHVuc2lnbmVkKXN0b3JlZF9sZW4sIDApOyAvKiB3aXRob3V0IGhlYWRlciAqLworICAgICAgICBjb21wcmVzc2VkX2xlbiA9IHN0b3JlZF9sZW4gPDwgMzsKKyAgICAgICAgKmZpbGVfbWV0aG9kID0gU1RPUkVEOworCisjaWZkZWYgRk9SQ0VfTUVUSE9ECisgICAgfSBlbHNlIGlmIChsZXZlbCA9PSAyICYmIGJ1ZiAhPSAoY2hhciopMCkgeyAvKiBmb3JjZSBzdG9yZWQgYmxvY2sgKi8KKyNlbHNlCisgICAgfSBlbHNlIGlmIChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIgJiYgYnVmICE9IChjaGFyKikwKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KKyNlbmRpZgorICAgICAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLgorICAgICAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCisgICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgorICAgICAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG8KKyAgICAgICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KKyAgICAgICAgICovCisgICAgICAgIHNlbmRfYml0cygoU1RPUkVEX0JMT0NLPDwxKStlb2YsIDMpOyAgLyogc2VuZCBibG9jayB0eXBlICovCisgICAgICAgIGNvbXByZXNzZWRfbGVuID0gKGNvbXByZXNzZWRfbGVuICsgMyArIDcpICYgfjdMOworICAgICAgICBjb21wcmVzc2VkX2xlbiArPSAoc3RvcmVkX2xlbiArIDQpIDw8IDM7CisKKyAgICAgICAgY29weV9ibG9jayhidWYsICh1bnNpZ25lZClzdG9yZWRfbGVuLCAxKTsgLyogd2l0aCBoZWFkZXIgKi8KKworI2lmZGVmIEZPUkNFX01FVEhPRAorICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMykgeyAvKiBmb3JjZSBzdGF0aWMgdHJlZXMgKi8KKyNlbHNlCisgICAgfSBlbHNlIGlmIChzdGF0aWNfbGVuYiA9PSBvcHRfbGVuYikgeworI2VuZGlmCisgICAgICAgIHNlbmRfYml0cygoU1RBVElDX1RSRUVTPDwxKStlb2YsIDMpOworICAgICAgICBjb21wcmVzc19ibG9jaygoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgKGN0X2RhdGEgKilzdGF0aWNfZHRyZWUpOworICAgICAgICBjb21wcmVzc2VkX2xlbiArPSAzICsgc3RhdGljX2xlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBzZW5kX2JpdHMoKERZTl9UUkVFUzw8MSkrZW9mLCAzKTsKKyAgICAgICAgc2VuZF9hbGxfdHJlZXMobF9kZXNjLm1heF9jb2RlKzEsIGRfZGVzYy5tYXhfY29kZSsxLCBtYXhfYmxpbmRleCsxKTsKKyAgICAgICAgY29tcHJlc3NfYmxvY2soKGN0X2RhdGEgKilkeW5fbHRyZWUsIChjdF9kYXRhICopZHluX2R0cmVlKTsKKyAgICAgICAgY29tcHJlc3NlZF9sZW4gKz0gMyArIG9wdF9sZW47CisgICAgfQorICAgIEFzc2VydCAoY29tcHJlc3NlZF9sZW4gPT0gYml0c19zZW50LCAiYmFkIGNvbXByZXNzZWQgc2l6ZSIpOworICAgIGluaXRfYmxvY2soKTsKKworICAgIGlmIChlb2YpIHsKKyAgICAgICAgQXNzZXJ0IChpbnB1dF9sZW4gPT0gaXNpemUsICJiYWQgaW5wdXQgc2l6ZSIpOworICAgICAgICBiaV93aW5kdXAoKTsKKyAgICAgICAgY29tcHJlc3NlZF9sZW4gKz0gNzsgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsIlxuY29tcHJsZW4gJWx1KCVsdSkgIiwgY29tcHJlc3NlZF9sZW4+PjMsCisgICAgICAgICAgIGNvbXByZXNzZWRfbGVuLTcqZW9mKSk7CisKKyAgICByZXR1cm4gY29tcHJlc3NlZF9sZW4gPj4gMzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKKyAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC4KKyAqLworaW50IGN0X3RhbGx5IChkaXN0LCBsYykKKyAgICBpbnQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgaW50IGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLworeworICAgIGxfYnVmW2xhc3RfbGl0KytdID0gKHVjaClsYzsKKyAgICBpZiAoZGlzdCA9PSAwKSB7CisgICAgICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqLworICAgICAgICBkeW5fbHRyZWVbbGNdLkZyZXErKzsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVCAmJgorICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgorICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiY3RfdGFsbHk6IGJhZCBtYXRjaCIpOworCisgICAgICAgIGR5bl9sdHJlZVtsZW5ndGhfY29kZVtsY10rTElURVJBTFMrMV0uRnJlcSsrOworICAgICAgICBkeW5fZHRyZWVbZF9jb2RlKGRpc3QpXS5GcmVxKys7CisKKyAgICAgICAgZF9idWZbbGFzdF9kaXN0KytdID0gKHVzaClkaXN0OworICAgICAgICBmbGFncyB8PSBmbGFnX2JpdDsKKyAgICB9CisgICAgZmxhZ19iaXQgPDw9IDE7CisKKyAgICAvKiBPdXRwdXQgdGhlIGZsYWdzIGlmIHRoZXkgZmlsbCBhIGJ5dGU6ICovCisgICAgaWYgKChsYXN0X2xpdCAmIDcpID09IDApIHsKKyAgICAgICAgZmxhZ19idWZbbGFzdF9mbGFncysrXSA9IGZsYWdzOworICAgICAgICBmbGFncyA9IDAsIGZsYWdfYml0ID0gMTsKKyAgICB9CisgICAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovCisgICAgaWYgKGxldmVsID4gMiAmJiAobGFzdF9saXQgJiAweGZmZikgPT0gMCkgeworICAgICAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi8KKyAgICAgICAgdWxnIG91dF9sZW5ndGggPSAodWxnKWxhc3RfbGl0KjhMOworICAgICAgICB1bGcgaW5fbGVuZ3RoID0gKHVsZylzdHJzdGFydC1ibG9ja19zdGFydDsKKyAgICAgICAgaW50IGRjb2RlOworICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CisgICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpZHluX2R0cmVlW2Rjb2RlXS5GcmVxKig1TCtleHRyYV9kYml0c1tkY29kZV0pOworICAgICAgICB9CisgICAgICAgIG91dF9sZW5ndGggPj49IDM7CisgICAgICAgIFRyYWNlKChzdGRlcnIsIlxubGFzdF9saXQgJXUsIGxhc3RfZGlzdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKKyAgICAgICAgICAgICAgIGxhc3RfbGl0LCBsYXN0X2Rpc3QsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCwKKyAgICAgICAgICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7CisgICAgICAgIGlmIChsYXN0X2Rpc3QgPCBsYXN0X2xpdC8yICYmIG91dF9sZW5ndGggPCBpbl9sZW5ndGgvMikgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAobGFzdF9saXQgPT0gTElUX0JVRlNJWkUtMSB8fCBsYXN0X2Rpc3QgPT0gRElTVF9CVUZTSVpFKTsKKyAgICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIExJVF9CVUZTSVpFIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEsKKyAgICAgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0bworICAgICAqIDY0Sy0xIGJ5dGVzLgorICAgICAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlcworICovCitsb2NhbCB2b2lkIGNvbXByZXNzX2Jsb2NrKGx0cmVlLCBkdHJlZSkKKyAgICBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovCisgICAgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi8KK3sKKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgaW50IGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi8KKyAgICB1bnNpZ25lZCBseCA9IDA7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKyAgICB1bnNpZ25lZCBkeCA9IDA7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gZF9idWYgKi8KKyAgICB1bnNpZ25lZCBmeCA9IDA7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gZmxhZ19idWYgKi8KKyAgICB1Y2ggZmxhZyA9IDA7ICAgICAgIC8qIGN1cnJlbnQgZmxhZ3MgKi8KKyAgICB1bnNpZ25lZCBjb2RlOyAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KKyAgICBpbnQgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi8KKworICAgIGlmIChsYXN0X2xpdCAhPSAwKSBkbyB7CisgICAgICAgIGlmICgobHggJiA3KSA9PSAwKSBmbGFnID0gZmxhZ19idWZbZngrK107CisgICAgICAgIGxjID0gbF9idWZbbHgrK107CisgICAgICAgIGlmICgoZmxhZyAmIDEpID09IDApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLCIgJyVjJyAiLCBsYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLworICAgICAgICAgICAgY29kZSA9IGxlbmd0aF9jb2RlW2xjXTsKKyAgICAgICAgICAgIHNlbmRfY29kZShjb2RlK0xJVEVSQUxTKzEsIGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi8KKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdOworICAgICAgICAgICAgICAgIHNlbmRfYml0cyhsYywgZXh0cmEpOyAgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc3QgPSBkX2J1ZltkeCsrXTsKKyAgICAgICAgICAgIC8qIEhlcmUsIGRpc3QgaXMgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTsKKyAgICAgICAgICAgIEFzc2VydCAoY29kZSA8IERfQ09ERVMsICJiYWQgZF9jb2RlIik7CisKKyAgICAgICAgICAgIHNlbmRfY29kZShjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdOworICAgICAgICAgICAgICAgIHNlbmRfYml0cyhkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLworICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovCisgICAgICAgIGZsYWcgPj49IDE7CisgICAgfSB3aGlsZSAobHggPCBsYXN0X2xpdCk7CisKKyAgICBzZW5kX2NvZGUoRU5EX0JMT0NLLCBsdHJlZSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IHRoZSBmaWxlIHR5cGUgdG8gQVNDSUkgb3IgQklOQVJZLCB1c2luZyBhIGNydWRlIGFwcHJveGltYXRpb246CisgKiBiaW5hcnkgaWYgbW9yZSB0aGFuIDIwJSBvZiB0aGUgYnl0ZXMgYXJlIDw9IDYgb3IgPj0gMTI4LCBhc2NpaSBvdGhlcndpc2UuCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldCBhbmQgdGhlIHRvdGFsIG9mIGFsbAorICogZnJlcXVlbmNpZXMgZG9lcyBub3QgZXhjZWVkIDY0SyAodG8gZml0IGluIGFuIGludCBvbiAxNiBiaXQgbWFjaGluZXMpLgorICovCitsb2NhbCB2b2lkIHNldF9maWxlX3R5cGUoKQoreworICAgIGludCBuID0gMDsKKyAgICB1bnNpZ25lZCBhc2NpaV9mcmVxID0gMDsKKyAgICB1bnNpZ25lZCBiaW5fZnJlcSA9IDA7CisgICAgd2hpbGUgKG4gPCA3KSAgICAgICAgYmluX2ZyZXEgKz0gZHluX2x0cmVlW24rK10uRnJlcTsKKyAgICB3aGlsZSAobiA8IDEyOCkgICAgYXNjaWlfZnJlcSArPSBkeW5fbHRyZWVbbisrXS5GcmVxOworICAgIHdoaWxlIChuIDwgTElURVJBTFMpIGJpbl9mcmVxICs9IGR5bl9sdHJlZVtuKytdLkZyZXE7CisgICAgKmZpbGVfdHlwZSA9IGJpbl9mcmVxID4gKGFzY2lpX2ZyZXEgPj4gMikgPyBCSU5BUlkgOiBBU0NJSTsKKyAgICBpZiAoKmZpbGVfdHlwZSA9PSBCSU5BUlkgJiYgdHJhbnNsYXRlX2VvbCkgeworICAgICAgICB3YXJuKCItbCB1c2VkIG9uIGJpbmFyeSBmaWxlIiwgIiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Vzci9nemlwL3VuemlwLmMgYi91c3IvZ3ppcC91bnppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTE0YTMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC91bnppcC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIHVuemlwLmMgLS0gZGVjb21wcmVzcyBmaWxlcyBpbiBnemlwIG9yIHBremlwIGZvcm1hdC4KKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKgorICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBmdW56aXAuYyB3cml0dGVuCisgKiBhbmQgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IE1hcmsgQWRsZXIuCisgKi8KKworLyoKKyAgIFRoaXMgdmVyc2lvbiBjYW4gZXh0cmFjdCBmaWxlcyBpbiBnemlwIGZvcm1hdC4KKyAgIE9ubHkgdGhlIGZpcnN0IGVudHJ5IGlzIGV4dHJhY3RlZCwgYW5kIGl0IGhhcyB0byBiZQorICAgZWl0aGVyIGRlZmxhdGVkIG9yIHN0b3JlZC4KKyAqLworCisjaWZkZWYgUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJElkOiB1bnppcC5jLHYgMS4xIDIwMDIvMDgvMTggMDA6NTk6MjEgaHBhIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAidGFpbG9yLmgiCisjaW5jbHVkZSAiZ3ppcC5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVuemlwIGluIHRvIG91dC4gIFRoaXMgcm91dGluZSB3b3JrcyBvbiBnemlwIGZpbGVzIG9ubHkuCisgKgorICogSU4gYXNzZXJ0aW9uczogdGhlIGJ1ZmZlciBpbmJ1ZiBjb250YWlucyBhbHJlYWR5IHRoZSBiZWdpbm5pbmcgb2YKKyAqICAgdGhlIGNvbXByZXNzZWQgZGF0YSwgZnJvbSBvZmZzZXRzIGlucHRyIHRvIGluc2l6ZS0xIGluY2x1ZGVkLgorICogICBUaGUgbWFnaWMgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC4gVGhlIG91dHB1dCBidWZmZXIgaXMgY2xlYXJlZC4KKyAqLworaW50IHVuemlwKGluLCBvdXQpCisgICAgaW50IGluLCBvdXQ7ICAgLyogaW5wdXQgYW5kIG91dHB1dCBmaWxlIGRlc2NyaXB0b3JzICovCit7CisgICAgdWxnIG9yaWdfY3JjID0gMDsgICAgICAgLyogb3JpZ2luYWwgY3JjICovCisgICAgdWxnIG9yaWdfbGVuID0gMDsgICAgICAgLyogb3JpZ2luYWwgdW5jb21wcmVzc2VkIGxlbmd0aCAqLworICAgIGludCBuOworICAgIHVjaCBidWZbOF07ICAgICAgICAvKiBleHRlbmRlZCBsb2NhbCBoZWFkZXIgKi8KKworICAgIGlmZCA9IGluOworICAgIG9mZCA9IG91dDsKKworICAgIHVwZGNyYyhOVUxMLCAwKTsgICAgICAgICAgIC8qIGluaXRpYWxpemUgY3JjICovCisKKyAgICAvKiBEZWNvbXByZXNzICovCisgICAgaWYgKG1ldGhvZCA9PSBERUZMQVRFRCkgIHsKKworCWludCByZXMgPSBpbmZsYXRlKCk7CisKKwlpZiAocmVzID09IDMpIHsKKwkgICAgZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKKwl9IGVsc2UgaWYgKHJlcyAhPSAwKSB7CisJICAgIGVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YS0tZm9ybWF0IHZpb2xhdGVkIik7CisJfQorCisgICAgfSBlbHNlIHsKKwllcnJvcigiaW50ZXJuYWwgZXJyb3IsIGludmFsaWQgbWV0aG9kIik7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBjcmMgYW5kIG9yaWdpbmFsIGxlbmd0aCAqLworICAgIC8qIGNyYzMyICAoc2VlIGFsZ29yaXRobS5kb2MpCisgICAgICogdW5jb21wcmVzc2VkIGlucHV0IHNpemUgbW9kdWxvIDJeMzIKKyAgICAgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7CisJYnVmW25dID0gKHVjaClnZXRfYnl0ZSgpOyAvKiBtYXkgY2F1c2UgYW4gZXJyb3IgaWYgRU9GICovCisgICAgfQorICAgIG9yaWdfY3JjID0gTEcoYnVmKTsKKyAgICBvcmlnX2xlbiA9IExHKGJ1Zis0KTsKKworICAgIC8qIFZhbGlkYXRlIGRlY29tcHJlc3Npb24gKi8KKyAgICBpZiAob3JpZ19jcmMgIT0gdXBkY3JjKG91dGJ1ZiwgMCkpIHsKKwllcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEtLWNyYyBlcnJvciIpOworICAgIH0KKyAgICBpZiAob3JpZ19sZW4gIT0gKHVsZylieXRlc19vdXQpIHsKKwllcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEtLWxlbmd0aCBlcnJvciIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KZGlmZiAtLWdpdCBhL3Vzci9nemlwL3V0aWwuYyBiL3Vzci9nemlwL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZmNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvdXRpbC5jCkBAIC0wLDAgKzEsMzcyIEBACisvKiB1dGlsLmMgLS0gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGd6aXAgc3VwcG9ydAorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseQorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisjaWZkZWYgUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJElkOiB1dGlsLmMsdiAxLjEgMjAwMi8wOC8xOCAwMDo1OToyMSBocGEgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJ0YWlsb3IuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnemlwLmgiCisKK2V4dGVybiB1bGcgY3JjXzMyX3RhYltdOyAgIC8qIGNyYyB0YWJsZSwgZGVmaW5lZCBiZWxvdyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgaW5wdXQgdG8gb3V0cHV0IHVuY2hhbmdlZDogemNhdCA9PSBjYXQgd2l0aCAtLWZvcmNlLgorICogSU4gYXNzZXJ0aW9uOiBpbnNpemUgYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbiBpbmJ1Zi4KKyAqLworaW50IGNvcHkoaW4sIG91dCkKKyAgICBpbnQgaW4sIG91dDsgICAvKiBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgZGVzY3JpcHRvcnMgKi8KK3sKKyAgICBlcnJubyA9IDA7CisgICAgd2hpbGUgKGluc2l6ZSAhPSAwICYmIChpbnQpaW5zaXplICE9IEVPRikgeworCXdyaXRlX2J1ZihvdXQsIChjaGFyKilpbmJ1ZiwgaW5zaXplKTsKKwlieXRlc19vdXQgKz0gaW5zaXplOworCWluc2l6ZSA9IHJlYWQoaW4sIChjaGFyKilpbmJ1ZiwgSU5CVUZTSVopOworICAgIH0KKyAgICBpZiAoKGludClpbnNpemUgPT0gRU9GICYmIGVycm5vICE9IDApIHsKKwlyZWFkX2Vycm9yKCk7CisgICAgfQorICAgIGJ5dGVzX2luID0gYnl0ZXNfb3V0OworICAgIHJldHVybiBPSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSdW4gYSBzZXQgb2YgYnl0ZXMgdGhyb3VnaCB0aGUgY3JjIHNoaWZ0IHJlZ2lzdGVyLiAgSWYgcyBpcyBhIE5VTEwKKyAqIHBvaW50ZXIsIHRoZW4gaW5pdGlhbGl6ZSB0aGUgY3JjIHNoaWZ0IHJlZ2lzdGVyIGNvbnRlbnRzIGluc3RlYWQuCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgY3JjIGluIGVpdGhlciBjYXNlLgorICovCit1bGcgdXBkY3JjKHMsIG4pCisgICAgdWNoICpzOyAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlcyB0byBwdW1wIHRocm91Z2ggKi8KKyAgICB1bnNpZ25lZCBuOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gc1tdICovCit7CisgICAgcmVnaXN0ZXIgdWxnIGM7ICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisKKyAgICBzdGF0aWMgdWxnIGNyYyA9ICh1bGcpMHhmZmZmZmZmZkw7IC8qIHNoaWZ0IHJlZ2lzdGVyIGNvbnRlbnRzICovCisKKyAgICBpZiAocyA9PSBOVUxMKSB7CisJYyA9IDB4ZmZmZmZmZmZMOworICAgIH0gZWxzZSB7CisJYyA9IGNyYzsKKyAgICAgICAgaWYgKG4pIGRvIHsKKyAgICAgICAgICAgIGMgPSBjcmNfMzJfdGFiWygoaW50KWMgXiAoKnMrKykpICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyAgICB9CisgICAgY3JjID0gYzsKKyAgICByZXR1cm4gYyBeIDB4ZmZmZmZmZmZMOyAgICAgICAvKiAoaW5zdGVhZCBvZiB+YyBmb3IgNjQtYml0IG1hY2hpbmVzKSAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsZWFyIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycworICovCit2b2lkIGNsZWFyX2J1ZnMoKQoreworICAgIG91dGNudCA9IDA7CisgICAgaW5zaXplID0gaW5wdHIgPSAwOworICAgIGJ5dGVzX2luID0gYnl0ZXNfb3V0ID0gMEw7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlsbCB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKyAqLworaW50IGZpbGxfaW5idWYoZW9mX29rKQorICAgIGludCBlb2Zfb2s7ICAgICAgICAgIC8qIHNldCBpZiBFT0YgYWNjZXB0YWJsZSBhcyBhIHJlc3VsdCAqLworeworICAgIGludCBsZW47CisKKyAgICAvKiBSZWFkIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KKyAgICBpbnNpemUgPSAwOworICAgIGVycm5vID0gMDsKKyAgICBkbyB7CisJbGVuID0gcmVhZChpZmQsIChjaGFyKilpbmJ1ZitpbnNpemUsIElOQlVGU0laLWluc2l6ZSk7CisgICAgICAgIGlmIChsZW4gPT0gMCB8fCBsZW4gPT0gRU9GKSBicmVhazsKKwlpbnNpemUgKz0gbGVuOworICAgIH0gd2hpbGUgKGluc2l6ZSA8IElOQlVGU0laKTsKKworICAgIGlmIChpbnNpemUgPT0gMCkgeworCWlmIChlb2Zfb2spIHJldHVybiBFT0Y7CisJcmVhZF9lcnJvcigpOworICAgIH0KKyAgICBieXRlc19pbiArPSAodWxnKWluc2l6ZTsKKyAgICBpbnB0ciA9IDE7CisgICAgcmV0dXJuIGluYnVmWzBdOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIHRoZSBvdXRwdXQgYnVmZmVyIG91dGJ1ZlswLi5vdXRjbnQtMV0gYW5kIHVwZGF0ZSBieXRlc19vdXQuCisgKiAodXNlZCBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSBvbmx5KQorICovCit2b2lkIGZsdXNoX291dGJ1ZigpCit7CisgICAgaWYgKG91dGNudCA9PSAwKSByZXR1cm47CisKKyAgICB3cml0ZV9idWYob2ZkLCAoY2hhciAqKW91dGJ1Ziwgb3V0Y250KTsKKyAgICBieXRlc19vdXQgKz0gKHVsZylvdXRjbnQ7CisgICAgb3V0Y250ID0gMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSB0aGUgb3V0cHV0IHdpbmRvdyB3aW5kb3dbMC4ub3V0Y250LTFdIGFuZCB1cGRhdGUgY3JjIGFuZCBieXRlc19vdXQuCisgKiAoVXNlZCBmb3IgdGhlIGRlY29tcHJlc3NlZCBkYXRhIG9ubHkuKQorICovCit2b2lkIGZsdXNoX3dpbmRvdygpCit7CisgICAgaWYgKG91dGNudCA9PSAwKSByZXR1cm47CisgICAgdXBkY3JjKHdpbmRvdywgb3V0Y250KTsKKworICAgIGlmICghdGVzdCkgeworCXdyaXRlX2J1ZihvZmQsIChjaGFyICopd2luZG93LCBvdXRjbnQpOworICAgIH0KKyAgICBieXRlc19vdXQgKz0gKHVsZylvdXRjbnQ7CisgICAgb3V0Y250ID0gMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEb2VzIHRoZSBzYW1lIGFzIHdyaXRlKCksIGJ1dCBhbHNvIGhhbmRsZXMgcGFydGlhbCBwaXBlIHdyaXRlcyBhbmQgY2hlY2tzCisgKiBmb3IgZXJyb3IgcmV0dXJuLgorICovCit2b2lkIHdyaXRlX2J1ZihmZCwgYnVmLCBjbnQpCisgICAgaW50ICAgICAgIGZkOworICAgIHZvaWRwICAgICBidWY7CisgICAgdW5zaWduZWQgIGNudDsKK3sKKyAgICB1bnNpZ25lZCAgbjsKKworICAgIHdoaWxlICgobiA9IHdyaXRlKGZkLCBidWYsIGNudCkpICE9IGNudCkgeworCWlmIChuID09ICh1bnNpZ25lZCkoLTEpKSB7CisJICAgIHdyaXRlX2Vycm9yKCk7CisJfQorCWNudCAtPSBuOworCWJ1ZiA9ICh2b2lkcCkoKGNoYXIqKWJ1ZituKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHV0IHN0cmluZyBzIGluIGxvd2VyIGNhc2UsIHJldHVybiBzLgorICovCitjaGFyICpzdHJsd3IocykKKyAgICBjaGFyICpzOworeworICAgIGNoYXIgKnQ7CisgICAgZm9yICh0ID0gczsgKnQ7IHQrKykgKnQgPSB0b2xvdygqdCk7CisgICAgcmV0dXJuIHM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmV0dXJuIHRoZSBiYXNlIG5hbWUgb2YgYSBmaWxlIChyZW1vdmUgYW55IGRpcmVjdG9yeSBwcmVmaXggYW5kCisgKiBhbnkgdmVyc2lvbiBzdWZmaXgpLiBGb3Igc3lzdGVtcyB3aXRoIGZpbGUgbmFtZXMgdGhhdCBhcmUgbm90CisgKiBjYXNlIHNlbnNpdGl2ZSwgZm9yY2UgdGhlIGJhc2UgbmFtZSB0byBsb3dlciBjYXNlLgorICovCitjaGFyICpiYXNlbmFtZShmbmFtZSkKKyAgICBjaGFyICpmbmFtZTsKK3sKKyAgICBjaGFyICpwOworCisgICAgaWYgKChwID0gc3RycmNocihmbmFtZSwgUEFUSF9TRVApKSAgIT0gTlVMTCkgZm5hbWUgPSBwKzE7CisgICAgaWYgKGNhc2VtYXAoJ0EnKSA9PSAnYScpIHN0cmx3cihmbmFtZSk7CisgICAgcmV0dXJuIGZuYW1lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEFkZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoaWYgYW55KSBiZWZvcmUgYXJndiwgYW5kIHVwZGF0ZSBhcmdjLgorICogUmV0dXJuIHRoZSBleHBhbmRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBiZSBmcmVlZCBsYXRlciwgb3IgTlVMTAorICogaWYgbm8gb3B0aW9ucyB3ZXJlIGFkZGVkIHRvIGFyZ3YuCisgKi8KKyNkZWZpbmUgU0VQQVJBVE9SCSIgXHQiCS8qIHNlcGFyYXRvcnMgaW4gZW52IHZhcmlhYmxlICovCisKK2NoYXIgKmFkZF9lbnZvcHQoYXJnY3AsIGFyZ3ZwLCBlbnYpCisgICAgaW50ICphcmdjcDsgICAgICAgICAgLyogcG9pbnRlciB0byBhcmdjICovCisgICAgY2hhciAqKiphcmd2cDsgICAgICAgLyogcG9pbnRlciB0byBhcmd2ICovCisgICAgY2hhciAqZW52OyAgICAgICAgICAgLyogbmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworeworICAgIGNoYXIgKnA7ICAgICAgICAgICAgIC8qIHJ1bm5pbmcgcG9pbnRlciB0aHJvdWdoIGVudiB2YXJpYWJsZSAqLworICAgIGNoYXIgKipvYXJndjsgICAgICAgIC8qIHJ1bnMgdGhyb3VnaCBvbGQgYXJndiBhcnJheSAqLworICAgIGNoYXIgKipuYXJndjsgICAgICAgIC8qIHJ1bnMgdGhyb3VnaCBuZXcgYXJndiBhcnJheSAqLworICAgIGludAkgb2FyZ2MgPSAqYXJnY3A7IC8qIG9sZCBhcmdjICovCisgICAgaW50ICBuYXJnYyA9IDA7ICAgICAgLyogbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBlbnYgdmFyaWFibGUgKi8KKworICAgIGVudiA9IChjaGFyKilnZXRlbnYoZW52KTsKKyAgICBpZiAoZW52ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgcCA9IChjaGFyKil4bWFsbG9jKHN0cmxlbihlbnYpKzEpOworICAgIGVudiA9IHN0cmNweShwLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgLyoga2VlcCBlbnYgdmFyaWFibGUgaW50YWN0ICovCisKKyAgICBmb3IgKHAgPSBlbnY7ICpwOyBuYXJnYysrICkgeyAgICAgICAgICAgIC8qIG1vdmUgdGhyb3VnaCBlbnYgKi8KKwlwICs9IHN0cnNwbihwLCBTRVBBUkFUT1IpOwkgICAgIC8qIHNraXAgbGVhZGluZyBzZXBhcmF0b3JzICovCisJaWYgKCpwID09ICdcMCcpIGJyZWFrOworCisJcCArPSBzdHJjc3BuKHAsIFNFUEFSQVRPUik7CSAgICAgLyogZmluZCBlbmQgb2Ygd29yZCAqLworCWlmICgqcCkgKnArKyA9ICdcMCc7CQkgICAgIC8qIG1hcmsgaXQgKi8KKyAgICB9CisgICAgaWYgKG5hcmdjID09IDApIHsKKwlmcmVlKGVudik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgICphcmdjcCArPSBuYXJnYzsKKyAgICAvKiBBbGxvY2F0ZSB0aGUgbmV3IGFyZ3YgYXJyYXksIHdpdGggYW4gZXh0cmEgZWxlbWVudCBqdXN0IGluIGNhc2UKKyAgICAgKiB0aGUgb3JpZ2luYWwgYXJnIGxpc3QgZGlkIG5vdCBlbmQgd2l0aCBhIE5VTEwuCisgICAgICovCisgICAgbmFyZ3YgPSAoY2hhcioqKWNhbGxvYygqYXJnY3ArMSwgc2l6ZW9mKGNoYXIgKikpOworICAgIGlmIChuYXJndiA9PSBOVUxMKSBlcnJvcigib3V0IG9mIG1lbW9yeSIpOworICAgIG9hcmd2ICA9ICphcmd2cDsKKyAgICAqYXJndnAgPSBuYXJndjsKKworICAgIC8qIENvcHkgdGhlIHByb2dyYW0gbmFtZSBmaXJzdCAqLworICAgIGlmIChvYXJnYy0tIDwgMCkgZXJyb3IoImFyZ2M8PTAiKTsKKyAgICAqKG5hcmd2KyspID0gKihvYXJndisrKTsKKworICAgIC8qIFRoZW4gY29weSB0aGUgZW52aXJvbm1lbnQgYXJncyAqLworICAgIGZvciAocCA9IGVudjsgbmFyZ2MgPiAwOyBuYXJnYy0tKSB7CisJcCArPSBzdHJzcG4ocCwgU0VQQVJBVE9SKTsJICAgICAvKiBza2lwIHNlcGFyYXRvcnMgKi8KKwkqKG5hcmd2KyspID0gcDsJCQkgICAgIC8qIHN0b3JlIHN0YXJ0ICovCisJd2hpbGUgKCpwKyspIDsJCQkgICAgIC8qIHNraXAgb3ZlciB3b3JkICovCisgICAgfQorCisgICAgLyogRmluYWxseSBjb3B5IHRoZSBvbGQgYXJncyBhbmQgYWRkIGEgTlVMTCAodXN1YWwgY29udmVudGlvbikgKi8KKyAgICB3aGlsZSAob2FyZ2MtLSkgKihuYXJndisrKSA9ICoob2FyZ3YrKyk7CisgICAgKm5hcmd2ID0gTlVMTDsKKyAgICByZXR1cm4gZW52OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVycm9yIGhhbmRsZXJzLgorICovCit2b2lkIGVycm9yKG0pCisgICAgY2hhciAqbTsKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXM6ICVzOiAlc1xuIiwgcHJvZ25hbWUsIGlmbmFtZSwgbSk7CisgICAgYWJvcnRfZ3ppcCgpOworfQorCit2b2lkIHdhcm4oYSwgYikKKyAgICBjaGFyICphLCAqYjsgICAgICAgICAgICAvKiBtZXNzYWdlIHN0cmluZ3MganV4dGFwb3NlZCBpbiBvdXRwdXQgKi8KK3sKKyAgICBXQVJOKChzdGRlcnIsICIlczogJXM6IHdhcm5pbmc6ICVzJXNcbiIsIHByb2duYW1lLCBpZm5hbWUsIGEsIGIpKTsKK30KKwordm9pZCByZWFkX2Vycm9yKCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXM6ICIsIHByb2duYW1lKTsKKyAgICBpZiAoZXJybm8gIT0gMCkgeworCXBlcnJvcihpZm5hbWUpOworICAgIH0gZWxzZSB7CisJZnByaW50ZihzdGRlcnIsICIlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiwgaWZuYW1lKTsKKyAgICB9CisgICAgYWJvcnRfZ3ppcCgpOworfQorCit2b2lkIHdyaXRlX2Vycm9yKCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXM6ICIsIHByb2duYW1lKTsKKyAgICBwZXJyb3Iob2ZuYW1lKTsKKyAgICBhYm9ydF9nemlwKCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGlzcGxheSBjb21wcmVzc2lvbiByYXRpbyBvbiB0aGUgZ2l2ZW4gc3RyZWFtIG9uIDYgY2hhcmFjdGVycy4KKyAqLwordm9pZCBkaXNwbGF5X3JhdGlvKG51bSwgZGVuLCBmaWxlKQorICAgIGxvbmcgbnVtOworICAgIGxvbmcgZGVuOworICAgIEZJTEUgKmZpbGU7Cit7CisgICAgbG9uZyByYXRpbzsgIC8qIDEwMDAgdGltZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvICovCisgICAgY2hhciBzaWduOworCisgICAgaWYgKGRlbiA9PSAwKSB7CisJcmF0aW8gPSAwOyAvKiBubyBjb21wcmVzc2lvbiAqLworICAgIH0gZWxzZSBpZiAoZGVuIDwgMjE0NzQ4M0wpIHsgLyogKDIqKjMxIC0xKS8xMDAwICovCisJcmF0aW8gPSAxMDAwTCpudW0vZGVuOworICAgIH0gZWxzZSB7CisJcmF0aW8gPSBudW0vKGRlbi8xMDAwTCk7CisgICAgfQorICAgIGlmIChyYXRpbyA8IDApIHsKKwlzaWduID0gJy0nOworCXJhdGlvID0gLXJhdGlvOworICAgIH0gZWxzZSB7CisJc2lnbiA9ICcgJzsKKyAgICB9CisgICAgZnByaW50ZihmaWxlLCAiJWMlMmxkLiUxbGQlJSIsIHNpZ24sIHJhdGlvIC8gMTBMLCByYXRpbyAlIDEwTCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW1pLXNhZmUgbWFsbG9jIC0tIG5ldmVyIHJldHVybnMgTlVMTC4KKyAqLwordm9pZHAgeG1hbGxvYyAoc2l6ZSkKKyAgICB1bnNpZ25lZCBzaXplOworeworICAgIHZvaWRwIGNwID0gKHZvaWRwKW1hbGxvYyAoc2l6ZSk7CisKKyAgICBpZiAoY3AgPT0gTlVMTCkgZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKKyAgICByZXR1cm4gY3A7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGFibGUgb2YgQ1JDLTMyJ3Mgb2YgYWxsIHNpbmdsZS1ieXRlIHZhbHVlcyAobWFkZSBieSBtYWtlY3JjLmMpCisgKi8KK3VsZyBjcmNfMzJfdGFiW10gPSB7CisgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLCAweDA3NmRjNDE5TCwKKyAgMHg3MDZhZjQ4ZkwsIDB4ZTk2M2E1MzVMLCAweDllNjQ5NWEzTCwgMHgwZWRiODgzMkwsIDB4NzlkY2I4YTRMLAorICAweGUwZDVlOTFlTCwgMHg5N2QyZDk4OEwsIDB4MDliNjRjMmJMLCAweDdlYjE3Y2JkTCwgMHhlN2I4MmQwN0wsCisgIDB4OTBiZjFkOTFMLCAweDFkYjcxMDY0TCwgMHg2YWIwMjBmMkwsIDB4ZjNiOTcxNDhMLCAweDg0YmU0MWRlTCwKKyAgMHgxYWRhZDQ3ZEwsIDB4NmRkZGU0ZWJMLCAweGY0ZDRiNTUxTCwgMHg4M2QzODVjN0wsIDB4MTM2Yzk4NTZMLAorICAweDY0NmJhOGMwTCwgMHhmZDYyZjk3YUwsIDB4OGE2NWM5ZWNMLCAweDE0MDE1YzRmTCwgMHg2MzA2NmNkOUwsCisgIDB4ZmEwZjNkNjNMLCAweDhkMDgwZGY1TCwgMHgzYjZlMjBjOEwsIDB4NGM2OTEwNWVMLCAweGQ1NjA0MWU0TCwKKyAgMHhhMjY3NzE3MkwsIDB4M2MwM2U0ZDFMLCAweDRiMDRkNDQ3TCwgMHhkMjBkODVmZEwsIDB4YTUwYWI1NmJMLAorICAweDM1YjVhOGZhTCwgMHg0MmIyOTg2Y0wsIDB4ZGJiYmM5ZDZMLCAweGFjYmNmOTQwTCwgMHgzMmQ4NmNlM0wsCisgIDB4NDVkZjVjNzVMLCAweGRjZDYwZGNmTCwgMHhhYmQxM2Q1OUwsIDB4MjZkOTMwYWNMLCAweDUxZGUwMDNhTCwKKyAgMHhjOGQ3NTE4MEwsIDB4YmZkMDYxMTZMLCAweDIxYjRmNGI1TCwgMHg1NmIzYzQyM0wsIDB4Y2ZiYTk1OTlMLAorICAweGI4YmRhNTBmTCwgMHgyODAyYjg5ZUwsIDB4NWYwNTg4MDhMLCAweGM2MGNkOWIyTCwgMHhiMTBiZTkyNEwsCisgIDB4MmY2ZjdjODdMLCAweDU4Njg0YzExTCwgMHhjMTYxMWRhYkwsIDB4YjY2NjJkM2RMLCAweDc2ZGM0MTkwTCwKKyAgMHgwMWRiNzEwNkwsIDB4OThkMjIwYmNMLCAweGVmZDUxMDJhTCwgMHg3MWIxODU4OUwsIDB4MDZiNmI1MWZMLAorICAweDlmYmZlNGE1TCwgMHhlOGI4ZDQzM0wsIDB4NzgwN2M5YTJMLCAweDBmMDBmOTM0TCwgMHg5NjA5YTg4ZUwsCisgIDB4ZTEwZTk4MThMLCAweDdmNmEwZGJiTCwgMHgwODZkM2QyZEwsIDB4OTE2NDZjOTdMLCAweGU2NjM1YzAxTCwKKyAgMHg2YjZiNTFmNEwsIDB4MWM2YzYxNjJMLCAweDg1NjUzMGQ4TCwgMHhmMjYyMDA0ZUwsIDB4NmMwNjk1ZWRMLAorICAweDFiMDFhNTdiTCwgMHg4MjA4ZjRjMUwsIDB4ZjUwZmM0NTdMLCAweDY1YjBkOWM2TCwgMHgxMmI3ZTk1MEwsCisgIDB4OGJiZWI4ZWFMLCAweGZjYjk4ODdjTCwgMHg2MmRkMWRkZkwsIDB4MTVkYTJkNDlMLCAweDhjZDM3Y2YzTCwKKyAgMHhmYmQ0NGM2NUwsIDB4NGRiMjYxNThMLCAweDNhYjU1MWNlTCwgMHhhM2JjMDA3NEwsIDB4ZDRiYjMwZTJMLAorICAweDRhZGZhNTQxTCwgMHgzZGQ4OTVkN0wsIDB4YTRkMWM0NmRMLCAweGQzZDZmNGZiTCwgMHg0MzY5ZTk2YUwsCisgIDB4MzQ2ZWQ5ZmNMLCAweGFkNjc4ODQ2TCwgMHhkYTYwYjhkMEwsIDB4NDQwNDJkNzNMLCAweDMzMDMxZGU1TCwKKyAgMHhhYTBhNGM1ZkwsIDB4ZGQwZDdjYzlMLCAweDUwMDU3MTNjTCwgMHgyNzAyNDFhYUwsIDB4YmUwYjEwMTBMLAorICAweGM5MGMyMDg2TCwgMHg1NzY4YjUyNUwsIDB4MjA2Zjg1YjNMLCAweGI5NjZkNDA5TCwgMHhjZTYxZTQ5ZkwsCisgIDB4NWVkZWY5MGVMLCAweDI5ZDljOTk4TCwgMHhiMGQwOTgyMkwsIDB4YzdkN2E4YjRMLCAweDU5YjMzZDE3TCwKKyAgMHgyZWI0MGQ4MUwsIDB4YjdiZDVjM2JMLCAweGMwYmE2Y2FkTCwgMHhlZGI4ODMyMEwsIDB4OWFiZmIzYjZMLAorICAweDAzYjZlMjBjTCwgMHg3NGIxZDI5YUwsIDB4ZWFkNTQ3MzlMLCAweDlkZDI3N2FmTCwgMHgwNGRiMjYxNUwsCisgIDB4NzNkYzE2ODNMLCAweGUzNjMwYjEyTCwgMHg5NDY0M2I4NEwsIDB4MGQ2ZDZhM2VMLCAweDdhNmE1YWE4TCwKKyAgMHhlNDBlY2YwYkwsIDB4OTMwOWZmOWRMLCAweDBhMDBhZTI3TCwgMHg3ZDA3OWViMUwsIDB4ZjAwZjkzNDRMLAorICAweDg3MDhhM2QyTCwgMHgxZTAxZjI2OEwsIDB4NjkwNmMyZmVMLCAweGY3NjI1NzVkTCwgMHg4MDY1NjdjYkwsCisgIDB4MTk2YzM2NzFMLCAweDZlNmIwNmU3TCwgMHhmZWQ0MWI3NkwsIDB4ODlkMzJiZTBMLCAweDEwZGE3YTVhTCwKKyAgMHg2N2RkNGFjY0wsIDB4ZjliOWRmNmZMLCAweDhlYmVlZmY5TCwgMHgxN2I3YmU0M0wsIDB4NjBiMDhlZDVMLAorICAweGQ2ZDZhM2U4TCwgMHhhMWQxOTM3ZUwsIDB4MzhkOGMyYzRMLCAweDRmZGZmMjUyTCwgMHhkMWJiNjdmMUwsCisgIDB4YTZiYzU3NjdMLCAweDNmYjUwNmRkTCwgMHg0OGIyMzY0YkwsIDB4ZDgwZDJiZGFMLCAweGFmMGExYjRjTCwKKyAgMHgzNjAzNGFmNkwsIDB4NDEwNDdhNjBMLCAweGRmNjBlZmMzTCwgMHhhODY3ZGY1NUwsIDB4MzE2ZThlZWZMLAorICAweDQ2NjliZTc5TCwgMHhjYjYxYjM4Y0wsIDB4YmM2NjgzMWFMLCAweDI1NmZkMmEwTCwgMHg1MjY4ZTIzNkwsCisgIDB4Y2MwYzc3OTVMLCAweGJiMGI0NzAzTCwgMHgyMjAyMTZiOUwsIDB4NTUwNTI2MmZMLCAweGM1YmEzYmJlTCwKKyAgMHhiMmJkMGIyOEwsIDB4MmJiNDVhOTJMLCAweDVjYjM2YTA0TCwgMHhjMmQ3ZmZhN0wsIDB4YjVkMGNmMzFMLAorICAweDJjZDk5ZThiTCwgMHg1YmRlYWUxZEwsIDB4OWI2NGMyYjBMLCAweGVjNjNmMjI2TCwgMHg3NTZhYTM5Y0wsCisgIDB4MDI2ZDkzMGFMLCAweDljMDkwNmE5TCwgMHhlYjBlMzYzZkwsIDB4NzIwNzY3ODVMLCAweDA1MDA1NzEzTCwKKyAgMHg5NWJmNGE4MkwsIDB4ZTJiODdhMTRMLCAweDdiYjEyYmFlTCwgMHgwY2I2MWIzOEwsIDB4OTJkMjhlOWJMLAorICAweGU1ZDViZTBkTCwgMHg3Y2RjZWZiN0wsIDB4MGJkYmRmMjFMLCAweDg2ZDNkMmQ0TCwgMHhmMWQ0ZTI0MkwsCisgIDB4NjhkZGIzZjhMLCAweDFmZGE4MzZlTCwgMHg4MWJlMTZjZEwsIDB4ZjZiOTI2NWJMLCAweDZmYjA3N2UxTCwKKyAgMHgxOGI3NDc3N0wsIDB4ODgwODVhZTZMLCAweGZmMGY2YTcwTCwgMHg2NjA2M2JjYUwsIDB4MTEwMTBiNWNMLAorICAweDhmNjU5ZWZmTCwgMHhmODYyYWU2OUwsIDB4NjE2YmZmZDNMLCAweDE2NmNjZjQ1TCwgMHhhMDBhZTI3OEwsCisgIDB4ZDcwZGQyZWVMLCAweDRlMDQ4MzU0TCwgMHgzOTAzYjNjMkwsIDB4YTc2NzI2NjFMLCAweGQwNjAxNmY3TCwKKyAgMHg0OTY5NDc0ZEwsIDB4M2U2ZTc3ZGJMLCAweGFlZDE2YTRhTCwgMHhkOWQ2NWFkY0wsIDB4NDBkZjBiNjZMLAorICAweDM3ZDgzYmYwTCwgMHhhOWJjYWU1M0wsIDB4ZGViYjllYzVMLCAweDQ3YjJjZjdmTCwgMHgzMGI1ZmZlOUwsCisgIDB4YmRiZGYyMWNMLCAweGNhYmFjMjhhTCwgMHg1M2IzOTMzMEwsIDB4MjRiNGEzYTZMLCAweGJhZDAzNjA1TCwKKyAgMHhjZGQ3MDY5M0wsIDB4NTRkZTU3MjlMLCAweDIzZDk2N2JmTCwgMHhiMzY2N2EyZUwsIDB4YzQ2MTRhYjhMLAorICAweDVkNjgxYjAyTCwgMHgyYTZmMmI5NEwsIDB4YjQwYmJlMzdMLCAweGMzMGM4ZWExTCwgMHg1YTA1ZGYxYkwsCisgIDB4MmQwMmVmOGRMCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvemlwLmMgYi91c3IvZ3ppcC96aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDM5NGMyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvemlwLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIHppcC5jIC0tIGNvbXByZXNzIGZpbGVzIHRvIHRoZSBnemlwIG9yIHBremlwIGZvcm1hdAorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseQorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisjaWZkZWYgUkNTSUQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJElkOiB6aXAuYyx2IDEuMSAyMDAyLzA4LzE4IDAwOjU5OjIxIGhwYSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgInRhaWxvci5oIgorI2luY2x1ZGUgImd6aXAuaCIKKworbG9jYWwgdWxnIGNyYzsgICAgICAgLyogY3JjIG9uIHVuY29tcHJlc3NlZCBmaWxlIGRhdGEgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZWZsYXRlIGluIHRvIG91dC4KKyAqIElOIGFzc2VydGlvbnM6IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGNsZWFyZWQuCisgKiAgIFRoZSB2YXJpYWJsZXMgdGltZV9zdGFtcCBhbmQgc2F2ZV9vcmlnX25hbWUgYXJlIGluaXRpYWxpemVkLgorICovCitpbnQgemlwKGluLCBvdXQpCisgICAgaW50IGluLCBvdXQ7ICAgICAgICAgICAgLyogaW5wdXQgYW5kIG91dHB1dCBmaWxlIGRlc2NyaXB0b3JzICovCit7CisgICAgdWNoICBmbGFncyA9IDA7ICAgICAgICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFncyAqLworICAgIHVzaCAgYXR0ciA9IDA7ICAgICAgICAgIC8qIGFzY2lpL2JpbmFyeSBmbGFnICovCisgICAgdXNoICBkZWZsYXRlX2ZsYWdzID0gMDsgLyogcGt6aXAgLWVzLCAtZW4gb3IgLWV4IGVxdWl2YWxlbnQgKi8KKworICAgIGlmZCA9IGluOworICAgIG9mZCA9IG91dDsKKyAgICBvdXRjbnQgPSAwOworCisgICAgLyogV3JpdGUgdGhlIGhlYWRlciB0byB0aGUgZ3ppcCBmaWxlLiBTZWUgYWxnb3JpdGhtLmRvYyBmb3IgdGhlIGZvcm1hdCAqLworCisgICAgbWV0aG9kID0gREVGTEFURUQ7CisgICAgcHV0X2J5dGUoR1pJUF9NQUdJQ1swXSk7IC8qIG1hZ2ljIGhlYWRlciAqLworICAgIHB1dF9ieXRlKEdaSVBfTUFHSUNbMV0pOworICAgIHB1dF9ieXRlKERFRkxBVEVEKTsgICAgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgKi8KKworICAgIGlmIChzYXZlX29yaWdfbmFtZSkgeworCWZsYWdzIHw9IE9SSUdfTkFNRTsKKyAgICB9CisgICAgcHV0X2J5dGUoZmxhZ3MpOyAgICAgICAgIC8qIGdlbmVyYWwgZmxhZ3MgKi8KKyAgICBwdXRfbG9uZyh0aW1lX3N0YW1wKTsKKworICAgIC8qIFdyaXRlIGRlZmxhdGVkIGZpbGUgdG8gemlwIGZpbGUgKi8KKyAgICBjcmMgPSB1cGRjcmMoMCwgMCk7CisKKyAgICBiaV9pbml0KG91dCk7CisgICAgY3RfaW5pdCgmYXR0ciwgJm1ldGhvZCk7CisgICAgbG1faW5pdChsZXZlbCwgJmRlZmxhdGVfZmxhZ3MpOworCisgICAgcHV0X2J5dGUoKHVjaClkZWZsYXRlX2ZsYWdzKTsgLyogZXh0cmEgZmxhZ3MgKi8KKyAgICBwdXRfYnl0ZShPU19DT0RFKTsgICAgICAgICAgICAvKiBPUyBpZGVudGlmaWVyICovCisKKyAgICBpZiAoc2F2ZV9vcmlnX25hbWUpIHsKKwljaGFyICpwID0gYmFzZW5hbWUoaWZuYW1lKTsgLyogRG9uJ3Qgc2F2ZSB0aGUgZGlyZWN0b3J5IHBhcnQuICovCisJZG8geworCSAgICBwdXRfY2hhcigqcCk7CisJfSB3aGlsZSAoKnArKyk7CisgICAgfQorICAgIGhlYWRlcl9ieXRlcyA9IChsb25nKW91dGNudDsKKworICAgICh2b2lkKWRlZmxhdGUoKTsKKworI2lmICFkZWZpbmVkKE5PX1NJWkVfQ0hFQ0spICYmICFkZWZpbmVkKFJFQ09SRF9JTykKKyAgLyogQ2hlY2sgaW5wdXQgc2l6ZSAoYnV0IG5vdCBpbiBWTVMgLS0gdmFyaWFibGUgcmVjb3JkIGxlbmd0aHMgbWVzcyBpdCB1cCkKKyAgICogYW5kIG5vdCBvbiBNU0RPUyAtLSBkaWV0IGluIFRTUiBtb2RlIHJlcG9ydHMgYW4gaW5jb3JyZWN0IGZpbGUgc2l6ZSkKKyAgICovCisgICAgaWYgKGlmaWxlX3NpemUgIT0gLTFMICYmIGlzaXplICE9ICh1bGcpaWZpbGVfc2l6ZSkgeworCVRyYWNlKChzdGRlcnIsICIgYWN0dWFsPSVsZCwgcmVhZD0lbGQgIiwgaWZpbGVfc2l6ZSwgaXNpemUpKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogZmlsZSBzaXplIGNoYW5nZWQgd2hpbGUgemlwcGluZ1xuIiwKKwkJcHJvZ25hbWUsIGlmbmFtZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBXcml0ZSB0aGUgY3JjIGFuZCB1bmNvbXByZXNzZWQgc2l6ZSAqLworICAgIHB1dF9sb25nKGNyYyk7CisgICAgcHV0X2xvbmcoaXNpemUpOworICAgIGhlYWRlcl9ieXRlcyArPSAyKnNpemVvZihsb25nKTsKKworICAgIGZsdXNoX291dGJ1ZigpOworICAgIHJldHVybiBPSzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgZmlsZSwgcGVyZm9ybSBlbmQtb2YtbGluZQorICogdHJhbnNsYXRpb24sIGFuZCB1cGRhdGUgdGhlIGNyYyBhbmQgaW5wdXQgZmlsZSBzaXplLgorICogSU4gYXNzZXJ0aW9uOiBzaXplID49IDIgKGZvciBlbmQtb2YtbGluZSB0cmFuc2xhdGlvbikKKyAqLworaW50IGZpbGVfcmVhZChidWYsIHNpemUpCisgICAgY2hhciAqYnVmOworICAgIHVuc2lnbmVkIHNpemU7Cit7CisgICAgdW5zaWduZWQgbGVuOworCisgICAgQXNzZXJ0KGluc2l6ZSA9PSAwLCAiaW5idWYgbm90IGVtcHR5Iik7CisKKyAgICBsZW4gPSByZWFkKGlmZCwgYnVmLCBzaXplKTsKKyAgICBpZiAobGVuID09ICh1bnNpZ25lZCkoLTEpIHx8IGxlbiA9PSAwKSByZXR1cm4gKGludClsZW47CisKKyAgICBjcmMgPSB1cGRjcmMoKHVjaCopYnVmLCBsZW4pOworICAgIGlzaXplICs9ICh1bGcpbGVuOworICAgIHJldHVybiAoaW50KWxlbjsKK30KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL0tidWlsZCBiL3Vzci9pbmNsdWRlL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjIwMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvS2J1aWxkCkBAIC0wLDAgKzEsMTEgQEAKK2Fsd2F5cyA6PSBhc20KKworJChvYmopL2FzbToKKwlAZWNobyAnICBTWU1MSU5LICRAIC0+IGluY2x1ZGUvYXNtLSQoS0xJQkNBU01BUkNIKScKKwkkKFEpaWYgWyAnJChLTElCQ0tFUk5FTFNSQykuJyAtZWYgJyQob2JqKS8uLi8uLicgXTsgdGhlbiBcCisJCWxuIC1mc24gLi4vLi4vaW5jbHVkZS9hc20tJChLTElCQ0FTTUFSQ0gpICRAOyBcCisJIGVsc2UgXAorCQlsbiAtZnNuICQoS0xJQkNLRVJORUxTUkMpLi9pbmNsdWRlL2FzbS0kKEtMSUJDQVNNQVJDSCkgJEA7IFwKKwkgZmkKKworY2xlYW4tZmlsZXMgOj0gYXNtCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hbGxvY2EuaCBiL3Vzci9pbmNsdWRlL2FsbG9jYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZWY0YzAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hbGxvY2EuaApAQCAtMCwwICsxLDEyIEBACisvKgorICogYWxsb2NhLmgKKyAqCisgKiBKdXN0IGNhbGwgdGhlIGJ1aWx0aW4gYWxsb2NhKCkgZnVuY3Rpb24KKyAqLworCisjaWZuZGVmIF9BTExPQ0FfSAorI2RlZmluZSBfQUxMT0NBX0gKKworI2RlZmluZSBhbGxvY2Eoc2l6ZSkgX19idWlsdGluX2FsbG9jYShzaXplKQorCisjZW5kaWYJCQkJLyogX0FMTE9DQV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmZlZTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworI2RlZmluZSBfS0xJQkNfVVNFX1JUX1NJRyAxCisjZGVmaW5lIF9LTElCQ19TVEFURlNfRl9UWVBFXzY0IDAKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2MzhiMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBhcmNoL2FscGhhL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3MwOworCXVuc2lnbmVkIGxvbmcgX19zMTsKKwl1bnNpZ25lZCBsb25nIF9fczI7CisJdW5zaWduZWQgbG9uZyBfX3MzOworCXVuc2lnbmVkIGxvbmcgX19zNDsKKwl1bnNpZ25lZCBsb25nIF9fczU7CisJdW5zaWduZWQgbG9uZyBfX2ZwOworCXVuc2lnbmVkIGxvbmcgX19yYTsKKwl1bnNpZ25lZCBsb25nIF9fZ3A7CisJdW5zaWduZWQgbG9uZyBfX3NwOworCisJdW5zaWduZWQgbG9uZyBfX2YyOworCXVuc2lnbmVkIGxvbmcgX19mMzsKKwl1bnNpZ25lZCBsb25nIF9fZjQ7CisJdW5zaWduZWQgbG9uZyBfX2Y1OworCXVuc2lnbmVkIGxvbmcgX19mNjsKKwl1bnNpZ25lZCBsb25nIF9fZjc7CisJdW5zaWduZWQgbG9uZyBfX2Y4OworCXVuc2lnbmVkIGxvbmcgX19mOTsKK307CisKKy8qIE11c3QgYmUgYW4gYXJyYXkgc28gaXQgd2lsbCBkZWNheSB0byBhIHBvaW50ZXIgd2hlbiBhIGZ1bmN0aW9uIGlzIGNhbGxlZCAqLwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSFNFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTNhMzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9hbHBoYS9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIE5vIHNwZWNpYWwgc3R1ZmYgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTI5YmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgbG9uZwlzdF9pbm87CisJX19zdGRldjY0CShzdF9yZGV2KTsKKwlsb25nCQlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxvY2tzOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCXVuc2lnbmVkIGludAlzdF9ibGtzaXplOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKwl1bnNpZ25lZCBpbnQJX19wYWQwOworCisJc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisgIAlsb25nCQlfX3VudXNlZFszXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9tYWNoaW5lL2FzbS5oIGIvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9tYWNoaW5lL2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYWU0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2FscGhhL21hY2hpbmUvYXNtLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIG1hY2hpbmUvYXNtLmgKKyAqLworCisjaWZuZGVmIF9NQUNISU5FX0FTTV9ICisjZGVmaW5lIF9NQUNISU5FX0FTTV9ICisKKy8qIFN0YW5kYXJkIGFsaWFzZXMgZm9yIEFscGhhIHJlZ2lzdGVyIG5hbWVzICovCisKKyNkZWZpbmUgdjAJJDAKKyNkZWZpbmUgdDAJJDEKKyNkZWZpbmUgdDEJJDIKKyNkZWZpbmUgdDIJJDMKKyNkZWZpbmUgdDMJJDQKKyNkZWZpbmUgdDQJJDUKKyNkZWZpbmUgdDUJJDYKKyNkZWZpbmUgdDYJJDcKKyNkZWZpbmUgdDcJJDgKKyNkZWZpbmUgczAJJDkKKyNkZWZpbmUgczEJJDEwCisjZGVmaW5lIHMyCSQxMQorI2RlZmluZSBzMwkkMTIKKyNkZWZpbmUgczQJJDEzCisjZGVmaW5lIHM1CSQxNAorI2RlZmluZSBmcAkkMTUKKyNkZWZpbmUgYTAJJDE2CisjZGVmaW5lIGExCSQxNworI2RlZmluZSBhMgkkMTgKKyNkZWZpbmUgYTMJJDE5CisjZGVmaW5lIGE0CSQyMAorI2RlZmluZSBhNQkkMjEKKyNkZWZpbmUgdDgJJDIyCisjZGVmaW5lIHQ5CSQyMworI2RlZmluZSB0MTAJJDI0CisjZGVmaW5lIHQxMQkkMjUKKyNkZWZpbmUgcmEJJDI2CisjZGVmaW5lIHQxMgkkMjcJCS8qIHQxMiBhbmQgcHYgYXJlIGJvdGggdXNlZCBmb3IgJDI3ICovCisjZGVmaW5lIHB2CSQyNwkJLyogdDEyIGFuZCBwdiBhcmUgYm90aCB1c2VkIGZvciAkMjcgKi8KKyNkZWZpbmUgYXQJJDI4CisjZGVmaW5lIGdwCSQyOQorI2RlZmluZSBzcAkkMzAKKyNkZWZpbmUgemVybwkkMzEKKworI2VuZGlmCQkJCS8qIF9NQUNISU5FX0FTTV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0YmRiNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIEFsbCBkZWZhdWx0cyAqLworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZGI4YTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvaTM4Ni9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGludCByZWdzWzEwXTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4OTUyNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9hcm0vaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YmJjOWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMSwgaGVuY2UgdGhlIGFic29sdXRlbHkKKyAqIGluc2FuZSBhbW91bnRzIG9mIHBhZGRpbmcgYXJvdW5kIGRldl90J3MuCisgKiBOb3RlOiBUaGUga2VybmVsIHplcm8ncyB0aGUgcGFkZGVkIHJlZ2lvbiBiZWNhdXNlIGdsaWJjIG1pZ2h0IHJlYWQgdGhlbQorICogaW4gdGhlIGhvcGUgdGhhdCB0aGUga2VybmVsIGhhcyBzdHJldGNoZWQgdG8gdXNpbmcgbGFyZ2VyIHNpemVzLgorICovCisKK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgY2hhciAgIF9fcGFkMFs0XTsKKworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgbG9uZwlzdF91aWQ7CisJdW5zaWduZWQgbG9uZwlzdF9naWQ7CisKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCXVuc2lnbmVkIGNoYXIgICBfX3BhZDNbNF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgIHN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9pbm87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FzbW1hY3Jvcy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXNtbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyMWM5NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FzbW1hY3Jvcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiB1c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hc21tYWNyb3MuaAorICoKKyAqIEFzc2VtYmx5IG1hY3JvcyB1c2VkIGJ5IEFSTSBzeXN0ZW0gY2FsbCBzdHVicworICovCisKKyNpZm5kZWYgX0tMSUJDX0FTTU1BQ1JPU19ICisjZGVmaW5lIF9LTElCQ19BU01NQUNST1NfSAorCisvKiBBbiBpbW1lZGlhdGUgaW4gQVJNIGNhbiBiZSBhbnkgOC1iaXQgdmFsdWUgcm90YXRlZCBieSBhbiBldmVuIG51bWJlciBvZiBiaXRzICovCisKKyNkZWZpbmUgQVJNX1ZBTElEX0lNTSh4KQlcCisJKCgoKHgpICYgfjB4MDAwMDAwZmYpID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHgwMDAwMDNmYykgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDAwMDAwZmYwKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4MDAwMDNmYzApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHgwMDAwZmYwMCkgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDAwMDNmYzAwKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4MDAwZmYwMDApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHgwMDNmYzAwMCkgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDAwZmYwMDAwKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4MDNmYzAwMDApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHgwZmYwMDAwMCkgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDNmYzAwMDAwKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4ZmYwMDAwMDApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHhmYzAwMDAwMykgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weGYwMDAwMDBmKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4YzAwMDAwM2YpID09IDApKQorCisjZW5kaWYgLyogX0tMSUJDX0FTTU1BQ1JPU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjA2MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBjcmlzIHVzZXMgMTMgYXMgdGhlIHBhZ2Ugc2hpZnQgZmFjdG9yIGZvciBzeXNfbW1hcDIgKi8KKyNkZWZpbmUgX0tMSUJDX01NQVAyX1NISUZUCTEzCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ1Y2NiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogYXJjaC9jcmlzL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3IwOworCXVuc2lnbmVkIGxvbmcgX19yMTsKKwl1bnNpZ25lZCBsb25nIF9fcjI7CisJdW5zaWduZWQgbG9uZyBfX3IzOworCXVuc2lnbmVkIGxvbmcgX19yNDsKKwl1bnNpZ25lZCBsb25nIF9fcjU7CisJdW5zaWduZWQgbG9uZyBfX3I2OworCXVuc2lnbmVkIGxvbmcgX19yNzsKKwl1bnNpZ25lZCBsb25nIF9fcjg7CisJdW5zaWduZWQgbG9uZyBfX3NwOworCXVuc2lnbmVkIGxvbmcgX19zcnA7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTc0NTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL2NyaXMvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkM2FkZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMSwgaGVuY2UgdGhlIGFic29sdXRlbHkKKyAqIGluc2FuZSBhbW91bnRzIG9mIHBhZGRpbmcgYXJvdW5kIGRldl90J3MuCisgKi8KK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgY2hhcglfX3BhZDBbNF07CisKKwl1bnNpZ25lZCBsb25nCV9fc3RfaW5vOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgbG9uZwlzdF91aWQ7CisJdW5zaWduZWQgbG9uZwlzdF9naWQ7CisKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzRdOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCisJdW5zaWduZWQgbG9uZwlzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCXVuc2lnbmVkIGxvbmcJX19wYWQ0OwkJLyogZnV0dXJlIHBvc3NpYmxlIHN0X2Jsb2NrcyBoaWdoIGJpdHMgKi8KKworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhNGM4YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogT24gaTM4Niwgb25seSBoYWxmIHRoZSBzaWduYWxzIGFyZSBhY2Nlc3NpYmxlIHVzaW5nIHRoZSBsZWdhY3kgY2FsbHMuICovCisjZGVmaW5lIF9LTElCQ19VU0VfUlRfU0lHIDEKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWJhM2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBhcmNoL2kzODYvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBpbnQgX19lYng7CisJdW5zaWduZWQgaW50IF9fZXNwOworCXVuc2lnbmVkIGludCBfX2VicDsKKwl1bnNpZ25lZCBpbnQgX19lc2k7CisJdW5zaWduZWQgaW50IF9fZWRpOworCXVuc2lnbmVkIGludCBfX2VpcDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk0MmRiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIGFyY2gvaTM4Ni9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworLyogVGhlIGluLWtlcm5lbCBoZWFkZXJzIGZvciBpMzg2IHN0aWxsIGhhdmUgbGliYzUKKyAgIGNyYXAgaW4gdGhlbS4gIFJlY29uc2lkZXIgdXNpbmcgPGFzbS9zaWduYWwuaD4KKyAgIHdoZW4vaWYgaXQgZ2V0cyBjbGVhbmVkIHVwOyBmb3Igbm93LCBkdXBsaWNhdGUKKyAgIHRoZSBkZWZpbml0aW9ucyBoZXJlLiAqLworCisjZGVmaW5lIF9OU0lHICAgICAgICAgICA2NAorI2RlZmluZSBfTlNJR19CUFcgICAgICAgMzIKKyNkZWZpbmUgX05TSUdfV09SRFMgICAgIChfTlNJRyAvIF9OU0lHX0JQVykKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgc2lnW19OU0lHX1dPUkRTXTsKK30gc2lnc2V0X3Q7CisKKyNkZWZpbmUgU0lHSFVQICAgICAgICAgICAxCisjZGVmaW5lIFNJR0lOVCAgICAgICAgICAgMgorI2RlZmluZSBTSUdRVUlUICAgICAgICAgIDMKKyNkZWZpbmUgU0lHSUxMICAgICAgICAgICA0CisjZGVmaW5lIFNJR1RSQVAgICAgICAgICAgNQorI2RlZmluZSBTSUdBQlJUICAgICAgICAgIDYKKyNkZWZpbmUgU0lHSU9UICAgICAgICAgICA2CisjZGVmaW5lIFNJR0JVUyAgICAgICAgICAgNworI2RlZmluZSBTSUdGUEUgICAgICAgICAgIDgKKyNkZWZpbmUgU0lHS0lMTCAgICAgICAgICA5CisjZGVmaW5lIFNJR1VTUjEgICAgICAgICAxMAorI2RlZmluZSBTSUdTRUdWICAgICAgICAgMTEKKyNkZWZpbmUgU0lHVVNSMiAgICAgICAgIDEyCisjZGVmaW5lIFNJR1BJUEUgICAgICAgICAxMworI2RlZmluZSBTSUdBTFJNICAgICAgICAgMTQKKyNkZWZpbmUgU0lHVEVSTSAgICAgICAgIDE1CisjZGVmaW5lIFNJR1NUS0ZMVCAgICAgICAxNgorI2RlZmluZSBTSUdDSExEICAgICAgICAgMTcKKyNkZWZpbmUgU0lHQ09OVCAgICAgICAgIDE4CisjZGVmaW5lIFNJR1NUT1AgICAgICAgICAxOQorI2RlZmluZSBTSUdUU1RQICAgICAgICAgMjAKKyNkZWZpbmUgU0lHVFRJTiAgICAgICAgIDIxCisjZGVmaW5lIFNJR1RUT1UgICAgICAgICAyMgorI2RlZmluZSBTSUdVUkcgICAgICAgICAgMjMKKyNkZWZpbmUgU0lHWENQVSAgICAgICAgIDI0CisjZGVmaW5lIFNJR1hGU1ogICAgICAgICAyNQorI2RlZmluZSBTSUdWVEFMUk0gICAgICAgMjYKKyNkZWZpbmUgU0lHUFJPRiAgICAgICAgIDI3CisjZGVmaW5lIFNJR1dJTkNIICAgICAgICAyOAorI2RlZmluZSBTSUdJTyAgICAgICAgICAgMjkKKyNkZWZpbmUgU0lHUE9MTCAgICAgICAgIFNJR0lPCisjZGVmaW5lIFNJR1BXUiAgICAgICAgICAzMAorI2RlZmluZSBTSUdTWVMgICAgICAgICAgMzEKKyNkZWZpbmUgU0lHVU5VU0VEICAgICAgIDMxCisKKyNkZWZpbmUgU0lHUlRNSU4gICAgICAgIDMyCisjZGVmaW5lIFNJR1JUTUFYICAgICAgICAoX05TSUctMSkKKworLyoKKyAqIFNBX0ZMQUdTIHZhbHVlczoKKyAqCisgKiBTQV9PTlNUQUNLIGluZGljYXRlcyB0aGF0IGEgcmVnaXN0ZXJlZCBzdGFja190IHdpbGwgYmUgdXNlZC4KKyAqIFNBX0lOVEVSUlVQVCBpcyBhIG5vLW9wLCBidXQgbGVmdCBkdWUgdG8gaGlzdG9yaWNhbCByZWFzb25zLiBVc2UgdGhlCisgKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKKyAqIFNBX05PQ0xEU1RPUCBmbGFnIHRvIHR1cm4gb2ZmIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLgorICogU0FfUkVTRVRIQU5EIGNsZWFycyB0aGUgaGFuZGxlciB3aGVuIHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkLgorICogU0FfTk9DTERXQUlUIGZsYWcgb24gU0lHQ0hMRCB0byBpbmhpYml0IHpvbWJpZXMuCisgKiBTQV9OT0RFRkVSIHByZXZlbnRzIHRoZSBjdXJyZW50IHNpZ25hbCBmcm9tIGJlaW5nIG1hc2tlZCBpbiB0aGUgaGFuZGxlci4KKyAqCisgKiBTQV9PTkVTSE9UIGFuZCBTQV9OT01BU0sgYXJlIHRoZSBoaXN0b3JpY2FsIExpbnV4IG5hbWVzIGZvciB0aGUgU2luZ2xlCisgKiBVbml4IG5hbWVzIFJFU0VUSEFORCBhbmQgTk9ERUZFUiByZXNwZWN0aXZlbHkuCisgKi8KKyNkZWZpbmUgU0FfTk9DTERTVE9QCTB4MDAwMDAwMDF1CisjZGVmaW5lIFNBX05PQ0xEV0FJVAkweDAwMDAwMDAydQorI2RlZmluZSBTQV9TSUdJTkZPCTB4MDAwMDAwMDR1CisjZGVmaW5lIFNBX09OU1RBQ0sJMHgwODAwMDAwMHUKKyNkZWZpbmUgU0FfUkVTVEFSVAkweDEwMDAwMDAwdQorI2RlZmluZSBTQV9OT0RFRkVSCTB4NDAwMDAwMDB1CisjZGVmaW5lIFNBX1JFU0VUSEFORAkweDgwMDAwMDAwdQorCisjZGVmaW5lIFNBX05PTUFTSwlTQV9OT0RFRkVSCisjZGVmaW5lIFNBX09ORVNIT1QJU0FfUkVTRVRIQU5ECisjZGVmaW5lIFNBX0lOVEVSUlVQVAkweDIwMDAwMDAwCS8qIGR1bW15IC0tIGlnbm9yZWQgKi8KKworI2RlZmluZSBTQV9SRVNUT1JFUgkweDA0MDAwMDAwCisKKy8qCisgKiBzaWdhbHRzdGFjayBjb250cm9scworICovCisjZGVmaW5lIFNTX09OU1RBQ0sJMQorI2RlZmluZSBTU19ESVNBQkxFCTIKKworI2RlZmluZSBNSU5TSUdTVEtTWgkyMDQ4CisjZGVmaW5lIFNJR1NUS1NaCTgxOTIKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC5oPgorCisvKiBUaGlzIHVzZXMgZ2NjIGFub255bW91cyB1bmlvbiBzdXBwb3J0Li4uICovCitzdHJ1Y3Qgc2lnaW5mbzsKKworc3RydWN0IHNpZ2FjdGlvbiB7CisJdW5pb24geworCQlfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworCQl2b2lkICgqc2Ffc2lnYWN0aW9uKShpbnQsIHN0cnVjdCBzaWdpbmZvICosIHZvaWQgKik7CisJfTsKKwl1bnNpZ25lZCBsb25nCXNhX2ZsYWdzOworCV9fc2lncmVzdG9yZV90IAlzYV9yZXN0b3JlcjsKKwlzaWdzZXRfdAlzYV9tYXNrOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMGY5NTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5CisgKiBpbnNhbmUgYW1vdW50cyBvZiBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLgorICovCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCXVuc2lnbmVkIGNoYXIJX19wYWQwWzRdOworCisJdW5zaWduZWQgbG9uZwlfX3N0X2lubzsKKworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKworCXVuc2lnbmVkIGxvbmcJc3RfdWlkOworCXVuc2lnbmVkIGxvbmcJc3RfZ2lkOworCisJX19zdGRldjY0CShzdF9yZGV2KTsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkM1s0XTsKKworCWxvbmcgbG9uZwlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCisJc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvZGl2ZXJyLmggYi91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvZGl2ZXJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyMzhhYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9kaXZlcnIuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogYXJjaC9pMzg2L2luY2x1ZGUva2xpYmMvZGl2ZXJyLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19ESVZFUlJfSAorI2RlZmluZSBfS0xJQkNfRElWRVJSX0gKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fZGl2aWRlX2Vycm9yKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlICgiaW50ICQwIik7Cit9CisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfRElWRVJSX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9zeXMvaW8uaCBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9zeXMvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMxYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L3N5cy9pby5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5cy9pby5oIGZvciB0aGUgaTM4NiBhcmNoaXRlY3R1cmUKKyAqCisgKiBCYXNpYyBJL08gbWFjcm9zCisgKi8KKworI2lmbmRlZiBfU1lTX0lPX0gKKyNkZWZpbmUgX1NZU19JT19IIDEKKworLyogSS9PLXJlbGF0ZWQgc3lzdGVtIGNhbGxzICovCisKK2ludCBpb3BsKGludCk7CitpbnQgaW9wZXJtKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCk7CisKKy8qIEJhc2ljIEkvTyBtYWNyb3MgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvdXRiKHVuc2lnbmVkIGNoYXIgX192LCB1bnNpZ25lZCBzaG9ydCBfX3ApCit7CisJYXNtIHZvbGF0aWxlICgib3V0YiAlMCwlMSIgOiA6ICJhIiAoX192KSwgImROIiAoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgb3V0dyh1bnNpZ25lZCBzaG9ydCBfX3YsIHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwlhc20gdm9sYXRpbGUgKCJvdXR3ICUwLCUxIiA6IDogImEiIChfX3YpLCAiZE4iIChfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvdXRsKHVuc2lnbmVkIGludCBfX3YsIHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwlhc20gdm9sYXRpbGUgKCJvdXRsICUwLCUxIiA6IDogImEiIChfX3YpLCAiZE4iIChfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBpbmIodW5zaWduZWQgc2hvcnQgX19wKQoreworCXVuc2lnbmVkIGNoYXIgX192OworCWFzbSB2b2xhdGlsZSAoImluYiAlMSwlMCIgOiAiPWEiIChfX3YpIDogImROIiAoX19wKSk7CisJcmV0dXJuIF9fdjsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW53KHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBfX3Y7CisJYXNtIHZvbGF0aWxlICgiaW53ICUxLCUwIiA6ICI9YSIgKF9fdikgOiAiZE4iIChfX3ApKTsKKwlyZXR1cm4gX192OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgaW5sKHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwl1bnNpZ25lZCBpbnQgX192OworCWFzbSB2b2xhdGlsZSAoImlubCAlMSwlMCIgOiAiPWEiIChfX3YpIDogImROIiAoX19wKSk7CisJcmV0dXJuIF9fdjsKK30KKworLyogU3RyaW5nIEkvTyBtYWNyb3MgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0c2IodW5zaWduZWQgc2hvcnQgX19wLCBjb25zdCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzYiIKKwkJICAgICAgOiAiK1MiIChfX2QpLCAiK2MiIChfX24pCisJCSAgICAgIDogImQiIChfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0c3codW5zaWduZWQgc2hvcnQgX19wLCBjb25zdCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzdyIKKwkJICAgICAgOiAiK1MiIChfX2QpLCAiK2MiIChfX24pCisJCSAgICAgIDogImQiIChfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0c2wodW5zaWduZWQgc2hvcnQgX19wLCBjb25zdCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzbCIKKwkJICAgICAgOiAiK1MiIChfX2QpLCAiK2MiKF9fbikKKwkJICAgICAgOiAiZCIgKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGluc2IodW5zaWduZWQgc2hvcnQgX19wLCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNiIgorCQkgICAgICA6ICIrRCIgKF9fZCksICIrYyIgKF9fbikKKwkJICAgICAgOiAiZCIgKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGluc3codW5zaWduZWQgc2hvcnQgX19wLCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnN3IgorCQkgICAgICA6ICIrRCIgKF9fZCksICIrYyIgKF9fbikKKwkJICAgICAgOiAiZCIgKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGluc2wodW5zaWduZWQgc2hvcnQgX19wLCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNsIgorCQkgICAgICA6ICIrRCIgKF9fZCksICIrYyIgKF9fbikKKwkJICAgICAgOiAiZCIgKF9fcCkpOworfQorCisjZW5kaWYJCQkJLyogX1NZU19JT19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2kzODYvc3lzL3ZtODYuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9zeXMvdm04Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjUxY2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2kzODYvc3lzL3ZtODYuaApAQCAtMCwwICsxLDQwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5cy92bTg2LmggZm9yIGkzODYKKyAqLworCisjaWZuZGVmIF9TWVNfVk04Nl9ICisjZGVmaW5lIF9TWVNfVk04Nl9IIDEKKworI2luY2x1ZGUgPGFzbS92bTg2Lmg+CisKKy8qIEFjdHVhbCBzeXN0ZW0gY2FsbCAqLworaW50IHZtODYoc3RydWN0IHZtODZfc3RydWN0ICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYmQxZWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIElBNjQgZG9lc24ndCBoYXZlIHN5c19mb3JrLCBidXQgaXQgZG9lcyBoYXZlIGFuIE1NVSAqLworI2RlZmluZSBfS0xJQkNfTk9fTU1VIDAKKy8qIElBNjQgZG9lc24ndCBoYXZlIHN5c192Zm9yaywgaXQgaGFzIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlICovCisjZGVmaW5lIF9LTElCQ19SRUFMX1ZGT1JLIDEKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTY0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBhcmNoL2lhNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqCisgKiBDb2RlIGJvcnJvd2VkIGZyb20gdGhlIEZyZWVCU0Qga2VybmVsLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCisvKiBVc2VyIGNvZGUgbXVzdCBub3QgZGVwZW5kIG9uIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBqbXBfYnVmLiAqLworI2RlZmluZSBfSkJMRU4gMHgyMDAKKworLyogZ3VhcmFudGVlZCAxMjgtYml0IGFsaWdubWVudCEgKi8KK3R5cGVkZWYgY2hhciBqbXBfYnVmW19KQkxFTl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOTYxYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGFyY2gvaWE2NC9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjZGVmaW5lIF9OU0lHICAgICAgICA2NAorI2RlZmluZSBfTlNJR19CUFcgICAgNjQKKyNkZWZpbmUgX05TSUdfV09SRFMgKF9OU0lHIC8gX05TSUdfQlBXKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzaWdbX05TSUdfV09SRFNdOworfSBzaWdzZXRfdDsKKworc3RydWN0IHNpZ2FjdGlvbiB7CisJdW5pb24geworCQlfX3NpZ2hhbmRsZXJfdCBfc2FfaGFuZGxlcjsKKwkJdm9pZCAoKl9zYV9zaWdhY3Rpb24pIChpbnQsIHN0cnVjdCBzaWdpbmZvICosIHZvaWQgKik7CisJfSBfdTsKKwlzaWdzZXRfdCBzYV9tYXNrOworCWludCBzYV9mbGFnczsKK307CisKKyNkZWZpbmUgc2FfaGFuZGxlciAgICAgIF91Ll9zYV9oYW5kbGVyCisjZGVmaW5lIHNhX3NpZ2FjdGlvbiAgICBfdS5fc2Ffc2lnYWN0aW9uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM4ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgbG9uZwlzdF9pbm87CisJdW5zaWduZWQgbG9uZwlzdF9ubGluazsKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisJdW5zaWduZWQgaW50CV9fcGFkMDsKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCXVuc2lnbmVkIGxvbmcJc3Rfc2l6ZTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisJbG9uZwkJc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWRbM107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc3lzLmggYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDc4MjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHN5cy5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogYXJjaC9pYTY0L2luY2x1ZGUva2xpYmMvYXJjaHN5cy5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN5c2NhbGwgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU1lTX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTWVNfSAorCisjZGVmaW5lIF9fSUE2NF9CUkVBSyAiYnJlYWsgMHgxMDAwMDA7O1xuXHQiCisKKyNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUgKHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yOCBhc20gKCJyOCIpOwkJCQkJXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxMCBhc20gKCJyMTAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxNSBhc20gKCJyMTUiKSA9IF9fTlJfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxvbmcgX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKF9fSUE2NF9CUkVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAoX3I4KSwgIj1yIiAoX3IxMCksICI9ciIgKF9yMTUpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIjIiIChfcjE1KSBBU01fQVJHU18wICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIgQVNNX0NMT0JCRVJTXzApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9yZXR2YWwgPSBfcjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmIChfcjEwID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgZXJybm8gPSAoX3JldHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3JldHZhbCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiAodHlwZSlfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIF9zeXNjYWxsMSh0eXBlLG5hbWUsdHlwZTEsYXJnMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lICh0eXBlMSBhcmcxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjggYXNtICgicjgiKTsJCQkJCVwKKyAgICAgICByZWdpc3RlciBsb25nIF9yMTAgYXNtICgicjEwIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yMTUgYXNtICgicjE1IikgPSBfX05SXyMjbmFtZTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBsb25nIF9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBMT0FEX0FSR1NfMShhcmcxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfX2FzbSBfX3ZvbGF0aWxlIChfX0lBNjRfQlJFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKF9yOCksICI9ciIgKF9yMTApLCAiPXIiIChfcjE1KSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTV9PVVRBUkdTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICIyIiAoX3IxNSkgQVNNX0FSR1NfMSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiIEFTTV9DTE9CQkVSU18xKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfcmV0dmFsID0gX3I4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBpZiAoX3IxMCA9PSAtMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGVycm5vID0gKF9yZXR2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIF9yZXR2YWwgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gKHR5cGUpX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikgICAgICAgICAgICAgICAgICAgICAgXAordHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3I4IGFzbSAoInI4Iik7CQkJCQlcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjEwIGFzbSAoInIxMCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjE1IGFzbSAoInIxNSIpID0gX19OUl8jI25hbWU7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgbG9uZyBfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTE9BRF9BUkdTXzIoYXJnMSwgYXJnMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX19hc20gX192b2xhdGlsZSAoX19JQTY0X0JSRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChfcjgpLCAiPXIiIChfcjEwKSwgIj1yIiAoX3IxNSksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU01fT1VUQVJHU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMiIgKF9yMTUpIEFTTV9BUkdTXzIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiBBU01fQ0xPQkJFUlNfMik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3JldHZhbCA9IF9yODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKF9yMTAgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBlcnJubyA9IChfcmV0dmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBfcmV0dmFsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuICh0eXBlKV9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMykgICAgICAgICAgIFwKK3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yOCBhc20gKCJyOCIpOwkJCQkJXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxMCBhc20gKCJyMTAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxNSBhc20gKCJyMTUiKSA9IF9fTlJfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxvbmcgX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIExPQURfQVJHU18zKGFyZzEsIGFyZzIsIGFyZzMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKF9fSUE2NF9CUkVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAoX3I4KSwgIj1yIiAoX3IxMCksICI9ciIgKF9yMTUpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNNX09VVEFSR1NfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIjIiIChfcjE1KSBBU01fQVJHU18zICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIgQVNNX0NMT0JCRVJTXzMpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9yZXR2YWwgPSBfcjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmIChfcjEwID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgZXJybm8gPSAoX3JldHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3JldHZhbCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiAodHlwZSlfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIF9zeXNjYWxsNCh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCkgXAordHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCkgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3I4IGFzbSAoInI4Iik7CQkJCQlcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjEwIGFzbSAoInIxMCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjE1IGFzbSAoInIxNSIpID0gX19OUl8jI25hbWU7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgbG9uZyBfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTE9BRF9BUkdTXzQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX19hc20gX192b2xhdGlsZSAoX19JQTY0X0JSRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChfcjgpLCAiPXIiIChfcjEwKSwgIj1yIiAoX3IxNSksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU01fT1VUQVJHU180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMiIgKF9yMTUpIEFTTV9BUkdTXzQgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiBBU01fQ0xPQkJFUlNfNCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3JldHZhbCA9IF9yODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKF9yMTAgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBlcnJubyA9IChfcmV0dmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBfcmV0dmFsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuICh0eXBlKV9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LHR5cGU1LGFyZzUpIFwKK3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsIHR5cGU1IGFyZzUpICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yOCBhc20gKCJyOCIpOwkJCQkJXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxMCBhc20gKCJyMTAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxNSBhc20gKCJyMTUiKSA9IF9fTlJfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxvbmcgX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIExPQURfQVJHU181KGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKF9fSUE2NF9CUkVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAoX3I4KSwgIj1yIiAoX3IxMCksICI9ciIgKF9yMTUpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNNX09VVEFSR1NfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIjIiIChfcjE1KSBBU01fQVJHU181ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIgQVNNX0NMT0JCRVJTXzUpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9yZXR2YWwgPSBfcjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmIChfcjEwID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgZXJybm8gPSAoX3JldHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3JldHZhbCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiAodHlwZSlfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIF9zeXNjYWxsNih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCx0eXBlNSxhcmc1LHR5cGU2LGFyZzYpIFwKK3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsIHR5cGU1IGFyZzUsIHR5cGU2IGFyZzYpICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yOCBhc20gKCJyOCIpOwkJCQkJXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxMCBhc20gKCJyMTAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxNSBhc20gKCJyMTUiKSA9IF9fTlJfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxvbmcgX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIExPQURfQVJHU182KGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOyAgICAgICAgICAgICAgICAgXAorICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKF9fSUE2NF9CUkVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAoX3I4KSwgIj1yIiAoX3IxMCksICI9ciIgKF9yMTUpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNNX09VVEFSR1NfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIjIiIChfcjE1KSBBU01fQVJHU182ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIgQVNNX0NMT0JCRVJTXzYpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9yZXR2YWwgPSBfcjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmIChfcjEwID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgZXJybm8gPSAoX3JldHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3JldHZhbCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiAodHlwZSlfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIExPQURfQVJHU18wKCkgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIExPQURfQVJHU18xKG91dDApCQkJCVwKKyAgcmVnaXN0ZXIgbG9uZyBfb3V0MCBhc20gKCJvdXQwIikgPSAobG9uZykgKG91dDApOwlcCisgIExPQURfQVJHU18wICgpCisjZGVmaW5lIExPQURfQVJHU18yKG91dDAsIG91dDEpCQkJCVwKKyAgcmVnaXN0ZXIgbG9uZyBfb3V0MSBhc20gKCJvdXQxIikgPSAobG9uZykgKG91dDEpOwlcCisgIExPQURfQVJHU18xIChvdXQwKQorI2RlZmluZSBMT0FEX0FSR1NfMyhvdXQwLCBvdXQxLCBvdXQyKQkJCVwKKyAgcmVnaXN0ZXIgbG9uZyBfb3V0MiBhc20gKCJvdXQyIikgPSAobG9uZykgKG91dDIpOwlcCisgIExPQURfQVJHU18yIChvdXQwLCBvdXQxKQorI2RlZmluZSBMT0FEX0FSR1NfNChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKQkJXAorICByZWdpc3RlciBsb25nIF9vdXQzIGFzbSAoIm91dDMiKSA9IChsb25nKSAob3V0Myk7CVwKKyAgTE9BRF9BUkdTXzMgKG91dDAsIG91dDEsIG91dDIpCisjZGVmaW5lIExPQURfQVJHU181KG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQpCVwKKyAgcmVnaXN0ZXIgbG9uZyBfb3V0NCBhc20gKCJvdXQ0IikgPSAobG9uZykgKG91dDQpOwlcCisgIExPQURfQVJHU180IChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKQorI2RlZmluZSBMT0FEX0FSR1NfNihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1KQlcCisgIHJlZ2lzdGVyIGxvbmcgX291dDUgYXNtICgib3V0NSIpID0gKGxvbmcpIChvdXQ1KTsJXAorICBMT0FEX0FSR1NfNSAob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCkKKworI2RlZmluZSBBU01fT1VUQVJHU18xCSI9ciIgKF9vdXQwKQorI2RlZmluZSBBU01fT1VUQVJHU18yCUFTTV9PVVRBUkdTXzEsICI9ciIgKF9vdXQxKQorI2RlZmluZSBBU01fT1VUQVJHU18zCUFTTV9PVVRBUkdTXzIsICI9ciIgKF9vdXQyKQorI2RlZmluZSBBU01fT1VUQVJHU180CUFTTV9PVVRBUkdTXzMsICI9ciIgKF9vdXQzKQorI2RlZmluZSBBU01fT1VUQVJHU181CUFTTV9PVVRBUkdTXzQsICI9ciIgKF9vdXQ0KQorI2RlZmluZSBBU01fT1VUQVJHU182CUFTTV9PVVRBUkdTXzUsICI9ciIgKF9vdXQ1KQorCisjZGVmaW5lIEFTTV9BUkdTXzAKKyNkZWZpbmUgQVNNX0FSR1NfMQlBU01fQVJHU18wLCAiMyIgKF9vdXQwKQorI2RlZmluZSBBU01fQVJHU18yCUFTTV9BUkdTXzEsICI0IiAoX291dDEpCisjZGVmaW5lIEFTTV9BUkdTXzMJQVNNX0FSR1NfMiwgIjUiIChfb3V0MikKKyNkZWZpbmUgQVNNX0FSR1NfNAlBU01fQVJHU18zLCAiNiIgKF9vdXQzKQorI2RlZmluZSBBU01fQVJHU181CUFTTV9BUkdTXzQsICI3IiAoX291dDQpCisjZGVmaW5lIEFTTV9BUkdTXzYJQVNNX0FSR1NfNSwgIjgiIChfb3V0NSkKKworI2RlZmluZSBBU01fQ0xPQkJFUlNfMAlBU01fQ0xPQkJFUlNfMSwgIm91dDAiCisjZGVmaW5lIEFTTV9DTE9CQkVSU18xCUFTTV9DTE9CQkVSU18yLCAib3V0MSIKKyNkZWZpbmUgQVNNX0NMT0JCRVJTXzIJQVNNX0NMT0JCRVJTXzMsICJvdXQyIgorI2RlZmluZSBBU01fQ0xPQkJFUlNfMwlBU01fQ0xPQkJFUlNfNCwgIm91dDMiCisjZGVmaW5lIEFTTV9DTE9CQkVSU180CUFTTV9DTE9CQkVSU181LCAib3V0NCIKKyNkZWZpbmUgQVNNX0NMT0JCRVJTXzUJQVNNX0NMT0JCRVJTXzYsICJvdXQ1IgorI2RlZmluZSBBU01fQ0xPQkJFUlNfNgksICJvdXQ2IiwgIm91dDciLAkJCQlcCisgIC8qIE5vbi1zdGFja2VkIGludGVnZXIgcmVnaXN0ZXJzLCBtaW51cyByOCwgcjEwLCByMTUuICAqLwkJXAorICAicjIiLCAicjMiLCAicjkiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNiIsICJyMTciLCAicjE4IiwJXAorICAicjE5IiwgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsICJyMjQiLCAicjI1IiwgInIyNiIsICJyMjciLAlcCisgICJyMjgiLCAicjI5IiwgInIzMCIsICJyMzEiLAkJCQkJCVwKKyAgLyogUHJlZGljYXRlIHJlZ2lzdGVycy4gICovCQkJCQkJXAorICAicDYiLCAicDciLCAicDgiLCAicDkiLCAicDEwIiwgInAxMSIsICJwMTIiLCAicDEzIiwgInAxNCIsICJwMTUiLAlcCisgIC8qIE5vbi1yb3RhdGluZyBmcCByZWdpc3RlcnMuICAqLwkJCQkJXAorICAiZjYiLCAiZjciLCAiZjgiLCAiZjkiLCAiZjEwIiwgImYxMSIsICJmMTIiLCAiZjEzIiwgImYxNCIsICJmMTUiLAlcCisgIC8qIEJyYW5jaCByZWdpc3RlcnMuICAqLwkJCQkJCVwKKyAgImI2IiwgImI3IgorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hTWVNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbTMyci9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4OTg3NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbTMyci9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogQWxsIGRlZmF1bHRzICovCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJkZjljCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogYXJjaC9tMzJyL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3I4OworCXVuc2lnbmVkIGxvbmcgX19yOTsKKwl1bnNpZ25lZCBsb25nIF9fcjEwOworCXVuc2lnbmVkIGxvbmcgX19yMTE7CisJdW5zaWduZWQgbG9uZyBfX3IxMjsKKwl1bnNpZ25lZCBsb25nIF9fcjEzOworCXVuc2lnbmVkIGxvbmcgX19yMTQ7CisJdW5zaWduZWQgbG9uZyBfX3IxNTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hTRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbTMyci9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1MzAyNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbTMyci9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvbTMyci9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIE5vIHNwZWNpYWwgc3R1ZmYgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQzYWRlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLCBoZW5jZSB0aGUgYWJzb2x1dGVseQorICogaW5zYW5lIGFtb3VudHMgb2YgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4KKyAqLworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkMFs0XTsKKworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJdW5zaWduZWQgY2hhcglfX3BhZDNbNF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisKKwl1bnNpZ25lZCBsb25nCXN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZwlfX3BhZDQ7CQkvKiBmdXR1cmUgcG9zc2libGUgc3RfYmxvY2tzIGhpZ2ggYml0cyAqLworCisJc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGVmNjJlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBPbiBtNjhrLCBzeXNfbW1hcDIgdXNlcyB0aGUgY3VycmVudCBwYWdlIHNpemUgYXMgdGhlIHNoaWZ0IGZhY3RvciAqLworI2RlZmluZSBfS0xJQkNfTU1BUDJfU0hJRlQJX19nZXRwYWdlc2hpZnQoKQorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1YzgxMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIHVzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBpbnQgX19kMjsKKwl1bnNpZ25lZCBpbnQgX19kMzsKKwl1bnNpZ25lZCBpbnQgX19kNDsKKwl1bnNpZ25lZCBpbnQgX19kNTsKKwl1bnNpZ25lZCBpbnQgX19kNjsKKwl1bnNpZ25lZCBpbnQgX19kNzsKKwl1bnNpZ25lZCBpbnQgX19hMjsKKwl1bnNpZ25lZCBpbnQgX19hMzsKKwl1bnNpZ25lZCBpbnQgX19hNDsKKwl1bnNpZ25lZCBpbnQgX19hNTsKKwl1bnNpZ25lZCBpbnQgX19mcDsJLyogYTYgKi8KKwl1bnNpZ25lZCBpbnQgX19zcDsJLyogYTcgKi8KKwl1bnNpZ25lZCBpbnQgX19yZXRhZGRyOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfS0xCSUNfQVJDSFNFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc5MTJhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9tNjhrL2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorLyogTm8gc3BlY2lhbCBzdHVmZiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTI1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5CisgKiBpbnNhbmUgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4KKyAqLworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkMVsyXTsKKworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJdW5zaWduZWQgY2hhcglfX3BhZDNbMl07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwYWZiNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogTUlQUyBoYXMgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgZm9yIHZmb3JrKCkgKi8KKyNkZWZpbmUgX0tMSUJDX1JFQUxfVkZPUksgMQorCisvKiBNSVBTIGRlZmluZXMgaXQncyBvd24gc3RhdGZzICovCisjZGVmaW5lIF9LTElCQ19TVEFURlNfRl9UWVBFXzMyQiAxCisKKy8qIE1JUFMgaGFzIG5vbnN0YW5kYXJkIHNvY2tldCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBfS0xJQkNfSEFTX0FSQ0hTT0NLRVRfSCAxCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaGZjbnRsLmggYi91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaGZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2MTgyMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoZmNudGwuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogYXJjaC9taXBzL2luY2x1ZGUva2xpYmMvYXJjaGZjbnRsLmgKKyAqCisgKiBPbiBNSVBTLCA8YXNtL2ZjbnRsLmg+IGlzbid0IHVzYWJsZSAoY29tcGlsaW5nIHN0cnVjdCBzdGF0IHdpdGgKKyAqIHRoZSBjb3JyZWN0IGRlZmluaXRpb25zIGRvZXNuJ3QgImp1c3Qgd29yayIpLCBzbyB3ZSBuZWVkIHRvIHByb3ZpZGUKKyAqIG91ciBvd24gZGVmaW5pdGlvbnMuCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSEZDTlRMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hGQ05UTF9ICisKKyNpZmRlZiBfQVNNX0ZDTlRMX0gJCS8qIFdlIHdlcmUgdG9vIGxhdGUhICovCisjIGVycm9yICI8YXNtL2ZjbnRsLmg+IGluY2x1ZGVkIGJlZm9yZSA8a2xpYmMvYXJjaGZjbnRsLmg+IgorI2VuZGlmCisjZGVmaW5lIF9BU01fRkNOVExfSAkJLyogS2VlcCA8YXNtL2ZjbnRsLmg+IGZyb20gZ2V0dGluZyBpbmNsdWRlZCAqLworCisjZGVmaW5lIE9fQUNDTU9ERQkweDAwMDMKKyNkZWZpbmUgT19SRE9OTFkJMHgwMDAwCisjZGVmaW5lIE9fV1JPTkxZCTB4MDAwMQorI2RlZmluZSBPX1JEV1IJCTB4MDAwMgorI2RlZmluZSBPX0FQUEVORAkweDAwMDgKKyNkZWZpbmUgT19TWU5DCQkweDAwMTAKKyNkZWZpbmUgT19OT05CTE9DSwkweDAwODAKKyNkZWZpbmUgT19DUkVBVCAgICAgICAgIDB4MDEwMAorI2RlZmluZSBPX1RSVU5DCQkweDAyMDAKKyNkZWZpbmUgT19FWENMCQkweDA0MDAKKyNkZWZpbmUgT19OT0NUVFkJMHgwODAwCisjZGVmaW5lIEZBU1lOQwkJMHgxMDAwCisjZGVmaW5lIE9fTEFSR0VGSUxFCTB4MjAwMAorI2RlZmluZSBPX0RJUkVDVAkweDgwMDAKKyNkZWZpbmUgT19ESVJFQ1RPUlkJMHgxMDAwMAorI2RlZmluZSBPX05PRk9MTE9XCTB4MjAwMDAKKyNkZWZpbmUgT19OT0FUSU1FCTB4NDAwMDAKKworI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCisKKyNkZWZpbmUgRl9EVVBGRAkJMAorI2RlZmluZSBGX0dFVEZECQkxCisjZGVmaW5lIEZfU0VURkQJCTIKKyNkZWZpbmUgRl9HRVRGTAkJMworI2RlZmluZSBGX1NFVEZMCQk0CisjZGVmaW5lIEZfR0VUTEsJCTE0CisjZGVmaW5lIEZfU0VUTEsJCTYKKyNkZWZpbmUgRl9TRVRMS1cJNworCisjZGVmaW5lIEZfU0VUT1dOCTI0CisjZGVmaW5lIEZfR0VUT1dOCTIzCisjZGVmaW5lIEZfU0VUU0lHCTEwCisjZGVmaW5lIEZfR0VUU0lHCTExCisKKyNkZWZpbmUgRl9HRVRMSzY0CTMzCisjZGVmaW5lIEZfU0VUTEs2NAkzNAorI2RlZmluZSBGX1NFVExLVzY0CTM1CisKKyNkZWZpbmUgRkRfQ0xPRVhFQwkxCisKKyNkZWZpbmUgRl9SRExDSwkJMAorI2RlZmluZSBGX1dSTENLCQkxCisjZGVmaW5lIEZfVU5MQ0sJCTIKKworI2RlZmluZSBGX0VYTENLCQk0CisjZGVmaW5lIEZfU0hMQ0sJCTgKKworI2RlZmluZSBGX0lOUFJPR1JFU1MJMTYKKworI2RlZmluZSBMT0NLX1NICQkxCisjZGVmaW5lIExPQ0tfRVgJCTIKKyNkZWZpbmUgTE9DS19OQgkJNAorI2RlZmluZSBMT0NLX1VOCQk4CisKKyNkZWZpbmUgTE9DS19NQU5ECTMyCisjZGVmaW5lIExPQ0tfUkVBRAk2NAorI2RlZmluZSBMT0NLX1dSSVRFCTEyOAorI2RlZmluZSBMT0NLX1JXCQkxOTIKKwordHlwZWRlZiBzdHJ1Y3QgZmxvY2sgeworCXNob3J0CWxfdHlwZTsKKwlzaG9ydAlsX3doZW5jZTsKKwlsb2ZmX3QJbF9zdGFydDsKKwlsb2ZmX3QJbF9sZW47CisJcGlkX3QJbF9waWQ7Cit9IGZsb2NrX3Q7CisKKyNkZWZpbmUgRl9MSU5VWF9TUEVDSUZJQ19CQVNFCTEwMjQKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiZTgzZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIGFyY2gvbWlwcy9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGxvbmcgX19zMDsKKwl1bnNpZ25lZCBsb25nIF9fczE7CisJdW5zaWduZWQgbG9uZyBfX3MyOworCXVuc2lnbmVkIGxvbmcgX19zMzsKKwl1bnNpZ25lZCBsb25nIF9fczQ7CisJdW5zaWduZWQgbG9uZyBfX3M1OworCXVuc2lnbmVkIGxvbmcgX19zNjsKKwl1bnNpZ25lZCBsb25nIF9fczc7CisJdW5zaWduZWQgbG9uZyBfX2dwOworCXVuc2lnbmVkIGxvbmcgX19zcDsKKwl1bnNpZ25lZCBsb25nIF9fczg7CisJdW5zaWduZWQgbG9uZyBfX3JhOworCXVuc2lnbmVkIGxvbmcgX19mMjA7CisJdW5zaWduZWQgbG9uZyBfX2YyMTsKKwl1bnNpZ25lZCBsb25nIF9fZjIyOworCXVuc2lnbmVkIGxvbmcgX19mMjM7CisJdW5zaWduZWQgbG9uZyBfX2YyNDsKKwl1bnNpZ25lZCBsb25nIF9fZjI1OworCXVuc2lnbmVkIGxvbmcgX19mMjY7CisJdW5zaWduZWQgbG9uZyBfX2YyNzsKKwl1bnNpZ25lZCBsb25nIF9fZjI4OworCXVuc2lnbmVkIGxvbmcgX19mMjk7CisJdW5zaWduZWQgbG9uZyBfX2YzMDsKKwl1bnNpZ25lZCBsb25nIF9fZjMxOworCXVuc2lnbmVkIGxvbmcgX19mY3IzMTsKKwl1bnNpZ25lZCBsb25nIF9fdW51c2VkOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Y2E3NTYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL21pcHMvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc29ja2V0LmggYi91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGFmMWIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHNvY2tldC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBhcmNoL21pcHMva2xpYmMvYXJjaHNvY2tldC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNPQ0tFVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU09DS0VUX0gKKworI2lmbmRlZiBTT0NLX1NUUkVBTQorIyBkZWZpbmUgU09DS19ER1JBTSAgICAgMQorIyBkZWZpbmUgU09DS19TVFJFQU0gICAgMgorIyBkZWZpbmUgU09DS19SQVcgICAgICAgMworIyBkZWZpbmUgU09DS19SRE0gICAgICAgNAorIyBkZWZpbmUgU09DS19TRVFQQUNLRVQgNQorIyBkZWZpbmUgU09DS19QQUNLRVQgICAgMTAKKyNlbmRpZgorCisjZW5kaWYgLyogX0tMSUJDX0FSQ0hTT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQ2MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworLyoKKyAqIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLCBoZW5jZSB0aGUgYWJzb2x1dGVseSBpbnNhbmUKKyAqIGFtb3VudHMgb2YgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4gIFRoZSBtZW1vcnkgbGF5b3V0IGlzIHRoZSBzYW1lIGFzIG9mCisgKiBzdHJ1Y3Qgc3RhdCBvZiB0aGUgNjQtYml0IGtlcm5lbCwgd2hpY2ggbWFrZXMgdGhpcyBvbmUgb2YgdGhlIHNhbmVzdAorICogMzItYml0IHN0cnVjdCBzdGF0cy4KKyAqLworCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgaW50CXN0X2RldjsKKwl1bnNpZ25lZCBsb25nCXN0X3BhZDBbM107CS8qIFJlc2VydmVkIGZvciBzdF9kZXYgZXhwYW5zaW9uICAqLworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKKworCW1vZGVfdAkJc3RfbW9kZTsKKwlubGlua190CQlzdF9ubGluazsKKworCXVpZF90CQlzdF91aWQ7CisJZ2lkX3QJCXN0X2dpZDsKKworCXVuc2lnbmVkIGludAlzdF9yZGV2OworCXVuc2lnbmVkIGxvbmcJc3RfcGFkMVszXTsJLyogUmVzZXJ2ZWQgZm9yIHN0X3JkZXYgZXhwYW5zaW9uICAqLworCisJbG9uZyBsb25nCXN0X3NpemU7CisKKwlzdHJ1Y3QgdGltZXNwZWMJCXN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjCQlzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYwkJc3RfY3RpbTsKKworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X3BhZDI7CisKKwlsb25nIGxvbmcJc3RfYmxvY2tzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHMvbWFjaGluZS9hc20uaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9tYWNoaW5lL2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjRiYzYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL21pcHMvbWFjaGluZS9hc20uaApAQCAtMCwwICsxLDExIEBACisvKgorICogYXJjaC9taXBzL2luY2x1ZGUvbWFjaGluZS9hc20uaAorICovCisKKyNpZm5kZWYgX01BQ0hJTkVfQVNNX0gKKyNkZWZpbmUgX01BQ0hJTkVfQVNNX0gKKworI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vYXNtLmg+CisKKyNlbmRpZgkJCQkvKiBfTUFDSElORV9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzL3NnaWRlZnMuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9zZ2lkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhOGFlOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9zZ2lkZWZzLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIGFyY2gvbWlwcy9pbmNsdWRlL3NnaWRlZnMuaAorICovCisKKy8qIFNvbWUgQUJJIGNvbnN0YW50cyAqLworCisjaWZuZGVmIF9TR0lERUZTX0gKKyNkZWZpbmUgX1NHSURFRlNfSAorCisjZGVmaW5lIF9NSVBTX0lTQV9NSVBTMSAxCisjZGVmaW5lIF9NSVBTX0lTQV9NSVBTMiAyCisjZGVmaW5lIF9NSVBTX0lTQV9NSVBTMyAzCisjZGVmaW5lIF9NSVBTX0lTQV9NSVBTNCA0CisjZGVmaW5lIF9NSVBTX0lTQV9NSVBTNSA1CisKKyNkZWZpbmUgX01JUFNfU0lNX0FCSTMyICAgICAgICAgMQorI2RlZmluZSBfTUlQU19TSU1fTkFCSTMyICAgICAgICAyCisjZGVmaW5lIF9NSVBTX1NJTV9BQkk2NCAgICAgICAgIDMKKworI2VuZGlmCQkJCS8qIF9TR0lERUZTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9zcGFjZXMuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9zcGFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY1MzBiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL3NwYWNlcy5oCkBAIC0wLDAgKzEgQEAKKy8qIEluY2x1ZGVkIGJ5IDxhc20vcGFnZS5oPiBidXQgbm90IGFjdHVhbGx5IG5lZWRlZCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzFjYjQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBNSVBTIGhhcyBub25zdGFuZGFyZCBzb2NrZXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgX0tMSUJDX0hBU19BUkNIU09DS0VUX0ggMQorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTBhZjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvbWlwczY0L2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorLyogTm8gc3BlY2lhbCBzdHVmZiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoc29ja2V0LmggYi91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzOTQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwczY0L2tsaWJjL2FyY2hzb2NrZXQuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogYXJjaC9taXBzNjQva2xpYmMvYXJjaHNvY2tldC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNPQ0tFVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU09DS0VUX0gKKworI2lmbmRlZiBTT0NLX1NUUkVBTQorIyBkZWZpbmUgU09DS19ER1JBTSAgICAgMQorIyBkZWZpbmUgU09DS19TVFJFQU0gICAgMgorIyBkZWZpbmUgU09DS19SQVcgICAgICAgMworIyBkZWZpbmUgU09DS19SRE0gICAgICAgNAorIyBkZWZpbmUgU09DS19TRVFQQUNLRVQgNQorIyBkZWZpbmUgU09DS19QQUNLRVQgICAgMTAKKyNlbmRpZgorCisjZW5kaWYgLyogX0tMSUJDX0FSQ0hTT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwczY0L2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZjlhZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwczY0L2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIGludAkJc3RfZGV2OworCXVuc2lnbmVkIGludAkJc3RfcGFkMFszXTsgLyogUmVzZXJ2ZWQgZm9yIHN0X2RldiBleHBhbnNpb24gKi8KKworCXVuc2lnbmVkIGxvbmcJCXN0X2lubzsKKworCW1vZGVfdAkJCXN0X21vZGU7CisJbmxpbmtfdAkJCXN0X25saW5rOworCisJdWlkX3QJCQlzdF91aWQ7CisJZ2lkX3QJCQlzdF9naWQ7CisKKwl1bnNpZ25lZCBpbnQJCXN0X3JkZXY7CisJdW5zaWduZWQgaW50CQlzdF9wYWQxWzNdOyAvKiBSZXNlcnZlZCBmb3Igc3RfcmRldiBleHBhbnNpb24gKi8KKworCW9mZl90CQkJc3Rfc2l6ZTsKKworCXN0cnVjdCB0aW1lc3BlYwkJc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMJCXN0X210aW07CisJc3RydWN0IHRpbWVzcGVjCQlzdF9jdGltOworCisJdW5zaWduZWQgaW50CQlzdF9ibGtzaXplOworCXVuc2lnbmVkIGludAkJc3RfcGFkMjsKKworCXVuc2lnbmVkIGxvbmcJCXN0X2Jsb2NrczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YmE5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBBbGwgZGVmYXVsdHMgKi8KKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWU5NDNlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL3BhcmlzYy9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCWRvdWJsZSByZWdzWzIxXTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2YWVlYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogYXJjaC9wYXJpc2MvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjZGVmaW5lIF9OU0lHICAgIDY0CisjZGVmaW5lIF9OU0lHX1NaIChfTlNJRyAvIExPTkdfQklUKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzaWdbX05TSUdfU1pdOworfSBzaWdzZXRfdDsKKworc3RydWN0IHNpZ2FjdGlvbiB7CisJX19zaWdoYW5kbGVyX3QJc2FfaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nCXNhX2ZsYWdzOworCXNpZ3NldF90CXNhX21hc2s7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGVmOGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CQkoc3RfZGV2KTsKKwl1bnNpZ25lZCBpbnQJCV9fcGFkMTsKKworCXVuc2lnbmVkIGludAkJX19zdF9pbm87CS8qIE5vdCBhY3R1YWxseSBmaWxsZWQgaW4gKi8KKwl1bnNpZ25lZCBpbnQJCXN0X21vZGU7CisJdW5zaWduZWQgaW50CQlzdF9ubGluazsKKwl1bnNpZ25lZCBpbnQJCXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJCXN0X2dpZDsKKwlfX3N0ZGV2NjQJCShzdF9yZGV2KTsKKwl1bnNpZ25lZCBpbnQJCV9fcGFkMjsKKwlzaWduZWQgbG9uZyBsb25nCXN0X3NpemU7CisJc2lnbmVkIGludAkJc3RfYmxrc2l6ZTsKKworCXNpZ25lZCBsb25nIGxvbmcJc3RfYmxvY2tzOworCXN0cnVjdCB0aW1lc3BlYwkJc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMJCXN0X210aW07CisJc3RydWN0IHRpbWVzcGVjCQlzdF9jdGltOworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9pbm87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTA0ZWVlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGMva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogQWxsIGRlZmF1bHRzICovCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3BwYy9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL3BwYy9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlOWVkNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogYXJjaC9wcGMvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fcjI7CisJdW5zaWduZWQgbG9uZyBfX3NwOworCXVuc2lnbmVkIGxvbmcgX19scjsKKwl1bnNpZ25lZCBsb25nIF9fY3I7CisJdW5zaWduZWQgbG9uZyBfX3IxMzsKKwl1bnNpZ25lZCBsb25nIF9fcjE0OworCXVuc2lnbmVkIGxvbmcgX19yMTU7CisJdW5zaWduZWQgbG9uZyBfX3IxNjsKKwl1bnNpZ25lZCBsb25nIF9fcjE3OworCXVuc2lnbmVkIGxvbmcgX19yMTg7CisJdW5zaWduZWQgbG9uZyBfX3IxOTsKKwl1bnNpZ25lZCBsb25nIF9fcjIwOworCXVuc2lnbmVkIGxvbmcgX19yMjE7CisJdW5zaWduZWQgbG9uZyBfX3IyMjsKKwl1bnNpZ25lZCBsb25nIF9fcjIzOworCXVuc2lnbmVkIGxvbmcgX19yMjQ7CisJdW5zaWduZWQgbG9uZyBfX3IyNTsKKwl1bnNpZ25lZCBsb25nIF9fcjI2OworCXVuc2lnbmVkIGxvbmcgX19yMjc7CisJdW5zaWduZWQgbG9uZyBfX3IyODsKKwl1bnNpZ25lZCBsb25nIF9fcjI5OworCXVuc2lnbmVkIGxvbmcgX19yMzA7CisJdW5zaWduZWQgbG9uZyBfX3IzMTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3BwYy9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL3BwYy9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzYWM5MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9wcGMvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL3BwYy9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzFmNGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BwYy9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMS4KKyAqLworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NCAoc3RfZGV2KTsJCS8qIERldmljZS4gKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfaW5vOwkvKiBGaWxlIHNlcmlhbCBudW1iZXIuICAqLworCXVuc2lnbmVkIGludCBzdF9tb2RlOwkJLyogRmlsZSBtb2RlLiAgKi8KKwl1bnNpZ25lZCBpbnQgc3Rfbmxpbms7CQkvKiBMaW5rIGNvdW50LiAgKi8KKwl1bnNpZ25lZCBpbnQgc3RfdWlkOwkJLyogVXNlciBJRCBvZiB0aGUgZmlsZSdzIG93bmVyLiAgKi8KKwl1bnNpZ25lZCBpbnQgc3RfZ2lkOwkJLyogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cC4gKi8KKwlfX3N0ZGV2NjQgKHN0X3JkZXYpOyAJCS8qIERldmljZSBudW1iZXIsIGlmIGRldmljZS4gICovCisJdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMjsKKwlsb25nIGxvbmcgc3Rfc2l6ZTsJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworCWxvbmcgc3RfYmxrc2l6ZTsJCS8qIE9wdGltYWwgYmxvY2sgc2l6ZSBmb3IgSS9PLiAgKi8KKworCWxvbmcgbG9uZyBzdF9ibG9ja3M7CQkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOwkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisJdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2M1NjMwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisjZGVmaW5lIF9LTElCQ19VU0VfUlRfU0lHIDEKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcHBjNjQva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNzcyOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjNjQva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBhcmNoL3BwYzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3IyOworCXVuc2lnbmVkIGxvbmcgX19zcDsKKwl1bnNpZ25lZCBsb25nIF9fbHI7CisJdW5zaWduZWQgbG9uZyBfX2NyOworCXVuc2lnbmVkIGxvbmcgX19yMTM7CisJdW5zaWduZWQgbG9uZyBfX3IxNDsKKwl1bnNpZ25lZCBsb25nIF9fcjE1OworCXVuc2lnbmVkIGxvbmcgX19yMTY7CisJdW5zaWduZWQgbG9uZyBfX3IxNzsKKwl1bnNpZ25lZCBsb25nIF9fcjE4OworCXVuc2lnbmVkIGxvbmcgX19yMTk7CisJdW5zaWduZWQgbG9uZyBfX3IyMDsKKwl1bnNpZ25lZCBsb25nIF9fcjIxOworCXVuc2lnbmVkIGxvbmcgX19yMjI7CisJdW5zaWduZWQgbG9uZyBfX3IyMzsKKwl1bnNpZ25lZCBsb25nIF9fcjI0OworCXVuc2lnbmVkIGxvbmcgX19yMjU7CisJdW5zaWduZWQgbG9uZyBfX3IyNjsKKwl1bnNpZ25lZCBsb25nIF9fcjI3OworCXVuc2lnbmVkIGxvbmcgX19yMjg7CisJdW5zaWduZWQgbG9uZyBfX3IyOTsKKwl1bnNpZ25lZCBsb25nIF9fcjMwOworCXVuc2lnbmVkIGxvbmcgX19yMzE7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzRjZWYwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvcHBjNjQvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcHBjNjQva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjNjQva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTEzMTZjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCWlub190CQlzdF9pbm87CisJbmxpbmtfdAkJc3Rfbmxpbms7CisJbW9kZV90CQlzdF9tb2RlOworCXVpZF90IAkJc3RfdWlkOworCWdpZF90IAkJc3RfZ2lkOworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJb2ZmX3QJCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgCXN0X2Jsa3NpemU7CisJdW5zaWduZWQgbG9uZyAgCXN0X2Jsb2NrczsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOwkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQ1OworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDY7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTcxYTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIEJvdGggczM5MCBhbmQgczM5MHggdXNlIHRoZSAiMzItYml0IiB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlICovCisjZGVmaW5lIF9LTElCQ19TVEFURlNfRl9UWVBFXzY0IDAKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODc4MGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBhcmNoL3MzOTAvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCisjaWZuZGVmIF9fczM5MHhfXworCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1aW50MzJfdCBfX2dyZWdzWzEwXTsJLyogZ2VuZXJhbCByZWdpc3RlcnMgcjYtcjE1ICovCisJdWludDY0X3QgX19mcHJlZ3NbMl07CS8qIGZwIHJlZ2lzdGVycyBmNCBhbmQgZjYgICAqLworfTsKKworI2Vsc2UgLyogX19zMzkweF9fICovCisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVpbnQ2NF90IF9fZ3JlZ3NbMTBdOyAvKiBnZW5lcmFsIHJlZ2lzdGVycyByNi1yMTUgKi8KKwl1aW50NjRfdCBfX2ZwcmVnc1s0XTsgLyogZnAgcmVnaXN0ZXJzIGYxLCBmMywgZjUsIGY3ICovCit9OworCisjZW5kaWYgLyogX19zMzkweF9fICovCisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zMzkwL2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTZiOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zMzkwL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9zMzkwL2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorLyogTm8gc3BlY2lhbCBzdHVmZiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNGM4MjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworI2lmbmRlZiBfX3MzOTB4X18KKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5CisgKiBpbnNhbmUgYW1vdW50cyBvZiBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLgorICovCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCXVuc2lnbmVkIGludAlfX3BhZDE7CisjZGVmaW5lIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTwkxCisJdW5zaWduZWQgbG9uZwlfX3N0X2lubzsKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisJdW5zaWduZWQgbG9uZwlzdF91aWQ7CisJdW5zaWduZWQgbG9uZwlzdF9naWQ7CisJX19zdGRldjY0CShzdF9yZGV2KTsKKwl1bnNpZ25lZCBpbnQJX19wYWQzOworCWxvbmcgbG9uZwlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkNFs0XTsKKwl1bnNpZ25lZCBsb25nCV9fcGFkNTsgICAgIC8qIGZ1dHVyZSBwb3NzaWJsZSBzdF9ibG9ja3MgaGlnaCBiaXRzICovCisJdW5zaWduZWQgbG9uZwlzdF9ibG9ja3M7ICAvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworfTsKKworI2Vsc2UgLyogX19zMzkweF9fICovCisKK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgbG9uZwlzdF9pbm87CisJdW5zaWduZWQgbG9uZwlzdF9ubGluazsKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisJdW5zaWduZWQgaW50CV9fcGFkMTsKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCXVuc2lnbmVkIGxvbmcJc3Rfc2l6ZTsKKwlzdHJ1Y3QgdGltZXNwZWMJc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMJc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMJc3RfY3RpbTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisJbG9uZwkJc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWRbM107Cit9OworCisjZW5kaWYgLyogX19zMzkweF9fICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5ZTNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBBbGwgZGVmYXVsdHMgKi8KKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5NzE2NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBhcmNoL3NoL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3I4OworCXVuc2lnbmVkIGxvbmcgX19yOTsKKwl1bnNpZ25lZCBsb25nIF9fcjEwOworCXVuc2lnbmVkIGxvbmcgX19yMTE7CisJdW5zaWduZWQgbG9uZyBfX3IxMjsKKwl1bnNpZ25lZCBsb25nIF9fcjEzOworCXVuc2lnbmVkIGxvbmcgX19yMTQ7CisJdW5zaWduZWQgbG9uZyBfX3IxNTsKKwl1bnNpZ25lZCBsb25nIF9fcHI7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0OGU1MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL3NoL2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorLyogTm8gc3BlY2lhbCBzdHVmZiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3NoL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL3NoL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzOTE4MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5CisgKiBpbnNhbmUgYW1vdW50cyBvZiBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLgorICovCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCXVuc2lnbmVkIGNoYXIJX19wYWQwWzRdOworCisJdW5zaWduZWQgbG9uZwlzdF9pbm87CisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgbG9uZwlzdF91aWQ7CisJdW5zaWduZWQgbG9uZwlzdF9naWQ7CisKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzRdOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCisJdW5zaWduZWQgbG9uZyBsb25nIHN0X2Jsb2NrczsKKworCXN0cnVjdCB0aW1lc3BlYwlzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhNmM0OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisjZGVmaW5lIF9LTElCQ19VU0VfUlRfU0lHIDEJLyogVXNlIHJ0Xyogc2lnbmFscyAqLworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjRkNmEyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGFyY2gvc3BhcmMvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fc3A7CisJdW5zaWduZWQgbG9uZyBfX2ZwOworCXVuc2lnbmVkIGxvbmcgX19wYzsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODQ1YTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogYXJjaC9zcGFyYy9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2RlZmluZSBfX1dBTlRfUE9TSVgxQl9TSUdOQUxTX18KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisKK3N0cnVjdCBzaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90CXNhX2hhbmRsZXI7CisJdW5zaWduZWQgbG9uZwlzYV9mbGFnczsKKwl2b2lkCQkoKnNhX3Jlc3RvcmVyKSh2b2lkKTsJLyogTm90IHVzZWQgYnkgTGludXgvU1BBUkMgKi8KKwlzaWdzZXRfdAlzYV9tYXNrOworfTsKKworLyogTm90IGFjdHVhbGx5IHVzZWQgYnkgdGhlIGtlcm5lbC4uLiAqLworI2RlZmluZSBTQV9SRVNUT1JFUgkweDgwMDAwMDAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwM2Q0MGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfaW5vOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCisJX19zdGRldjY0CShzdF9yZGV2KTsKKworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzhdOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgaW50CXN0X2Jsa3NpemU7CisKKwl1bnNpZ25lZCBjaGFyCV9fcGFkNFs4XTsKKwl1bnNpZ25lZCBpbnQJc3RfYmxvY2tzOworCisJc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisKKwl1bnNpZ25lZCBpbnQJX191bnVzZWQ0OworCXVuc2lnbmVkIGludAlfX3VudXNlZDU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMvbWFjaGluZS9hc20uaCBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMvbWFjaGluZS9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGZlOWIxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL2FzbS5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgkkTmV0QlNEOiBhc20uaCx2IDEuMTQgMjAwMi8wNy8yMCAwODozNzozMCBtcmcgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBBbGxlbiBCcmlnZ3MKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogR2xlYW5lZCBmcm9tIGxvY29yZS5zIGFuZCBzdW4zIGFzbS5oIHdoaWNoIGhhZCB0aGUgZm9sbG93aW5nIGNvcHlyaWdodHM6CisgKiBsb2NvcmUuczoKKyAqIENvcHlyaWdodCAoYykgMTk4OCBVbml2ZXJzaXR5IG9mIFV0YWguCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIHN1bjMvaW5jbHVkZS9hc20uaDoKKyAqIENvcHlyaWdodCAoYykgMTk5MyBBZGFtIEdsYXNzCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0FTTV9IXworI2RlZmluZSBfQVNNX0hfCisKKy8qIFB1bGwgaW4gQ0NGU1osIENDNjRGU1osIGFuZCBCSUFTIGZyb20gZnJhbWUuaCAqLworI2lmbmRlZiBfTE9DT1JFCisjZGVmaW5lIF9MT0NPUkUKKyNlbmRpZgorI2luY2x1ZGUgPG1hY2hpbmUvZnJhbWUuaD4KKworI2lmZGVmIF9fRUxGX18KKyNkZWZpbmUJX0NfTEFCRUwobmFtZSkJCW5hbWUKKyNlbHNlCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgX0NfTEFCRUwobmFtZSkJCV8gIyMgbmFtZQorI2Vsc2UKKyNkZWZpbmUgX0NfTEFCRUwobmFtZSkJCV8vKiovbmFtZQorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUJX0FTTV9MQUJFTChuYW1lKQluYW1lCisKKyNpZmRlZiBQSUMKKy8qCisgKiBQSUNfUFJPTE9HVUUoKSBpcyBha2luIHRvIHRoZSBjb21waWxlciBnZW5lcmF0ZWQgZnVuY3Rpb24gcHJvbG9ndWUgZm9yCisgKiBQSUMgY29kZS4gSXQgbGVhdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBHbG9iYWwgT2Zmc2V0IFRhYmxlIGluIERFU1QsCisgKiBjbG9iYmVyaW5nIHJlZ2lzdGVyIFRNUCBpbiB0aGUgcHJvY2Vzcy4KKyAqCisgKiBXZSBjYW4gdXNlIHR3byBjb2RlIHNlcXVlbmNlcy4gIFdlIGNhbiByZWFkIHRoZSAlcGMgb3IgdXNlIHRoZSBjYWxsCisgKiBpbnN0cnVjdGlvbiB0aGF0IHNhdmVzIHRoZSBwYyBpbiAlbzcuICBDYWxsIHJlcXVpcmVzIHRoZSBicmFuY2ggdW5pdCBhbmQKKyAqIElFVTEsIGFuZCBjbG9iYmVycyAlbzcgd2hpY2ggbmVlZHMgdG8gYmUgcmVzdG9yZWQuICBUaGlzIGluc3RydWN0aW9uCisgKiBzZXF1ZW5jZSB0YWtlcyBhYm91dCA0IGN5Y2xlcyBkdWUgdG8gaW5zdHJ1Y3Rpb24gaW50ZXJkZXBlbmRlbmNlLiAgUmVhZGluZworICogdGhlIHBjIHRha2VzIDQgY3ljbGVzIHRvIGRpc3BhdGNoIGFuZCBpcyBhbHdheXMgZGlzcGF0Y2hlZCBhbG9uZS4gIFRoYXQKKyAqIHNlcXVlbmNlIHRha2VzIDcgY3ljbGVzLgorICovCisjaWZkZWYgX19hcmNoNjRfXworI2RlZmluZSBQSUNfUFJPTE9HVUUoZGVzdCx0bXApIFwKKwltb3YgJW83LCB0bXA7IFwKKwlzZXRoaSAlaGkoX0dMT0JBTF9PRkZTRVRfVEFCTEVfLTQpLGRlc3Q7IFwKKwljYWxsIDBmOyBcCisJIG9yIGRlc3QsJWxvKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXys0KSxkZXN0OyBcCiswOiBcCisJYWRkIGRlc3QsJW83LGRlc3Q7IFwKKwltb3YgdG1wLCAlbzcKKyNlbHNlCisjZGVmaW5lIFBJQ19QUk9MT0dVRShkZXN0LHRtcCkgXAorCW1vdiAlbzcsdG1wOyAzOiBjYWxsIDRmOyBub3A7IDQ6IFwKKwlzZXRoaSAlaGkoX0NfTEFCRUwoX0dMT0JBTF9PRkZTRVRfVEFCTEVfKS0oM2ItLikpLGRlc3Q7IFwKKwlvciBkZXN0LCVsbyhfQ19MQUJFTChfR0xPQkFMX09GRlNFVF9UQUJMRV8pLSgzYi0uKSksZGVzdDsgXAorCWFkZCBkZXN0LCVvNyxkZXN0OyBtb3YgdG1wLCVvNworI2VuZGlmCisKKy8qCisgKiBQSUNDWV9TRVQoKSBkb2VzIHRoZSBlcXVpdmFsZW50IG9mIGEgYHNldCB2YXIsICVkZXN0JyBpbnN0cnVjdGlvbiBpbgorICogYSBQSUMtbGlrZSB3YXksIGJ1dCB3aXRob3V0IGludm9sdmluZyB0aGUgR2xvYmFsIE9mZnNldCBUYWJsZS4gVGhpcworICogb25seSB3b3JrcyBmb3IgVkFScyBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUgKmFuZCogaW4gdGhlIHRleHQgc2VnbWVudC4KKyAqLworI2lmZGVmIF9fYXJjaDY0X18KKyNkZWZpbmUgUElDQ1lfU0VUKHZhcixkZXN0LHRtcCkgXAorCTM6IHJkICVwYywgdG1wOyBhZGQgdG1wLCh2YXItM2IpLGRlc3QKKyNlbHNlCisjZGVmaW5lIFBJQ0NZX1NFVCh2YXIsZGVzdCx0bXApIFwKKwltb3YgJW83LHRtcDsgMzogY2FsbCA0Zjsgbm9wOyA0OiBcCisJYWRkICVvNywodmFyLTNiKSxkZXN0OyBtb3YgdG1wLCVvNworI2VuZGlmCisjZWxzZQorI2RlZmluZSBQSUNfUFJPTE9HVUUoZGVzdCx0bXApCisjZGVmaW5lIFBJQ0NZX09GRlNFVCh2YXIsZGVzdCx0bXApCisjZW5kaWYKKworI2RlZmluZSBGVFlQRSh4KQkJLnR5cGUgeCxAZnVuY3Rpb24KKyNkZWZpbmUgT1RZUEUoeCkJCS50eXBlIHgsQG9iamVjdAorCisjZGVmaW5lCV9FTlRSWShuYW1lKSBcCisJLmFsaWduIDQ7IC5nbG9ibCBuYW1lOyAucHJvYyAxOyBGVFlQRShuYW1lKTsgbmFtZToKKworI2lmZGVmIEdQUk9GCisvKiBzZWUgX01DT1VOVF9FTlRSWSBpbiBwcm9maWxlLmggKi8KKyNpZmRlZiBfX0VMRl9fCisjaWZkZWYgX19hcmNoNjRfXworI2RlZmluZSBfUFJPRl9QUk9MT0dVRSBcCisJLmRhdGE7IC5hbGlnbiA4OyAxOiAudWF3b3JkIDA7IC51YXdvcmQgMDsgXAorCS50ZXh0OyBzYXZlICVzcCwtQ0M2NEZTWiwlc3A7IHNldGhpICVoaSgxYiksJW8wOyBjYWxsIF9tY291bnQ7IFwKKwlvciAlbzAsJWxvKDFiKSwlbzA7IHJlc3RvcmUKKyNlbHNlCisjZGVmaW5lIF9QUk9GX1BST0xPR1VFIFwKKwkuZGF0YTsgLmFsaWduIDQ7IDE6IC5sb25nIDA7IFwKKwkudGV4dDsgc2F2ZSAlc3AsLTk2LCVzcDsgc2V0aGkgJWhpKDFiKSwlbzA7IGNhbGwgX21jb3VudDsgXAorCW9yICVvMCwlbG8oMWIpLCVvMDsgcmVzdG9yZQorI2VuZGlmCisjZWxzZQorI2lmZGVmIF9fYXJjaDY0X18KKyNkZWZpbmUgX1BST0ZfUFJPTE9HVUUgXAorCS5kYXRhOyAuYWxpZ24gODsgMTogLnVhd29yZCAwOyAudWF3b3JkIDA7IFwKKwkudGV4dDsgc2F2ZSAlc3AsLUNDNjRGU1osJXNwOyBzZXRoaSAlaGkoMWIpLCVvMDsgY2FsbCBtY291bnQ7IFwKKwlvciAlbzAsJWxvKDFiKSwlbzA7IHJlc3RvcmUKKyNlbHNlCisjZGVmaW5lCV9QUk9GX1BST0xPR1VFIFwKKwkuZGF0YTsgLmFsaWduIDQ7IDE6IC5sb25nIDA7IFwKKwkudGV4dDsgc2F2ZSAlc3AsLTk2LCVzcDsgc2V0aGkgJWhpKDFiKSwlbzA7IGNhbGwgbWNvdW50OyBcCisJb3IgJW8wLCVsbygxYiksJW8wOyByZXN0b3JlCisjZW5kaWYKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX1BST0ZfUFJPTE9HVUUKKyNlbmRpZgorCisjZGVmaW5lIEVOVFJZKG5hbWUpCQlfRU5UUlkoX0NfTEFCRUwobmFtZSkpOyBfUFJPRl9QUk9MT0dVRQorI2RlZmluZSBFTlRSWV9OT1BST0ZJTEUobmFtZSkJX0VOVFJZKF9DX0xBQkVMKG5hbWUpKQorI2RlZmluZQlBU0VOVFJZKG5hbWUpCQlfRU5UUlkoX0FTTV9MQUJFTChuYW1lKSk7IF9QUk9GX1BST0xPR1VFCisjZGVmaW5lCUZVTkMobmFtZSkJCUFTRU5UUlkobmFtZSkKKyNkZWZpbmUgUk9EQVRBKG5hbWUpCQkuYWxpZ24gNDsgLnRleHQ7IC5nbG9ibCBfQ19MQUJFTChuYW1lKTsgXAorCQkJCU9UWVBFKF9DX0xBQkVMKG5hbWUpKTsgX0NfTEFCRUwobmFtZSk6CisKKyNkZWZpbmUgQVNNU1RSCQkJLmFzY2l6CisKKyNkZWZpbmUgUkNTSUQobmFtZSkJCS5hc2NpeiBuYW1lCisKKyNpZmRlZiBfX0VMRl9fCisjZGVmaW5lCVdFQUtfQUxJQVMoYWxpYXMsc3ltKQkJCQkJCVwKKwkud2VhayBhbGlhczsJCQkJCQkJXAorCWFsaWFzID0gc3ltCisjZW5kaWYKKworLyoKKyAqIFdBUk5fUkVGRVJFTkNFUzogY3JlYXRlIGEgd2FybmluZyBpZiB0aGUgc3BlY2lmaWVkIHN5bWJvbCBpcyByZWZlcmVuY2VkLgorICovCisjaWZkZWYgX19FTEZfXworI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lCVdBUk5fUkVGRVJFTkNFUyhfc3ltLF9tc2cpCQkJCVwKKwkuc2VjdGlvbiAuZ251Lndhcm5pbmcuICMjIF9zeW0gOyAuYXNjaWkgX21zZyA7IC50ZXh0CisjZWxzZQorI2RlZmluZQlXQVJOX1JFRkVSRU5DRVMoX3N5bSxfbXNnKQkJCQlcCisJLnNlY3Rpb24gLmdudS53YXJuaW5nLi8qKi9fc3ltIDsgLmFzY2lpIF9tc2cgOyAudGV4dAorI2VuZGlmCQkJCS8qIF9fU1REQ19fICovCisjZWxzZQorI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lCV9fU1RSSU5HKHgpCQkJI3gKKyNkZWZpbmUJV0FSTl9SRUZFUkVOQ0VTKHN5bSxtc2cpCQkJCQlcCisJLnN0YWJzIG1zZyAjIyAsMzAsMCwwLDAgOwkJCQkJXAorCS5zdGFicyBfX1NUUklORyhfICMjIHN5bSkgIyMgLDEsMCwwLDAKKyNlbHNlCisjZGVmaW5lCV9fU1RSSU5HKHgpCQkJIngiCisjZGVmaW5lCVdBUk5fUkVGRVJFTkNFUyhzeW0sbXNnKQkJCQkJXAorCS5zdGFicyBtc2csMzAsMCwwLDAgOwkJCQkJCVwKKwkuc3RhYnMgX19TVFJJTkcoXy8qKi9zeW0pLDEsMCwwLDAKKyNlbmRpZgkJCQkvKiBfX1NURENfXyAqLworI2VuZGlmCQkJCS8qIF9fRUxGX18gKi8KKworI2VuZGlmCQkJCS8qIF9BU01fSF8gKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMvbWFjaGluZS9mcmFtZS5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiOWM0NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMvbWFjaGluZS9mcmFtZS5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKgkkTmV0QlNEOiBmcmFtZS5oLHYgMS40IDIwMDEvMTIvMDQgMDA6MDU6MDUgZGFycmVuciBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMgRW5naW5lZXJpbmcgZ3JvdXAKKyAqIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgdW5kZXIgREFSUEEgY29udHJhY3QgQkcgOTEtNjYgYW5kCisgKiBjb250cmlidXRlZCB0byBCZXJrZWxleS4KKyAqCisgKiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZnJhbWUuaAk4LjEgKEJlcmtlbGV5KSA2LzExLzkzCisgKi8KKworI2lmbmRlZiBfTUFDSElORV9GUkFNRV9ICisjZGVmaW5lIF9NQUNISU5FX0ZSQU1FX0gKKworI2lmZGVmIF9fQVNTRU1CTFlfXworIyBkZWZpbmUgX0xPQ09SRQorI2VuZGlmCisKKyNpZm5kZWYgX0xPQ09SRQorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKgorICogU3BhcmMgc3RhY2sgZnJhbWUgZm9ybWF0LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgY29udGVudHMgb2YgZWFjaCBzdGFjayBmcmFtZSBtYXkgYmUgaGVsZCBvbmx5IGluCisgKiBtYWNoaW5lIHJlZ2lzdGVyIHdpbmRvd3MuICBJbiBvcmRlciB0byBnZXQgYW4gYWNjdXJhdGUgcGljdHVyZQorICogb2YgdGhlIGZyYW1lLCB5b3UgbXVzdCBmaXJzdCBmb3JjZSB0aGUga2VybmVsIHRvIHdyaXRlIGFueSBzdWNoCisgKiB3aW5kb3dzIHRvIHRoZSBzdGFjay4KKyAqLworI2lmbmRlZiBfTE9DT1JFCisjaWZuZGVmIFNVTjRVCitzdHJ1Y3QgZnJhbWUgeworCWludDMyX3QgZnJfbG9jYWxbOF07CS8qIHNwYWNlIHRvIHNhdmUgbG9jYWxzICglbDAuLiVsNykgKi8KKwlpbnQzMl90IGZyX2FyZ1s2XTsJLyogc3BhY2UgdG8gc2F2ZSBhcmd1bWVudHMgKCVpMC4uJWk1KSAqLworCXN0cnVjdCBmcmFtZSAqZnJfZnA7CS8qIHNwYWNlIHRvIHNhdmUgZnJhbWUgcG9pbnRlciAoJWk2KSAqLworCWludDMyX3QgZnJfcGM7CQkvKiBzcGFjZSB0byBzYXZlIHJldHVybiBwYyAoJWk3KSAqLworCS8qCisJICogU3VuT1MgcmVzZXJ2ZXMgYW5vdGhlciA4IHdvcmRzIGhlcmU7IHRoaXMgaXMgcG9pbnRsZXNzCisJICogYnV0IHdlIGRvIGl0IGZvciBjb21wYXRpYmlsaXR5LgorCSAqLworCWludDMyX3QgZnJfeHh4OwkJLyogYHN0cnVjdHVyZSByZXR1cm4gcG9pbnRlcicgKHVudXNlZCkgKi8KKwlpbnQzMl90IGZyX2FyZ2RbNl07CS8qIGBhcmcgZHVtcCBhcmVhJyAobHVuYWN5KSAqLworCWludDMyX3QgZnJfYXJneFsxXTsJLyogYXJnIGV4dGVuc2lvbiAoYXJncyA3Li5uOyB2YXJpYWJsZSBzaXplKSAqLworfTsKKyNlbHNlCitzdHJ1Y3QgZnJhbWUzMiB7CisJaW50MzJfdCBmcl9sb2NhbFs4XTsJLyogc3BhY2UgdG8gc2F2ZSBsb2NhbHMgKCVsMC4uJWw3KSAqLworCWludDMyX3QgZnJfYXJnWzZdOwkvKiBzcGFjZSB0byBzYXZlIGFyZ3VtZW50cyAoJWkwLi4laTUpICovCisJdWludDMyX3QgZnJfZnA7CS8qIHNwYWNlIHRvIHNhdmUgZnJhbWUgcG9pbnRlciAoJWk2KSAqLworCXVpbnQzMl90IGZyX3BjOwkvKiBzcGFjZSB0byBzYXZlIHJldHVybiBwYyAoJWk3KSAqLworCS8qCisJICogU3VuT1MgcmVzZXJ2ZXMgYW5vdGhlciA4IHdvcmRzIGhlcmU7IHRoaXMgaXMgcG9pbnRsZXNzCisJICogYnV0IHdlIGRvIGl0IGZvciBjb21wYXRpYmlsaXR5LgorCSAqLworCWludDMyX3QgZnJfeHh4OwkJLyogYHN0cnVjdHVyZSByZXR1cm4gcG9pbnRlcicgKHVudXNlZCkgKi8KKwlpbnQzMl90IGZyX2FyZ2RbNl07CS8qIGBhcmcgZHVtcCBhcmVhJyAobHVuYWN5KSAqLworCWludDMyX3QgZnJfYXJneFsxXTsJLyogYXJnIGV4dGVuc2lvbiAoYXJncyA3Li5uOyB2YXJpYWJsZSBzaXplKSAqLworfTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDQ0ZTWiAoQyBDb21waWxlciBGcmFtZSBTaVplKSBpcyB0aGUgc2l6ZSBvZiBhIHN0YWNrIGZyYW1lIHJlcXVpcmVkIGlmCisgKiBhIGZ1bmN0aW9uIGlzIHRvIGNhbGwgQyBjb2RlLiAgSXQgc2hvdWxkIGJlIGp1c3QgNjQsIGJ1dCBTdW4gZGVmaW5lZAorICogdGhlaXIgZnJhbWUgd2l0aCBzcGFjZSB0byBob2xkIGFyZ3VtZW50cyAwIHRocm91Z2ggNSAocGx1cyBzb21lIGp1bmspLAorICogYW5kIHZhcmFyZ3Mgcm91dGluZXMgKHN1Y2ggYXMga3ByaW50ZikgZGVtYW5kIHRoaXMsIGFuZCBnY2MgdXNlcyB0aGlzCisgKiBhcmVhIGF0IHRpbWVzIGFueXdheS4KKyAqLworI2RlZmluZSBDQ0ZTWgkJOTYKKworLyoKKyAqIFNwYXJjIHY5IHN0YWNrIGZyYW1lIGZvcm1hdC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc3RhY2sgZnJhbWUgbWF5IGJlIGhlbGQgb25seSBpbgorICogbWFjaGluZSByZWdpc3RlciB3aW5kb3dzLiAgSW4gb3JkZXIgdG8gZ2V0IGFuIGFjY3VyYXRlIHBpY3R1cmUKKyAqIG9mIHRoZSBmcmFtZSwgeW91IG11c3QgZmlyc3QgZm9yY2UgdGhlIGtlcm5lbCB0byB3cml0ZSBhbnkgc3VjaAorICogd2luZG93cyB0byB0aGUgc3RhY2suCisgKgorICogVjkgZnJhbWVzIGhhdmUgYW4gb2RkIGJpYXMsIHNvIHlvdSBjYW4gdGFsbCBhIHY5IGZyYW1lIGZyb20KKyAqIGEgdjggZnJhbWUgYnkgdGVzdGluZyB0aGUgc3RhY2sgcG9pbnRlcidzIGxzYi4KKyAqLworI2lmICFkZWZpbmVkKF9MT0NPUkUpICYmICFkZWZpbmVkKF9MSUJDKQorc3RydWN0IGZyYW1lNjQgeworCWludDY0X3QgZnJfbG9jYWxbOF07CS8qIHNwYWNlIHRvIHNhdmUgbG9jYWxzICglbDAuLiVsNykgKi8KKwlpbnQ2NF90IGZyX2FyZ1s2XTsJLyogc3BhY2UgdG8gc2F2ZSBhcmd1bWVudHMgKCVpMC4uJWk1KSAqLworCXVpbnQ2NF90IGZyX2ZwOwkJLyogc3BhY2UgdG8gc2F2ZSBmcmFtZSBwb2ludGVyICglaTYpICovCisJdWludDY0X3QgZnJfcGM7CQkvKiBzcGFjZSB0byBzYXZlIHJldHVybiBwYyAoJWk3KSAqLworCS8qCisJICogU1ZSNCByZXNlcnZlcyBhIGJ1bmNoIG9mIGV4dHJhIHN0dWZmLgorCSAqLworCWludDY0X3QgZnJfYXJnZFs2XTsJLyogYHJlZ2lzdGVyIHNhdmUgYXJlYScgKGx1bmFjeSkgKi8KKwlpbnQ2NF90IGZyX2FyZ3hbMF07CS8qIGFyZyBleHRlbnNpb24gKGFyZ3MgNy4ubjsgdmFyaWFibGUgc2l6ZSkgKi8KK307CisKKyNkZWZpbmUgdjluZXh0X2ZyYW1lKGYpCQkoKHN0cnVjdCBmcmFtZTY0KikoZi0+ZnJfZnArQklBUykpCisjZW5kaWYKKworLyoKKyAqIENDNjRGU1ogKEMgQ29tcGlsZXIgNjQtYml0IEZyYW1lIFNpWmUpIGlzIHRoZSBzaXplIG9mIGEgc3RhY2sgZnJhbWUgdXNlZAorICogYnkgdGhlIGNvbXBpbGVyIGluIDY0LWJpdCBtb2RlLiAgSXQgaXMgKDE2KSo4OyBzcGFjZSBmb3IgOCBpbnMsIDggb3V0cy4KKyAqLworI2RlZmluZSBDQzY0RlNaCQkxNzYKKworLyoKKyAqIHY5IHN0YWNrcyBhbGwgaGF2ZSBhIGJpYXMgb2YgMjA0NyBhZGRlZCB0byB0aGUgJXNwIGFuZCAlZnAsIHNvIHlvdSBjYW4gZWFzaWx5CisgKiBkZXRlY3QgaXQgYnkgdGVzdGluZyB0aGUgcmVnaXN0ZXIgZm9yIGFuIG9kZCB2YWx1ZS4gIFdoeSAySy0xIEkgZG9uJ3Qga25vdy4KKyAqLworI2RlZmluZSBCSUFTCSgyMDQ4LTEpCisKKyNlbmRpZiAvKiBfTUFDSElORV9GUkFNRV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL21hY2hpbmUvdHJhcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL3RyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM3OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL3RyYXAuaApAQCAtMCwwICsxLDE0MCBAQAorLyoJJE5ldEJTRDogdHJhcC5oLHYgMS4xMSAxOTk5LzAxLzIwIDAwOjE1OjA4IHBrIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcyBFbmdpbmVlcmluZyBncm91cAorICogYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSB1bmRlciBEQVJQQSBjb250cmFjdCBCRyA5MS02NiBhbmQKKyAqIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5LgorICoKKyAqIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0cmFwLmgJOC4xIChCZXJrZWxleSkgNi8xMS85MworICovCisvKgorICogU3VuNG0gc3VwcG9ydCBieSBBYXJvbiBCcm93biwgSGFydmFyZCBVbml2ZXJzaXR5LgorICogQ2hhbmdlcyBDb3B5cmlnaHQgKGMpIDE5OTUgVGhlIFByZXNpZGVudCBhbmQgRmVsbG93cyBvZiBIYXJ2YXJkIENvbGxlZ2UuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpZm5kZWYJX01BQ0hJTkVfVFJBUF9ICisjZGVmaW5lCV9NQUNISU5FX1RSQVBfSAorCisvKgl0cmFwCQl2ZWMJICAocHJpKSBkZXNjcmlwdGlvbgkqLworI2RlZmluZQlUX1JFU0VUCQkweDAwCS8qICgxKSBub3QgYWN0dWFsbHkgdmVjdG9yZWQ7IGp1bXBzIHRvIDAgKi8KKyNkZWZpbmUJVF9URVhURkFVTFQJMHgwMQkvKiAoMikgYWRkcmVzcyBmYXVsdCBkdXJpbmcgaW5zdHIgZmV0Y2ggKi8KKyNkZWZpbmUJVF9JTExJTlNUCTB4MDIJLyogKDMpIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUJVF9QUklWSU5TVAkweDAzCS8qICg0KSBwcml2aWxlZ2VkIGluc3RydWN0aW9uICovCisjZGVmaW5lCVRfRlBESVNBQkxFRAkweDA0CS8qICg1KSBmcCBpbnN0ciB3aGlsZSBmcCBkaXNhYmxlZCAqLworI2RlZmluZQlUX1dJTk9GCQkweDA1CS8qICg2KSByZWdpc3RlciB3aW5kb3cgb3ZlcmZsb3cgKi8KKyNkZWZpbmUJVF9XSU5VRgkJMHgwNgkvKiAoNykgcmVnaXN0ZXIgd2luZG93IHVuZGVyZmxvdyAqLworI2RlZmluZQlUX0FMSUdOCQkweDA3CS8qICg4KSBhZGRyZXNzIG5vdCBwcm9wZXJseSBhbGlnbmVkICovCisjZGVmaW5lCVRfRlBFCQkweDA4CS8qICg5KSBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gKi8KKyNkZWZpbmUJVF9EQVRBRkFVTFQJMHgwOQkvKiAoMTApIGFkZHJlc3MgZmF1bHQgZHVyaW5nIGRhdGEgZmV0Y2ggKi8KKyNkZWZpbmUJVF9UQUdPRgkJMHgwYQkvKiAoMTEpIHRhZyBvdmVyZmxvdyAqLworLyoJCQkweDBiCSAgIHVudXNlZCAqLworLyoJCQkweDBjCSAgIHVudXNlZCAqLworLyoJCQkweDBkCSAgIHVudXNlZCAqLworLyoJCQkweDBlCSAgIHVudXNlZCAqLworLyoJCQkweDBmCSAgIHVudXNlZCAqLworLyoJCQkweDEwCSAgIHVudXNlZCAqLworI2RlZmluZQlUX0wxSU5UCQkweDExCS8qICgyNykgbGV2ZWwgMSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MMklOVAkJMHgxMgkvKiAoMjYpIGxldmVsIDIgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDNJTlQJCTB4MTMJLyogKDI1KSBsZXZlbCAzIGludGVycnVwdCAqLworI2RlZmluZQlUX0w0SU5UCQkweDE0CS8qICgyNCkgbGV2ZWwgNCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MNUlOVAkJMHgxNQkvKiAoMjMpIGxldmVsIDUgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDZJTlQJCTB4MTYJLyogKDIyKSBsZXZlbCA2IGludGVycnVwdCAqLworI2RlZmluZQlUX0w3SU5UCQkweDE3CS8qICgyMSkgbGV2ZWwgNyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MOElOVAkJMHgxOAkvKiAoMjApIGxldmVsIDggaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDlJTlQJCTB4MTkJLyogKDE5KSBsZXZlbCA5IGludGVycnVwdCAqLworI2RlZmluZQlUX0wxMElOVAkweDFhCS8qICgxOCkgbGV2ZWwgMTAgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDExSU5UCTB4MWIJLyogKDE3KSBsZXZlbCAxMSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MMTJJTlQJMHgxYwkvKiAoMTYpIGxldmVsIDEyIGludGVycnVwdCAqLworI2RlZmluZQlUX0wxM0lOVAkweDFkCS8qICgxNSkgbGV2ZWwgMTMgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDE0SU5UCTB4MWUJLyogKDE0KSBsZXZlbCAxNCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MMTVJTlQJMHgxZgkvKiAoMTMpIGxldmVsIDE1IGludGVycnVwdCAqLworLyoJCQkweDIwCSAgIHVudXNlZCAqLworLyoJdGhyb3VnaAkJMHgyMwkgICB1bnVzZWQgKi8KKyNkZWZpbmUJVF9DUERJU0FCTEVECTB4MjQJLyogKDUpIGNvcHJvY2Vzc29yIGluc3RyIHdoaWxlIGRpc2FibGVkICovCisjZGVmaW5lCVRfVU5JTVBMRkxVU0gJMHgyNQkvKiBVbmltcGxlbWVudGVkIEZMVVNIICovCisvKgl0aHJvdWdoCQkweDI3CSAgIHVudXNlZCAqLworI2RlZmluZQlUX0NQRVhDRVBUSU9OCTB4MjgJLyogKDkpIGNvcHJvY2Vzc29yIGV4Y2VwdGlvbiAqLworLyoJCQkweDI5CSAgIHVudXNlZCAqLworI2RlZmluZSBUX0lESVYwCQkweDJhCS8qIGRpdmlkZSBieSB6ZXJvIChmcm9tIGh3IFtzdV1kaXYgaW5zdHIpICovCisjZGVmaW5lIFRfU1RPUkVCVUZGQVVMVAkweDJiCS8qIFN1cGVyU1BBUkM6IFN0b3JlIGJ1ZmZlciBjb3B5LWJhY2sgZmF1bHQgKi8KKy8qCQkJMHgyYwkgICB1bnVzZWQgKi8KKy8qCXRocm91Z2gJCTB4N2YJICAgdW51c2VkICovCisKKy8qIGJlZ2lubmluZyBvZiBgdXNlcicgdmVjdG9ycyAoZnJvbSB0cmFwIGluc3RydWN0aW9ucykgLSBhbGwgcHJpb3JpdHkgMTIgKi8KKyNkZWZpbmUJVF9TVU5fU1lTQ0FMTAkweDgwCS8qIHN5c3RlbSBjYWxsICovCisjZGVmaW5lCVRfQlJFQUtQT0lOVAkweDgxCS8qIGJyZWFrcG9pbnQgYGluc3RydWN0aW9uJyAqLworI2RlZmluZQlUX0RJVjAJCTB4ODIJLyogZGl2aXNpb24gcm91dGluZSB3YXMgaGFuZGVkIDAgKi8KKyNkZWZpbmUJVF9GTFVTSFdJTgkweDgzCS8qIGZsdXNoIHdpbmRvd3MgKi8KKyNkZWZpbmUJVF9DTEVBTldJTgkweDg0CS8qIHByb3ZpZGUgY2xlYW4gd2luZG93cyAqLworI2RlZmluZQlUX1JBTkdFQ0hFQ0sJMHg4NQkvKiA/ICovCisjZGVmaW5lCVRfRklYQUxJR04JMHg4NgkvKiBmaXggdXAgdW5hbGlnbmVkIGFjY2Vzc2VzICovCisjZGVmaW5lCVRfSU5UT0YJCTB4ODcJLyogaW50ZWdlciBvdmVyZmxvdyA/ICovCisjZGVmaW5lCVRfU1ZSNF9TWVNDQUxMCTB4ODgJLyogU1ZSNCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZQlUX0JTRF9TWVNDQUxMCTB4ODkJLyogQlNEIHN5c3RlbSBjYWxsICovCisjZGVmaW5lCVRfS0dEQl9FWEVDCTB4OGEJLyogZm9yIGtlcm5lbCBnZGIgKi8KKworLyogMHg4Yi4uMHhmZiBhcmUgY3VycmVudGx5IHVuYWxsb2NhdGVkLCBleGNlcHQgdGhlIGZvbGxvd2luZyAqLworI2RlZmluZSBUX1NWUjRfR0VUQ0MJCTB4YTAKKyNkZWZpbmUgVF9TVlI0X1NFVENDCQkweGExCisjZGVmaW5lIFRfU1ZSNF9HRVRQU1IJCTB4YTIKKyNkZWZpbmUgVF9TVlI0X1NFVFBTUgkJMHhhMworI2RlZmluZSBUX1NWUjRfR0VUSFJUSU1FCTB4YTQKKyNkZWZpbmUgVF9TVlI0X0dFVEhSVlRJTUUJMHhhNQorI2RlZmluZSBUX1NWUjRfR0VUSFJFU1RJTUUJMHhhNworCisjaWZkZWYgX0tFUk5FTAkJCS8qIHBzZXVkbyB0cmFwcyBmb3IgbG9jb3JlLnMgKi8KKyNkZWZpbmUJVF9SV1JFVAkJLTEJLyogbmVlZCBmaXJzdCB1c2VyIHdpbmRvdyBmb3IgdHJhcCByZXR1cm4gKi8KKyNkZWZpbmUJVF9BU1QJCS0yCS8qIG5vLW9wLCBqdXN0IG5lZWRlZCByZXNjaGVkdWxlIG9yIHByb2ZpbGUgKi8KKyNlbmRpZgorCisvKiBmbGFncyB0byBzeXN0ZW0gY2FsbCAoZmxhZ3MgaW4gJWcxIGFsb25nIHdpdGggc3lzY2FsbCBudW1iZXIpICovCisjZGVmaW5lCVNZU0NBTExfRzJSRkxBRwkweDQwMAkvKiBvbiBzdWNjZXNzLCByZXR1cm4gdG8gJWcyIHJhdGhlciB0aGFuIG5wYyAqLworI2RlZmluZQlTWVNDQUxMX0c3UkZMQUcJMHg4MDAJLyogdXNlICVnNyBhcyBhYm92ZSAoZGVwcmVjYXRlZCkgKi8KKworLyoKKyAqIGBzb2Z0d2FyZSB0cmFwJyBtYWNyb3MgdG8ga2VlcCBwZW9wbGUgaGFwcHkgKHNwYXJjIHY4IG1hbnVhbCBzYXlzIG5vdAorICogdG8gc2V0IHRoZSB1cHBlciBiaXRzKS4KKyAqLworI2RlZmluZQlTVF9CUkVBS1BPSU5UCShUX0JSRUFLUE9JTlQgJiAweDdmKQorI2RlZmluZQlTVF9ESVYwCQkoVF9ESVYwICYgMHg3ZikKKyNkZWZpbmUJU1RfRkxVU0hXSU4JKFRfRkxVU0hXSU4gJiAweDdmKQorI2RlZmluZQlTVF9TWVNDQUxMCShUX1NVTl9TWVNDQUxMICYgMHg3ZikKKworI2VuZGlmCQkJCS8qIF9NQUNISU5FX1RSQVBfSF8gKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjNjQva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGMwMDMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjNjQva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKyNkZWZpbmUgX0tMSUJDX1VTRV9SVF9TSUcgMQkvKiBVc2UgcnRfKiBzaWduYWxzICovCisjZGVmaW5lIF9LTElCQ19ORUVEU19TQV9SRVNUT1JFUiAxIC8qIE5lZWQgYSByZXN0b3JlciBmdW5jdGlvbiAqLworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYzY0L2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4MjViZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGFyY2gvc3BhcmM2NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGxvbmcgX19zcDsKKwl1bnNpZ25lZCBsb25nIF9fZnA7CisJdW5zaWduZWQgbG9uZyBfX3BjOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjNjQva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGE1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjNjQva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBhcmNoL3NwYXJjNjQvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNkZWZpbmUgX19XQU5UX1BPU0lYMUJfU0lHTkFMU19fCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorCisvKiBOb3QgYWN0dWFsbHkgdXNlZCBieSB0aGUga2VybmVsLi4uICovCisjZGVmaW5lIFNBX1JFU1RPUkVSCTB4ODAwMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3NwYXJjNjQva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmIyYTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjNjQva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCXVuc2lnbmVkIGludAlfX3BhZDA7CisKKwlfX3N0ZGV2NjQgKHN0X3JkZXYpOworCWxvbmcJCXN0X3NpemU7CisJbG9uZwkJc3RfYmxrc2l6ZTsKKwlsb25nCQlzdF9ibG9ja3M7CisKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKworCXVuc2lnbmVkIGxvbmcgX191bnVzZWRbM107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGEyYTZkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gveDg2XzY0L2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogeDg2LTY0IGRvZXNuJ3QgcHJvdmlkZSBhIGRlZmF1bHQgc2lncmV0dXJuLiAqLworI2RlZmluZSBfS0xJQkNfTkVFRFNfU0FfUkVTVE9SRVIgMQorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGZjNjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGFyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3JieDsKKwl1bnNpZ25lZCBsb25nIF9fcnNwOworCXVuc2lnbmVkIGxvbmcgX19yYnA7CisJdW5zaWduZWQgbG9uZyBfX3IxMjsKKwl1bnNpZ25lZCBsb25nIF9fcjEzOworCXVuc2lnbmVkIGxvbmcgX19yMTQ7CisJdW5zaWduZWQgbG9uZyBfX3IxNTsKKwl1bnNpZ25lZCBsb25nIF9fcmlwOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhlYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBhcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIFRoZSB4ODYtNjQgaGVhZGVycyBkZWZpbmVzIE5TSUcgMzIsIGJ1dCBpdCdzIGFjdHVhbGx5IDY0ICovCisjdW5kZWYgIF9OU0lHCisjdW5kZWYgIE5TSUcKKyNkZWZpbmUgX05TSUcgNjQKKyNkZWZpbmUgTlNJRyAgX05TSUcKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE2OGFjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCXVuc2lnbmVkIGludAlfX3BhZDA7CisJX19zdGRldjY0CShzdF9yZGV2KTsKKwlsb25nCQlzdF9zaXplOworCWxvbmcJCXN0X2Jsa3NpemU7CisJbG9uZwkJc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworICAJbG9uZwkJX191bnVzZWRbM107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L3N5cy9pby5oIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQvc3lzL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwY2E0OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L3N5cy9pby5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNCBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHN5cy9pby5oIGZvciB0aGUgaTM4NiBhcmNoaXRlY3R1cmUKKyAqCisgKiBCYXNpYyBJL08gbWFjcm9zCisgKi8KKworI2lmbmRlZiBfU1lTX0lPX0gKKyNkZWZpbmUgX1NZU19JT19IIDEKKworLyogSS9PLXJlbGF0ZWQgc3lzdGVtIGNhbGxzICovCisKK2ludCBpb3BsKGludCk7CitpbnQgaW9wZXJtKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCk7CisKKy8qIEJhc2ljIEkvTyBtYWNyb3MgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvdXRiKHVuc2lnbmVkIGNoYXIgX192LCB1bnNpZ25lZCBzaG9ydCBfX3ApCit7CisJYXNtIHZvbGF0aWxlICgib3V0YiAlMCwlMSIgOiA6ICJhIiAoX192KSwgImROIihfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvdXR3KHVuc2lnbmVkIHNob3J0IF9fdiwgdW5zaWduZWQgc2hvcnQgX19wKQoreworCWFzbSB2b2xhdGlsZSAoIm91dHcgJTAsJTEiIDogOiAiYSIgKF9fdiksICJkTiIoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgb3V0bCh1bnNpZ25lZCBpbnQgX192LCB1bnNpZ25lZCBzaG9ydCBfX3ApCit7CisJYXNtIHZvbGF0aWxlICgib3V0bCAlMCwlMSIgOiA6ICJhIiAoX192KSwgImROIihfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBpbmIodW5zaWduZWQgc2hvcnQgX19wKQoreworCXVuc2lnbmVkIGNoYXIgX192OworCWFzbSB2b2xhdGlsZSAoImluYiAlMSwlMCIgOiAiPWEiIChfX3YpIDogImROIihfX3ApKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW53KHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBfX3Y7CisJYXNtIHZvbGF0aWxlICgiaW53ICUxLCUwIiA6ICI9YSIgKF9fdikgOiAiZE4iKF9fcCkpOworCXJldHVybiB2OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgaW5sKHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwl1bnNpZ25lZCBpbnQgX192OworCWFzbSB2b2xhdGlsZSAoImlubCAlMSwlMCIgOiAiPWEiIChfX3YpIDogImROIihfX3ApKTsKKwlyZXR1cm4gdjsKK30KKworLyogU3RyaW5nIEkvTyBtYWNyb3MgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0c2IodW5zaWduZWQgc2hvcnQgX19wLCBjb25zdCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzYiIKKwkJICAgICAgOiAiK1MiIChfX2QpLCAiK2MiKF9fbikKKwkJICAgICAgOiAiZCIoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK291dHN3KHVuc2lnbmVkIHNob3J0IF9fcCwgY29uc3Qgdm9pZCAqX19kLCB1bnNpZ25lZCBsb25nIF9fbikKK3sKKwlhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgb3V0c3ciCisJCSAgICAgIDogIitTIiAoX19kKSwgIitjIihfX24pCisJCSAgICAgIDogImQiKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXRzbCh1bnNpZ25lZCBzaG9ydCBfX3AsIGNvbnN0IHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IG91dHNsIgorCQkgICAgICA6ICIrUyIgKF9fZCksICIrYyIoX19uKQorCQkgICAgICA6ICJkIihfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBpbnNiKHVuc2lnbmVkIHNob3J0IF9fcCwgdm9pZCAqX19kLCB1bnNpZ25lZCBsb25nIF9fbikKK3sKKwlhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgaW5zYiIKKwkJICAgICAgOiAiK0QiIChfX2QpLCAiK2MiKF9fbikKKwkJICAgICAgOiAiZCIoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5zdyh1bnNpZ25lZCBzaG9ydCBfX3AsIHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc3ciCisJCSAgICAgIDogIitEIiAoX19kKSwgIitjIihfX24pCisJCSAgICAgIDogImQiKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGluc2wodW5zaWduZWQgc2hvcnQgX19wLCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNsIgorCQkgICAgICA6ICIrRCIgKF9fZCksICIrYyIoX19uKQorCQkgICAgICA6ICJkIihfX3ApKTsKK30KKworI2VuZGlmCQkJCS8qIF9TWVNfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJwYS9pbmV0LmggYi91c3IvaW5jbHVkZS9hcnBhL2luZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMyZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJwYS9pbmV0LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGFycGEvaW5ldC5oCisgKi8KKworI2lmbmRlZiBfQVJQQV9JTkVUX0gKKyNkZWZpbmUgX0FSUEFfSU5FVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbjYuaD4KKworX19leHRlcm4gdWludDMyX3QgaW5ldF9hZGRyKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgaW5ldF9hdG9uKGNvbnN0IGNoYXIgKiwgc3RydWN0IGluX2FkZHIgKik7CitfX2V4dGVybiBjaGFyICppbmV0X250b2Eoc3RydWN0IGluX2FkZHIpOworX19leHRlcm4gaW50IGluZXRfcHRvbihpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK19fZXh0ZXJuIGNvbnN0IGNoYXIgKmluZXRfbnRvcChpbnQsIGNvbnN0IHZvaWQgKiwgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gdW5zaWduZWQgaW50IGluZXRfbnNhcF9hZGRyKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworX19leHRlcm4gY2hhciAqaW5ldF9uc2FwX250b2EoaW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGNoYXIgKik7CisKKyNlbmRpZgkJCQkvKiBfQVJQQV9JTkVUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2Fzc2VydC5oIGIvdXNyL2luY2x1ZGUvYXNzZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5ZTA4MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2Fzc2VydC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBhc3NlcnQuaAorICovCisKKyNpZm5kZWYgX0FTU0VSVF9ICisjZGVmaW5lIF9BU1NFUlRfSAorCisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworI2lmZGVmIE5ERUJVRworCisjZGVmaW5lIGFzc2VydCh4KSAoKHZvaWQpKHgpKQorCisjZWxzZQorCitleHRlcm4gX19ub3JldHVybiBfX2Fzc2VydF9mYWlsKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQpOworCisjZGVmaW5lIGFzc2VydCh4KSAoKHgpID8gKHZvaWQpMCA6IF9fYXNzZXJ0X2ZhaWwoI3gsIF9fRklMRV9fLCBfX0xJTkVfXykpCisKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX0FTU0VSVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS5oIGIvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmNjODg1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUuaApAQCAtMCwwICsxLDMgQEAKKyNpZm5kZWYgX0JJVFNJWkUKKyNkZWZpbmUgX0JJVFNJWkUgMzIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvbGltaXRzLmggYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWI5N2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvbGltaXRzLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGJpdHMzMi9saW1pdHMuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfTElNSVRTX0gKKyNkZWZpbmUgX0JJVFNJWkVfTElNSVRTX0gKKworI2RlZmluZSBMT05HX0JJVAkzMgorCisjZGVmaW5lIExPTkdfTUlOCSgtMjE0NzQ4MzY0N0wtMSkKKyNkZWZpbmUgTE9OR19NQVgJMjE0NzQ4MzY0N0wKKyNkZWZpbmUgVUxPTkdfTUFYCTQyOTQ5NjcyOTVVTAorCisjZW5kaWYJCQkJLyogX0JJVFNJWkVfTElNSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGRlZi5oIGIvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNzMzYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGRlZi5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBiaXRzMzIvc3RkZGVmLmgKKyAqLworCisjaWZuZGVmIF9CSVRTSVpFX1NURERFRl9ICisjZGVmaW5lIF9CSVRTSVpFX1NURERFRl9ICisKKyNkZWZpbmUgX1NJWkVfVAorI2lmIGRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19jcmlzX18pCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2l6ZV90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKKyNlbmRpZgorCisjZGVmaW5lIF9QVFJESUZGX1QKK3R5cGVkZWYgc2lnbmVkIGludCBwdHJkaWZmX3Q7CisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9TVERERUZfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvc3RkaW50LmggYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ0NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvc3RkaW50LmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGJpdHMzMi9zdGRpbnQuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfU1RESU5UX0gKKyNkZWZpbmUgX0JJVFNJWkVfU1RESU5UX0gKKwordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQJCWludDE2X3Q7Cit0eXBlZGVmIGludAkJCWludDMyX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQJCWludDY0X3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50CXVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CXVpbnQ2NF90OworCit0eXBlZGVmIGludAkJCWludF9mYXN0MTZfdDsKK3R5cGVkZWYgaW50CQkJaW50X2Zhc3QzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50X2Zhc3QzMl90OworCit0eXBlZGVmIGludAkJCWludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRwdHJfdDsKKworI2RlZmluZSBfX0lOVDY0X0MoYykgICBjICMjIExMCisjZGVmaW5lIF9fVUlOVDY0X0MoYykgIGMgIyMgVUxMCisKKyNkZWZpbmUgX19QUkk2NF9SQU5LICAgImxsIgorI2RlZmluZSBfX1BSSUZBU1RfUkFOSyAiIgorI2RlZmluZSBfX1BSSVBUUl9SQU5LICAiIgorCisjZW5kaWYJCQkJLyogX0JJVFNJWkVfU1RESU5UX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGludGNvbnN0LmggYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRpbnRjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjYzYmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRpbnRjb25zdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBiaXRzMzIvc3RkaW50Y29uc3QuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfU1RESU5UQ09OU1RfSAorI2RlZmluZSBfQklUU0laRV9TVERJTlRDT05TVF9ICisKKyNkZWZpbmUgSU5UX0ZBU1QxNl9DKGMpCSBJTlQzMl9DKGMpCisjZGVmaW5lIElOVF9GQVNUMzJfQyhjKSAgSU5UMzJfQyhjKQorCisjZGVmaW5lIFVJTlRfRkFTVDE2X0MoYykgVUlOVDMyX0MoYykKKyNkZWZpbmUgVUlOVF9GQVNUMzJfQyhjKSBVSU5UMzJfQyhjKQorCisjZGVmaW5lIElOVFBUUl9DKGMpCSBJTlQzMl9DKGMpCisjZGVmaW5lIFVJTlRQVFJfQyhjKQkgVUlOVDMyX0MoYykKKyNkZWZpbmUgUFRSRElGRl9DKGMpICAgICBJTlQzMl9DKGMpCisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9TVERJTlRDT05TVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRpbnRsaW1pdHMuaCBiL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGludGxpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NTA5NGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRpbnRsaW1pdHMuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogYml0czMyL3N0ZGludGxpbWl0cy5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9TVERJTlRMSU1JVFNfSAorI2RlZmluZSBfQklUU0laRV9TVERJTlRMSU1JVFNfSAorCisjZGVmaW5lIElOVF9GQVNUMTZfTUlOCUlOVDMyX01JTgorI2RlZmluZSBJTlRfRkFTVDMyX01JTglJTlQzMl9NSU4KKyNkZWZpbmUgSU5UX0ZBU1QxNl9NQVgJSU5UMzJfTUFYCisjZGVmaW5lIElOVF9GQVNUMzJfTUFYCUlOVDMyX01BWAorI2RlZmluZSBVSU5UX0ZBU1QxNl9NQVggVUlOVDMyX01BWAorI2RlZmluZSBVSU5UX0ZBU1QzMl9NQVggVUlOVDMyX01BWAorCisjZGVmaW5lIElOVFBUUl9NSU4JSU5UMzJfTUlOCisjZGVmaW5lIElOVFBUUl9NQVgJSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRQVFJfTUFYCVVJTlQzMl9NQVgKKworI2RlZmluZSBQVFJESUZGX01JTglJTlQzMl9NSU4KKyNkZWZpbmUgUFRSRElGRl9NQVgJSU5UMzJfTUFYCisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9TVERJTlRMSU1JVFNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUuaCBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2OTZmZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplLmgKQEAgLTAsMCArMSwzIEBACisjaWZuZGVmIF9CSVRTSVpFCisjZGVmaW5lIF9CSVRTSVpFIDY0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL2xpbWl0cy5oIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjViYmY4MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL2xpbWl0cy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBiaXRzNjQvbGltaXRzLmgKKyAqLworCisjaWZuZGVmIF9CSVRTSVpFX0xJTUlUU19ICisjZGVmaW5lIF9CSVRTSVpFX0xJTUlUU19ICisKKyNkZWZpbmUgTE9OR19CSVQJNjQKKworI2RlZmluZSBMT05HX01JTgkoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMLTEpCisjZGVmaW5lIExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMCisjZGVmaW5lIFVMT05HX01BWAkxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9MSU1JVFNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkZGVmLmggYi91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk0MmExCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkZGVmLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGJpdHM2NC9zdGRkZWYuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfU1REREVGX0gKKyNkZWZpbmUgX0JJVFNJWkVfU1REREVGX0gKKworI2RlZmluZSBfU0laRV9UCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2l6ZV90OworI2RlZmluZSBfUFRSRElGRl9UCit0eXBlZGVmIHNpZ25lZCBsb25nIHB0cmRpZmZfdDsKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURERFRl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9zdGRpbnQuaCBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGU2MzkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9zdGRpbnQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogYml0czY0L3N0ZGludC5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9TVERJTlRfSAorI2RlZmluZSBfQklUU0laRV9TVERJTlRfSAorCit0eXBlZGVmIHNpZ25lZCBjaGFyCQlpbnQ4X3Q7Cit0eXBlZGVmIHNob3J0IGludAkJaW50MTZfdDsKK3R5cGVkZWYgaW50CQkJaW50MzJfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCWludDY0X3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50CXVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50NjRfdDsKKwordHlwZWRlZiBsb25nIGludAkJaW50X2Zhc3QxNl90OwordHlwZWRlZiBsb25nIGludAkJaW50X2Zhc3QzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgbG9uZyBpbnQJCWludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50cHRyX3Q7CisKKyNkZWZpbmUgX19JTlQ2NF9DKGMpICBjICMjIEwKKyNkZWZpbmUgX19VSU5UNjRfQyhjKSBjICMjIFVMCisKKyNkZWZpbmUgX19QUkk2NF9SQU5LCSJsIgorI2RlZmluZSBfX1BSSUZBU1RfUkFOSyAgImwiCisjZGVmaW5lIF9fUFJJUFRSX1JBTksJImwiCisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkaW50Y29uc3QuaCBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGludGNvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlOGViNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGludGNvbnN0LmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGJpdHM2NC9zdGRpbnRjb25zdC5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9TVERJTlRDT05TVF9ICisjZGVmaW5lIF9CSVRTSVpFX1NURElOVENPTlNUX0gKKworI2RlZmluZSBJTlRfRkFTVDE2X0MoYykJIElOVDY0X0MoYykKKyNkZWZpbmUgSU5UX0ZBU1QzMl9DKGMpICBJTlQ2NF9DKGMpCisKKyNkZWZpbmUgVUlOVF9GQVNUMTZfQyhjKSBVSU5UNjRfQyhjKQorI2RlZmluZSBVSU5UX0ZBU1QzMl9DKGMpIFVJTlQ2NF9DKGMpCisKKyNkZWZpbmUgSU5UUFRSX0MoYykJIElOVDY0X0MoYykKKyNkZWZpbmUgVUlOVFBUUl9DKGMpCSBVSU5UNjRfQyhjKQorI2RlZmluZSBQVFJESUZGX0MoYykgICAgIElOVDY0X0MoYykKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURElOVENPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGludGxpbWl0cy5oIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkaW50bGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1ZDViOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGludGxpbWl0cy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBiaXRzNjQvc3RkaW50bGltaXRzLmgKKyAqLworCisjaWZuZGVmIF9CSVRTSVpFX1NURElOVExJTUlUU19ICisjZGVmaW5lIF9CSVRTSVpFX1NURElOVExJTUlUU19ICisKKyNkZWZpbmUgSU5UX0ZBU1QxNl9NSU4JSU5UNjRfTUlOCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOCUlOVDY0X01JTgorI2RlZmluZSBJTlRfRkFTVDE2X01BWAlJTlQ2NF9NQVgKKyNkZWZpbmUgSU5UX0ZBU1QzMl9NQVgJSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDE2X01BWCBVSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDMyX01BWCBVSU5UNjRfTUFYCisKKyNkZWZpbmUgSU5UUFRSX01JTglJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UUFRSX01BWAlJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVFBUUl9NQVgJVUlOVDY0X01BWAorCisjZGVmaW5lIFBUUkRJRkZfTUlOCUlOVDY0X01JTgorI2RlZmluZSBQVFJESUZGX01BWAlJTlQ2NF9NQVgKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURElOVExJTUlUU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9ieXRlc3dhcC5oIGIvdXNyL2luY2x1ZGUvYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQxYTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYnl0ZXN3YXAuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogYnl0ZXN3YXAuaAorICovCisKKyNpZm5kZWYgX0JZVEVTV0FQX0gKKyNkZWZpbmUgX0JZVEVTV0FQX0gKKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIGJzd2FwXzE2KHgpIF9fc3dhYjE2KHgpCisjZGVmaW5lIGJzd2FwXzMyKHgpIF9fc3dhYjMyKHgpCisjZGVmaW5lIGJzd2FwXzY0KHgpIF9fc3dhYjY0KHgpCisKKyNlbmRpZgkJCQkvKiBfQllURVNXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvY3R5cGUuaCBiL3Vzci9pbmNsdWRlL2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwYWVjOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2N0eXBlLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBjdHlwZS5oCisgKgorICogVGhpcyBhc3N1bWVzIElTTyA4ODU5LTEsIGJlaW5nIGEgcmVhc29uYWJsZSBzdXBlcnNldCBvZiBBU0NJSS4KKyAqLworCisjaWZuZGVmIF9DVFlQRV9ICisjZGVmaW5lIF9DVFlQRV9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKworLyoKKyAqIFRoaXMgcmVsaWVzIG9uIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CisgKgorICogY250cmwgPSAhcHJpbnQKKyAqIGFscGhhID0gdXBwZXJ8bG93ZXIKKyAqIGdyYXBoID0gcHVuY3R8YWxwaGF8ZGlnaXQKKyAqIGJsYW5rID0gJ1x0JyB8fCAnICcgKHBlciBQT1NJWCByZXF1aXJlbWVudCkKKyAqLworZW51bSB7CisJX19jdHlwZV91cHBlciA9ICgxIDw8IDApLAorCV9fY3R5cGVfbG93ZXIgPSAoMSA8PCAxKSwKKwlfX2N0eXBlX2RpZ2l0ID0gKDEgPDwgMiksCisJX19jdHlwZV94ZGlnaXQgPSAoMSA8PCAzKSwKKwlfX2N0eXBlX3NwYWNlID0gKDEgPDwgNCksCisJX19jdHlwZV9wcmludCA9ICgxIDw8IDUpLAorCV9fY3R5cGVfcHVuY3QgPSAoMSA8PCA2KSwKKwlfX2N0eXBlX2NudHJsID0gKDEgPDwgNyksCit9OworCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBfX2N0eXBlc1tdOworCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzYWxudW0oaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJgorCSAgICAoX19jdHlwZV91cHBlciB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX2RpZ2l0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19jdHlwZV9pc2FscGhhKGludCBfX2MpCit7CisJcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgKF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX2xvd2VyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19jdHlwZV9pc2FzY2lpKGludCBfX2MpCit7CisJcmV0dXJuICEoX19jICYgfjB4N2YpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzYmxhbmsoaW50IF9fYykKK3sKKwlyZXR1cm4gKF9fYyA9PSAnXHQnKSB8fCAoX19jID09ICcgJyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNjbnRybChpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfY250cmw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNkaWdpdChpbnQgX19jKQoreworCXJldHVybiAoKHVuc2lnbmVkKV9fYyAtICcwJykgPD0gOTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19jdHlwZV9pc2dyYXBoKGludCBfX2MpCit7CisJcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYKKwkgICAgKF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX2xvd2VyIHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfcHVuY3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzbG93ZXIoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiBfX2N0eXBlX2xvd2VyOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzcHJpbnQoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiBfX2N0eXBlX3ByaW50OworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzcHVuY3QoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiBfX2N0eXBlX3B1bmN0OworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzc3BhY2UoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiBfX2N0eXBlX3NwYWNlOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzdXBwZXIoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiBfX2N0eXBlX3VwcGVyOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzeGRpZ2l0KGludCBfX2MpCit7CisJcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgX19jdHlwZV94ZGlnaXQ7Cit9CisKKy8qIE5vdGU6IHRoaXMgaXMgZGVjaW1hbCwgbm90IGhleCwgdG8gYXZvaWQgYWNjaWRlbnRhbCBwcm9tb3Rpb24gdG8gdW5zaWduZWQgKi8KKyNkZWZpbmUgX3RvdXBwZXIoX19jKSAoKF9fYykgJiB+MzIpCisjZGVmaW5lIF90b2xvd2VyKF9fYykgKChfX2MpIHwgMzIpCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfdG91cHBlcihpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlX2lzbG93ZXIoX19jKSA/IF90b3VwcGVyKF9fYykgOiBfX2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfdG9sb3dlcihpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlX2lzdXBwZXIoX19jKSA/IF90b2xvd2VyKF9fYykgOiBfX2M7Cit9CisKKyNpZmRlZiBfX0NUWVBFX05PX0lOTElORQorIyBkZWZpbmUgX19DVFlQRUZVTkMoWCkgXAorICBfX2V4dGVybiBpbnQgWChpbnQpOworI2Vsc2UKKyNkZWZpbmUgX19DVFlQRUZVTkMoWCkgXAorICBfX2V4dGVybiBpbmxpbmUgaW50IFgoaW50IF9fYykJCVwKKyAgewkJCQkJCVwKKyAgICByZXR1cm4gX19jdHlwZV8jI1goX19jKTsgCQkJXAorICB9CisjZW5kaWYKKworX19DVFlQRUZVTkMoaXNhbG51bSkKKyAgICBfX0NUWVBFRlVOQyhpc2FscGhhKQorICAgIF9fQ1RZUEVGVU5DKGlzYXNjaWkpCisgICAgX19DVFlQRUZVTkMoaXNibGFuaykKKyAgICBfX0NUWVBFRlVOQyhpc2NudHJsKQorICAgIF9fQ1RZUEVGVU5DKGlzZGlnaXQpCisgICAgX19DVFlQRUZVTkMoaXNncmFwaCkKKyAgICBfX0NUWVBFRlVOQyhpc2xvd2VyKQorICAgIF9fQ1RZUEVGVU5DKGlzcHJpbnQpCisgICAgX19DVFlQRUZVTkMoaXNwdW5jdCkKKyAgICBfX0NUWVBFRlVOQyhpc3NwYWNlKQorICAgIF9fQ1RZUEVGVU5DKGlzdXBwZXIpCisgICAgX19DVFlQRUZVTkMoaXN4ZGlnaXQpCisgICAgX19DVFlQRUZVTkModG91cHBlcikKKyAgICBfX0NUWVBFRlVOQyh0b2xvd2VyKQorI2VuZGlmCQkJCS8qIF9DVFlQRV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9kaXJlbnQuaCBiL3Vzci9pbmNsdWRlL2RpcmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjQ0NzQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9kaXJlbnQuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogZGlyZW50LmgKKyAqLworCisjaWZuZGVmIF9ESVJFTlRfSAorI2RlZmluZSBfRElSRU5UX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy9kaXJlbnQuaD4KKworc3RydWN0IF9JT19kaXIgeworCWludCBfX2ZkOworCisjaWZkZWYgX19LTElCQ19ESVJFTlRfSU5URVJOQUxTCisJLyogVGhlc2UgZmllbGRzIGZvciBpbnRlcm5hbCB1c2Ugb25seSAqLworCisJc2l6ZV90IGJ5dGVzX2xlZnQ7CisJc3RydWN0IGRpcmVudCAqbmV4dDsKKwkvKiBEZWNsYXJpbmcgdGhpcyBhcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZW5mb3JjZXMgY29ycmVjdCBhbGlnbm1lbnQgKi8KKwlzdHJ1Y3QgZGlyZW50IGJ1ZmZlclsxNV07CS8qIDE1IHRpbWVzIG1heCBkaXJlbnQgc2l6ZSA9fiA0SyAqLworI2VuZGlmCit9OwordHlwZWRlZiBzdHJ1Y3QgX0lPX2RpciBESVI7CisKK19fZXh0ZXJuIERJUiAqb3BlbmRpcihjb25zdCBjaGFyICopOworX19leHRlcm4gc3RydWN0IGRpcmVudCAqcmVhZGRpcihESVIgKik7CitfX2V4dGVybiBpbnQgY2xvc2VkaXIoRElSICopOworc3RhdGljIF9faW5saW5lX18gaW50IGRpcmZkKERJUiAqIF9fZCkKK3sKKwlyZXR1cm4gX19kLT5fX2ZkOworfQorCisjZW5kaWYJCQkJLyogX0RJUkVOVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9lbGYuaCBiL3Vzci9pbmNsdWRlL2VsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDNhODEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9lbGYuaApAQCAtMCwwICsxLDExIEBACisvKgorICogZWxmLmgKKyAqLworCisjaWZuZGVmIF9FTEZfSAorI2RlZmluZSBfRUxGX0gKKworI2luY2x1ZGUgPHN5cy9lbGYzMi5oPgorI2luY2x1ZGUgPHN5cy9lbGY2NC5oPgorCisjZW5kaWYJCQkJLyogX0VMRl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9lbmRpYW4uaCBiL3Vzci9pbmNsdWRlL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Y2Q2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9lbmRpYW4uaApAQCAtMCwwICsxLDE1IEBACisvKgorICogZW5kaWFuLmgKKyAqLworCisjaWZuZGVmIF9FTkRJQU5fSAorI2RlZmluZSBfRU5ESUFOX0gKKworI2luY2x1ZGUgPGtsaWJjL2VuZGlhbi5oPgorCisjZGVmaW5lIExJVFRMRV9FTkRJQU4JX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEJJR19FTkRJQU4JX19CSUdfRU5ESUFOCisjZGVmaW5lIFBEUF9FTkRJQU4JX19QRFBfRU5ESUFOCisjZGVmaW5lIEJZVEVfT1JERVIJX19CWVRFX09SREVSCisKKyNlbmRpZgkJCQkvKiBfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2Vycm5vLmggYi91c3IvaW5jbHVkZS9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZTIwYmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9lcnJuby5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBlcnJuby5oCisgKi8KKworI2lmbmRlZiBfRVJSTk9fSAorI2RlZmluZSBfRVJSTk9fSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKK19fZXh0ZXJuIGludCBlcnJubzsKKworI2VuZGlmIC8qIF9FUlJOT19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9mY250bC5oIGIvdXNyL2luY2x1ZGUvZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA4ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvZmNudGwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogZmNudGwuaAorICovCisKKyNpZm5kZWYgX0ZDTlRMX0gKKyNkZWZpbmUgX0ZDTlRMX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgZGVmaW5lZChfX21pcHNfXykgJiYgIWRlZmluZWQoX19taXBzNjRfXykKKyMgaW5jbHVkZSA8a2xpYmMvYXJjaGZjbnRsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorCisvKiBUaGlzIGlzIHVnbHksIGJ1dCAic3RydWN0IGZsb2NrIiBoYXMgYWN0dWFsbHkgYmVlbiBkZWZpbmVkIHdpdGgKKyAgIGEgbG9uZyBvZmZfdCwgc28gaXQncyByZWFsbHkgInN0cnVjdCBmbG9jazY0Ii4gIEl0IGp1c3QgaGFwcGVucworICAgdG8gd29yay4gIEdhZy4gIEJhcmYuCisKKyAgIFRoaXMgaGFwcGVucyB0byB3b3JrIG9uIGFsbCAzMi1iaXQgYXJjaGl0ZWN0dXJlcyBleGNlcHQgTUlQUy4gKi8KKworI2lmZGVmIEZfR0VUTEs2NAorIyB1bmRlZiBGX0dFVExLCisjIGRlZmluZSBGX0dFVExLIEZfR0VUTEs2NAorI2VuZGlmCisKKyNpZmRlZiBGX1NFVExLNjQKKyMgdW5kZWYgRl9TRVRMSworIyBkZWZpbmUgRl9TRVRMSyBGX1NFVExLNjQKKyNlbmRpZgorCisjaWZkZWYgRl9TRVRMS1c2NAorIyB1bmRlZiBGX1NFVExLVworIyBkZWZpbmUgRl9TRVRMS1cgRl9TRVRMS1c2NAorI2VuZGlmCisKKy8qIFRoaXMgaXMgZGVmaW5lZCBoZXJlIGFzIHdlbGwgYXMgaW4gPHVuaXN0ZC5oPiAqLworI2lmbmRlZiBfS0xJQkNfSU5fT1BFTl9DCitfX2V4dGVybiBpbnQgb3Blbihjb25zdCBjaGFyICosIGludCwgLi4uKTsKK19fZXh0ZXJuIGludCBvcGVuYXQoaW50LCBjb25zdCBjaGFyICosIGludCwgLi4uKTsKKyNlbmRpZgorCitfX2V4dGVybiBpbnQgY3JlYXQoY29uc3QgY2hhciAqLCBtb2RlX3QpOworX19leHRlcm4gaW50IGZjbnRsKGludCwgaW50LCAuLi4pOworCisjZW5kaWYJCQkJLyogX0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2ZubWF0Y2guaCBiL3Vzci9pbmNsdWRlL2ZubWF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg4MTQwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvZm5tYXRjaC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0ZOTUFUQ0hfSAorI2RlZmluZSBfRk5NQVRDSF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKworI2RlZmluZSBGTk1fTk9NQVRDSAkJMQorCisjZGVmaW5lIEZOTV9QQVRITkFNRQkJMQorI2RlZmluZSBGTk1fRklMRV9OQU1FCQlGTk1fUEFUSE5BTUUKKyNkZWZpbmUgRk5NX05PRVNDQVBFCQkyCisjZGVmaW5lIEZOTV9QRVJJT0QJCTQKKworX19leHRlcm4gaW50IGZubWF0Y2goY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisKKyNlbmRpZiAvKiBfRk5NQVRDSF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9nZXRvcHQuaCBiL3Vzci9pbmNsdWRlL2dldG9wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzQxY2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9nZXRvcHQuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9HRVRPUFRfSAorI2RlZmluZSBfR0VUT1BUX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorCitzdHJ1Y3Qgb3B0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBoYXNfYXJnOworCWludCAqZmxhZzsKKwlpbnQgdmFsOworfTsKKworZW51bSB7CisJbm9fYXJndW1lbnQJICA9IDAsCisJcmVxdWlyZWRfYXJndW1lbnQgPSAxLAorCW9wdGlvbmFsX2FyZ3VtZW50ID0gMiwKK307CisKK19fZXh0ZXJuIGludCBnZXRvcHRfbG9uZyhpbnQsIGNoYXIgKmNvbnN0ICosIGNvbnN0IGNoYXIgKiwKKwkJCSBjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGludCAqKTsKKworI2VuZGlmIC8qIF9HRVRPUFRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvZ3JwLmggYi91c3IvaW5jbHVkZS9ncnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJmNzllCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvZ3JwLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIGdycC5oCisgKi8KKworI2lmbmRlZiBfR1JQX0gKKyNkZWZpbmUgX0dSUF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworc3RydWN0IGdyb3VwIHsKKwljaGFyICpncl9uYW1lOworCWNoYXIgKmdyX3Bhc3N3ZDsKKwlnaWRfdCBncl9naWQ7CisJY2hhciAqKmdyX21lbTsKK307CisKK19fZXh0ZXJuIGludCBzZXRncm91cHMoc2l6ZV90LCBjb25zdCBnaWRfdCAqKTsKKworI2VuZGlmCQkJCS8qIF9HUlBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvaW50dHlwZXMuaCBiL3Vzci9pbmNsdWRlL2ludHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMTFmZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2ludHR5cGVzLmgKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBpbnR0eXBlcy5oCisgKi8KKworI2lmbmRlZiBfSU5UVFlQRVNfSAorI2RlZmluZSBfSU5UVFlQRVNfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3N0YXRpYyBfX2lubGluZV9fIGludG1heF90IGltYXhhYnMoaW50bWF4X3QgX19uKQoreworCXJldHVybiAoX19uIDwgKGludG1heF90KSAwKSA/IC1fX24gOiBfX247Cit9CisKK19fZXh0ZXJuIGludG1heF90IHN0cnRvaW1heChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CitfX2V4dGVybiB1aW50bWF4X3Qgc3RydG91bWF4KGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKKworLyogZXh0ZW5zaW9ucyAqLworX19leHRlcm4gaW50bWF4X3Qgc3RybnRvaW1heChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCwgc2l6ZV90KTsKK19fZXh0ZXJuIHVpbnRtYXhfdCBzdHJudG91bWF4KGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50LCBzaXplX3QpOworCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0ZPUk1BVF9NQUNST1MpCisKKyNkZWZpbmUgUFJJZDgJImQiCisjZGVmaW5lIFBSSWQxNgkiZCIKKyNkZWZpbmUgUFJJZDMyCSJkIgorI2RlZmluZSBQUklkNjQJX19QUkk2NF9SQU5LICJkIgorCisjZGVmaW5lIFBSSWRMRUFTVDgJImQiCisjZGVmaW5lIFBSSWRMRUFTVDE2CSJkIgorI2RlZmluZSBQUklkTEVBU1QzMgkiZCIKKyNkZWZpbmUgUFJJZExFQVNUNjQJX19QUkk2NF9SQU5LICJkIgorCisjZGVmaW5lIFBSSWRGQVNUOAkiZCIKKyNkZWZpbmUgUFJJZEZBU1QxNglfX1BSSUZBU1RfUkFOSyAiZCIKKyNkZWZpbmUgUFJJZEZBU1QzMglfX1BSSUZBU1RfUkFOSyAiZCIKKyNkZWZpbmUgUFJJZEZBU1Q2NAlfX1BSSTY0X1JBTksgImQiCisKKyNkZWZpbmUgUFJJZE1BWAkgX19QUkk2NF9SQU5LICJkIgorI2RlZmluZSBQUklkUFRSICBfX1BSSVBUUl9SQU5LICJkIgorCisjZGVmaW5lIFBSSWk4CSJpIgorI2RlZmluZSBQUklpMTYJImkiCisjZGVmaW5lIFBSSWkzMgkiaSIKKyNkZWZpbmUgUFJJaTY0CV9fUFJJNjRfUkFOSyAiaSIKKworI2RlZmluZSBQUklpTEVBU1Q4CSJpIgorI2RlZmluZSBQUklpTEVBU1QxNgkiaSIKKyNkZWZpbmUgUFJJaUxFQVNUMzIJImkiCisjZGVmaW5lIFBSSWlMRUFTVDY0CV9fUFJJNjRfUkFOSyAiaSIKKworI2RlZmluZSBQUklpRkFTVDgJImkiCisjZGVmaW5lIFBSSWlGQVNUMTYJX19QUklGQVNUX1JBTksgImkiCisjZGVmaW5lIFBSSWlGQVNUMzIJX19QUklGQVNUX1JBTksgImkiCisjZGVmaW5lIFBSSWlGQVNUNjQJX19QUkk2NF9SQU5LICJpIgorCisjZGVmaW5lIFBSSWlNQVgJIF9fUFJJNjRfUkFOSyAiaSIKKyNkZWZpbmUgUFJJaVBUUiAgX19QUklQVFJfUkFOSyAiaSIKKworI2RlZmluZSBQUklvOAkibyIKKyNkZWZpbmUgUFJJbzE2CSJvIgorI2RlZmluZSBQUklvMzIJIm8iCisjZGVmaW5lIFBSSW82NAlfX1BSSTY0X1JBTksgIm8iCisKKyNkZWZpbmUgUFJJb0xFQVNUOAkibyIKKyNkZWZpbmUgUFJJb0xFQVNUMTYJIm8iCisjZGVmaW5lIFBSSW9MRUFTVDMyCSJvIgorI2RlZmluZSBQUklvTEVBU1Q2NAlfX1BSSTY0X1JBTksgIm8iCisKKyNkZWZpbmUgUFJJb0ZBU1Q4CSJvIgorI2RlZmluZSBQUklvRkFTVDE2CV9fUFJJRkFTVF9SQU5LICJvIgorI2RlZmluZSBQUklvRkFTVDMyCV9fUFJJRkFTVF9SQU5LICJvIgorI2RlZmluZSBQUklvRkFTVDY0CV9fUFJJNjRfUkFOSyAibyIKKworI2RlZmluZSBQUklvTUFYCSBfX1BSSTY0X1JBTksgIm8iCisjZGVmaW5lIFBSSW9QVFIgIF9fUFJJUFRSX1JBTksgIm8iCisKKyNkZWZpbmUgUFJJdTgJInUiCisjZGVmaW5lIFBSSXUxNgkidSIKKyNkZWZpbmUgUFJJdTMyCSJ1IgorI2RlZmluZSBQUkl1NjQJX19QUkk2NF9SQU5LICJ1IgorCisjZGVmaW5lIFBSSXVMRUFTVDgJInUiCisjZGVmaW5lIFBSSXVMRUFTVDE2CSJ1IgorI2RlZmluZSBQUkl1TEVBU1QzMgkidSIKKyNkZWZpbmUgUFJJdUxFQVNUNjQJX19QUkk2NF9SQU5LICJ1IgorCisjZGVmaW5lIFBSSXVGQVNUOAkidSIKKyNkZWZpbmUgUFJJdUZBU1QxNglfX1BSSUZBU1RfUkFOSyAidSIKKyNkZWZpbmUgUFJJdUZBU1QzMglfX1BSSUZBU1RfUkFOSyAidSIKKyNkZWZpbmUgUFJJdUZBU1Q2NAlfX1BSSTY0X1JBTksgInUiCisKKyNkZWZpbmUgUFJJdU1BWAkgX19QUkk2NF9SQU5LICJ1IgorI2RlZmluZSBQUkl1UFRSICBfX1BSSVBUUl9SQU5LICJ1IgorCisjZGVmaW5lIFBSSXg4CSJ4IgorI2RlZmluZSBQUkl4MTYJIngiCisjZGVmaW5lIFBSSXgzMgkieCIKKyNkZWZpbmUgUFJJeDY0CV9fUFJJNjRfUkFOSyAieCIKKworI2RlZmluZSBQUkl4TEVBU1Q4CSJ4IgorI2RlZmluZSBQUkl4TEVBU1QxNgkieCIKKyNkZWZpbmUgUFJJeExFQVNUMzIJIngiCisjZGVmaW5lIFBSSXhMRUFTVDY0CV9fUFJJNjRfUkFOSyAieCIKKworI2RlZmluZSBQUkl4RkFTVDgJIngiCisjZGVmaW5lIFBSSXhGQVNUMTYJX19QUklGQVNUX1JBTksgIngiCisjZGVmaW5lIFBSSXhGQVNUMzIJX19QUklGQVNUX1JBTksgIngiCisjZGVmaW5lIFBSSXhGQVNUNjQJX19QUkk2NF9SQU5LICJ4IgorCisjZGVmaW5lIFBSSXhNQVgJIF9fUFJJNjRfUkFOSyAieCIKKyNkZWZpbmUgUFJJeFBUUiAgX19QUklQVFJfUkFOSyAieCIKKworI2RlZmluZSBQUklYOAkiWCIKKyNkZWZpbmUgUFJJWDE2CSJYIgorI2RlZmluZSBQUklYMzIJIlgiCisjZGVmaW5lIFBSSVg2NAlfX1BSSTY0X1JBTksgIlgiCisKKyNkZWZpbmUgUFJJWExFQVNUOAkiWCIKKyNkZWZpbmUgUFJJWExFQVNUMTYJIlgiCisjZGVmaW5lIFBSSVhMRUFTVDMyCSJYIgorI2RlZmluZSBQUklYTEVBU1Q2NAlfX1BSSTY0X1JBTksgIlgiCisKKyNkZWZpbmUgUFJJWEZBU1Q4CSJYIgorI2RlZmluZSBQUklYRkFTVDE2CV9fUFJJRkFTVF9SQU5LICJYIgorI2RlZmluZSBQUklYRkFTVDMyCV9fUFJJRkFTVF9SQU5LICJYIgorI2RlZmluZSBQUklYRkFTVDY0CV9fUFJJNjRfUkFOSyAiWCIKKworI2RlZmluZSBQUklYTUFYCSBfX1BSSTY0X1JBTksgIlgiCisjZGVmaW5lIFBSSVhQVFIgIF9fUFJJUFRSX1JBTksgIlgiCisKKyNkZWZpbmUgU0NOZDgJImhoZCIKKyNkZWZpbmUgU0NOZDE2CSJoZCIKKyNkZWZpbmUgU0NOZDMyCSJkIgorI2RlZmluZSBTQ05kNjQJX19QUkk2NF9SQU5LICJkIgorCisjZGVmaW5lIFNDTmRMRUFTVDgJImhoZCIKKyNkZWZpbmUgU0NOZExFQVNUMTYJImhkIgorI2RlZmluZSBTQ05kTEVBU1QzMgkiZCIKKyNkZWZpbmUgU0NOZExFQVNUNjQJX19QUkk2NF9SQU5LICJkIgorCisjZGVmaW5lIFNDTmRGQVNUOAkiaGhkIgorI2RlZmluZSBTQ05kRkFTVDE2CV9fUFJJRkFTVF9SQU5LICJkIgorI2RlZmluZSBTQ05kRkFTVDMyCV9fUFJJRkFTVF9SQU5LICJkIgorI2RlZmluZSBTQ05kRkFTVDY0CV9fUFJJNjRfUkFOSyAiZCIKKworI2RlZmluZSBTQ05kTUFYCSBfX1BSSTY0X1JBTksgImQiCisjZGVmaW5lIFNDTmRQVFIgIF9fUFJJUFRSX1JBTksgImQiCisKKyNkZWZpbmUgU0NOaTgJImhoaSIKKyNkZWZpbmUgU0NOaTE2CSJoaSIKKyNkZWZpbmUgU0NOaTMyCSJpIgorI2RlZmluZSBTQ05pNjQJX19QUkk2NF9SQU5LICJpIgorCisjZGVmaW5lIFNDTmlMRUFTVDgJImhoaSIKKyNkZWZpbmUgU0NOaUxFQVNUMTYJImhpIgorI2RlZmluZSBTQ05pTEVBU1QzMgkiaSIKKyNkZWZpbmUgU0NOaUxFQVNUNjQJX19QUkk2NF9SQU5LICJpIgorCisjZGVmaW5lIFNDTmlGQVNUOAkiaGhpIgorI2RlZmluZSBTQ05pRkFTVDE2CV9fUFJJRkFTVF9SQU5LICJpIgorI2RlZmluZSBTQ05pRkFTVDMyCV9fUFJJRkFTVF9SQU5LICJpIgorI2RlZmluZSBTQ05pRkFTVDY0CV9fUFJJNjRfUkFOSyAiaSIKKworI2RlZmluZSBTQ05pTUFYCSBfX1BSSTY0X1JBTksgImkiCisjZGVmaW5lIFNDTmlQVFIgIF9fUFJJUFRSX1JBTksgImkiCisKKyNkZWZpbmUgU0NObzgJImhobyIKKyNkZWZpbmUgU0NObzE2CSJobyIKKyNkZWZpbmUgU0NObzMyCSJvIgorI2RlZmluZSBTQ05vNjQJX19QUkk2NF9SQU5LICJvIgorCisjZGVmaW5lIFNDTm9MRUFTVDgJImhobyIKKyNkZWZpbmUgU0NOb0xFQVNUMTYJImhvIgorI2RlZmluZSBTQ05vTEVBU1QzMgkibyIKKyNkZWZpbmUgU0NOb0xFQVNUNjQJX19QUkk2NF9SQU5LICJvIgorCisjZGVmaW5lIFNDTm9GQVNUOAkiaGhvIgorI2RlZmluZSBTQ05vRkFTVDE2CV9fUFJJRkFTVF9SQU5LICJvIgorI2RlZmluZSBTQ05vRkFTVDMyCV9fUFJJRkFTVF9SQU5LICJvIgorI2RlZmluZSBTQ05vRkFTVDY0CV9fUFJJNjRfUkFOSyAibyIKKworI2RlZmluZSBTQ05vTUFYCSBfX1BSSTY0X1JBTksgIm8iCisjZGVmaW5lIFNDTm9QVFIgIF9fUFJJUFRSX1JBTksgIm8iCisKKyNkZWZpbmUgU0NOdTgJImhodSIKKyNkZWZpbmUgU0NOdTE2CSJodSIKKyNkZWZpbmUgU0NOdTMyCSJ1IgorI2RlZmluZSBTQ051NjQJX19QUkk2NF9SQU5LICJ1IgorCisjZGVmaW5lIFNDTnVMRUFTVDgJImhodSIKKyNkZWZpbmUgU0NOdUxFQVNUMTYJImh1IgorI2RlZmluZSBTQ051TEVBU1QzMgkidSIKKyNkZWZpbmUgU0NOdUxFQVNUNjQJX19QUkk2NF9SQU5LICJ1IgorCisjZGVmaW5lIFNDTnVGQVNUOAkiaGh1IgorI2RlZmluZSBTQ051RkFTVDE2CV9fUFJJRkFTVF9SQU5LICJ1IgorI2RlZmluZSBTQ051RkFTVDMyCV9fUFJJRkFTVF9SQU5LICJ1IgorI2RlZmluZSBTQ051RkFTVDY0CV9fUFJJNjRfUkFOSyAidSIKKworI2RlZmluZSBTQ051TUFYCSBfX1BSSTY0X1JBTksgInUiCisjZGVmaW5lIFNDTnVQVFIgIF9fUFJJUFRSX1JBTksgInUiCisKKyNkZWZpbmUgU0NOeDgJImhoeCIKKyNkZWZpbmUgU0NOeDE2CSJoeCIKKyNkZWZpbmUgU0NOeDMyCSJ4IgorI2RlZmluZSBTQ054NjQJX19QUkk2NF9SQU5LICJ4IgorCisjZGVmaW5lIFNDTnhMRUFTVDgJImhoeCIKKyNkZWZpbmUgU0NOeExFQVNUMTYJImh4IgorI2RlZmluZSBTQ054TEVBU1QzMgkieCIKKyNkZWZpbmUgU0NOeExFQVNUNjQJX19QUkk2NF9SQU5LICJ4IgorCisjZGVmaW5lIFNDTnhGQVNUOAkiaGh4IgorI2RlZmluZSBTQ054RkFTVDE2CV9fUFJJRkFTVF9SQU5LICJ4IgorI2RlZmluZSBTQ054RkFTVDMyCV9fUFJJRkFTVF9SQU5LICJ4IgorI2RlZmluZSBTQ054RkFTVDY0CV9fUFJJNjRfUkFOSyAieCIKKworI2RlZmluZSBTQ054TUFYCSBfX1BSSTY0X1JBTksgIngiCisjZGVmaW5lIFNDTnhQVFIgIF9fUFJJUFRSX1JBTksgIngiCisKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX0lOVFRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2tsaWJjL2NvbXBpbGVyLmggYi91c3IvaW5jbHVkZS9rbGliYy9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjYyMzQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9rbGliYy9jb21waWxlci5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICoga2xpYmMvY29tcGlsZXIuaAorICoKKyAqIFZhcmlvdXMgY29tcGlsZXIgZmVhdHVyZXMKKyAqLworCisjaWZuZGVmIF9LTElCQ19DT01QSUxFUl9ICisjZGVmaW5lIF9LTElCQ19DT01QSUxFUl9ICisKKy8qIFNwZWNpZmljIGNhbGxpbmcgY29udmVudGlvbnMgKi8KKy8qIF9fY2RlY2wgaXMgdXNlZCB3aGVuIHdlIHdhbnQgdmFyYWRpYyBhbmQgbm9uLXZhcmFkaWMgZnVuY3Rpb25zIHRvIGhhdmUKKyAgIHRoZSBzYW1lIGJpbmFyeSBjYWxsaW5nIGNvbnZlbnRpb24uICovCisjaWZkZWYgX19pMzg2X18KKyMgaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBfX2NkZWNsIF9fYXR0cmlidXRlX18oKGNkZWNsLHJlZ3Bhcm0oMCkpKQorIyBlbHNlCisgIC8qIE1vc3Qgb3RoZXIgQyBjb21waWxlcnMgaGF2ZSBfX2NkZWNsIGFzIGEga2V5d29yZCAqLworIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIF9fY2RlY2wJCS8qIE1lYW5pbmdsZXNzIG9uIG5vbi1pMzg2ICovCisjZW5kaWYKKworLyogSG93IHRvIGRlY2xhcmUgYSBmdW5jdGlvbiB0aGF0ICptdXN0KiBiZSBpbmxpbmVkICovCisjaWZkZWYgX19HTlVDX18KKyMgaWYgX19HTlVDX18gPj0gMworIyAgZGVmaW5lIF9fbXVzdF9pbmxpbmUgc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCisjIGVsc2UKKyMgIGRlZmluZSBfX211c3RfaW5saW5lIGV4dGVybiBfX2lubGluZV9fCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgX19tdXN0X2lubGluZSBpbmxpbmUJLyogSnVzdCBob3BlIHRoaXMgd29ya3MuLi4gKi8KKyNlbmRpZgorCisvKiBIb3cgdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QgcmV0dXJuICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIF9fbm9yZXR1cm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxzZQorIyBkZWZpbmUgX19ub3JldHVybiB2b2lkCisjZW5kaWYKKworLyogImNvbnN0IiBmdW5jdGlvbjoKKworICAgICBNYW55IGZ1bmN0aW9ucyBkbyBub3QgZXhhbWluZSBhbnkgdmFsdWVzIGV4Y2VwdCB0aGVpciBhcmd1bWVudHMsCisgICAgIGFuZCBoYXZlIG5vIGVmZmVjdHMgZXhjZXB0IHRoZSByZXR1cm4gdmFsdWUuICBCYXNpY2FsbHkgdGhpcyBpcworICAgICBqdXN0IHNsaWdodGx5IG1vcmUgc3RyaWN0IGNsYXNzIHRoYW4gdGhlIGBwdXJlJyBhdHRyaWJ1dGUgYWJvdmUsCisgICAgIHNpbmNlIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIHRvIHJlYWQgZ2xvYmFsIG1lbW9yeS4KKworICAgICBOb3RlIHRoYXQgYSBmdW5jdGlvbiB0aGF0IGhhcyBwb2ludGVyIGFyZ3VtZW50cyBhbmQgZXhhbWluZXMgdGhlCisgICAgIGRhdGEgcG9pbnRlZCB0byBtdXN0IF9ub3RfIGJlIGRlY2xhcmVkIGBjb25zdCcuICBMaWtld2lzZSwgYQorICAgICBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgbm9uLWBjb25zdCcgZnVuY3Rpb24gdXN1YWxseSBtdXN0IG5vdCBiZQorICAgICBgY29uc3QnLiAgSXQgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3IgYSBgY29uc3QnIGZ1bmN0aW9uIHRvIHJldHVybgorICAgICBgdm9pZCcuCisqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBfX2NvbnN0ZnVuYyBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCisjZWxzZQorIyBkZWZpbmUgX19jb25zdGZ1bmMKKyNlbmRpZgorI3VuZGVmIF9fYXR0cmlidXRlX2NvbnN0X18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX2NvbnN0ZnVuYworCisvKiAicHVyZSIgZnVuY3Rpb246CisKKyAgICAgTWFueSBmdW5jdGlvbnMgaGF2ZSBubyBlZmZlY3RzIGV4Y2VwdCB0aGUgcmV0dXJuIHZhbHVlIGFuZCB0aGVpcgorICAgICByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbmx5IG9uIHRoZSBwYXJhbWV0ZXJzIGFuZC9vciBnbG9iYWwKKyAgICAgdmFyaWFibGVzLiAgU3VjaCBhIGZ1bmN0aW9uIGNhbiBiZSBzdWJqZWN0IHRvIGNvbW1vbiBzdWJleHByZXNzaW9uCisgICAgIGVsaW1pbmF0aW9uIGFuZCBsb29wIG9wdGltaXphdGlvbiBqdXN0IGFzIGFuIGFyaXRobWV0aWMgb3BlcmF0b3IKKyAgICAgd291bGQgYmUuICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIHdpdGggdGhlIGF0dHJpYnV0ZQorICAgICBgcHVyZScuCisqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBfX3B1cmVmdW5jIF9fYXR0cmlidXRlX18oKHB1cmUpKQorI2Vsc2UKKyMgZGVmaW5lIF9fcHVyZWZ1bmMKKyNlbmRpZgorI3VuZGVmIF9fYXR0cmlidXRlX3B1cmVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9wdXJlX18gX19wdXJlZnVuYworCisvKiBGb3JtYXQgYXR0cmlidXRlICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIF9fZm9ybWF0ZnVuYyh0LGYsYSkgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHQsZixhKSkpCisjZWxzZQorIyBkZWZpbmUgX19mb3JtYXRmdW5jKHQsZixhKQorI2VuZGlmCisKKy8qIG1hbGxvYygpIGZ1bmN0aW9uIChyZXR1cm5zIHVuYWxpYXNlZCBwb2ludGVyKSAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSAzKQorIyBkZWZpbmUgX19tYWxsb2NmdW5jIF9fYXR0cmlidXRlX18oKG1hbGxvYykpCisjZWxzZQorIyBkZWZpbmUgX19tYWxsb2NmdW5jCisjZW5kaWYKKworLyogbGlrZWx5L3VubGlrZWx5ICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NSkpCisjIGRlZmluZSBfX2xpa2VseSh4KSAgIF9fYnVpbHRpbl9leHBlY3QoKHgpLCAxKQorIyBkZWZpbmUgX191bmxpa2VseSh4KSBfX2J1aWx0aW5fZXhwZWN0KCh4KSwgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpa2VseSh4KSAgICh4KQorIyBkZWZpbmUgX191bmxpa2VseSh4KSAoeCkKKyNlbmRpZgorCisvKiBQb3NzaWJseSB1bnVzZWQgZnVuY3Rpb24gKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgX191bnVzZWRmdW5jCV9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorIyBkZWZpbmUgX191bnVzZWRmdW5jCisjZW5kaWYKKworLyogSXQncyBhbGwgdXNlciBzcGFjZS4uLiAqLworI2RlZmluZSBfX3VzZXIKKworLyogVGhlIGJpdHdpc2UgYXR0cmlidXRlOiBkaXNhbGxvdyBhcml0aG1ldHJpYyBvcGVyYXRpb25zICovCisjaWZkZWYgX19DSEVDS0VSX18JCS8qIHNwYXJzZSBvbmx5ICovCisjIGRlZmluZSBfX2JpdHdpc2UJX19hdHRyaWJ1dGVfXygoYml0d2lzZSkpCisjZWxzZQorIyBkZWZpbmUgX19iaXR3aXNlCisjZW5kaWYKKworLyogU2h1dCB1cCB1bnVzZWQgd2FybmluZ3MgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgX19hdHRyaWJ1dGVfdXNlZF9fIF9fYXR0cmlidXRlX18oKHVzZWQpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXworI2VuZGlmCisKKy8qIENvbXBpbGVyIHByYWdtYSB0byBtYWtlIGFuIGFsaWFzIHN5bWJvbCAqLworI2RlZmluZSBfX0FMSUFTKF9fdCwgX19mLCBfX3AsIF9fYSkgXAorICBfX3QgX19mIF9fcCBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygjX19hKSkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2tsaWJjL2RpdmVyci5oIGIvdXNyL2luY2x1ZGUva2xpYmMvZGl2ZXJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwODg3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2tsaWJjL2RpdmVyci5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBrbGliYy9kaXZlcnIuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0RJVkVSUl9ICisjZGVmaW5lIF9LTElCQ19ESVZFUlJfSAorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19kaXZpZGVfZXJyb3Iodm9pZCkKK3sKKwlyYWlzZShTSUdGUEUpOworfQorCisjZW5kaWYJCQkJLyogX0tMSUJDX0RJVkVSUl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9rbGliYy9lbmRpYW4uaCBiL3Vzci9pbmNsdWRlL2tsaWJjL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTYzZGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9rbGliYy9lbmRpYW4uaApAQCAtMCwwICsxLDM5IEBACisvKgorICoga2xpYmMvZW5kaWFuLmgKKyAqCisgKiBMaWtlIDxlbmRpYW4uaD4sIGJ1dCBleHBvcnQgb25seSBkb3VibGUtdW5kZXJzY29yZSBzeW1ib2xzCisgKi8KKworI2lmbmRlZiBfS0xJQkNfRU5ESUFOX0gKKyNkZWZpbmUgX0tMSUJDX0VORElBTl9ICisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogTGludXgnIGFzbS9ieXRlb3JkZXIuaCBkZWZpbmVzIGVpdGhlciBfX0xJVFRMRV9FTkRJQU4gb3IKKyAgIF9fQklHX0VORElBTiwgYnV0IHRoZSBnbGliYy9CU0QtaXNoIG1hY3JvcyBleHBlY3QgYm90aCB0byBiZQorICAgZGVmaW5lZCB3aXRoIF9fQllURV9PUkRFUiBkZWZpbmluZyB3aGljaCBpcyBhY3R1YWxseSB1c2VkLi4uICovCisKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKyMgdW5kZWYgIF9fTElUVExFX0VORElBTgorIyBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyMgZGVmaW5lIF9fQklHX0VORElBTiAgICA0MzIxCisjIGRlZmluZSBfX1BEUF9FTkRJQU4gICAgMzQxMgorIyBkZWZpbmUgX19CWVRFX09SREVSICAgIF9fTElUVExFX0VORElBTgorI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisjIHVuZGVmICBfX0JJR19FTkRJQU4KKyMgZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjIGRlZmluZSBfX0JJR19FTkRJQU4gICAgNDMyMQorIyBkZWZpbmUgX19QRFBfRU5ESUFOICAgIDM0MTIKKyMgZGVmaW5lIF9fQllURV9PUkRFUiAgICBfX0JJR19FTkRJQU4KKyNlbGlmIGRlZmluZWQoX19QRFBfRU5ESUFOKQorIyB1bmRlZiAgX19QRFBfRU5ESUFOCisjIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4gMTIzNAorIyBkZWZpbmUgX19CSUdfRU5ESUFOICAgIDQzMjEKKyMgZGVmaW5lIF9fUERQX0VORElBTiAgICAzNDEyCisjIGRlZmluZSBfX0JZVEVfT1JERVIgICAgX19QRFBfRU5ESUFOCisjZWxzZQorIyBlcnJvciAiVW5rbm93biBieXRlIG9yZGVyISIKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX0tMSUJDX0VORElBTl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9rbGliYy9leHRlcm4uaCBiL3Vzci9pbmNsdWRlL2tsaWJjL2V4dGVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkN2M3YjgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9rbGliYy9leHRlcm4uaApAQCAtMCwwICsxLDE2IEBACisvKgorICoga2xpYmMvZXh0ZXJuLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19FWFRFUk5fSAorI2RlZmluZSBfS0xJQkNfRVhURVJOX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIF9fZXh0ZXJuIGV4dGVybiAiQyIKKyNlbHNlCisjZGVmaW5lIF9fZXh0ZXJuIGV4dGVybgorI2VuZGlmCisKKyNkZWZpbmUgX19hbGlhcyh4KSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcyh4KSkpCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfRVhURVJOX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2tsaWJjL3N0YXRoZWxwLmggYi91c3IvaW5jbHVkZS9rbGliYy9zdGF0aGVscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjBkYWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9rbGliYy9zdGF0aGVscC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzdGF0aGVscC5oCisgKgorICogSGVscGVyIG1hY3JvcyBmb3IgPGtsaWJjL2FyY2hzdGF0Lmg+CisgKi8KKworI2lmbmRlZiBfS0xJQkNfU1RBVEhFTFBfSAorI2RlZmluZSBfS0xJQkNfU1RBVEhFTFBfSAorCisjaW5jbHVkZSA8a2xpYmMvZW5kaWFuLmg+CisKKy8qCisgKiBNb3N0IGFyY2hpdGVjdHVyZXMgaGF2ZSBhIDY0LWJpdCBmaWVsZCBmb3Igc3RfZGV2IGFuZCBzdF9yZGV2LAorICogYnV0IGRldl90IGlzIDMyIGJpdHMgKHVpbnQzMl90ID09IHVuc2lnbmVkIGludCksIHNvIG1ha2UgYQorICogbWFjcm8gd2UgY2FuIHVzZSBhY3Jvc3MgYWxsIGFyY2hpdGVjdHVyZXMuCisgKi8KKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgZGVmaW5lIF9fc3RkZXY2NCh4KQl1bnNpZ25lZCBpbnQgX18jI3gsIHg7CisjZWxzZQorIyBkZWZpbmUgX19zdGRldjY0KHgpCXVuc2lnbmVkIGludCB4LCBfXyMjeDsKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX0tMSUJDX1NUQVRIRUxQX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGIvdXNyL2luY2x1ZGUva2xpYmMvc3lzY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMzJkOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICoga2xpYmMvc3lzY29uZmlnLmgKKyAqCisgKiBBbGxvd3MgZm9yIGRlZmluaXRpb25zIG9mIHNvbWUgdGhpbmdzIHdoaWNoIG1heSBiZSBzeXN0ZW0tZGVwZW5kZW50CisgKiBOT1RFOiB0aGlzIGZpbGUgbXVzdCBub3QgcmVzdWx0IGluIGFueSBvdXRwdXQgZnJvbSB0aGUgcHJlcHJvY2Vzc29yLgorICovCisKKyNpZm5kZWYgX0tMSUJDX1NZU0NPTkZJR19ICisjZGVmaW5lIF9LTElCQ19TWVNDT05GSUdfSAorCisjaW5jbHVkZSA8a2xpYmMvYXJjaGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgdmFyaWFibGVzIHRoYXQgY2FuIGJlIGRlZmluZWQgaW4gPGtsaWJjL2FyY2hjb25maWcuaD4uCisgKiBGb3IgYm9vbGVhbiBvcHRpb25zLCAjZGVmaW5lIHRvIDAgdG8gZGlzYWJsZSwgI2RlZmluZSB0byAxIHRvIGVuYWJsZS4KKyAqCisgKiBJZiB1bmRlZmluZWQsIHRoZXkgd2lsbCBiZSBnaXZlbiBkZWZhdWx0cyBoZXJlLgorICovCisKKworLyoKKyAqIF9LTElCQ19OT19NTVU6CisgKgorICoJSW5kaWNhdGVzIHRoaXMgYXJjaGl0ZWN0dXJlIGRvZXNuJ3QgaGF2ZSBhbiBNTVUsIGFuZCB0aGVyZWZvcmUKKyAqCWRvZXMgbm90IGhhdmUgdGhlIHN5c19mb3JrIGFuZCBzeXNfYnJrIHN5c3RlbSBjYWxscy4KKyAqLworLyogRGVmYXVsdCB0byBoYXZpbmcgYW4gTU1VIGlmIHdlIGNhbiBmaW5kIHRoZSBmb3JrIHN5c3RlbSBjYWxsICovCisjaWZuZGVmIF9LTElCQ19OT19NTVUKKyMgaWYgZGVmaW5lZChfX05SX2ZvcmspCisjICBkZWZpbmUgX0tMSUJDX05PX01NVSAwCisjIGVsc2UKKyMgIGRlZmluZSBfS0xJQkNfTk9fTU1VIDEKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBfS0xJQkNfUkVBTF9WRk9SSzoKKyAqCisgKglJbmRpY2F0ZXMgdGhhdCB0aGlzIGFyY2hpdGVjdHVyZSBoYXMgYSByZWFsIHZmb3JrKCkgc3lzdGVtIGNhbGwuCisgKglUaGlzIGlzIHRoZSBkZWZhdWx0IGlmIHN5c192Zm9yayBleGlzdHM7IGlmIHRoZXJlIGlzIGFuCisgKglhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIHZmb3JrKCksIGRlZmluZSB0aGlzCisgKglzeW1ib2wuCisgKi8KKyNpZm5kZWYgX0tMSUJDX1JFQUxfVkZPUksKKyMgaWYgZGVmaW5lZChfX05SX3Zmb3JrKQorIyAgZGVmaW5lIF9LTElCQ19SRUFMX1ZGT1JLIDEKKyMgZWxzZQorIyAgZGVmaW5lIF9LTElCQ19SRUFMX1ZGT1JLIDAKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBfS0xJQkNfVVNFX01NQVAyOgorICoKKyAqCUluZGljYXRlcyB0aGF0IHRoaXMgYXJjaGl0ZWN0dXJlIHNob3VsZCB1c2Ugc3lzX21tYXAyIGluc3RlYWQKKyAqCW9mIHN5c19tbWFwLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcywgYXNzdW1pbmcKKyAqCXN5c19tbWFwMiBleGlzdHMuCisgKi8KKyNpZm5kZWYgX0tMSUJDX1VTRV9NTUFQMgorIyBpZiAoX0JJVFNJWkUgPT0gMzIgJiYgZGVmaW5lZChfX05SX21tYXAyKSkgfHwgXAorICAgICAoX0JJVFNJWkUgPT0gNjQgJiYgIWRlZmluZWQoX19OUl9tbWFwKSkKKyMgIGRlZmluZSBfS0xJQkNfVVNFX01NQVAyIDEKKyMgZWxzZQorIyAgZGVmaW5lIF9LTElCQ19VU0VfTU1BUDIgMAorIyBlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19NTUFQMl9TSElGVDoKKyAqCisgKglJbmRpY2F0ZSB0aGUgc2hpZnQgb2YgdGhlIG9mZnNldCBwYXJhbWV0ZXIgaW4gc3lzX21tYXAyLgorICoJT24gbW9zdCBhcmNoaXRlY3R1cmVzLCB0aGlzIGlzIGFsd2F5cyAxMiwgYnV0IG9uIHNvbWUKKyAqCWFyY2hpdGVjdHVyZXMgaXQgY2FuIGJlIGEgZGlmZmVyZW50IG51bWJlciwgb3IgdGhlIGN1cnJlbnQKKyAqCXBhZ2Ugc2l6ZS4gIElmIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBwYWdlIHNpemUsIGRlZmluZQorICoJdGhpcyB0byBhbiBleHByZXNzaW9uIHdoaWNoIGluY2x1ZGVzIF9fZ2V0cGFnZXNoaWZ0KCkuCisgKi8KKyNpZm5kZWYgX0tMSUJDX01NQVAyX1NISUZUCisjIGRlZmluZSBfS0xJQkNfTU1BUDJfU0hJRlQgMTIKKyNlbmRpZgorCisKKy8qCisgKiBfS0xJQkNfTUFMTE9DX1VTRVNfU0JSSzoKKyAqCisgKglJbmRpY2F0ZXMgdGhhdCBtYWxsb2MoKSBzaG91bGQgdXNlIHNicmsoKSB0byBvYnRhaW4gcmF3IG1lbW9yeQorICoJZnJvbSB0aGUgc3lzdGVtLCByYXRoZXIgdGhhbiBtbWFwKCkuCisgKi8KKy8qIERlZmF1bHQgdG8gZ2V0IG1lbW9yeSB1c2luZyBtbWFwKCkgKi8KKyNpZm5kZWYgX0tMSUJDX01BTExPQ19VU0VTX1NCUksKKyMgZGVmaW5lIF9LTElCQ19NQUxMT0NfVVNFU19TQlJLIDAKKyNlbmRpZgorCisKKy8qCisgKiBfS0xJQkNfTUFMTE9DX0NIVU5LX1NJWkU6CisgKglUaGlzIGlzIHRoZSBtaW5pbXVtIGNodW5rIHNpemUgd2Ugd2lsbCBhc2sgdGhlIGtlcm5lbCBmb3IgdXNpbmcKKyAqCW1hbGxvYygpOyB0aGlzIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIHRoZSBwYWdlIHNpemUgYW5kIG11c3QKKyAqCWJlIGEgcG93ZXIgb2YgMi4KKyAqLworI2lmbmRlZiBfS0xJQkNfTUFMTE9DX0NIVU5LX1NJWkUKKyMgZGVmaW5lIF9LTElCQ19NQUxMT0NfQ0hVTktfU0laRQk2NTUzNgorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19TQlJLX0FMSUdOTUVOVDoKKyAqCisgKglUaGlzIGlzIHRoZSBtaW5pbXVtIGFsaWdubWVudCBmb3IgdGhlIG1lbW9yeSByZXR1cm5lZCBieQorICoJc2JyaygpLiAgSXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIuICBJZiBfS0xJQkNfTUFMTE9DX1VTRVNfU0JSSworICoJaXMgc2V0IGl0IHNob3VsZCBiZSBubyBzbWFsbGVyIHRoYW4gdGhlIHNpemUgb2Ygc3RydWN0CisgKglhcmVuYV9oZWFkZXIgaW4gbWFsbG9jLmggKD09IDQgcG9pbnRlcnMuKQorICovCisjaWZuZGVmIF9LTElCQ19TQlJLX0FMSUdOTUVOVAorIyBkZWZpbmUgX0tMSUJDX1NCUktfQUxJR05NRU5UCQkzMgorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19VU0VfUlRfU0lHOgorICoKKyAqICAgICAgSW5kaWNhdGVzIHRoYXQgdGhpcyBhcmNoaXRlY3R1cmUgc2hvdWxkIHVzZSB0aGUgcnRfc2lnKigpCisgKiAgICAgIGZhbWlseSBvZiBzeXN0ZW0gY2FsbHMsIGV2ZW4gaWYgdGhlIG9sZGVyIHN5c3RlbSBjYWxscyBhcmUKKyAqICAgICAgcHJvdmlkZWQuICBUaGlzIHJlcXVpcmVzIHRoYXQgPGFzbS9zaWduYWwuaD4gaXMgY29ycmVjdCBmb3IKKyAqICAgICAgdXNpbmcgd2l0aCB0aGUgcnRfc2lnKigpIHN5c3RlbSBjYWxscy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgaWYKKyAqICAgICAgdGhlIG9sZGVyIHN5c3RlbSBjYWxscyBhcmUgdW5kZWZpbmVkIGluIDxhc20vdW5pc3RkLmg+LgorICoKKyAqLworI2lmbmRlZiBfS0xJQkNfVVNFX1JUX1NJRworIyBpZmRlZiBfX05SX3NpZ2FjdGlvbgorIyAgZGVmaW5lIF9LTElCQ19VU0VfUlRfU0lHIDAKKyMgZWxzZQorIyAgZGVmaW5lIF9LTElCQ19VU0VfUlRfU0lHIDEKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBfS0xJQkNfTkVFRFNfU0FfUkVTVE9SRVI6CisgKgorICoJU29tZSBhcmNoaXRlY3R1cmVzLCBsaWtlIHg4Ni02NCBhbmQgc29tZSBpMzg2IEZlZG9yYSBrZXJuZWxzLAorICoJZG8gbm90IHByb3ZpZGUgYSBkZWZhdWx0IHNpZ3JldHVybiwgYW5kIHRoZXJlZm9yZSBtdXN0IGhhdmUKKyAqCVNBX1JFU1RPUkVSIHNldC4KKyAqLworI2lmbmRlZiBfS0xJQkNfTkVFRFNfU0FfUkVTVE9SRVIKKyMgZGVmaW5lIF9LTElCQ19ORUVEU19TQV9SRVNUT1JFUiAwCisjZW5kaWYKKworCisvKgorICogX0tMSUJDX1NUQVRGU19GX1RZUEVfNjQ6CisgKgorICoJVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgZl90eXBlLCBmX2JzaXplLCBmX25hbWVsZW4sCisgKglmX2Zyc2l6ZSwgYW5kIGZfc3BhcmUgZmllbGRzIG9mIHN0cnVjdCBzdGF0ZnMgYXJlCisgKgk2NCBiaXRzIGxvbmcuICBUaGlzIGlzIG5vcm1hbGx5IHRoZSBjYXNlIGZvciA2NC1iaXQKKyAqCXBsYXRmb3JtcywgYW5kIHNvIGlzIHRoZSBkZWZhdWx0IGZvciB0aG9zZS4gIFNlZQorICoJdXNyL2luY2x1ZGUvc3lzL3Zmcy5oIGZvciB0aGUgZXhhY3QgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfS0xJQkNfU1RBVEZTX0ZfVFlQRV82NAorIyBkZWZpbmUgX0tMSUJDX1NUQVRGU19GX1RZUEVfNjQgKF9CSVRTSVpFID09IDY0KQorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19TVEFURlNfRl9UWVBFXzMyQjoKKyAqCisgKiAJbWlwcyBoYXMgaXQncyBvd24gZGVmaW5pdGlvbiBvZiBzdGF0ZnMsIHdoaWNoIGlzCisgKiAJZGlmZmVyZW50IGZyb20gYW55IG90aGVyIDMyIGJpdCBhcmNoLgorICovCQorI2lmbmRlZiBfS0xJQkNfU1RBVEZTX0ZfVFlQRV8zMkIKKyMgZGVmaW5lIF9LTElCQ19TVEFURlNfRl9UWVBFXzMyQiAwCisjZW5kaWYKKworCisvKgorICogX0tMSUJDX0hBU19BUkNIU09DS0VUX0gKKyAqCisgKiAgICAgICBUaGlzIGFyY2hpdGVjdHVyZSBoYXMgPGtsaWJjL2FyY2hzb2NrZXQuaD4KKyAqLworI2lmbmRlZiBfS0xJQkNfSEFTX0FSQ0hTT0NLRVRfSAorIyBkZWZpbmUgX0tMSUJDX0hBU19BUkNIU09DS0VUX0ggMAorI2VuZGlmCisKKyNlbmRpZiAvKiBfS0xJQkNfU1lTQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2xpbWl0cy5oIGIvdXNyL2luY2x1ZGUvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyZjAwNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2xpbWl0cy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBsaW1pdHMuaAorICovCisKKyNpZm5kZWYgX0xJTUlUU19ICisjZGVmaW5lIF9MSU1JVFNfSAorCisjZGVmaW5lIENIQVJfQklUCTgKKyNkZWZpbmUgU0hSVF9CSVQJMTYKKyNkZWZpbmUgSU5UX0JJVAkJMzIKKyNkZWZpbmUgTE9OR0xPTkdfQklUCTY0CisKKyNkZWZpbmUgU0NIQVJfTUlOCSgtMTI4KQorI2RlZmluZSBTQ0hBUl9NQVgJMTI3CisjZGVmaW5lIFVDSEFSX01BWAkyNTUKKworI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisjIGRlZmluZSBDSEFSX01JTiAwCisjIGRlZmluZSBDSEFSX01BWCBVQ0hBUl9NQVgKKyNlbHNlCisjIGRlZmluZSBDSEFSX01JTiBTQ0hBUl9NSU4KKyMgZGVmaW5lIENIQVJfTUFYIFNDSEFSX01BWAorI2VuZGlmCisKKyNkZWZpbmUgU0hSVF9NSU4JKC0zMjc2OCkKKyNkZWZpbmUgU0hSVF9NQVgJMzI3NjcKKyNkZWZpbmUgVVNIUlRfTUFYCTY1NTM1CisKKyNkZWZpbmUgSU5UX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIElOVF9NQVgJCTIxNDc0ODM2NDcKKyNkZWZpbmUgVUlOVF9NQVgJNDI5NDk2NzI5NVUKKworI2RlZmluZSBMT05HTE9OR19NSU4JKC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwtMSkKKyNkZWZpbmUgTE9OR0xPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorI2RlZmluZSBVTE9OR0xPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMCisKKyNpbmNsdWRlIDxiaXRzaXplL2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCisjZW5kaWYJCQkJLyogX0xJTUlUU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9tYWxsb2MuaCBiL3Vzci9pbmNsdWRlL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzMxNjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9tYWxsb2MuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogbWFsbG9jLmgKKyAqCisgKiBBcHBhcmVudGx5IHBlb3BsZSBoYXZlbid0IGNhdWdodCBvbiB0byB1c2UgPHN0ZGxpYi5oPiwgd2hpY2ggaXMgdGhlCisgKiBzdGFuZGFyZCBwbGFjZSBmb3IgdGhpcyBjcmFwIHNpbmNlIHRoZSAxOTgwJ3MuLi4KKyAqLworCisjaWZuZGVmIF9NQUxMT0NfSAorI2RlZmluZSBfTUFMTE9DX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK19fZXh0ZXJuIHZvaWQgZnJlZSh2b2lkICopOworCitfX2V4dGVybiBfX21hbGxvY2Z1bmMgdm9pZCAqbWFsbG9jKHNpemVfdCk7CitfX2V4dGVybiBfX21hbGxvY2Z1bmMgdm9pZCAqY2FsbG9jKHNpemVfdCwgc2l6ZV90KTsKK19fZXh0ZXJuIF9fbWFsbG9jZnVuYyB2b2lkICpyZWFsbG9jKHZvaWQgKiwgc2l6ZV90KTsKKworI2VuZGlmCQkJCS8qIF9NQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0L2lmLmggYi91c3IvaW5jbHVkZS9uZXQvaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFhMGMwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0L2lmLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9ORVRfSUZfSAorI2RlZmluZSBfTkVUX0lGX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKKyNlbmRpZiAvKiBfTkVUX0lGX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL25ldC9pZl9hcnAuaCBiL3Vzci9pbmNsdWRlL25ldC9pZl9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjVmMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0L2lmX2FycC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL25ldC9pZl9wYWNrZXQuaCBiL3Vzci9pbmNsdWRlL25ldC9pZl9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU4ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0L2lmX3BhY2tldC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL25ldC9yb3V0ZS5oIGIvdXNyL2luY2x1ZGUvbmV0L3JvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwZGYyNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGVmMjIwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTJiYjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIG5ldGluZXQvaW4uaAorICovCisKKyNpZm5kZWYgX05FVElORVRfSU5fSAorI2RlZmluZSBfTkVUSU5FVF9JTl9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4JCS8qIE11c3QgYmUgaW5jbHVkZWQgKmJlZm9yZSogPGxpbnV4L2luLmg+ICovCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgkJLyogTXVzdCBiZSBpbmNsdWRlZCAqYmVmb3JlKiA8bGludXgvaW4uaD4gKi8KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorCisjaWZuZGVmIGh0b25zCisjIGRlZmluZSBodG9ucyh4KQlfX2NwdV90b19iZTE2KHgpCisjZW5kaWYKKyNpZm5kZWYgbnRvaHMKKyMgZGVmaW5lIG50b2hzKHgpCV9fYmUxNl90b19jcHUoeCkKKyNlbmRpZgorI2lmbmRlZiBodG9ubAorIyBkZWZpbmUgaHRvbmwoeCkJX19jcHVfdG9fYmUzMih4KQorI2VuZGlmCisjaWZuZGVmIG50b2hsCisjIGRlZmluZSBudG9obCh4KQlfX2JlMzJfdG9fY3B1KHgpCisjZW5kaWYKKyNpZm5kZWYgaHRvbnEKKyMgZGVmaW5lIGh0b25xKHgpCV9fY3B1X3RvX2JlNjQoeCkKKyNlbmRpZgorI2lmbmRlZiBudG9ocQorIyBkZWZpbmUgbnRvaHEoeCkJX19iZTY0X3RvX2NwdSh4KQorI2VuZGlmCisKKyNkZWZpbmUgSVBQT1JUX1JFU0VSVkVECTEwMjQKKworX19leHRlcm4gaW50IGJpbmRyZXN2cG9ydChpbnQgc2QsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKTsKKworI2VuZGlmCQkJCS8qIF9ORVRJTkVUX0lOX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL25ldGluZXQvaW42LmggYi91c3IvaW5jbHVkZS9uZXRpbmV0L2luNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmRhOTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXRpbmV0L2luNi5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBuZXRpbmV0L2luNi5oCisgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JTjZfSAorI2RlZmluZSBfTkVUSU5FVF9JTjZfSAorCisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisKKyNlbmRpZgkJCQkvKiBfTkVUSU5FVF9JTjZfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcC5oIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODRiZmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXRpbmV0L2lwLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIG5ldGluZXQvaXAuaAorICovCisKKyNpZm5kZWYgX05FVElORVRfSVBfSAorI2RlZmluZSBfTkVUSU5FVF9JUF9ICisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorCisjZGVmaW5lIElQX0RGCQkweDQwMDAJLyogRmxhZzogIkRvbid0IEZyYWdtZW50IiAqLworCisjZW5kaWYJCQkJLyogX05FVElORVRfSVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0aW5ldC90Y3AuaCBiL3Vzci9pbmNsdWRlL25ldGluZXQvdGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjNDcyOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL25ldGluZXQvdGNwLmgKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIG5ldGluZXQvdGNwLmgKKyAqLworCisjaWZuZGVmIF9ORVRJTkVUX1RDUF9ICisjZGVmaW5lIF9ORVRJTkVUX1RDUF9ICisKKyNpbmNsdWRlIDxlbmRpYW4uaD4JCS8qIEluY2x1ZGUgKmJlZm9yZSogbGludXgvdGNwLmggKi8KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKworI2VuZGlmCQkJCS8qIF9ORVRJTkVUX1RDUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZmNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC91ZHAuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogbmV0aW5ldC91ZHAuaAorICovCisKKyNpZm5kZWYgX05FVElORVRfVURQX0gKKyNkZWZpbmUgX05FVElORVRfVURQX0gKKworLyoKKyAqIFdlIHdvdWxkIGluY2x1ZGUgbGludXgvdWRwLmgsIGJ1dCBpdCBicmluZ3MgaW4gdG9vIG11Y2ggb3RoZXIgc3R1ZmYKKyAqLworCitzdHJ1Y3QgdWRwaGRyIHsKKwlfX3UxNiBzb3VyY2U7CisJX191MTYgZGVzdDsKKwlfX3UxNiBsZW47CisJX191MTYgY2hlY2s7Cit9OworCisjZW5kaWYJCQkJLyogX05FVElORVRfVURQX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL25ldHBhY2tldC9wYWNrZXQuaCBiL3Vzci9pbmNsdWRlL25ldHBhY2tldC9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU4ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0cGFja2V0L3BhY2tldC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3BhdGhzLmggYi91c3IvaW5jbHVkZS9wYXRocy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWYzMDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9wYXRocy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcGF0aHMuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmIF9QQVRIU19IXworI2RlZmluZQlfUEFUSFNfSF8KKworLyogRGVmYXVsdCBzZWFyY2ggcGF0aC4gKi8KKyNkZWZpbmUJX1BBVEhfREVGUEFUSAkiL3Vzci9iaW46L2JpbiIKKy8qIEFsbCBzdGFuZGFyZCB1dGlsaXRpZXMgcGF0aC4gKi8KKyNkZWZpbmUJX1BBVEhfU1REUEFUSCBcCisJIi91c3IvYmluOi9iaW46L3Vzci9zYmluOi9zYmluIgorCisjZGVmaW5lCV9QQVRIX0JTSEVMTAkiL2Jpbi9zaCIKKyNkZWZpbmUJX1BBVEhfQ09OU09MRQkiL2Rldi9jb25zb2xlIgorI2RlZmluZQlfUEFUSF9DU0hFTEwJIi9iaW4vY3NoIgorI2RlZmluZQlfUEFUSF9ERVZEQgkiL3Zhci9ydW4vZGV2LmRiIgorI2RlZmluZQlfUEFUSF9ERVZOVUxMCSIvZGV2L251bGwiCisjZGVmaW5lCV9QQVRIX0RSVU0JIi9kZXYvZHJ1bSIKKyNkZWZpbmUJX1BBVEhfS0xPRwkiL3Byb2Mva21zZyIKKyNkZWZpbmUJX1BBVEhfS01FTQkiL2Rldi9rbWVtIgorI2RlZmluZQlfUEFUSF9MQVNUTE9HCSIvdmFyL2xvZy9sYXN0bG9nIgorI2RlZmluZQlfUEFUSF9NQUlMRElSCSIvdmFyL21haWwiCisjZGVmaW5lCV9QQVRIX01BTgkiL3Vzci9zaGFyZS9tYW4iCisjZGVmaW5lCV9QQVRIX01FTQkiL2Rldi9tZW0iCisjZGVmaW5lCV9QQVRIX01OVFRBQgkiL2V0Yy9mc3RhYiIKKyNkZWZpbmUJX1BBVEhfTU9VTlRFRAkiL2V0Yy9tdGFiIgorI2RlZmluZQlfUEFUSF9OT0xPR0lOCSIvZXRjL25vbG9naW4iCisjZGVmaW5lCV9QQVRIX1BSRVNFUlZFCSIvdmFyL2xpYiIKKyNkZWZpbmUJX1BBVEhfUldIT0RJUgkiL3Zhci9zcG9vbC9yd2hvIgorI2RlZmluZQlfUEFUSF9TRU5ETUFJTAkiL3Vzci9zYmluL3NlbmRtYWlsIgorI2RlZmluZQlfUEFUSF9TSEFET1cJIi9ldGMvc2hhZG93IgorI2RlZmluZQlfUEFUSF9TSEVMTFMJIi9ldGMvc2hlbGxzIgorI2RlZmluZQlfUEFUSF9UVFkJIi9kZXYvdHR5IgorI2RlZmluZQlfUEFUSF9VTklYCSIvYm9vdC92bWxpbnV4IgorI2RlZmluZSBfUEFUSF9VVE1QCSIvdmFyL3J1bi91dG1wIgorI2RlZmluZQlfUEFUSF9WSQkiL2Jpbi92aSIKKyNkZWZpbmUgX1BBVEhfV1RNUAkiL3Zhci9sb2cvd3RtcCIKKworLyogUHJvdmlkZSB0cmFpbGluZyBzbGFzaCwgc2luY2UgbW9zdGx5IHVzZWQgZm9yIGJ1aWxkaW5nIHBhdGhuYW1lcy4gKi8KKyNkZWZpbmUJX1BBVEhfREVWCSIvZGV2LyIKKyNkZWZpbmUJX1BBVEhfVE1QCSIvdG1wLyIKKyNkZWZpbmUJX1BBVEhfVkFSREIJIi92YXIvZGIvIgorI2RlZmluZQlfUEFUSF9WQVJSVU4JIi92YXIvcnVuLyIKKyNkZWZpbmUJX1BBVEhfVkFSVE1QCSIvdmFyL3RtcC8iCisKKyNlbmRpZgkJCQkvKiAhX1BBVEhTX0hfICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9wb2xsLmggYi91c3IvaW5jbHVkZS9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmYjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3BvbGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3B3ZC5oIGIvdXNyL2luY2x1ZGUvcHdkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkZGJmYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3B3ZC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX1BXRF9ICisjZGVmaW5lIF9QV0RfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3N0cnVjdCBwYXNzd2QgeworCWNoYXIgKnB3X25hbWU7CisJY2hhciAqcHdfcGFzc3dkOworCXVpZF90IHB3X3VpZDsKKwlnaWRfdCBwd19naWQ7CisJY2hhciAqcHdfZ2Vjb3M7CisJY2hhciAqcHdfZGlyOworCWNoYXIgKnB3X3NoZWxsOworfTsKKworX19leHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHduYW0oY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZgkvKiBfUFdEX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3NjaGVkLmggYi91c3IvaW5jbHVkZS9zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNGRhOGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zY2hlZC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBzY2hlZC5oCisgKi8KKworI2lmbmRlZiBfU0NIRURfSAorI2RlZmluZSBfU0NIRURfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisKKy8qIGxpbnV4L3NjaGVkLmggaXMgdW51c2FibGU7IHB1dCB0aGUgZGVjbGFyYXRpb25zIHdlIG5lZWQgaGVyZS4uLiAqLworCisjZGVmaW5lIFNDSEVEX05PUk1BTCAgICAgICAgICAgIDAKKyNkZWZpbmUgU0NIRURfRklGTyAgICAgICAgICAgICAgMQorI2RlZmluZSBTQ0hFRF9SUiAgICAgICAgICAgICAgICAyCisKK3N0cnVjdCBzY2hlZF9wYXJhbSB7CisJaW50IHNjaGVkX3ByaW9yaXR5OworfTsKKworX19leHRlcm4gaW50IHNjaGVkX3NldHNjaGVkdWxlcihwaWRfdCwgaW50LCBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CitfX2V4dGVybiBpbnQgc2NoZWRfeWllbGQodm9pZCk7CisKKy8qIFJhdyBpbnRlcmZhY2VzIHRvIGNsb25lKDIpOyBvbmx5IGFjdHVhbGx5IHVzYWJsZSBmb3Igbm9uLVZNLWNsb25pbmcgKi8KKyNpZmRlZiBfX2lhNjRfXworX19leHRlcm4gcGlkX3QgX19jbG9uZTIoaW50LCB2b2lkICosIHZvaWQgKik7CitzdGF0aWMgX19pbmxpbmVfXyBwaWRfdCBfX2Nsb25lKGludCBfZiwgdm9pZCAqX3NwKQoreworCS8qIElmIHRoaXMgaXMgdXNlZCB3aXRoIF9zcCAhPSAwIGl0IHdpbGwgaGF2ZSB0aGUgZWZmZWN0IG9mIHRoZSBzcAorCSAgIGFuZCByc3AgZ3Jvd2luZyBhd2F5IGZyb20gYSBzaW5nbGUgcG9pbnQgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucy4gKi8KKwlyZXR1cm4gX19jbG9uZTIoX2YsIF9zcCwgX3NwKTsKK30KKyNlbHNlCitfX2V4dGVybiBwaWRfdCBfX2Nsb25lKGludCwgdm9pZCAqKTsKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX1NDSEVEX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3NldGptcC5oIGIvdXNyL2luY2x1ZGUvc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlYmNjZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3NldGptcC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX1NFVEpNUF9ICisjZGVmaW5lIF9TRVRKTVBfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPGtsaWJjL2FyY2hzZXRqbXAuaD4KKworX19leHRlcm4gaW50IHNldGptcChqbXBfYnVmKTsKK19fZXh0ZXJuIF9fbm9yZXR1cm4gbG9uZ2ptcChqbXBfYnVmLCBpbnQpOworCisvKgorICBXaG9zZSBicmlnaHQgaWRlYSB3YXMgaXQgdG8gYWRkIHVucmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvIGp1c3QgYWJvdXQKKyAgdGhlIG9ubHkgZnVuY3Rpb24gaW4gdGhlIHN0YW5kYXJkIEMgbGlicmFyeSAoc2V0am1wKSB3aGljaCBjYW5ub3QgYmUKKyAgd3JhcHBlZCBieSBhbiBvcmRpbmFyeSBmdW5jdGlvbiB3cmFwcGVyPyAgQW55d2F5LCB0aGUgZGFtYWdlIGlzIGRvbmUsCisgIGFuZCB0aGVyZWZvcmUsIHRoaXMgd3JhcHBlciAqbXVzdCogYmUgaW5saW5lLiAgSG93ZXZlciwgZ2NjIHdpbGwKKyAgY29tcGxhaW4gaWYgdGhpcyBpcyBhbiBpbmxpbmUgZnVuY3Rpb24gZm9yIHVua25vd24gcmVhc29uLCBhbmQKKyAgdGhlcmVmb3JlIHNpZ3NldGptcCgpIG5lZWRzIHRvIGJlIGEgbWFjcm8uCisqLworCitzdHJ1Y3QgX19zaWdqbXBfYnVmIHsKKwlqbXBfYnVmIF9fam1wYnVmOworCXNpZ3NldF90IF9fc2lnczsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fc2lnam1wX2J1ZiBzaWdqbXBfYnVmWzFdOworCisjZGVmaW5lIHNpZ3NldGptcChfX2VudiwgX19zYXZlKSBcCisoeyBcCisgIHN0cnVjdCBfX3NpZ2ptcF9idWYgKl9fZSA9IChfX2Vudik7IFwKKyAgc2lncHJvY21hc2soMCwgTlVMTCwgJl9fZS0+X19zaWdzKTsgXAorICBzZXRqbXAoX19lLT5fX2ptcGJ1Zik7IFwKK30pCisKK19fZXh0ZXJuIF9fbm9yZXR1cm4gc2lnbG9uZ2ptcChzaWdqbXBfYnVmLCBpbnQpOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zaWduYWwuaCBiL3Vzci9pbmNsdWRlL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNmI0NzAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zaWduYWwuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIHNpZ25hbC5oCisgKi8KKworI2lmbmRlZiBfU0lHTkFMX0gKKyNkZWZpbmUgX1NJR05BTF9ICisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgkJLyogRm9yIG1lbXNldCgpICovCisjaW5jbHVkZSA8bGltaXRzLmg+CQkvKiBGb3IgTE9OR19CSVQgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGtsaWJjL2FyY2hzaWduYWwuaD4JLyogSW5jbHVkZXMgPGFzbS9zaWduYWwuaD4gaWYgYXBwcm9wcmlhdGUgKi8KKworLyogZ2xpYmMgc2VlbXMgdG8gdXNlIHNpZ19hdG9taWNfdCBhcyAiaW50IiBwcmV0dHkgbXVjaCBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKyAgIERvIHRoZSBzYW1lLCBidXQgYWxsb3cgdGhlIGFyY2hpdGVjdHVyZSB0byBvdmVycmlkZS4gKi8KKyNpZm5kZWYgX0tMSUJDX0hBU19BUkNIX1NJR19BVE9NSUNfVAordHlwZWRlZiBpbnQgc2lnX2F0b21pY190OworI2VuZGlmCisKKy8qIFNvbWUgYXJjaGl0ZWN0dXJlcyBkb24ndCBkZWZpbmUgdGhlc2UgKi8KKyNpZm5kZWYgU0FfUkVTRVRIQU5ECisjIGRlZmluZSBTQV9SRVNFVEhBTkQgU0FfT05FU0hPVAorI2VuZGlmCisjaWZuZGVmIFNBX05PREVGRVIKKyMgZGVmaW5lIFNBX05PREVGRVIgU0FfTk9NQVNLCisjZW5kaWYKKy8qIFNvbWUgYXJjaGl0ZWN0dXJlcyBkZWZpbmUgTlNJRyBhbmQgbm90IF9OU0lHIG9yIHZpY2UgdmVyc2EgKi8KKyNpZm5kZWYgTlNJRworIyBkZWZpbmUgTlNJRyBfTlNJRworI2VuZGlmCisjaWZuZGVmIF9OU0lHCisjIGRlZmluZSBfTlNJRyBOU0lHCisjZW5kaWYKKworLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgcmVhbC10aW1lIHNpZ25hbHMgYXZhaWxhYmxlIHRvIHVzZXJzcGFjZSwKKyAgIGhpZGUgdGhlbSBhbGwgKi8KKyNpZiBTSUdSVE1BWCA8PSBTSUdSVE1JTgorIyB1bmRlZiBTSUdSVE1JTgorIyB1bmRlZiBTSUdSVE1BWAorI2VuZGlmCisKKy8qIFRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzIGFyZSBpbmNvbnNpc3RlbnQgd2hldGhlciBvciBub3QKKyAgIFNJR1JUTUFYIGlzIGluY2x1c2l2ZSBvciBleGNsdXNpdmUuICBQT1NJWCBzZWVtcyB0byBzdGF0ZSB0aGF0CisgICBpdCdzIGluY2x1c2l2ZSwgaG93ZXZlci4gKi8KKyNpZiBTSUdSVE1BWCA+PSBfTlNJRworIyB1bmRlZiAgU0lHUlRNQVgKKyMgZGVmaW5lIFNJR1JUTUFYIChfTlNJRy0xKQorI2VuZGlmCisKK19fZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19zaWdsaXN0W19OU0lHXTsKK19fZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19zaWdhYmJyZXZbX05TSUddOworCisvKiBUaGlzIGFzc3VtZXMgc2lnc2V0X3QgaXMgZWl0aGVyIGFuIHVuc2lnbmVkIGxvbmcgb3IgYW4gYXJyYXkgb2Ygc3VjaCwKKyAgIGFuZCB0aGF0IF9OU0lHX0JQVyBpbiB0aGUga2VybmVsIGlzIGFsd2F5cyBMT05HX0JJVCAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgc2lnZW1wdHlzZXQoc2lnc2V0X3QgKiBfX3NldCkKK3sKKwltZW1zZXQoX19zZXQsIDAsIHNpemVvZiAqX19zZXQpOworCXJldHVybiAwOworfQorc3RhdGljIF9faW5saW5lX18gaW50IHNpZ2ZpbGxzZXQoc2lnc2V0X3QgKiBfX3NldCkKK3sKKwltZW1zZXQoX19zZXQsIH4wLCBzaXplb2YgKl9fc2V0KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBfX2lubGluZV9fIGludCBzaWdhZGRzZXQoc2lnc2V0X3QgKiBfX3NldCwgaW50IF9fc2lnbnVtKQoreworCXVuc2lnbmVkIGxvbmcgKl9fbHNldCA9ICh1bnNpZ25lZCBsb25nICopX19zZXQ7CisJX19zaWdudW0tLTsJCS8qIFNpZ25hbCAwIGlzIG5vdCBpbiB0aGUgc2V0ICovCisJX19sc2V0W19fc2lnbnVtIC8gTE9OR19CSVRdIHw9IDFVTCA8PCAoX19zaWdudW0gJSBMT05HX0JJVCk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgc2lnZGVsc2V0KHNpZ3NldF90ICogX19zZXQsIGludCBfX3NpZ251bSkKK3sKKwl1bnNpZ25lZCBsb25nICpfX2xzZXQgPSAodW5zaWduZWQgbG9uZyAqKV9fc2V0OworCV9fc2lnbnVtLS07CQkvKiBTaWduYWwgMCBpcyBub3QgaW4gdGhlIHNldCAqLworCV9fbHNldFtfX3NpZ251bSAvIExPTkdfQklUXSAmPSB+KDFVTCA8PCAoX19zaWdudW0gJSBMT05HX0JJVCkpOworCXJldHVybiAwOworfQorc3RhdGljIF9faW5saW5lX18gaW50IHNpZ2lzbWVtYmVyKHNpZ3NldF90ICogX19zZXQsIGludCBfX3NpZ251bSkKK3sKKwl1bnNpZ25lZCBsb25nICpfX2xzZXQgPSAodW5zaWduZWQgbG9uZyAqKV9fc2V0OworCV9fc2lnbnVtLS07CQkvKiBTaWduYWwgMCBpcyBub3QgaW4gdGhlIHNldCAqLworCXJldHVybiAoaW50KSgoX19sc2V0W19fc2lnbnVtIC8gTE9OR19CSVRdID4+IChfX3NpZ251bSAlIExPTkdfQklUKSkgJgorCQkgICAgIDEpOworfQorCitfX2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBfX3NpZ25hbChpbnQsIF9fc2lnaGFuZGxlcl90LCBpbnQpOworX19leHRlcm4gX19zaWdoYW5kbGVyX3Qgc3lzdl9zaWduYWwoaW50LCBfX3NpZ2hhbmRsZXJfdCk7CitfX2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBic2Rfc2lnbmFsKGludCwgX19zaWdoYW5kbGVyX3QpOworX19leHRlcm4gaW50IHNpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiwgc3RydWN0IHNpZ2FjdGlvbiAqKTsKK19fZXh0ZXJuIGludCBzaWdwcm9jbWFzayhpbnQsIGNvbnN0IHNpZ3NldF90ICosIHNpZ3NldF90ICopOworX19leHRlcm4gaW50IHNpZ3BlbmRpbmcoc2lnc2V0X3QgKik7CitfX2V4dGVybiBpbnQgc2lnc3VzcGVuZChjb25zdCBzaWdzZXRfdCAqKTsKK19fZXh0ZXJuIGludCByYWlzZShpbnQpOworX19leHRlcm4gaW50IGtpbGwocGlkX3QsIGludCk7CisKKyNlbmRpZgkJCQkvKiBfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N0ZGFyZy5oIGIvdXNyL2luY2x1ZGUvc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzMjRiOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N0ZGFyZy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBzdGRhcmcuaAorICoKKyAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgZm9yIHRoZSBnY2Mgb25lLCBidXQgZGVmaW5lcyB2YV9jb3B5KCkKKyAqIGV2ZW4gaWYgZ2NjIGRvZXNuJ3QuCisgKi8KKworLyogTm90ZTogdGhlIF9TVERBUkdfSCBtYWNybyBiZWxvbmdzIHRvIHRoZSBnY2MgaGVhZGVyLi4uICovCisjaW5jbHVkZV9uZXh0IDxzdGRhcmcuaD4KKworLyogT2xkZXIgZ2NjIGNvbnNpZGVycyB0aGlzIGFuIGV4dGVuc2lvbiwgc28gaXQncyBkb3VibGUgdW5kZXJiYXIgb25seSAqLworI2lmbmRlZiB2YV9jb3B5CisjZGVmaW5lIHZhX2NvcHkoZCxzKSBfX3ZhX2NvcHkoZCxzKQorI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zdGRkZWYuaCBiL3Vzci9pbmNsdWRlL3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTI5YTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zdGRkZWYuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogc3RkZGVmLmgKKyAqLworCisjaWZuZGVmIF9TVERERUZfSAorI2RlZmluZSBfU1REREVGX0gKKworI2lmbmRlZiBfX0tMSUJDX18KKyMgZXJyb3IgIl9fS0xJQkNfXyBub3QgZGVmaW5lZCwgY29tcGlsZXIgaW52b2NhdGlvbiBlcnJvciEiCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHNpemUvc3RkZGVmLmg+CisKKyN1bmRlZiBOVUxMCisjaWZkZWYgX19jcGx1c3BsdXMKKyMgZGVmaW5lIE5VTEwgMAorI2Vsc2UKKyMgZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbmRpZgorCisjdW5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YodCxtKSAoKHNpemVfdCkmKCh0ICopMCktPm0pCisKKyNlbmRpZgkJCQkvKiBfU1REREVGX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N0ZGludC5oIGIvdXNyL2luY2x1ZGUvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0ZjAyNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N0ZGludC5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogc3RkaW50LmgKKyAqLworCisjaWZuZGVmIF9TVERJTlRfSAorI2RlZmluZSBfU1RESU5UX0gKKworI2luY2x1ZGUgPGJpdHNpemUvc3RkaW50Lmg+CisKK3R5cGVkZWYgaW50OF90CQlpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGludDE2X3QJCWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGludDMyX3QJCWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIGludDY0X3QJCWludF9sZWFzdDY0X3Q7CisKK3R5cGVkZWYgdWludDhfdAkJdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgdWludDE2X3QJdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVpbnQzMl90CXVpbnRfbGVhc3QzMl90OwordHlwZWRlZiB1aW50NjRfdAl1aW50X2xlYXN0NjRfdDsKKwordHlwZWRlZiBpbnQ4X3QJCWludF9mYXN0OF90OwordHlwZWRlZiBpbnQ2NF90CQlpbnRfZmFzdDY0X3Q7CisKK3R5cGVkZWYgdWludDhfdAkJdWludF9mYXN0OF90OwordHlwZWRlZiB1aW50NjRfdAl1aW50X2Zhc3Q2NF90OworCit0eXBlZGVmIGludDY0X3QJCWludG1heF90OwordHlwZWRlZiB1aW50NjRfdAl1aW50bWF4X3Q7CisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfTElNSVRfTUFDUk9TKQorCisjZGVmaW5lIElOVDhfTUlOCSgtMTI4KQorI2RlZmluZSBJTlQxNl9NSU4JKC0zMjc2OCkKKyNkZWZpbmUgSU5UMzJfTUlOCSgtMjE0NzQ4MzY0Ny0xKQorI2RlZmluZSBJTlQ2NF9NSU4JKF9fSU5UNjRfQygtOTIyMzM3MjAzNjg1NDc3NTgwNyktMSkKKworI2RlZmluZSBJTlQ4X01BWAkoMTI3KQorI2RlZmluZSBJTlQxNl9NQVgJKDMyNzY3KQorI2RlZmluZSBJTlQzMl9NQVgJKDIxNDc0ODM2NDcpCisjZGVmaW5lIElOVDY0X01BWAkoX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpKQorCisjZGVmaW5lIFVJTlQ4X01BWAkoMjU1VSkKKyNkZWZpbmUgVUlOVDE2X01BWAkoNjU1MzVVKQorI2RlZmluZSBVSU5UMzJfTUFYCSg0Mjk0OTY3Mjk1VSkKKyNkZWZpbmUgVUlOVDY0X01BWAkoX19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCisKKyNkZWZpbmUgSU5UX0xFQVNUOF9NSU4JSU5UOF9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUlOCUlOVDE2X01JTgorI2RlZmluZSBJTlRfTEVBU1QzMl9NSU4JSU5UMzJfTUlOCisjZGVmaW5lIElOVF9MRUFTVDY0X01JTglJTlQ2NF9NSU4KKworI2RlZmluZSBJTlRfTEVBU1Q4X01BWAlJTlQ4X01BWAorI2RlZmluZSBJTlRfTEVBU1QxNl9NQVgJSU5UMTZfTUFYCisjZGVmaW5lIElOVF9MRUFTVDMyX01BWAlJTlQzMl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUFYCUlOVDY0X01BWAorCisjZGVmaW5lIFVJTlRfTEVBU1Q4X01BWAkgVUlOVDhfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggVUlOVDE2X01BWAorI2RlZmluZSBVSU5UX0xFQVNUMzJfTUFYIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDY0X01BWCBVSU5UNjRfTUFYCisKKyNkZWZpbmUgSU5UX0ZBU1Q4X01JTglJTlQ4X01JTgorI2RlZmluZSBJTlRfRkFTVDY0X01JTglJTlQ2NF9NSU4KKworI2RlZmluZSBJTlRfRkFTVDhfTUFYCUlOVDhfTUFYCisjZGVmaW5lIElOVF9GQVNUNjRfTUFYCUlOVDY0X01BWAorCisjZGVmaW5lIFVJTlRfRkFTVDhfTUFYCVVJTlQ4X01BWAorI2RlZmluZSBVSU5UX0ZBU1Q2NF9NQVggVUlOVDY0X01BWAorCisjZGVmaW5lIElOVE1BWF9NSU4JSU5UNjRfTUlOCisjZGVmaW5lIElOVE1BWF9NQVgJSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRNQVhfTUFYCVVJTlQ2NF9NQVgKKworI2luY2x1ZGUgPGJpdHNpemUvc3RkaW50bGltaXRzLmg+CisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykKKworI2RlZmluZSBJTlQ4X0MoYykJYworI2RlZmluZSBJTlQxNl9DKGMpCWMKKyNkZWZpbmUgSU5UMzJfQyhjKQljCisjZGVmaW5lIElOVDY0X0MoYykJX19JTlQ2NF9DKGMpCisKKyNkZWZpbmUgVUlOVDhfQyhjKQljICMjIFUKKyNkZWZpbmUgVUlOVDE2X0MoYykJYyAjIyBVCisjZGVmaW5lIFVJTlQzMl9DKGMpCWMgIyMgVQorI2RlZmluZSBVSU5UNjRfQyhjKQlfX1VJTlQ2NF9DKGMpCisKKyNkZWZpbmUgSU5UX0xFQVNUOF9DKGMpCSBJTlQ4X0MoYykKKyNkZWZpbmUgSU5UX0xFQVNUMTZfQyhjKSBJTlQxNl9DKGMpCisjZGVmaW5lIElOVF9MRUFTVDMyX0MoYykgSU5UMzJfQyhjKQorI2RlZmluZSBJTlRfTEVBU1Q2NF9DKGMpIElOVDY0X0MoYykKKworI2RlZmluZSBVSU5UX0xFQVNUOF9DKGMpICBVSU5UOF9DKGMpCisjZGVmaW5lIFVJTlRfTEVBU1QxNl9DKGMpIFVJTlQxNl9DKGMpCisjZGVmaW5lIFVJTlRfTEVBU1QzMl9DKGMpIFVJTlQzMl9DKGMpCisjZGVmaW5lIFVJTlRfTEVBU1Q2NF9DKGMpIFVJTlQ2NF9DKGMpCisKKyNkZWZpbmUgSU5UX0ZBU1Q4X0MoYykJSU5UOF9DKGMpCisjZGVmaW5lIElOVF9GQVNUNjRfQyhjKSBJTlQ2NF9DKGMpCisKKyNkZWZpbmUgVUlOVF9GQVNUOF9DKGMpICBVSU5UOF9DKGMpCisjZGVmaW5lIFVJTlRfRkFTVDY0X0MoYykgVUlOVDY0X0MoYykKKworI2RlZmluZSBJTlRNQVhfQyhjKQlJTlQ2NF9DKGMpCisjZGVmaW5lIFVJTlRNQVhfQyhjKQlVSU5UNjRfQyhjKQorCisjaW5jbHVkZSA8Yml0c2l6ZS9zdGRpbnRjb25zdC5oPgorCisjZW5kaWYKKworLyogS2VlcCB0aGUga2VybmVsIGZyb20gdHJ5aW5nIHRvIGRlZmluZSB0aGVzZSB0eXBlcy4uLiAqLworI2RlZmluZSBfX0JJVF9UWVBFU19ERUZJTkVEX18KKworI2VuZGlmCQkJCS8qIF9TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3RkaW8uaCBiL3Vzci9pbmNsdWRlL3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2MmY1YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N0ZGlvLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBzdGRpby5oCisgKi8KKworI2lmbmRlZiBfU1RESU9fSAorI2RlZmluZSBfU1RESU9fSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIFRoaXMgc3RydWN0dXJlIGRvZXNuJ3QgcmVhbGx5IGV4aXN0LCBidXQgaXQgZ2l2ZXMgdXMgc29tZXRoaW5nCisgICB0byBkZWZpbmUgRklMRSAqIHdpdGggKi8KK3N0cnVjdCBfSU9fZmlsZTsKK3R5cGVkZWYgc3RydWN0IF9JT19maWxlIEZJTEU7CisKKyNpZm5kZWYgRU9GCisjIGRlZmluZSBFT0YgKC0xKQorI2VuZGlmCisKKyNpZm5kZWYgQlVGU0laCisjIGRlZmluZSBCVUZTSVogNDA5NgorI2VuZGlmCisKKyNkZWZpbmUgU0VFS19TRVQgMAorI2RlZmluZSBTRUVLX0NVUiAxCisjZGVmaW5lIFNFRUtfRU5EIDIKKworLyoKKyAqIENvbnZlcnQgYmV0d2VlbiBhIEZJTEUgKiBhbmQgYSBmaWxlIGRlc2NyaXB0b3IuICBXZSBkb24ndCBhY3R1YWxseQorICogaGF2ZSBhbnkgaW4tbWVtb3J5IGRhdGEsIHNvIHdlIGp1c3QgYWJ1c2UgdGhlIHBvaW50ZXIgaXRzZWxmIHRvCisgKiBob2xkIHRoZSBkYXRhLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBmb3IgZmlsZSBkZXNjcmlwdG9ycywgLTEgaXMKKyAqIGVycm9yIGFuZCAwIGlzIGEgdmFsaWQgdmFsdWU7IGZvciBGSUxFICosIE5VTEwgKDApIGlzIGVycm9yIGFuZAorICogbm9uLU5VTEwgYXJlIHZhbGlkLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZmlsZW5vKEZJTEUgKiBfX2YpCit7CisJLyogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGludHB0cl90LCBidXQgc2l6ZV90IHNob3VsZCBiZSB0aGUgc2FtZSBzaXplICovCisJcmV0dXJuIChpbnQpKHNpemVfdCkgX19mIC0gMTsKK30KKworLyogVGhpcyBpcyBhIG1hY3JvIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGluaXRpYWxpemVyICovCisjZGVmaW5lIF9fY3JlYXRlX2ZpbGUoX19mZCkgKChGSUxFICopKHNpemVfdCkoKF9fZmQpICsgMSkpCisKKyNkZWZpbmUgc3RkaW4gIF9fY3JlYXRlX2ZpbGUoMCkKKyNkZWZpbmUgc3Rkb3V0IF9fY3JlYXRlX2ZpbGUoMSkKKyNkZWZpbmUgc3RkZXJyIF9fY3JlYXRlX2ZpbGUoMikKKworX19leHRlcm4gRklMRSAqZm9wZW4oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCitzdGF0aWMgX19pbmxpbmVfXyBGSUxFICpmZG9wZW4oaW50IF9fZmQsIGNvbnN0IGNoYXIgKl9fbSkKK3sKKwkodm9pZClfX207CisJcmV0dXJuIF9fY3JlYXRlX2ZpbGUoX19mZCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZmNsb3NlKEZJTEUgKiBfX2YpCit7CisJZXh0ZXJuIGludCBjbG9zZShpbnQpOworCXJldHVybiBjbG9zZShmaWxlbm8oX19mKSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZnNlZWsoRklMRSAqIF9fZiwgb2ZmX3QgX19vLCBpbnQgX193KQoreworCWV4dGVybiBvZmZfdCBsc2VlayhpbnQsIG9mZl90LCBpbnQpOworCXJldHVybiAobHNlZWsoZmlsZW5vKF9fZiksIF9fbywgX193KSA9PSAob2ZmX3QpIC0gMSkgPyAtMSA6IDA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBvZmZfdCBmdGVsbChGSUxFICogX19mKQoreworCWV4dGVybiBvZmZfdCBsc2VlayhpbnQsIG9mZl90LCBpbnQpOworCXJldHVybiBsc2VlayhmaWxlbm8oX19mKSwgMCwgU0VFS19DVVIpOworfQorCitfX2V4dGVybiBpbnQgZnB1dHMoY29uc3QgY2hhciAqLCBGSUxFICopOworX19leHRlcm4gaW50IHB1dHMoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBmcHV0YyhpbnQsIEZJTEUgKik7CisjZGVmaW5lIHB1dGMoYyxmKSAgZnB1dGMoKGMpLChmKSkKKyNkZWZpbmUgcHV0Y2hhcihjKSBmcHV0YygoYyksc3Rkb3V0KQorCitfX2V4dGVybiBpbnQgZmdldGMoRklMRSAqKTsKK19fZXh0ZXJuIGNoYXIgKmZnZXRzKGNoYXIgKiwgaW50LCBGSUxFICopOworI2RlZmluZSBnZXRjKGYpIGZnZXRjKGYpCisjZGVmaW5lIGdldGNoYXIoKSBmZ2V0YyhzdGRpbikKKworX19leHRlcm4gc2l6ZV90IF9mcmVhZCh2b2lkICosIHNpemVfdCwgRklMRSAqKTsKK19fZXh0ZXJuIHNpemVfdCBfZndyaXRlKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBGSUxFICopOworCisjaWZuZGVmIF9fTk9fRlJFQURfRldSSVRFX0lOTElORVMKK2V4dGVybiBfX2lubGluZV9fIHNpemVfdCBmcmVhZCh2b2lkICpfX3AsIHNpemVfdCBfX3MsIHNpemVfdCBfX24sIEZJTEUgKiBfX2YpCit7CisJcmV0dXJuIF9mcmVhZChfX3AsIF9fcyAqIF9fbiwgX19mKSAvIF9fczsKK30KKworZXh0ZXJuIF9faW5saW5lX18gc2l6ZV90Citmd3JpdGUoY29uc3Qgdm9pZCAqX19wLCBzaXplX3QgX19zLCBzaXplX3QgX19uLCBGSUxFICogX19mKQoreworCXJldHVybiBfZndyaXRlKF9fcCwgX19zICogX19uLCBfX2YpIC8gX19zOworfQorI2VuZGlmCisKK19fZXh0ZXJuIGludCBwcmludGYoY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZwcmludGYoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK19fZXh0ZXJuIGludCBmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK19fZXh0ZXJuIGludCBzcHJpbnRmKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZzcHJpbnRmKGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK19fZXh0ZXJuIGludCBzbnByaW50ZihjaGFyICosIHNpemVfdCBuLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgdnNucHJpbnRmKGNoYXIgKiwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitfX2V4dGVybiBpbnQgYXNwcmludGYoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZhc3ByaW50ZihjaGFyICoqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCisvKiBObyBidWZmZXJpbmcsIHNvIG5vIGZsdXNoaW5nIG5lZWRlZCAqLworZXh0ZXJuIF9faW5saW5lX18gaW50IGZmbHVzaChGSUxFICogX19mKQoreworCSh2b2lkKV9fZjsKKwlyZXR1cm4gMDsKK30KKworX19leHRlcm4gaW50IHNzY2FuZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK19fZXh0ZXJuIGludCB2c3NjYW5mKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworX19leHRlcm4gdm9pZCBwZXJyb3IoY29uc3QgY2hhciAqKTsKKworX19leHRlcm4gaW50IHJlbmFtZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgcmVuYW1lYXQoaW50LCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKTsKKworX19leHRlcm4gaW50IHJlbW92ZShjb25zdCBjaGFyICopOworCisjZW5kaWYJCQkJLyogX1NURElPX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIGIvdXNyL2luY2x1ZGUvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjYzIyNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBzdGRsaWIuaAorICovCisKKyNpZm5kZWYgX1NURExJQl9ICisjZGVmaW5lIF9TVERMSUJfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjZGVmaW5lIEVYSVRfRkFJTFVSRSAxCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAwCisKK19fZXh0ZXJuIF9fbm9yZXR1cm4gYWJvcnQodm9pZCk7CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYWJzKGludCBfX24pCit7CisJcmV0dXJuIChfX24gPCAwKSA/IC1fX24gOiBfX247Cit9CitfX2V4dGVybiBpbnQgc3lzdGVtKGNvbnN0IGNoYXIgKnN0cmluZyk7CitfX2V4dGVybiBpbnQgYXRleGl0KHZvaWQgKCopKHZvaWQpKTsKK19fZXh0ZXJuIGludCBvbl9leGl0KHZvaWQgKCopKGludCwgdm9pZCAqKSwgdm9pZCAqKTsKK19fZXh0ZXJuIGludCBhdG9pKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBsb25nIGF0b2woY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGxvbmcgbG9uZyBhdG9sbChjb25zdCBjaGFyICopOworX19leHRlcm4gX19ub3JldHVybiBleGl0KGludCk7CitfX2V4dGVybiBfX25vcmV0dXJuIF9leGl0KGludCk7CisjZGVmaW5lIF9FeGl0IF9leGl0CitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxhYnMobG9uZyBfX24pCit7CisJcmV0dXJuIChfX24gPCAwTCkgPyAtX19uIDogX19uOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGxvbmcgbGxhYnMobG9uZyBsb25nIF9fbikKK3sKKwlyZXR1cm4gKF9fbiA8IDBMTCkgPyAtX19uIDogX19uOworfQorCitfX2V4dGVybiBsb25nIHN0cnRvbChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CitfX2V4dGVybiBsb25nIGxvbmcgc3RydG9sbChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CitfX2V4dGVybiB1bnNpZ25lZCBsb25nIHN0cnRvdWwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworX19leHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHN0cnRvdWxsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKKworX19leHRlcm4gY2hhciAqZ2V0ZW52KGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgcHV0ZW52KGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgc2V0ZW52KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworX19leHRlcm4gaW50IHVuc2V0ZW52KGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgY2xlYXJlbnYodm9pZCk7CisKK3R5cGVkZWYgaW50ICgqX19jb21wYXJlZnVuY190KSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworX19leHRlcm4gdm9pZCAqYnNlYXJjaChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsCisJCSAgICAgICBfX2NvbXBhcmVmdW5jX3QpOworX19leHRlcm4gdm9pZCBxc29ydCh2b2lkICosIHNpemVfdCwgc2l6ZV90LCBfX2NvbXBhcmVmdW5jX3QpOworCitfX2V4dGVybiBsb25nIGpyYW5kNDgodW5zaWduZWQgc2hvcnQgKik7CitfX2V4dGVybiBsb25nIG1yYW5kNDgodm9pZCk7CitfX2V4dGVybiBsb25nIG5yYW5kNDgodW5zaWduZWQgc2hvcnQgKik7CitfX2V4dGVybiBsb25nIGxyYW5kNDgodm9pZCk7CitfX2V4dGVybiB1bnNpZ25lZCBzaG9ydCAqc2VlZDQ4KGNvbnN0IHVuc2lnbmVkIHNob3J0ICopOworX19leHRlcm4gdm9pZCBzcmFuZDQ4KGxvbmcpOworCisjZGVmaW5lIFJBTkRfTUFYIDB4N2ZmZmZmZmYKK3N0YXRpYyBfX2lubGluZV9fIGludCByYW5kKHZvaWQpCit7CisJcmV0dXJuIChpbnQpbHJhbmQ0OCgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBzcmFuZCh1bnNpZ25lZCBpbnQgX19zKQoreworCXNyYW5kNDgoX19zKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgcmFuZG9tKHZvaWQpCit7CisJcmV0dXJuIGxyYW5kNDgoKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3JhbmRvbSh1bnNpZ25lZCBpbnQgX19zKQoreworCXNyYW5kNDgoX19zKTsKK30KKworLyogQmFzaWMgUFRZIGZ1bmN0aW9ucy4gIFRoZXNlIG9ubHkgd29yayBpZiBkZXZwdHMgaXMgbW91bnRlZCEgKi8KKworX19leHRlcm4gaW50IHVubG9ja3B0KGludCk7CitfX2V4dGVybiBjaGFyICpwdHNuYW1lKGludCk7CitfX2V4dGVybiBpbnQgZ2V0cHQodm9pZCk7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBncmFudHB0KGludCBfX2ZkKQoreworCSh2b2lkKV9fZmQ7CisJcmV0dXJuIDA7CQkvKiBkZXZwdHMgZG9lcyB0aGlzIGFsbCBmb3IgdXMhICovCit9CisKKyNlbmRpZgkJCQkvKiBfU1RETElCX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N0cmluZy5oIGIvdXNyL2luY2x1ZGUvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MDcyYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N0cmluZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBzdHJpbmcuaAorICovCisKKyNpZm5kZWYgX1NUUklOR19ICisjZGVmaW5lIF9TVFJJTkdfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK19fZXh0ZXJuIHZvaWQgKm1lbWNjcHkodm9pZCAqLCBjb25zdCB2b2lkICosIGludCwgc2l6ZV90KTsKK19fZXh0ZXJuIHZvaWQgKm1lbWNocihjb25zdCB2b2lkICosIGludCwgc2l6ZV90KTsKK19fZXh0ZXJuIHZvaWQgKm1lbXJjaHIoY29uc3Qgdm9pZCAqLCBpbnQsIHNpemVfdCk7CitfX2V4dGVybiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHZvaWQgKm1lbXNldCh2b2lkICosIGludCwgc2l6ZV90KTsKK19fZXh0ZXJuIHZvaWQgKm1lbW1lbShjb25zdCB2b2lkICosIHNpemVfdCwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworX19leHRlcm4gdm9pZCBtZW1zd2FwKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOworX19leHRlcm4gaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gY2hhciAqc3RyY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cmNocihjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBjaGFyICppbmRleChjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBjaGFyICpzdHJyY2hyKGNvbnN0IGNoYXIgKiwgaW50KTsKK19fZXh0ZXJuIGNoYXIgKnJpbmRleChjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cmNweShjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBzaXplX3Qgc3RyY3Nwbihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBjaGFyICpzdHJkdXAoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cm5kdXAoY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gY2hhciAqc3RyZXJyb3IoaW50KTsKK19fZXh0ZXJuIGNoYXIgKnN0cnNpZ25hbChpbnQpOworX19leHRlcm4gc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICopOworX19leHRlcm4gc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gY2hhciAqc3RybmNhdChjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHNpemVfdCBzdHJsY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gaW50IHN0cm5jbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJuY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJwYnJrKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cnNlcChjaGFyICoqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gc2l6ZV90IHN0cnNwbihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBjaGFyICpzdHJzdHIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RydG9rKGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCQkJCS8qIF9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL2RpcmVudC5oIGIvdXNyL2luY2x1ZGUvc3lzL2RpcmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjdhMzMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvZGlyZW50LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIHN5cy9kaXJlbnQuaAorICovCisKKyNpZm5kZWYgX1NZU19ESVJFTlRfSAorI2RlZmluZSBfU1lTX0RJUkVOVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogVGhlIGtlcm5lbCBjYWxscyB0aGlzIHN0cnVjdCBkaXJlbnQ2NCAqLworc3RydWN0IGRpcmVudCB7CisJdWludDY0X3QJZF9pbm87CisJaW50NjRfdAkJZF9vZmY7CisJdW5zaWduZWQgc2hvcnQJZF9yZWNsZW47CisJdW5zaWduZWQgY2hhcglkX3R5cGU7CisJY2hhcgkJZF9uYW1lWzI1Nl07Cit9OworCisvKiBGaWxlIHR5cGVzIHRvIHVzZSBmb3IgZF90eXBlICovCisjZGVmaW5lIERUX1VOS05PV04JIDAKKyNkZWZpbmUgRFRfRklGTwkJIDEKKyNkZWZpbmUgRFRfQ0hSCQkgMgorI2RlZmluZSBEVF9ESVIJCSA0CisjZGVmaW5lIERUX0JMSwkJIDYKKyNkZWZpbmUgRFRfUkVHCQkgOAorI2RlZmluZSBEVF9MTksJCTEwCisjZGVmaW5lIERUX1NPQ0sJCTEyCisjZGVmaW5lIERUX1dIVAkJMTQKKworX19leHRlcm4gaW50IGdldGRlbnRzKHVuc2lnbmVkIGludCwgc3RydWN0IGRpcmVudCAqLCB1bnNpZ25lZCBpbnQpOworCisjZW5kaWYJCQkJLyogX1NZU19ESVJFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL2VsZjMyLmggYi91c3IvaW5jbHVkZS9zeXMvZWxmMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRmOGNlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL2VsZjMyLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBzeXMvZWxmMzIuaAorICovCisKKyNpZm5kZWYgX1NZU19FTEYzMl9ICisjZGVmaW5lIF9TWVNfRUxGMzJfSAorCisjaW5jbHVkZSA8c3lzL2VsZmNvbW1vbi5oPgorCisvKiBFTEYgc3RhbmRhcmQgdHlwZWRlZnMgKHlldCBtb3JlIHByb29mIHRoYXQgPHN0ZGludC5oPiB3YXMgd2F5IG92ZXJkdWUpICovCit0eXBlZGVmIHVpbnQxNl90IEVsZjMyX0hhbGY7Cit0eXBlZGVmIGludDE2X3QgRWxmMzJfU0hhbGY7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX1dvcmQ7Cit0eXBlZGVmIGludDMyX3QgRWxmMzJfU3dvcmQ7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjMyX1h3b3JkOwordHlwZWRlZiBpbnQ2NF90IEVsZjMyX1N4d29yZDsKKwordHlwZWRlZiB1aW50MzJfdCBFbGYzMl9PZmY7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX0FkZHI7Cit0eXBlZGVmIHVpbnQxNl90IEVsZjMyX1NlY3Rpb247CisKKy8qIER5bmFtaWMgaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX2R5biB7CisJRWxmMzJfU3dvcmQgZF90YWc7CisJdW5pb24geworCQlFbGYzMl9Td29yZCBkX3ZhbDsKKwkJRWxmMzJfQWRkciBkX3B0cjsKKwl9IGRfdW47Cit9IEVsZjMyX0R5bjsKKworLyogUmVsb2NhdGlvbnMgKi8KKworI2RlZmluZSBFTEYzMl9SX1NZTSh4KQkoKHgpID4+IDgpCisjZGVmaW5lIEVMRjMyX1JfVFlQRSh4KQkoKHgpICYgMHhmZikKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcmVsIHsKKwlFbGYzMl9BZGRyIHJfb2Zmc2V0OworCUVsZjMyX1dvcmQgcl9pbmZvOworfSBFbGYzMl9SZWw7CisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3JlbGEgeworCUVsZjMyX0FkZHIgcl9vZmZzZXQ7CisJRWxmMzJfV29yZCByX2luZm87CisJRWxmMzJfU3dvcmQgcl9hZGRlbmQ7Cit9IEVsZjMyX1JlbGE7CisKKy8qIFN5bWJvbCAqLworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9zeW0geworCUVsZjMyX1dvcmQgc3RfbmFtZTsKKwlFbGYzMl9BZGRyIHN0X3ZhbHVlOworCUVsZjMyX1dvcmQgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHN0X2luZm87CisJdW5zaWduZWQgY2hhciBzdF9vdGhlcjsKKwlFbGYzMl9IYWxmIHN0X3NobmR4OworfSBFbGYzMl9TeW07CisKKy8qIE1haW4gZmlsZSBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfaGRyIHsKKwl1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsKKwlFbGYzMl9IYWxmIGVfdHlwZTsKKwlFbGYzMl9IYWxmIGVfbWFjaGluZTsKKwlFbGYzMl9Xb3JkIGVfdmVyc2lvbjsKKwlFbGYzMl9BZGRyIGVfZW50cnk7CisJRWxmMzJfT2ZmIGVfcGhvZmY7CisJRWxmMzJfT2ZmIGVfc2hvZmY7CisJRWxmMzJfV29yZCBlX2ZsYWdzOworCUVsZjMyX0hhbGYgZV9laHNpemU7CisJRWxmMzJfSGFsZiBlX3BoZW50c2l6ZTsKKwlFbGYzMl9IYWxmIGVfcGhudW07CisJRWxmMzJfSGFsZiBlX3NoZW50c2l6ZTsKKwlFbGYzMl9IYWxmIGVfc2hudW07CisJRWxmMzJfSGFsZiBlX3Noc3RybmR4OworfSBFbGYzMl9FaGRyOworCisvKiBQcm9ncmFtIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9waGRyIHsKKwlFbGYzMl9Xb3JkIHBfdHlwZTsKKwlFbGYzMl9PZmYgcF9vZmZzZXQ7CisJRWxmMzJfQWRkciBwX3ZhZGRyOworCUVsZjMyX0FkZHIgcF9wYWRkcjsKKwlFbGYzMl9Xb3JkIHBfZmlsZXN6OworCUVsZjMyX1dvcmQgcF9tZW1zejsKKwlFbGYzMl9Xb3JkIHBfZmxhZ3M7CisJRWxmMzJfV29yZCBwX2FsaWduOworfSBFbGYzMl9QaGRyOworCisvKiBTZWN0aW9uIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9zaGRyIHsKKwlFbGYzMl9Xb3JkIHNoX25hbWU7CisJRWxmMzJfV29yZCBzaF90eXBlOworCUVsZjMyX1dvcmQgc2hfZmxhZ3M7CisJRWxmMzJfQWRkciBzaF9hZGRyOworCUVsZjMyX09mZiBzaF9vZmZzZXQ7CisJRWxmMzJfV29yZCBzaF9zaXplOworCUVsZjMyX1dvcmQgc2hfbGluazsKKwlFbGYzMl9Xb3JkIHNoX2luZm87CisJRWxmMzJfV29yZCBzaF9hZGRyYWxpZ247CisJRWxmMzJfV29yZCBzaF9lbnRzaXplOworfSBFbGYzMl9TaGRyOworCisvKiBOb3RlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfbm90ZSB7CisJRWxmMzJfV29yZCBuX25hbWVzejsJLyogTmFtZSBzaXplICovCisJRWxmMzJfV29yZCBuX2Rlc2NzejsJLyogQ29udGVudCBzaXplICovCisJRWxmMzJfV29yZCBuX3R5cGU7CS8qIENvbnRlbnQgdHlwZSAqLworfSBFbGYzMl9OaGRyOworCisjZW5kaWYJCQkJLyogX1NZU19FTEYzMl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvZWxmNjQuaCBiL3Vzci9pbmNsdWRlL3N5cy9lbGY2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDg2YWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvZWxmNjQuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHN5cy9lbGY2NC5oCisgKi8KKworI2lmbmRlZiBfU1lTX0VMRjY0X0gKKyNkZWZpbmUgX1NZU19FTEY2NF9ICisKKyNpbmNsdWRlIDxzeXMvZWxmY29tbW9uLmg+CisKKy8qIEVMRiBzdGFuZGFyZCB0eXBlZGVmcyAoeWV0IG1vcmUgcHJvb2YgdGhhdCA8c3RkaW50Lmg+IHdhcyB3YXkgb3ZlcmR1ZSkgKi8KK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfSGFsZjsKK3R5cGVkZWYgaW50MTZfdCBFbGY2NF9TSGFsZjsKK3R5cGVkZWYgdWludDMyX3QgRWxmNjRfV29yZDsKK3R5cGVkZWYgaW50MzJfdCBFbGY2NF9Td29yZDsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfWHdvcmQ7Cit0eXBlZGVmIGludDY0X3QgRWxmNjRfU3h3b3JkOworCit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X09mZjsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfQWRkcjsKK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfU2VjdGlvbjsKKworLyogRHluYW1pYyBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfZHluIHsKKwlFbGY2NF9TeHdvcmQgZF90YWc7CisJdW5pb24geworCQlFbGY2NF9Yd29yZCBkX3ZhbDsKKwkJRWxmNjRfQWRkciBkX3B0cjsKKwl9IGRfdW47Cit9IEVsZjY0X0R5bjsKKworLyogUmVsb2NhdGlvbnMgKi8KKworI2RlZmluZSBFTEY2NF9SX1NZTSh4KQkoKHgpID4+IDMyKQorI2RlZmluZSBFTEY2NF9SX1RZUEUoeCkJKCh4KSAmIDB4ZmZmZmZmZmYpCisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3JlbCB7CisJRWxmNjRfQWRkciByX29mZnNldDsKKwlFbGY2NF9Yd29yZCByX2luZm87Cit9IEVsZjY0X1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcmVsYSB7CisJRWxmNjRfQWRkciByX29mZnNldDsKKwlFbGY2NF9Yd29yZCByX2luZm87CisJRWxmNjRfU3h3b3JkIHJfYWRkZW5kOworfSBFbGY2NF9SZWxhOworCisvKiBTeW1ib2wgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfc3ltIHsKKwlFbGY2NF9Xb3JkIHN0X25hbWU7CisJdW5zaWduZWQgY2hhciBzdF9pbmZvOworCXVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7CisJRWxmNjRfSGFsZiBzdF9zaG5keDsKKwlFbGY2NF9BZGRyIHN0X3ZhbHVlOworCUVsZjY0X1h3b3JkIHN0X3NpemU7Cit9IEVsZjY0X1N5bTsKKworLyogTWFpbiBmaWxlIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9oZHIgeworCXVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOworCUVsZjY0X0hhbGYgZV90eXBlOworCUVsZjY0X0hhbGYgZV9tYWNoaW5lOworCUVsZjY0X1dvcmQgZV92ZXJzaW9uOworCUVsZjY0X0FkZHIgZV9lbnRyeTsKKwlFbGY2NF9PZmYgZV9waG9mZjsKKwlFbGY2NF9PZmYgZV9zaG9mZjsKKwlFbGY2NF9Xb3JkIGVfZmxhZ3M7CisJRWxmNjRfSGFsZiBlX2Voc2l6ZTsKKwlFbGY2NF9IYWxmIGVfcGhlbnRzaXplOworCUVsZjY0X0hhbGYgZV9waG51bTsKKwlFbGY2NF9IYWxmIGVfc2hlbnRzaXplOworCUVsZjY0X0hhbGYgZV9zaG51bTsKKwlFbGY2NF9IYWxmIGVfc2hzdHJuZHg7Cit9IEVsZjY0X0VoZHI7CisKKy8qIFByb2dyYW0gaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3BoZHIgeworCUVsZjY0X1dvcmQgcF90eXBlOworCUVsZjY0X1dvcmQgcF9mbGFnczsKKwlFbGY2NF9PZmYgcF9vZmZzZXQ7CisJRWxmNjRfQWRkciBwX3ZhZGRyOworCUVsZjY0X0FkZHIgcF9wYWRkcjsKKwlFbGY2NF9Yd29yZCBwX2ZpbGVzejsKKwlFbGY2NF9Yd29yZCBwX21lbXN6OworCUVsZjY0X1h3b3JkIHBfYWxpZ247Cit9IEVsZjY0X1BoZHI7CisKKy8qIFNlY3Rpb24gaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3NoZHIgeworCUVsZjY0X1dvcmQgc2hfbmFtZTsKKwlFbGY2NF9Xb3JkIHNoX3R5cGU7CisJRWxmNjRfWHdvcmQgc2hfZmxhZ3M7CisJRWxmNjRfQWRkciBzaF9hZGRyOworCUVsZjY0X09mZiBzaF9vZmZzZXQ7CisJRWxmNjRfWHdvcmQgc2hfc2l6ZTsKKwlFbGY2NF9Xb3JkIHNoX2xpbms7CisJRWxmNjRfV29yZCBzaF9pbmZvOworCUVsZjY0X1h3b3JkIHNoX2FkZHJhbGlnbjsKKwlFbGY2NF9Yd29yZCBzaF9lbnRzaXplOworfSBFbGY2NF9TaGRyOworCisvKiBOb3RlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfbm90ZSB7CisJRWxmNjRfV29yZCBuX25hbWVzejsJLyogTmFtZSBzaXplICovCisJRWxmNjRfV29yZCBuX2Rlc2NzejsJLyogQ29udGVudCBzaXplICovCisJRWxmNjRfV29yZCBuX3R5cGU7CS8qIENvbnRlbnQgdHlwZSAqLworfSBFbGY2NF9OaGRyOworCisjZW5kaWYJCQkJLyogX1NZU19FTEY2NF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvZWxmY29tbW9uLmggYi91c3IvaW5jbHVkZS9zeXMvZWxmY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MWRiNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9lbGZjb21tb24uaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIHN5cy9lbGZjb21tb24uaAorICovCisKKyNpZm5kZWYgX1NZU19FTEZDT01NT05fSAorI2RlZmluZSBfU1lTX0VMRkNPTU1PTl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogU2VnbWVudCB0eXBlcyAqLworI2RlZmluZSBQVF9OVUxMICAgIAkwCisjZGVmaW5lIFBUX0xPQUQgICAgCTEKKyNkZWZpbmUgUFRfRFlOQU1JQyAJMgorI2RlZmluZSBQVF9JTlRFUlAgIAkzCisjZGVmaW5lIFBUX05PVEUgICAgCTQKKyNkZWZpbmUgUFRfU0hMSUIgICAJNQorI2RlZmluZSBQVF9QSERSICAgIAk2CisjZGVmaW5lIFBUX0xPT1MgICAgCTB4NjAwMDAwMDAKKyNkZWZpbmUgUFRfSElPUyAgICAJMHg2ZmZmZmZmZgorI2RlZmluZSBQVF9MT1BST0MgIAkweDcwMDAwMDAwCisjZGVmaW5lIFBUX0hJUFJPQyAgCTB4N2ZmZmZmZmYKKyNkZWZpbmUgUFRfR05VX0VIX0ZSQU1FCTB4NjQ3NGU1NTAJLyogRXh0ZW5zaW9uLCBlaD8gKi8KKworLyogRUxGIGZpbGUgdHlwZXMgKi8KKyNkZWZpbmUgRVRfTk9ORSAgIAkwCisjZGVmaW5lIEVUX1JFTCAgICAJMQorI2RlZmluZSBFVF9FWEVDICAgCTIKKyNkZWZpbmUgRVRfRFlOICAgIAkzCisjZGVmaW5lIEVUX0NPUkUgICAJNAorI2RlZmluZSBFVF9MT1BST0MgCTB4ZmYwMAorI2RlZmluZSBFVF9ISVBST0MgCTB4ZmZmZgorCisvKiBFTEYgbWFjaGluZSB0eXBlcyAqLworI2RlZmluZSBFTV9OT05FICAJMAorI2RlZmluZSBFTV9NMzIgICAJMQorI2RlZmluZSBFTV9TUEFSQyAJMgorI2RlZmluZSBFTV8zODYgICAJMworI2RlZmluZSBFTV82OEsgICAJNAorI2RlZmluZSBFTV84OEsgICAJNQorI2RlZmluZSBFTV80ODYgICAJNgkvKiBOb3QgdXNlZCBpbiBMaW51eCBhdCBsZWFzdCAqLworI2RlZmluZSBFTV84NjAgICAJNworI2RlZmluZSBFTV9NSVBTICAgICAgICAgOAkvKiBSM2ssIGJpZ2VuZGlhbig/KSAqLworI2RlZmluZSBFTV9NSVBTX1JTNF9CRSAJMTAJLyogUjRrIEJFICovCisjZGVmaW5lIEVNX1BBUklTQyAgICAgIAkxNQorI2RlZmluZSBFTV9TUEFSQzMyUExVUyAJMTgKKyNkZWZpbmUgRU1fUFBDICAgICAgICAgCTIwCisjZGVmaW5lIEVNX1BQQzY0ICAgICAgIAkyMQorI2RlZmluZSBFTV9TMzkwICAgICAgICAgMjIKKyNkZWZpbmUgRU1fU0ggICAgICAgICAgCTQyCisjZGVmaW5lIEVNX1NQQVJDVjkJNDMJLyogdjkgPSBTUEFSQzY0ICovCisjZGVmaW5lIEVNX0g4XzMwMEggICAgICA0NworI2RlZmluZSBFTV9IOFMgICAgICAgICAgNDgKKyNkZWZpbmUgRU1fSUFfNjQgICAgICAgIDUwCS8qIEl0YW5pYyAqLworI2RlZmluZSBFTV9YODZfNjQgICAgICAgNjIKKyNkZWZpbmUgRU1fQ1JJUyAgICAgICAgIDc2CisjZGVmaW5lIEVNX1Y4NTAgICAgICAgICA4NworI2RlZmluZSBFTV9BTFBIQSAgICAgICAgMHg5MDI2CS8qIEludGVycmltIEFscGhhIHRoYXQgc3R1Y2sgYXJvdW5kICovCisjZGVmaW5lIEVNX0NZR05VU19WODUwICAweDkwODAJLyogT2xkIHY4NTAgSUQgdXNlZCBieSBDeWdudXMgKi8KKyNkZWZpbmUgRU1fUzM5MF9PTEQgICAgIDB4QTM5MAkvKiBPYnNvbGV0ZSBpbnRlcnJpbSB2YWx1ZSBmb3IgUy8zOTAgKi8KKworLyogRHluYW1pYyB0eXBlIHZhbHVlcyAqLworI2RlZmluZSBEVF9OVUxMCQkwCisjZGVmaW5lIERUX05FRURFRAkxCisjZGVmaW5lIERUX1BMVFJFTFNaCTIKKyNkZWZpbmUgRFRfUExUR09UCTMKKyNkZWZpbmUgRFRfSEFTSAkJNAorI2RlZmluZSBEVF9TVFJUQUIJNQorI2RlZmluZSBEVF9TWU1UQUIJNgorI2RlZmluZSBEVF9SRUxBCQk3CisjZGVmaW5lIERUX1JFTEFTWgk4CisjZGVmaW5lIERUX1JFTEFFTlQJOQorI2RlZmluZSBEVF9TVFJTWgkxMAorI2RlZmluZSBEVF9TWU1FTlQJMTEKKyNkZWZpbmUgRFRfSU5JVAkJMTIKKyNkZWZpbmUgRFRfRklOSQkJMTMKKyNkZWZpbmUgRFRfU09OQU1FCTE0CisjZGVmaW5lIERUX1JQQVRICTE1CisjZGVmaW5lIERUX1NZTUJPTElDCTE2CisjZGVmaW5lIERUX1JFTAkJMTcKKyNkZWZpbmUgRFRfUkVMU1oJMTgKKyNkZWZpbmUgRFRfUkVMRU5UCTE5CisjZGVmaW5lIERUX1BMVFJFTAkyMAorI2RlZmluZSBEVF9ERUJVRwkyMQorI2RlZmluZSBEVF9URVhUUkVMCTIyCisjZGVmaW5lIERUX0pNUFJFTAkyMworI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAorI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgorCisvKiBBdXhpbGxpYXJ5IHRhYmxlIGVudHJpZXMgKi8KKyNkZWZpbmUgQVRfTlVMTAkJMAkvKiBlbmQgb2YgdmVjdG9yICovCisjZGVmaW5lIEFUX0lHTk9SRQkxCS8qIGVudHJ5IHNob3VsZCBiZSBpZ25vcmVkICovCisjZGVmaW5lIEFUX0VYRUNGRAkyCS8qIGZpbGUgZGVzY3JpcHRvciBvZiBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRFIJCTMJLyogcHJvZ3JhbSBoZWFkZXJzIGZvciBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRU5UCTQJLyogc2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAqLworI2RlZmluZSBBVF9QSE5VTQk1CS8qIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnMgKi8KKyNkZWZpbmUgQVRfUEFHRVNaCTYJLyogc3lzdGVtIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBBVF9CQVNFCQk3CS8qIGJhc2UgYWRkcmVzcyBvZiBpbnRlcnByZXRlciAqLworI2RlZmluZSBBVF9GTEFHUwk4CS8qIGZsYWdzICovCisjZGVmaW5lIEFUX0VOVFJZCTkJLyogZW50cnkgcG9pbnQgb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9OT1RFTEYJMTAJLyogcHJvZ3JhbSBpcyBub3QgRUxGICovCisjZGVmaW5lIEFUX1VJRAkJMTEJLyogcmVhbCB1aWQgKi8KKyNkZWZpbmUgQVRfRVVJRAkJMTIJLyogZWZmZWN0aXZlIHVpZCAqLworI2RlZmluZSBBVF9HSUQJCTEzCS8qIHJlYWwgZ2lkICovCisjZGVmaW5lIEFUX0VHSUQJCTE0CS8qIGVmZmVjdGl2ZSBnaWQgKi8KKyNkZWZpbmUgQVRfUExBVEZPUk0JMTUJLyogc3RyaW5nIGlkZW50aWZ5aW5nIENQVSBmb3Igb3B0aW1pemF0aW9ucyAqLworI2RlZmluZSBBVF9IV0NBUCAgCTE2CS8qIGFyY2ggZGVwZW5kZW50IGhpbnRzIGF0IENQVSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQVRfQ0xLVENLIAkxNwkvKiBmcmVxdWVuY3kgYXQgd2hpY2ggdGltZXMoKSBpbmNyZW1lbnRzICovCisvKiAxOC4uMjIgPSA/ICovCisjZGVmaW5lIEFUX1NFQ1VSRSAJMjMJLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLworCisvKiBQcm9ncmFtIGhlYWRlciBwZXJtaXNzaW9uIGZsYWdzICovCisjZGVmaW5lIFBGX1ggICAgICAgICAgICAweDEKKyNkZWZpbmUgUEZfVyAgICAgICAgICAgIDB4MgorI2RlZmluZSBQRl9SICAgICAgICAgICAgMHg0CisKKy8qIFNlY3Rpb24gaGVhZGVyIHR5cGVzICovCisjZGVmaW5lIFNIVF9OVUxMICAgICAgICAwCisjZGVmaW5lIFNIVF9QUk9HQklUUyAgICAxCisjZGVmaW5lIFNIVF9TWU1UQUIgICAgICAyCisjZGVmaW5lIFNIVF9TVFJUQUIgICAgICAzCisjZGVmaW5lIFNIVF9SRUxBICAgICAgICA0CisjZGVmaW5lIFNIVF9IQVNIICAgICAgICA1CisjZGVmaW5lIFNIVF9EWU5BTUlDICAgICA2CisjZGVmaW5lIFNIVF9OT1RFICAgICAgICA3CisjZGVmaW5lIFNIVF9OT0JJVFMgICAgICA4CisjZGVmaW5lIFNIVF9SRUwgICAgICAgICA5CisjZGVmaW5lIFNIVF9TSExJQiAgICAgICAxMAorI2RlZmluZSBTSFRfRFlOU1lNICAgICAgMTEKKyNkZWZpbmUgU0hUX05VTSAgICAgICAgIDEyCisjZGVmaW5lIFNIVF9MT1BST0MgICAgICAweDcwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVBST0MgICAgICAweDdmZmZmZmZmCisjZGVmaW5lIFNIVF9MT1VTRVIgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVVTRVIgICAgICAweGZmZmZmZmZmCisKKy8qIFNlY3Rpb24gaGVhZGVyIGZsYWdzICovCisjZGVmaW5lIFNIRl9XUklURSAgICAgICAweDEKKyNkZWZpbmUgU0hGX0FMTE9DICAgICAgIDB4MgorI2RlZmluZSBTSEZfRVhFQ0lOU1RSICAgMHg0CisjZGVmaW5lIFNIRl9NQVNLUFJPQyAgICAweGYwMDAwMDAwCisKKy8qIFNwZWNpYWwgc2VjdGlvbiBudW1iZXJzICovCisjZGVmaW5lIFNITl9VTkRFRiAgICAgICAwCisjZGVmaW5lIFNITl9MT1JFU0VSVkUgICAweGZmMDAKKyNkZWZpbmUgU0hOX0xPUFJPQyAgICAgIDB4ZmYwMAorI2RlZmluZSBTSE5fSElQUk9DICAgICAgMHhmZjFmCisjZGVmaW5lIFNITl9BQlMgICAgICAgICAweGZmZjEKKyNkZWZpbmUgU0hOX0NPTU1PTiAgICAgIDB4ZmZmMgorI2RlZmluZSBTSE5fSElSRVNFUlZFICAgMHhmZmZmCisKKy8qIExlbmdodCBvZiBtYWdpYyBhdCB0aGUgc3RhcnQgb2YgYSBmaWxlICovCisjZGVmaW5lIEVJX05JREVOVAkxNgorCisvKiBNYWdpYyBudW1iZXIgY29uc3RhbnRzLi4uICovCisjZGVmaW5lIEVJX01BRzAgICAgICAgICAwCS8qIGVfaWRlbnRbXSBpbmRleGVzICovCisjZGVmaW5lIEVJX01BRzEgICAgICAgICAxCisjZGVmaW5lIEVJX01BRzIgICAgICAgICAyCisjZGVmaW5lIEVJX01BRzMgICAgICAgICAzCisjZGVmaW5lIEVJX0NMQVNTICAgICAgICA0CisjZGVmaW5lIEVJX0RBVEEgICAgICAgICA1CisjZGVmaW5lIEVJX1ZFUlNJT04gICAgICA2CisjZGVmaW5lIEVJX09TQUJJICAgICAgICA3CisjZGVmaW5lIEVJX1BBRCAgICAgICAgICA4CisKKyNkZWZpbmUgRUxGTUFHMCAgICAgICAgIDB4N2YJLyogRUlfTUFHICovCisjZGVmaW5lIEVMRk1BRzEgICAgICAgICAnRScKKyNkZWZpbmUgRUxGTUFHMiAgICAgICAgICdMJworI2RlZmluZSBFTEZNQUczICAgICAgICAgJ0YnCisjZGVmaW5lIEVMRk1BRyAgICAgICAgICAiXDE3N0VMRiIKKyNkZWZpbmUgU0VMRk1BRyAgICAgICAgIDQKKworI2RlZmluZSBFTEZDTEFTU05PTkUgICAgMAkvKiBFSV9DTEFTUyAqLworI2RlZmluZSBFTEZDTEFTUzMyICAgICAgMQorI2RlZmluZSBFTEZDTEFTUzY0ICAgICAgMgorI2RlZmluZSBFTEZDTEFTU05VTSAgICAgMworCisjZGVmaW5lIEVMRkRBVEFOT05FICAgICAwCS8qIGVfaWRlbnRbRUlfREFUQV0gKi8KKyNkZWZpbmUgRUxGREFUQTJMU0IgICAgIDEKKyNkZWZpbmUgRUxGREFUQTJNU0IgICAgIDIKKworI2RlZmluZSBFVl9OT05FICAgICAgICAgMAkvKiBlX3ZlcnNpb24sIEVJX1ZFUlNJT04gKi8KKyNkZWZpbmUgRVZfQ1VSUkVOVCAgICAgIDEKKyNkZWZpbmUgRVZfTlVNICAgICAgICAgIDIKKworI2RlZmluZSBFTEZPU0FCSV9OT05FICAgMAorI2RlZmluZSBFTEZPU0FCSV9MSU5VWCAgMworCisjZW5kaWYJCQkJLyogX1NZU19FTEZDT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL2ZzdWlkLmggYi91c3IvaW5jbHVkZS9zeXMvZnN1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRlMjhiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL2ZzdWlkLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIHN5cy9mc3VpZC5oCisgKi8KKworI2lmbmRlZiBfU1lTX0ZTVUlEX0gKKyNkZWZpbmUgX1NZU19GU1VJRF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19leHRlcm4gaW50IHNldGZzdWlkKHVpZF90KTsKK19fZXh0ZXJuIGludCBzZXRmc2dpZChnaWRfdCk7CisKKyNlbmRpZgkJCQkvKiBfU1lTX0ZTVUlEX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9pbm90aWZ5LmggYi91c3IvaW5jbHVkZS9zeXMvaW5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOGNiMDUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvaW5vdGlmeS5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBzeXMvaW5vdGlmeS5oCisgKi8KKworI2lmbmRlZiBfU1lTX0lOT1RJRllfSAorI2RlZmluZSBfU1lTX0lOT1RJRllfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgorI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorCitfX2V4dGVybiBpbnQgaW5vdGlmeV9pbml0KHZvaWQpOworX19leHRlcm4gaW50IGlub3RpZnlfYWRkX3dhdGNoKGludCwgY29uc3QgY2hhciAqLCBfX3UzMik7CitfX2V4dGVybiBpbnQgaW5vdGlmeV9ybV93YXRjaChpbnQsIF9fdTMyKTsKKworI2VuZGlmCQkJCS8qIF9TWVNfSU5PVElGWV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvaW9jdGwuaCBiL3Vzci9pbmNsdWRlL3N5cy9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OWYxMTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvaW9jdGwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogc3lzL2lvY3RsLmgKKyAqLworCisjaWZuZGVmIF9TWVNfSU9DVExfSAorI2RlZmluZSBfU1lTX0lPQ1RMX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCitfX2V4dGVybiBpbnQgaW9jdGwoaW50LCBpbnQsIHZvaWQgKik7CisKKyNlbmRpZgkJCQkvKiBfU1lTX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9rbG9nLmggYi91c3IvaW5jbHVkZS9zeXMva2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzcyMTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMva2xvZy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzeXMva2xvZy5oCisgKi8KKworI2lmbmRlZiBfU1lTX0tMT0dfSAorI2RlZmluZSBfU1lTX0tMT0dfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisKKyNkZWZpbmUgS0xPR19DTE9TRQkwCisjZGVmaW5lIEtMT0dfT1BFTgkxCisjZGVmaW5lIEtMT0dfUkVBRAkyCisjZGVmaW5lIEtMT0dfUkVBRF9BTEwJMworI2RlZmluZSBLTE9HX1JFQURfQ0xFQVIJNAorI2RlZmluZSBLTE9HX0NMRUFSCTUKKyNkZWZpbmUgS0xPR19ESVNBQkxFCTYKKyNkZWZpbmUgS0xPR19FTkFCTEUJNworI2RlZmluZSBLTE9HX1NFVExFVkVMCTgKKyNkZWZpbmUgS0xPR19VTlJFQURTSVpFCTkKKyNkZWZpbmUgS0xPR19XUklURQkxMAorCitfX2V4dGVybiBpbnQga2xvZ2N0bChpbnQsIGNoYXIgKiwgaW50KTsKKworI2VuZGlmCQkJCS8qIF9TWVNfS0xPR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvbWQuaCBiL3Vzci9pbmNsdWRlL3N5cy9tZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGU0YWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvbWQuaApAQCAtMCwwICsxLDMyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzL21kLmgKKyAqCisgKiBEZWZpbmVzIGZvciB0aGUgTGludXggbWQgZnVuY3Rpb25hbGl0eS4gIFNvbWUgb2YgdGhpcyBzdHVmZiBpcworICogdXNlcnNwYWNlLXZpc2libGUgYnV0IGxpdmVzIGluIG1kX2suaCwgd2hpY2ggaXMgdXNlci1zcGFjZSB1bnNhZmUuCisgKiBTaWdoLgorICovCisKKyNpZm5kZWYgX1NZU19NRF9ICisjZGVmaW5lIF9TWVNfTURfSAorCisjZGVmaW5lIExFVkVMX01VTFRJUEFUSCAgICAgICAgICgtNCkKKyNkZWZpbmUgTEVWRUxfTElORUFSICAgICAgICAgICAgKC0xKQorI2RlZmluZSBMRVZFTF9GQVVMVFkgICAgICAgICAgICAoLTUpCisjZGVmaW5lIE1BWF9NRF9ERVZTICAyNTYJLyogTWF4IG51bWJlciBvZiBtZCBkZXYgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWRfdS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWRfcC5oPgorCisjZW5kaWYJCQkJLyogX1NZU19NRF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvbW1hbi5oIGIvdXNyL2luY2x1ZGUvc3lzL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmYwYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL21tYW4uaApAQCAtMCwwICsxLDI2IEBACisvKgorICogc3lzL21tYW4uaAorICovCisKKyNpZm5kZWYgX1NZU19NTUFOX0gKKyNkZWZpbmUgX1NZU19NTUFOX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tbWFuLmg+CisKKyNkZWZpbmUgTUFQX0ZBSUxFRCAoKHZvaWQgKiktMSkKKworX19leHRlcm4gdm9pZCAqbW1hcCh2b2lkICosIHNpemVfdCwgaW50LCBpbnQsIGludCwgb2ZmX3QpOworX19leHRlcm4gaW50IG11bm1hcCh2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiB2b2lkICptcmVtYXAodm9pZCAqLCBzaXplX3QsIHNpemVfdCwgdW5zaWduZWQgbG9uZyk7CitfX2V4dGVybiBpbnQgc2htX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIG1vZGVfdCk7CitfX2V4dGVybiBpbnQgc2htX3VubGluayhjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IG1zeW5jKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOworX19leHRlcm4gaW50IG1wcm90ZWN0KGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOworX19leHRlcm4gaW50IG1sb2NrYWxsKGludCk7CitfX2V4dGVybiBpbnQgbXVubG9ja2FsbCh2b2lkKTsKK19fZXh0ZXJuIGludCBtbG9jayhjb25zdCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgbXVubG9jayhjb25zdCB2b2lkICosIHNpemVfdCk7CisKKyNlbmRpZgkJCQkvKiBfU1lTX01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL21vdW50LmggYi91c3IvaW5jbHVkZS9zeXMvbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDZiMGVlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL21vdW50LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIHN5cy9tb3VudC5oCisgKi8KKworI2lmbmRlZiBfU1lTX01PVU5UX0gKKyNkZWZpbmUgX1NZU19NT1VOVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZnMtaW5kZXBlbmRlbnQgbW91bnQtZmxhZ3M6IHVwIHRvIDMyIGZsYWdzIGFyZSBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBNU19SRE9OTFkgICAgICAgMHgwMDAxCS8qIE1vdW50IHJlYWQtb25seSAqLworI2RlZmluZSBNU19OT1NVSUQgICAgICAgMHgwMDAyCS8qIElnbm9yZSBzdWlkIGFuZCBzZ2lkIGJpdHMgKi8KKyNkZWZpbmUgTVNfTk9ERVYgICAgICAgIDB4MDAwNAkvKiBEaXNhbGxvdyBhY2Nlc3MgdG8gZGV2aWNlIHNwZWNpYWwgZmlsZXMgKi8KKyNkZWZpbmUgTVNfTk9FWEVDICAgICAgIDB4MDAwOAkvKiBEaXNhbGxvdyBwcm9ncmFtIGV4ZWN1dGlvbiAqLworI2RlZmluZSBNU19TWU5DSFJPTk9VUyAgMHgwMDEwCS8qIFdyaXRlcyBhcmUgc3luY2VkIGF0IG9uY2UgKi8KKyNkZWZpbmUgTVNfUkVNT1VOVCAgICAgIDB4MDAyMAkvKiBBbHRlciBmbGFncyBvZiBhIG1vdW50ZWQgRlMgKi8KKyNkZWZpbmUgTVNfTUFORExPQ0sgICAgIDB4MDA0MAkvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMgKi8KKyNkZWZpbmUgTVNfRElSU1lOQyAgICAgIDB4MDA4MAkvKiBEaXJlY3RvcnkgbW9kaWZpY2F0aW9ucyBhcmUgc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgTVNfTk9BVElNRSAgICAgIDB4MDQwMAkvKiBEbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lcy4gKi8KKyNkZWZpbmUgTVNfTk9ESVJBVElNRSAgIDB4MDgwMAkvKiBEbyBub3QgdXBkYXRlIGRpcmVjdG9yeSBhY2Nlc3MgdGltZXMgKi8KKyNkZWZpbmUgTVNfQklORCAgICAgICAgIDB4MTAwMAorI2RlZmluZSBNU19NT1ZFICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1TX1JFQyAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgTVNfVkVSQk9TRSAgICAgIDB4ODAwMAorI2RlZmluZSBNU19QT1NJWEFDTCAgICAgKDE8PDE2KQkvKiBWRlMgZG9lcyBub3QgYXBwbHkgdGhlIHVtYXNrICovCisjZGVmaW5lIE1TX09ORV9TRUNPTkQgICAoMTw8MTcpCS8qIGZzIGhhcyAxIHNlYyBhL20vY3RpbWUgcmVzb2x1dGlvbiAqLworI2RlZmluZSBNU19BQ1RJVkUgICAgICAgKDE8PDMwKQorI2RlZmluZSBNU19OT1VTRVIgICAgICAgKDE8PDMxKQorCisvKgorICogU3VwZXJibG9jayBmbGFncyB0aGF0IGNhbiBiZSBhbHRlcmVkIGJ5IE1TX1JFTU9VTlQKKyAqLworI2RlZmluZSBNU19STVRfTUFTSyAgICAgKE1TX1JET05MWXxNU19TWU5DSFJPTk9VU3xNU19NQU5ETE9DS3xNU19OT0FUSU1FfE1TX05PRElSQVRJTUUpCisKKy8qCisgKiBPbGQgbWFnaWMgbW91bnQgZmxhZyBhbmQgbWFzaworICovCisjZGVmaW5lIE1TX01HQ19WQUwgMHhDMEVEMDAwMAorI2RlZmluZSBNU19NR0NfTVNLIDB4ZmZmZjAwMDAKKworLyoKKyAqIHVtb3VudDIoKSBmbGFncworICovCisjZGVmaW5lIE1OVF9GT1JDRQkxCS8qIEZvcmNpYmx5IHVubW91bnQgKi8KKyNkZWZpbmUgTU5UX0RFVEFDSAkyCS8qIERldGFjaCBmcm9tIHRyZWUgb25seSAqLworI2RlZmluZSBNTlRfRVhQSVJFCTQJLyogTWFyayBmb3IgZXhwaXJ5ICovCisKKy8qCisgKiBCbG9jayBkZXZpY2UgaW9jdGxzCisgKi8KKyNkZWZpbmUgQkxLUk9TRVQgICBfSU8oMHgxMiwgOTMpCS8qIFNldCBkZXZpY2UgcmVhZC1vbmx5ICgwID0gcmVhZC13cml0ZSkuICAqLworI2RlZmluZSBCTEtST0dFVCAgIF9JTygweDEyLCA5NCkJLyogR2V0IHJlYWQtb25seSBzdGF0dXMgKDAgPSByZWFkX3dyaXRlKS4gICovCisjZGVmaW5lIEJMS1JSUEFSVCAgX0lPKDB4MTIsIDk1KQkvKiBSZS1yZWFkIHBhcnRpdGlvbiB0YWJsZS4gICovCisjZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsIDk2KQkvKiBSZXR1cm4gZGV2aWNlIHNpemUuICAqLworI2RlZmluZSBCTEtGTFNCVUYgIF9JTygweDEyLCA5NykJLyogRmx1c2ggYnVmZmVyIGNhY2hlLiAgKi8KKyNkZWZpbmUgQkxLUkFTRVQgICBfSU8oMHgxMiwgOTgpCS8qIFNldCByZWFkIGFoZWFkIGZvciBibG9jayBkZXZpY2UuICAqLworI2RlZmluZSBCTEtSQUdFVCAgIF9JTygweDEyLCA5OSkJLyogR2V0IGN1cnJlbnQgcmVhZCBhaGVhZCBzZXR0aW5nLiAgKi8KKworLyoKKyAqIFByb3RvdHlwZXMKKyAqLworX19leHRlcm4gaW50IG1vdW50KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkgICBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHZvaWQgKik7CitfX2V4dGVybiBpbnQgdW1vdW50KGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgdW1vdW50Mihjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBpbnQgcGl2b3Rfcm9vdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKyNlbmRpZgkJCQkvKiBfU1lTX01PVU5UX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9wYXJhbS5oIGIvdXNyL2luY2x1ZGUvc3lzL3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYjJlNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9wYXJhbS5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBzeXMvcGFyYW0uaAorICovCisKKyNpZm5kZWYgX1NZU19QQVJBTV9ICisjZGVmaW5lIF9TWVNfUEFSQU1fSAorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKworI2VuZGlmCQkJCS8qIF9TWVNfUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3BvbGwuaCBiL3Vzci9pbmNsdWRlL3N5cy9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNjBjMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9wb2xsLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIHBvbGwuaAorICovCisKKyNpZm5kZWYgX1BPTExfSAorI2RlZmluZSBfUE9MTF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKworLyogUE9TSVggc3BlY2lmaWVzICJpbnQiIGZvciB0aGUgdGltZW91dCwgTGludXggc2VlbXMgdG8gdXNlIGxvbmcuLi4gKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgbmZkc190OworX19leHRlcm4gaW50IHBvbGwoc3RydWN0IHBvbGxmZCAqLCBuZmRzX3QsIGxvbmcpOworX19leHRlcm4gaW50IHBwb2xsKHN0cnVjdCBwb2xsZmQgKiwgbmZkc190LCBzdHJ1Y3QgdGltZXNwZWMgKiwKKwkJICAgY29uc3Qgc2lnc2V0X3QgKik7CisKKyNlbmRpZgkJCQkvKiBfUE9MTF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvcHJjdGwuaCBiL3Vzci9pbmNsdWRlL3N5cy9wcmN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmMxOTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvcHJjdGwuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9TWVNfUFJDVExfSAorI2RlZmluZSBfU1lTX1BSQ1RMX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CisKKy8qIGdsaWJjIGhhcyB0aGlzIGFzIGEgdmFyYWRpYyBmdW5jdGlvbiwgc28gam9pbiB0aGUgY2x1Yi4uLiAqLworX19leHRlcm4gaW50IHByY3RsKGludCwgLi4uKTsKKworI2VuZGlmIC8qIF9TWVNfUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3JlYm9vdC5oIGIvdXNyL2luY2x1ZGUvc3lzL3JlYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzdkMjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvcmVib290LmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIHN5cy9yZWJvb3QuaAorICovCisKKyNpZm5kZWYgX1NZU19SRUJPT1RfSAorI2RlZmluZSBfU1lTX1JFQk9PVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKworLyogZ2xpYmMgbmFtZXMgdGhlc2UgY29uc3RhbnRzIGRpZmZlcmVudGx5OyBhbGxvdyBib3RoIHZlcnNpb25zICovCisKKyNkZWZpbmUgUkJfQVVUT0JPT1QJTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUCisjZGVmaW5lIFJCX0hBTFRfU1lTVEVNCUxJTlVYX1JFQk9PVF9DTURfSEFMVAorI2RlZmluZSBSQl9FTkFCTEVfQ0FECUxJTlVYX1JFQk9PVF9DTURfQ0FEX09OCisjZGVmaW5lIFJCX0RJU0FCTEVfQ0FECUxJTlVYX1JFQk9PVF9DTURfQ0FEX09GRgorI2RlZmluZSBSQl9QT1dFUl9PRkYJTElOVVhfUkVCT09UX0NNRF9QT1dFUl9PRkYKKworLyogZ2xpYmMtaXNoIG9uZS1hcmd1bWVudCB2ZXJzaW9uICovCitfX2V4dGVybiBpbnQgcmVib290KGludCk7CisKKy8qIE5hdGl2ZSBmb3VyLWFyZ3VtZW50IHN5c3RlbSBjYWxsICovCitfX2V4dGVybiBpbnQgX19yZWJvb3QoaW50LCBpbnQsIGludCwgdm9pZCAqKTsKKworI2VuZGlmCQkJCS8qIF9TWVNfUkVCT09UX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9yZXNvdXJjZS5oIGIvdXNyL2luY2x1ZGUvc3lzL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjZWZiNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBzeXMvcmVzb3VyY2UuaAorICovCisKKyNpZm5kZWYgX1NZU19SRVNPVVJDRV9ICisjZGVmaW5lIF9TWVNfUkVTT1VSQ0VfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CQkvKiBNVVNUIGJlIGluY2x1ZGVkIGJlZm9yZSBsaW51eC9yZXNvdXJjZS5oICovCisjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KKworX19leHRlcm4gaW50IGdldHByaW9yaXR5KGludCwgaW50KTsKK19fZXh0ZXJuIGludCBzZXRwcmlvcml0eShpbnQsIGludCwgaW50KTsKKworI2VuZGlmCQkJCS8qIF9TWVNfUkVTT1VSQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIGIvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNGUwMGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIHN5cy9zZWxlY3QuaAorICovCisKKyNpZm5kZWYgX1NZU19TRUxFQ1RfSAorI2RlZmluZSBfU1lTX1NFTEVDVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitfX2V4dGVybiBpbnQgc2VsZWN0KGludCwgZmRfc2V0ICosIGZkX3NldCAqLCBmZF9zZXQgKiwgc3RydWN0IHRpbWV2YWwgKik7CitfX2V4dGVybiBpbnQgcHNlbGVjdChpbnQsIGZkX3NldCAqLCBmZF9zZXQgKiwgZmRfc2V0ICosCisJCSAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHNpZ3NldF90ICopOworCisjZW5kaWYJCQkJLyogX1NZU19TRUxFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3NlbmRmaWxlLmggYi91c3IvaW5jbHVkZS9zeXMvc2VuZGZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQ1ZjEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3NlbmRmaWxlLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIHN5cy9zZW5kZmlsZS5oCisgKi8KKworI2lmbmRlZiBfU1lTX1NFTkRGSUxFX0gKKyNkZWZpbmUgX1NZU19TRU5ERklMRV9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19leHRlcm4gc3NpemVfdCBzZW5kZmlsZShpbnQsIGludCwgb2ZmX3QgKiwgc2l6ZV90LCBvZmZfdCk7CisKKyNlbmRpZiAvKiBfU1lTX1NFTkRGSUxFX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9zb2NrZXQuaCBiL3Vzci9pbmNsdWRlL3N5cy9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQ3MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3NvY2tldC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBzeXMvc29ja2V0LmgKKyAqLworCisjaWZuZGVmIF9TWVNfU09DS0VUX0gKKyNkZWZpbmUgX1NZU19TT0NLRVRfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpZiBfS0xJQkNfSEFTX0FSQ0hTT0NLRVRfSAorI2luY2x1ZGUgPGtsaWJjL2FyY2hzb2NrZXQuaD4KKyNlbmRpZgorCisvKiBHcmVhdCBqb2IsIGd1eXMhICBUaGVzZSBhcmUgKmFyY2hpdGVjdHVyZS1zcGVjaWZpYyogQUJJIGNvbnN0YW50cywKKyAgIHRoYXQgYXJlIGhpZGRlbiB1bmRlciAjaWZkZWYgX19LRVJORUxfXy4uLiB3aGF0IGEgYnJpbGxpYW50IGlkZWEhCisgICBUaGVzZSBhcmUgdGhlICJjb21tb24iIGRlZmluaXRpb25zOyBpZiBub3QgYXBwcm9wcmlhdGUsIG92ZXJyaWRlCisgICB0aGVtIGluIDxrbGliYy9hcmNoc29ja2V0Lmg+LiAqLworICAgCisjaWZuZGVmIFNPQ0tfU1RSRUFNCisjIGRlZmluZSBTT0NLX1NUUkVBTSAgICAxCisjIGRlZmluZSBTT0NLX0RHUkFNICAgICAyCisjIGRlZmluZSBTT0NLX1JBVyAgICAgICAzCisjIGRlZmluZSBTT0NLX1JETSAgICAgICA0CisjIGRlZmluZSBTT0NLX1NFUVBBQ0tFVCA1CisjIGRlZmluZSBTT0NLX1BBQ0tFVCAgICAxMAorI2VuZGlmCisKK3R5cGVkZWYgaW50IHNvY2tsZW5fdDsKKworX19leHRlcm4gaW50IHNvY2tldChpbnQsIGludCwgaW50KTsKK19fZXh0ZXJuIGludCBiaW5kKGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7CitfX2V4dGVybiBpbnQgY29ubmVjdChpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QpOworX19leHRlcm4gaW50IGxpc3RlbihpbnQsIGludCk7CitfX2V4dGVybiBpbnQgYWNjZXB0KGludCwgc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCAqKTsKK19fZXh0ZXJuIGludCBnZXRzb2NrbmFtZShpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QgKik7CitfX2V4dGVybiBpbnQgZ2V0cGVlcm5hbWUoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICopOworX19leHRlcm4gaW50IHNvY2tldHBhaXIoaW50LCBpbnQsIGludCwgaW50ICopOworX19leHRlcm4gaW50IHNlbmQoaW50LCBjb25zdCB2b2lkICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKK19fZXh0ZXJuIGludCBzZW5kdG8oaW50LCBjb25zdCB2b2lkICosIHNpemVfdCwgaW50LCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwKKwkJCXNvY2tsZW5fdCk7CitfX2V4dGVybiBpbnQgcmVjdihpbnQsIHZvaWQgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworX19leHRlcm4gaW50IHJlY3Zmcm9tKGludCwgdm9pZCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCwgc3RydWN0IHNvY2thZGRyICosCisJCQkgIHNvY2tsZW5fdCAqKTsKK19fZXh0ZXJuIGludCBzaHV0ZG93bihpbnQsIGludCk7CitfX2V4dGVybiBpbnQgc2V0c29ja29wdChpbnQsIGludCwgaW50LCBjb25zdCB2b2lkICosIHNvY2tsZW5fdCk7CitfX2V4dGVybiBpbnQgZ2V0c29ja29wdChpbnQsIGludCwgaW50LCB2b2lkICosIHNvY2tsZW5fdCAqKTsKK19fZXh0ZXJuIGludCBzZW5kbXNnKGludCwgY29uc3Qgc3RydWN0IG1zZ2hkciAqLCB1bnNpZ25lZCBpbnQpOworX19leHRlcm4gaW50IHJlY3Ztc2coaW50LCBzdHJ1Y3QgbXNnaGRyICosIHVuc2lnbmVkIGludCk7CisKKyNlbmRpZgkJCQkvKiBfU1lTX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvc29ja2V0Y2FsbHMuaCBiL3Vzci9pbmNsdWRlL3N5cy9zb2NrZXRjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDM2N2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc29ja2V0Y2FsbHMuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogc3lzL3NvY2tldGNhbGxzLmgKKyAqLworCisjaWZuZGVmIF9TWVNfU09DS0VUQ0FMTFNfSAorI2RlZmluZSBfU1lTX1NPQ0tFVENBTExTX0gKKworLyogc29ja2V0Y2FsbHMgYnkgbnVtYmVyLCBzaW5jZSA8bGludXgvbmV0Lmg+IGlzbid0IHVzYWJsZSBmb3IgYXNzZW1ibHkgKi8KKworI2RlZmluZSBTWVNfU09DS0VUICAgICAgMQkvKiBzeXNfc29ja2V0KDIpICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19CSU5EICAgICAgICAyCS8qIHN5c19iaW5kKDIpICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTX0NPTk5FQ1QgICAgIDMJLyogc3lzX2Nvbm5lY3QoMikgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfTElTVEVOICAgICAgNAkvKiBzeXNfbGlzdGVuKDIpICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19BQ0NFUFQgICAgICA1CS8qIHN5c19hY2NlcHQoMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTX0dFVFNPQ0tOQU1FIDYJLyogc3lzX2dldHNvY2tuYW1lKDIpICAgICAgICAgICAqLworI2RlZmluZSBTWVNfR0VUUEVFUk5BTUUgNwkvKiBzeXNfZ2V0cGVlcm5hbWUoMikgICAgICAgICAgICovCisjZGVmaW5lIFNZU19TT0NLRVRQQUlSICA4CS8qIHN5c19zb2NrZXRwYWlyKDIpICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTX1NFTkQgICAgICAgIDkJLyogc3lzX3NlbmQoMikgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfUkVDViAgICAgICAgMTAJLyogc3lzX3JlY3YoMikgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfU0VORFRPICAgICAgMTEJLyogc3lzX3NlbmR0bygyKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfUkVDVkZST00gICAgMTIJLyogc3lzX3JlY3Zmcm9tKDIpICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfU0hVVERPV04gICAgMTMJLyogc3lzX3NodXRkb3duKDIpICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfU0VUU09DS09QVCAgMTQJLyogc3lzX3NldHNvY2tvcHQoMikgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfR0VUU09DS09QVCAgMTUJLyogc3lzX2dldHNvY2tvcHQoMikgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfU0VORE1TRyAgICAgMTYJLyogc3lzX3NlbmRtc2coMikgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfUkVDVk1TRyAgICAgMTcJLyogc3lzX3JlY3Ztc2coMikgICAgICAgICAgICAgICAqLworCisjZW5kaWYJCQkJLyogX1NZU19TT0NLRVRDQUxMU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvc3BsaWNlLmggYi91c3IvaW5jbHVkZS9zeXMvc3BsaWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMjZkOTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc3BsaWNlLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIHN5cy9zcGxpY2UuaAorICovCisKKyNpZm5kZWYgX1NZU19TUExJQ0VfSAorI2RlZmluZSBfU1lTX1NQTElDRV9ICisKKy8qIG1vdmUgcGFnZXMgaW5zdGVhZCBvZiBjb3B5aW5nICovCisjZGVmaW5lIFNQTElDRV9GX01PVkUJCTEKKy8qIGRvbid0IGJsb2NrIG9uIHRoZSBwaXBlIHNwbGljaW5nIChidXQgd2UgbWF5IHN0aWxsIGJsb2NrIG9uIHRoZSBmZAorICAgd2Ugc3BsaWNlIGZyb20vdG8sIG9mIGNvdXJzZSAqLworI2RlZmluZSBTUExJQ0VfRl9OT05CTE9DSwkyCisvKiBleHBlY3QgbW9yZSBkYXRhICovCisjZGVmaW5lIFNQTElDRV9GX01PUkUJCTQKKworX19leHRlcm4gaW50IHNwbGljZShpbnQsIG9mZl90ICosIGludCwgb2ZmX3QgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworX19leHRlcm4gaW50IHRlZShpbnQsIGludCwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworCisjZW5kaWYJCQkJLyogX1NZU19TUExJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3N0YXQuaCBiL3Vzci9pbmNsdWRlL3N5cy9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxODJmYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9zdGF0LmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIHN5cy9zdGF0LmgKKyAqLworCisjaWZuZGVmIF9TWVNfU1RBVF9ICisjZGVmaW5lIF9TWVNfU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgkJLyogRm9yIHN0cnVjdCB0aW1lc3BlYyAqLworI2luY2x1ZGUgPGtsaWJjL2FyY2hzdGF0Lmg+CisKKy8qIDIuNi4yMSBrZXJuZWxzIGhhdmUgb25jZSBhZ2FpbiBoaWRkZW4gYSBidW5jaCBvZiBzdHVmZi4uLiAqLworI2lmbmRlZiBTX0lGTVQKKworI2RlZmluZSBTX0lGTVQgIDAwMTcwMDAwCisjZGVmaW5lIFNfSUZTT0NLIDAxNDAwMDAKKyNkZWZpbmUgU19JRkxOSwkgMDEyMDAwMAorI2RlZmluZSBTX0lGUkVHICAwMTAwMDAwCisjZGVmaW5lIFNfSUZCTEsgIDAwNjAwMDAKKyNkZWZpbmUgU19JRkRJUiAgMDA0MDAwMAorI2RlZmluZSBTX0lGQ0hSICAwMDIwMDAwCisjZGVmaW5lIFNfSUZJRk8gIDAwMTAwMDAKKyNkZWZpbmUgU19JU1VJRCAgMDAwNDAwMAorI2RlZmluZSBTX0lTR0lEICAwMDAyMDAwCisjZGVmaW5lIFNfSVNWVFggIDAwMDEwMDAKKworI2RlZmluZSBTX0lTTE5LKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGTE5LKQorI2RlZmluZSBTX0lTUkVHKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2RlZmluZSBTX0lTRElSKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGRElSKQorI2RlZmluZSBTX0lTQ0hSKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGQ0hSKQorI2RlZmluZSBTX0lTQkxLKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGQkxLKQorI2RlZmluZSBTX0lTRklGTyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRklGTykKKyNkZWZpbmUgU19JU1NPQ0sobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZTT0NLKQorCisjZGVmaW5lIFNfSVJXWFUgMDA3MDAKKyNkZWZpbmUgU19JUlVTUiAwMDQwMAorI2RlZmluZSBTX0lXVVNSIDAwMjAwCisjZGVmaW5lIFNfSVhVU1IgMDAxMDAKKworI2RlZmluZSBTX0lSV1hHIDAwMDcwCisjZGVmaW5lIFNfSVJHUlAgMDAwNDAKKyNkZWZpbmUgU19JV0dSUCAwMDAyMAorI2RlZmluZSBTX0lYR1JQIDAwMDEwCisKKyNkZWZpbmUgU19JUldYTyAwMDAwNworI2RlZmluZSBTX0lST1RIIDAwMDA0CisjZGVmaW5lIFNfSVdPVEggMDAwMDIKKyNkZWZpbmUgU19JWE9USCAwMDAwMQorCisjZGVmaW5lIFNfSVJXWFVHTwkoU19JUldYVXxTX0lSV1hHfFNfSVJXWE8pCisjZGVmaW5lIFNfSUFMTFVHTwkoU19JU1VJRHxTX0lTR0lEfFNfSVNWVFh8U19JUldYVUdPKQorI2RlZmluZSBTX0lSVUdPCQkoU19JUlVTUnxTX0lSR1JQfFNfSVJPVEgpCisjZGVmaW5lIFNfSVdVR08JCShTX0lXVVNSfFNfSVdHUlB8U19JV09USCkKKyNkZWZpbmUgU19JWFVHTwkJKFNfSVhVU1J8U19JWEdSUHxTX0lYT1RIKQorCisjZW5kaWYKKworI2lmZGVmIF9TVEFUQlVGX1NUX05TRUMKKyAgLyogc3RydWN0IHN0YXQgaGFzIHN0cnVjdCB0aW1lc3BlYyBpbnN0ZWFkIG9mIHRpbWVfdCAqLworIyBkZWZpbmUgc3RfYXRpbWUgIHN0X2F0aW0udHZfc2VjCisjIGRlZmluZSBzdF9tdGltZSAgc3RfbXRpbS50dl9zZWMKKyMgZGVmaW5lIHN0X2N0aW1lICBzdF9jdGltLnR2X3NlYworI2VuZGlmCisKK19fZXh0ZXJuIGludCBzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7CitfX2V4dGVybiBpbnQgZnN0YXQoaW50LCBzdHJ1Y3Qgc3RhdCAqKTsKK19fZXh0ZXJuIGludCBmc3RhdGF0KGludCwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworX19leHRlcm4gaW50IGxzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7CitfX2V4dGVybiBtb2RlX3QgdW1hc2sobW9kZV90KTsKK19fZXh0ZXJuIGludCBta25vZChjb25zdCBjaGFyICosIG1vZGVfdCwgZGV2X3QpOworX19leHRlcm4gaW50IG1rbm9kYXQoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgbW9kZV90LCBkZXZfdCk7CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbWtmaWZvKGNvbnN0IGNoYXIgKl9fcCwgbW9kZV90IF9fbSkKK3sKKwlyZXR1cm4gbWtub2QoX19wLCAoX19tICYgflNfSUZNVCkgfCBTX0lGSUZPLCAoZGV2X3QpIDApOworfQorCisjZW5kaWYJCQkJLyogX1NZU19TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9zdGF0ZnMuaCBiL3Vzci9pbmNsdWRlL3N5cy9zdGF0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IzYjVlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3N0YXRmcy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvdmZzLmg+CmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvc3lzY2FsbC5oIGIvdXNyL2luY2x1ZGUvc3lzL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmUwMTQyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3N5c2NhbGwuaApAQCAtMCwwICsxLDEzIEBACisvKgorICogc3lzL3N5c2NhbGwuaAorICoKKyAqIEdlbmVyaWMgc3lzdGVtIGNhbGwgaW50ZXJmYWNlIG1hY3JvcworICovCisjaWZuZGVmIF9TWVNfU1lTQ0FMTF9ICisjZGVmaW5lIF9TWVNfU1lTQ0FMTF9ICisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworI2VuZGlmCQkJCS8qIF9TWVNfU1lTQ0FMTF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvc3lzaW5mby5oIGIvdXNyL2luY2x1ZGUvc3lzL3N5c2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE2OGRjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3N5c2luZm8uaApAQCAtMCwwICsxLDEyIEBACisvKgorICogc3lzL3N5c2luZm8uaAorICovCisKKyNpZm5kZWYgX1NZU19TWVNJTkZPX0gKKyNkZWZpbmUgX1NZU19TWVNJTkZPX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCitleHRlcm4gaW50IHN5c2luZm8oc3RydWN0IHN5c2luZm8gKmluZm8pOworCisjZW5kaWYJCQkJLyogX1NZU19TWVNJTkZPX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9zeXNtYWNyb3MuaCBiL3Vzci9pbmNsdWRlL3N5cy9zeXNtYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ0MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBzeXMvc3lzbWFjcm9zLmgKKyAqCisgKiBDb25zdHJ1Y3RzIHRvIGNyZWF0ZSBhbmQgcGljayBhcGFydCBkZXZfdC4gIFRoZSBkb3VibGUtdW5kZXJzY29yZQorICogdmVyc2lvbnMgYXJlIG1hY3JvcyBzbyB0aGV5IGNhbiBiZSB1c2VkIGFzIGNvbnN0YW50cy4KKyAqLworCisjaWZuZGVmIF9TWVNfU1lTTUFDUk9TX0gKKyNkZWZpbmUgX1NZU19TWVNNQUNST1NfSAorCisjaWZuZGVmIF9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9fbWFqb3IoX19kKSAoKChfX2QpID4+IDgpICYgMHhmZmYpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbWFqb3IoZGV2X3QgX19kKQoreworCXJldHVybiBfX21ham9yKF9fZCk7Cit9CisKKyNkZWZpbmUgX19taW5vcihfX2QpICgoKF9fZCkgJiAweGZmKXwoKChfX2QpID4+IDEyKSAmIDB4ZmZmMDApKQorc3RhdGljIF9faW5saW5lX18gaW50IG1pbm9yKGRldl90IF9fZCkKK3sKKwlyZXR1cm4gX19taW5vcihfX2QpOworfQorCisjZGVmaW5lIF9fbWFrZWRldihfX21hLCBfX21pKSBcCisJKCgoKF9fbWEpICYgMHhmZmYpIDw8IDgpfCgoX19taSkgJiAweGZmKXwoKChfX21pKSAmIDB4ZmZmMDApIDw8IDEyKSkKK3N0YXRpYyBfX2lubGluZV9fIGRldl90IG1ha2VkZXYoaW50IF9fbWEsIGludCBfX21pKQoreworCXJldHVybiBfX21ha2VkZXYoX19tYSwgX19taSk7Cit9CisKKyNlbmRpZgkJCQkvKiBfU1lTX1NZU01BQ1JPU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvdGltZS5oIGIvdXNyL2luY2x1ZGUvc3lzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTJmOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3RpbWUuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogc3lzL3RpbWUuaAorICovCisKKyNpZm5kZWYgX1NZU19USU1FX0gKKyNkZWZpbmUgX1NZU19USU1FX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworLyogVGhlIDIuNi4yMCBMaW51eCBoZWFkZXJzIGFsd2F5cyAjZGVmaW5lIEZEX1pFUk8gX19GRF9aRVJPLCBldGMsIGluCisgICA8bGludXgvdGltZS5oPiBidXQgbm90IGFsbCBhcmNoaXRlY3R1cmVzIGRlZmluZSB0aGUKKyAgIGRvdWJsZS11bmRlcnNjb3JlIG9uZXMsIGV4Y2VwdCBfX05GREJJVFMsIF9fRkRfU0VUU0laRSBhbmQKKyAgIF9fRkRTRVRfTE9OR1Mgd2hpY2ggYXJlIGRlZmluZWQgaW4gPGxpbnV4L3Bvc2l4X3R5cGVzLmg+LgorCisgICBVbmZvcnR1bmF0ZWx5LCBzb21lIGFyY2hpdGVjdHVyZXMgZGVmaW5lIHRoZSBkb3VibGUtdW5kZXJzY29yZSBvbmVzCisgICBhcyBpbmxpbmVzLCBzbyB3ZSBjYW4ndCB1c2UgYSBzaW1wbGUgI2lmZGVmIHRlc3QuICBUaHVzLCB0aGUgb25seQorICAgc2FmZSBvcHRpb24gcmVtYWluaW5nIGlzIHRvICN1bmRlZiB0aGUgdG9wLWxldmVsIG1hY3Jvcy4gKi8KKworI3VuZGVmIEZEX1pFUk8KKyN1bmRlZiBGRF9TRVQKKyN1bmRlZiBGRF9DTFIKKyN1bmRlZiBGRF9JU1NFVAorCitfX2V4dGVybiB2b2lkICptZW1zZXQodm9pZCAqLCBpbnQsIHNpemVfdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgRkRfWkVSTyhmZF9zZXQgKl9fZmRzZXRwKQoreworCW1lbXNldChfX2Zkc2V0cCwgMCwgc2l6ZW9mKGZkX3NldCkpOworfQorc3RhdGljIGlubGluZSB2b2lkIEZEX1NFVChpbnQgX19mZCwgZmRfc2V0ICpfX2Zkc2V0cCkKK3sKKwlfX2Zkc2V0cC0+ZmRzX2JpdHNbX19mZC9CSVRTX1BFUl9MT05HXSB8PQorCQkoMVVMIDw8IChfX2ZkICUgQklUU19QRVJfTE9ORykpOworfQorc3RhdGljIGlubGluZSB2b2lkIEZEX0NMUihpbnQgX19mZCwgZmRfc2V0ICpfX2Zkc2V0cCkKK3sKKwlfX2Zkc2V0cC0+ZmRzX2JpdHNbX19mZC9CSVRTX1BFUl9MT05HXSAmPQorCQl+KDFVTCA8PCAoX19mZCAlIEJJVFNfUEVSX0xPTkcpKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IEZEX0lTU0VUKGludCBfX2ZkLCBmZF9zZXQgKl9fZmRzZXRwKQoreworCXJldHVybiAoX19mZHNldHAtPmZkc19iaXRzW19fZmQvQklUU19QRVJfTE9OR10gPj4KKwkJKF9fZmQgJSBCSVRTX1BFUl9MT05HKSkgJiAxOworfQorCitfX2V4dGVybiBpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqKTsKK19fZXh0ZXJuIGludCBzZXR0aW1lb2ZkYXkoY29uc3Qgc3RydWN0IHRpbWV2YWwgKiwgY29uc3Qgc3RydWN0IHRpbWV6b25lICopOworX19leHRlcm4gaW50IGdldGl0aW1lcihpbnQsIHN0cnVjdCBpdGltZXJ2YWwgKik7CitfX2V4dGVybiBpbnQgc2V0aXRpbWVyKGludCwgY29uc3Qgc3RydWN0IGl0aW1lcnZhbCAqLCBzdHJ1Y3QgaXRpbWVydmFsICopOworX19leHRlcm4gaW50IHV0aW1lcyhjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCB0aW1ldmFsICopOworCisjZW5kaWYJCQkJLyogX1NZU19USU1FX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy90aW1lcy5oIGIvdXNyL2luY2x1ZGUvc3lzL3RpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiZTY5YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy90aW1lcy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBzeXMvdGltZXMuaAorICovCisKKyNpZm5kZWYgX1NZU19USU1FU19ICisjZGVmaW5lIF9TWVNfVElNRVNfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKworX19leHRlcm4gY2xvY2tfdCB0aW1lcyhzdHJ1Y3QgdG1zICopOworCisjZW5kaWYJCQkJLyogX1NZU19USU1FU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCBiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODBlZDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIHN5cy90eXBlcy5oCisgKi8KKworI2lmbmRlZiBfU1lTX1RZUEVTX0gKKyNkZWZpbmUgX1NZU19UWVBFU19ICisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIF9TU0laRV9UCit0eXBlZGVmIHB0cmRpZmZfdCBzc2l6ZV90OworCisjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworLyogS2VlcHMgbGludXgvdHlwZXMuaCBmcm9tIGdldHRpbmcgaW5jbHVkZWQgZWxzZXdoZXJlICovCisjZGVmaW5lIF9MSU5VWF9UWVBFU19ICisKK3R5cGVkZWYgX19rZXJuZWxfZmRfc2V0IGZkX3NldDsKK3R5cGVkZWYgdWludDMyX3QgZGV2X3Q7Cit0eXBlZGVmIF9fa2VybmVsX2lub190IGlub190OwordHlwZWRlZiBfX2tlcm5lbF9tb2RlX3QgbW9kZV90OwordHlwZWRlZiBfX2tlcm5lbF9ubGlua190IG5saW5rX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2xvZmZfdCBvZmZfdDsKK3R5cGVkZWYgX19rZXJuZWxfbG9mZl90IGxvZmZfdDsKK3R5cGVkZWYgX19rZXJuZWxfcGlkX3QgcGlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2RhZGRyX3QgZGFkZHJfdDsKK3R5cGVkZWYgX19rZXJuZWxfa2V5X3Qga2V5X3Q7Cit0eXBlZGVmIF9fa2VybmVsX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworLyogdHlwZWRlZiBfX2tlcm5lbF90aW1lcl90CXRpbWVyX3Q7ICovCit0eXBlZGVmIGludCB0aW1lcl90OworCit0eXBlZGVmIF9fa2VybmVsX3VpZDMyX3QgdWlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZDMyX3QgZ2lkX3Q7CisKK3R5cGVkZWYgX19rZXJuZWxfZnNpZF90IGZzaWRfdDsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIGFsc28gcHJvdGVjdGVkIGJ5IGluZGl2aWR1YWwgaWZkZWZzIGZvcgorICogaGlzdG9yaWNhbCByZWFzb25zOgorICovCisjaWZuZGVmIF9TSVpFX1QKKyNkZWZpbmUgX1NJWkVfVAordHlwZWRlZiBfX2tlcm5lbF9zaXplX3Qgc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1NTSVpFX1QKKyNkZWZpbmUgX1NTSVpFX1QKK3R5cGVkZWYgX19rZXJuZWxfc3NpemVfdCBzc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1BUUkRJRkZfVAorI2RlZmluZSBfUFRSRElGRl9UCit0eXBlZGVmIF9fa2VybmVsX3B0cmRpZmZfdCBwdHJkaWZmX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfVElNRV9UCisjZGVmaW5lIF9USU1FX1QKK3R5cGVkZWYgX19rZXJuZWxfdGltZV90IHRpbWVfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9DTE9DS19UCisjZGVmaW5lIF9DTE9DS19UCit0eXBlZGVmIF9fa2VybmVsX2Nsb2NrX3QgY2xvY2tfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9DQUREUl9UCisjZGVmaW5lIF9DQUREUl9UCit0eXBlZGVmIF9fa2VybmVsX2NhZGRyX3QgY2FkZHJfdDsKKyNlbmRpZgorCisvKiBCU0QgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1X2NoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVfc2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1X2xvbmc7CisKKy8qIFN5c1YgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1bmNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmc7CisKKy8qIE1vcmUgQlNEICovCit0eXBlZGVmIHVpbnQ4X3QgdV9pbnQ4X3Q7Cit0eXBlZGVmIHVpbnQxNl90IHVfaW50MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgdV9pbnQzMl90OwordHlwZWRlZiB1aW50NjRfdCB1X2ludDY0X3Q7CisKK3R5cGVkZWYgdWludDE2X3QgX19iaXR3aXNlIF9fbGUxNjsKK3R5cGVkZWYgdWludDE2X3QgX19iaXR3aXNlIF9fYmUxNjsKK3R5cGVkZWYgdWludDMyX3QgX19iaXR3aXNlIF9fbGUzMjsKK3R5cGVkZWYgdWludDMyX3QgX19iaXR3aXNlIF9fYmUzMjsKK3R5cGVkZWYgdWludDY0X3QgX19iaXR3aXNlIF9fbGU2NDsKK3R5cGVkZWYgdWludDY0X3QgX19iaXR3aXNlIF9fYmU2NDsKKwordHlwZWRlZiB1aW50MTZfdCBfX3N1bTE2OwordHlwZWRlZiB1aW50MzJfdCBfX3N1bTMyOwordHlwZWRlZiB1aW50NjRfdCBfX3N1bTY0OworCisvKgorICogU29tZSBoZWFkZXJzIHNlZW0gdG8gcmVxdWlyZSB0aGlzLi4uCisgKi8KKyNpZm5kZWYgQklUU19QRVJfTE9ORworIyBkZWZpbmUgQklUU19QRVJfTE9ORyBfQklUU0laRQorI2VuZGlmCisKKy8qCisgKiBTb21lIGFwcHMgd2FudCB0aGlzIGluIDxzeXMvdHlwZXMuaD4KKyAqLworI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvdWlvLmggYi91c3IvaW5jbHVkZS9zeXMvdWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzNDFmYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy91aW8uaApAQCAtMCwwICsxLDE1IEBACisvKgorICogc3lzL3Vpby5oCisgKi8KKworI2lmbmRlZiBfU1lTX1VJT19ICisjZGVmaW5lIF9TWVNfVUlPX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorCitfX2V4dGVybiBpbnQgcmVhZHYoaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgaW50KTsKK19fZXh0ZXJuIGludCB3cml0ZXYoaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgaW50KTsKKworI2VuZGlmCQkJCS8qIF9TWVNfVUlPX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy91bi5oIGIvdXNyL2luY2x1ZGUvc3lzL3VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyZDg3YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy91bi5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiA8c3lzL3VuLmg+CisgKi8KKworI2lmbmRlZiBfU1lTX1VOX0gKKyNkZWZpbmUgX1NZU19VTl9ICisKKyNpbmNsdWRlIDxsaW51eC91bi5oPgorCisjZW5kaWYJCQkJLyogX1NZU19VTl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvdXRpbWUuaCBiL3Vzci9pbmNsdWRlL3N5cy91dGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Mjg4YTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvdXRpbWUuaApAQCAtMCwwICsxLDEwIEBACisvKgorICogc3lzL3V0aW1lLmgKKyAqLworCisjaWZuZGVmIF9TWVNfVVRJTUVfSAorI2RlZmluZSBfU1lTX1VUSU1FX0gKKworI2luY2x1ZGUgPGxpbnV4L3V0aW1lLmg+CisKKyNlbmRpZgkJCQkvKiBfU1lTX1VUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy91dHNuYW1lLmggYi91c3IvaW5jbHVkZS9zeXMvdXRzbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTVjMGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvdXRzbmFtZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBzeXMvdXRzbmFtZS5oCisgKi8KKworI2lmbmRlZiBfU1lTX1VUU05BTUVfSAorI2RlZmluZSBfU1lTX1VUU05BTUVfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisKKyNkZWZpbmUgU1lTX05NTE4gNjUKKworc3RydWN0IHV0c25hbWUgeworCWNoYXIgc3lzbmFtZVtTWVNfTk1MTl07CisJY2hhciBub2RlbmFtZVtTWVNfTk1MTl07CisJY2hhciByZWxlYXNlW1NZU19OTUxOXTsKKwljaGFyIHZlcnNpb25bU1lTX05NTE5dOworCWNoYXIgbWFjaGluZVtTWVNfTk1MTl07CisJY2hhciBkb21haW5uYW1lW1NZU19OTUxOXTsKK307CisKK19fZXh0ZXJuIGludCB1bmFtZShzdHJ1Y3QgdXRzbmFtZSAqKTsKKworI2VuZGlmCQkJCS8qIF9TWVNfVVRTTkFNRV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvdmZzLmggYi91c3IvaW5jbHVkZS9zeXMvdmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiMWVhYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy92ZnMuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIHN5cy92ZnMuaAorICovCisKKyNpZm5kZWYgX1NZU19WRlNfSAorI2RlZmluZSBfU1lTX1ZGU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzaXplLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CisKKy8qIHN0cnVjdCBzdGF0ZnM2NCAtLSB0aGVyZSBzZWVtcyB0byBiZSB0d28gc3RhbmRhcmRzIC0KKyAgIG9uZSBmb3IgMzIgYW5kIG9uZSBmb3IgNjQgYml0cywgYW5kIHRoZXkncmUgaW5jb21wYXRpYmxlLgorICAgV29yc2UsIHNvbWUgNjQtYml0IHBsYXRmb3JtcyBzZWVtIHRvIHVzZSB0aGUgMzItYml0IGxheW91dC4KKyAgIE9mIGNvdXJzZSwgdGhlcmUgaXMgbm8gaW5jbHVkYWJsZSBoZWFkZXIgdGhhdCBkb2VzIHRoaXMgd2VsbC4gKi8KKworI2lmIF9LTElCQ19TVEFURlNfRl9UWVBFXzY0CisKK3N0cnVjdCBzdGF0ZnMgeworCXVpbnQ2NF90IGZfdHlwZTsKKwl1aW50NjRfdCBmX2JzaXplOworCXVpbnQ2NF90IGZfYmxvY2tzOworCXVpbnQ2NF90IGZfYmZyZWU7CisJdWludDY0X3QgZl9iYXZhaWw7CisJdWludDY0X3QgZl9maWxlczsKKwl1aW50NjRfdCBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJdWludDY0X3QgZl9uYW1lbGVuOworCXVpbnQ2NF90IGZfZnJzaXplOworCXVpbnQ2NF90IGZfc3BhcmVbNV07Cit9OworCisjZWxpZiBfS0xJQkNfU1RBVEZTX0ZfVFlQRV8zMkIKKworc3RydWN0IHN0YXRmcyB7CisJdWludDMyX3QgZl90eXBlOworCXVpbnQzMl90IGZfYnNpemU7CisJdWludDMyX3QgZl9mcnNpemU7CisJdWludDMyX3QgX19wYWQ7CisJdWludDY0X3QgZl9ibG9ja3M7CisJdWludDY0X3QgZl9iZnJlZTsKKwl1aW50NjRfdCBmX2ZpbGVzOworCXVpbnQ2NF90IGZfZmZyZWU7CisJdWludDY0X3QgZl9iYXZhaWw7CisJX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKKwl1aW50MzJfdCBmX25hbWVsZW47CisJdWludDMyX3QgZl9zcGFyZVs2XTsKK307CisKKyNlbHNlIC8qIG5vdCBfS0xJQkNfU1RBVEZTX0ZfVFlQRV82NCAqLworCitzdHJ1Y3Qgc3RhdGZzIHsKKwl1aW50MzJfdCBmX3R5cGU7CisJdWludDMyX3QgZl9ic2l6ZTsKKwl1aW50NjRfdCBmX2Jsb2NrczsKKwl1aW50NjRfdCBmX2JmcmVlOworCXVpbnQ2NF90IGZfYmF2YWlsOworCXVpbnQ2NF90IGZfZmlsZXM7CisJdWludDY0X3QgZl9mZnJlZTsKKwlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOworCXVpbnQzMl90IGZfbmFtZWxlbjsKKwl1aW50MzJfdCBmX2Zyc2l6ZTsKKwl1aW50MzJfdCBmX3NwYXJlWzVdOworfTsKKworI2VuZGlmIC8qIF9LTElCQ19TVEFURlNfRl9UWVBFXzY0ICovCisKK19fZXh0ZXJuIGludCBzdGF0ZnMoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdGZzICopOworX19leHRlcm4gaW50IGZzdGF0ZnMoaW50LCBzdHJ1Y3Qgc3RhdGZzICopOworCisvKiBWYXJpb3VzIGZpbGVzeXN0ZW0gdHlwZXMgKi8KKyNkZWZpbmUgQURGU19TVVBFUl9NQUdJQwkweGFkZjUKKyNkZWZpbmUgQUZGU19TVVBFUl9NQUdJQwkweGFkZmYKKyNkZWZpbmUgQUZTX0ZTX01BR0lDCQkweDZCNDE0NjUzCS8qICdrQUZTJyAqLworI2RlZmluZSBBVVRPRlNfU1VQRVJfTUFHSUMJMHgwMTg3CisjZGVmaW5lIEJGU19NQUdJQwkJMHgxQkFERkFDRQorI2RlZmluZSBDQVBJRlNfU1VQRVJfTUFHSUMJMHg0MzRlCisjZGVmaW5lIENJRlNfTUFHSUNfTlVNQkVSCTB4RkY1MzRENDIKKyNkZWZpbmUgQ09EQV9TVVBFUl9NQUdJQwkweDczNzU3MjQ1CisjZGVmaW5lIENSQU1GU19NQUdJQwkJMHgyOGNkM2Q0NQorI2RlZmluZSBERVZGU19TVVBFUl9NQUdJQwkweDEzNzMKKyNkZWZpbmUgREVWUFRTX1NVUEVSX01BR0lDCTB4MWNkMQorI2RlZmluZSBFRlNfU1VQRVJfTUFHSUMJCTB4NDE0QTUzCisjZGVmaW5lIEVWRU5UUE9MTEZTX01BR0lDCTB4MDMxMTE5NjUKKyNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQwkweEVGNTMKKyNkZWZpbmUgRVhUM19TVVBFUl9NQUdJQwkweEVGNTMKKyNkZWZpbmUgR0FER0VURlNfTUFHSUMJCTB4YWVlNzFlZTcKKyNkZWZpbmUgSEZTUExVU19TVVBFUl9NQUdJQwkweDQ4MmIKKyNkZWZpbmUgSEZTX01GU19TVVBFUl9NQUdJQwkweEQyRDcJLyogTUZTIE1EQiAoc3VwZXIgYmxvY2spICovCisjZGVmaW5lIEhGU19TVVBFUl9NQUdJQwkJMHg0MjQ0CS8qICJCRCI6IEhGUyBNREIgKHN1cGVyIGJsb2NrKSAqLworI2RlZmluZSBIUEZTX1NVUEVSX01BR0lDIDB4Zjk5NWU4NDkKKyNkZWZpbmUgSFVHRVRMQkZTX01BR0lDCQkweDk1ODQ1OGY2CisjZGVmaW5lIEhXR0ZTX01BR0lDCQkweDEyMDYxOTgzCisjZGVmaW5lIElCTUFTTUZTX01BR0lDCQkweDY2NzI2ZjY3CisjZGVmaW5lIElTT0ZTX1NVUEVSX01BR0lDCTB4OTY2MAorI2RlZmluZSBKRkZTMl9TVVBFUl9NQUdJQwkweDcyYjYKKyNkZWZpbmUgSkZGU19NQUdJQ19CSVRNQVNLCTB4MzQzODM5MzEJLyogIjE5ODQiICovCisjZGVmaW5lIEpGRlNfTUFHSUNfU0JfQklUTUFTSwkweDA3YzAJLyogMTk4NCAqLworI2RlZmluZSBKRlNfU1VQRVJfTUFHSUMJCTB4MzE1MzQ2NGEJLyogIkpGUzEiICovCisjZGVmaW5lIE1JTklYMl9TVVBFUl9NQUdJQwkweDI0NjgJLyogbWluaXggVjIgZnMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDMgkweDI0NzgJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCisjZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDMgkweDEzOEYJLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTVNET1NfU1VQRVJfTUFHSUMJMHg0ZDQ0CS8qIE1EICovCisjZGVmaW5lIE5DUF9TVVBFUl9NQUdJQwkJMHg1NjRjCisjZGVmaW5lIE5GU19TVVBFUl9NQUdJQwkJMHg2OTY5CisjZGVmaW5lIE5GU19TVVBFUl9NQUdJQwkJMHg2OTY5CisjZGVmaW5lIE9QRU5QUk9NX1NVUEVSX01BR0lDCTB4OWZhMQorI2RlZmluZSBPUFJPRklMRUZTX01BR0lDCTB4NmY3MDcyNmYKKyNkZWZpbmUgUEZNRlNfTUFHSUMJCTB4YTBiNGQ4ODkKKyNkZWZpbmUgUElQRUZTX01BR0lDCQkweDUwNDk1MDQ1CisjZGVmaW5lIFBST0NfU1VQRVJfTUFHSUMJMHg5ZmEwCisjZGVmaW5lIFFOWDRfU1VQRVJfTUFHSUMJMHgwMDJmCS8qIHFueDQgZnMgZGV0ZWN0aW9uICovCisjZGVmaW5lIFJBTUZTX01BR0lDCQkweDg1ODQ1OGY2CisjZGVmaW5lIFJFSVNFUkZTX1NVUEVSX01BR0lDCTB4NTI2NTQ5NzMKKyNkZWZpbmUgUk9NRlNfTUFHSUMJCTB4NzI3NQorI2RlZmluZSBTTUJfU1VQRVJfTUFHSUMJCTB4NTE3QgorI2RlZmluZSBTT0NLRlNfTUFHSUMJCTB4NTM0RjQzNEIKKyNkZWZpbmUgU1lTRlNfTUFHSUMJCTB4NjI2NTY1NzIKKyNkZWZpbmUgVE1QRlNfTUFHSUMJCTB4MDEwMjE5OTQKKyNkZWZpbmUgVURGX1NVUEVSX01BR0lDCQkweDE1MDEzMzQ2CisjZGVmaW5lIFVGU19NQUdJQwkJMHgwMDAxMTk1NAorI2RlZmluZSBVRlNfTUFHSUNfNEdCCQkweDA1MjMxOTk0CS8qIGZzID4gNCBHQiAmJiBmc19mZWF0dXJlYml0cyAqLworI2RlZmluZSBVRlNfTUFHSUNfRkVBCQkweDAwMTk1NjEyCS8qIGZzX2ZlYXR1cmViaXRzIHN1cHBvcnRlZCAqLworI2RlZmluZSBVRlNfTUFHSUNfTEZOCQkweDAwMDk1MDE0CS8qIGZzIHN1cHBvcnRzIGZpbGVuYW1lcyA+IDE0IGNoYXJzICovCisjZGVmaW5lIFVGU19NQUdJQ19TRUMJCTB4MDA2MTIxOTUJLyogQjEgc2VjdXJpdHkgZnMgKi8KKyNkZWZpbmUgVVNCREVWSUNFX1NVUEVSX01BR0lDCTB4OWZhMgorI2RlZmluZSBWWEZTX1NVUEVSX01BR0lDCTB4YTUwMUZDRjUKKworI2VuZGlmCQkJCS8qIF9TWVNfVkZTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy93YWl0LmggYi91c3IvaW5jbHVkZS9zeXMvd2FpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWVmYWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvd2FpdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBzeXMvd2FpdC5oCisgKi8KKworI2lmbmRlZiBfU1lTX1dBSVRfSAorI2RlZmluZSBfU1lTX1dBSVRfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNkZWZpbmUgV0VYSVRTVEFUVVMocykJKCgocykgJiAweGZmMDApID4+IDgpCisjZGVmaW5lIFdURVJNU0lHKHMpCSgocykgJiAweDdmKQorI2RlZmluZSBXSUZFWElURUQocykJKFdURVJNU0lHKHMpID09IDApCisjZGVmaW5lIFdJRlNUT1BQRUQocykJKFdURVJNU0lHKHMpID09IDB4N2YpCisvKiBVZ2x5IGhhY2sgdG8gYXZvaWQgbXVsdGlwbGUgZXZhbHVhdGlvbiBvZiAicyIgKi8KKyNkZWZpbmUgV0lGU0lHTkFMRUQocykJKFdURVJNU0lHKChzKSsxKSA+PSAyKQorI2RlZmluZSBXQ09SRURVTVAocykJKChzKSAmIDB4ODApCisjZGVmaW5lIFdTVE9QU0lHKHMpCVdFWElUU1RBVFVTKHMpCisKK19fZXh0ZXJuIHBpZF90IHdhaXQoaW50ICopOworX19leHRlcm4gcGlkX3Qgd2FpdHBpZChwaWRfdCwgaW50ICosIGludCk7CitfX2V4dGVybiBwaWRfdCB3YWl0MyhpbnQgKiwgaW50LCBzdHJ1Y3QgcnVzYWdlICopOworX19leHRlcm4gcGlkX3Qgd2FpdDQocGlkX3QsIGludCAqLCBpbnQsIHN0cnVjdCBydXNhZ2UgKik7CisKKyNlbmRpZgkJCQkvKiBfU1lTX1dBSVRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzZXhpdHMuaCBiL3Vzci9pbmNsdWRlL3N5c2V4aXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0NTRiOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5c2V4aXRzLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZglfU1lTRVhJVFNfSAorI2RlZmluZQlfU1lTRVhJVFNfSAorCisjZGVmaW5lIEVYX09LCQkwCS8qIHN1Y2Nlc3NmdWwgdGVybWluYXRpb24gKi8KKworI2RlZmluZSBFWF9fQkFTRQk2NAkvKiBiYXNlIHZhbHVlIGZvciBlcnJvciBtZXNzYWdlcyAqLworCisjZGVmaW5lIEVYX1VTQUdFCTY0CS8qIGNvbW1hbmQgbGluZSB1c2FnZSBlcnJvciAqLworI2RlZmluZSBFWF9EQVRBRVJSCTY1CS8qIGRhdGEgZm9ybWF0IGVycm9yICovCisjZGVmaW5lIEVYX05PSU5QVVQJNjYJLyogY2Fubm90IG9wZW4gaW5wdXQgKi8KKyNkZWZpbmUgRVhfTk9VU0VSCTY3CS8qIGFkZHJlc3NlZSB1bmtub3duICovCisjZGVmaW5lIEVYX05PSE9TVAk2OAkvKiBob3N0IG5hbWUgdW5rbm93biAqLworI2RlZmluZSBFWF9VTkFWQUlMQUJMRQk2OQkvKiBzZXJ2aWNlIHVuYXZhaWxhYmxlICovCisjZGVmaW5lIEVYX1NPRlRXQVJFCTcwCS8qIGludGVybmFsIHNvZnR3YXJlIGVycm9yICovCisjZGVmaW5lIEVYX09TRVJSCTcxCS8qIHN5c3RlbSBlcnJvciAoZS5nLiwgY2FuJ3QgZm9yaykgKi8KKyNkZWZpbmUgRVhfT1NGSUxFCTcyCS8qIGNyaXRpY2FsIE9TIGZpbGUgbWlzc2luZyAqLworI2RlZmluZSBFWF9DQU5UQ1JFQVQJNzMJLyogY2FuJ3QgY3JlYXRlICh1c2VyKSBvdXRwdXQgZmlsZSAqLworI2RlZmluZSBFWF9JT0VSUgk3NAkvKiBpbnB1dC9vdXRwdXQgZXJyb3IgKi8KKyNkZWZpbmUgRVhfVEVNUEZBSUwJNzUJLyogdGVtcCBmYWlsdXJlOyB1c2VyIGlzIGludml0ZWQgdG8gcmV0cnkgKi8KKyNkZWZpbmUgRVhfUFJPVE9DT0wJNzYJLyogcmVtb3RlIGVycm9yIGluIHByb3RvY29sICovCisjZGVmaW5lIEVYX05PUEVSTQk3NwkvKiBwZXJtaXNzaW9uIGRlbmllZCAqLworI2RlZmluZSBFWF9DT05GSUcJNzgJLyogY29uZmlndXJhdGlvbiBlcnJvciAqLworCisjZGVmaW5lIEVYX19NQVgJNzgJLyogbWF4aW11bSBsaXN0ZWQgdmFsdWUgKi8KKworI2VuZGlmIC8qIF9TWVNFWElUU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXNsb2cuaCBiL3Vzci9pbmNsdWRlL3N5c2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTE3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXNsb2cuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogc3lzbG9nLmgKKyAqLworCisjaWZuZGVmIF9TWVNMT0dfSAorI2RlZmluZSBfU1lTTE9HX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisKKy8qIEFsZXJ0IGxldmVscyAqLworI2RlZmluZSBMT0dfRU1FUkcJMAorI2RlZmluZSBMT0dfQUxFUlQJMQorI2RlZmluZSBMT0dfQ1JJVAkyCisjZGVmaW5lIExPR19FUlIJCTMKKyNkZWZpbmUgTE9HX1dBUk5JTkcJNAorI2RlZmluZSBMT0dfTk9USUNFCTUKKyNkZWZpbmUgTE9HX0lORk8JNgorI2RlZmluZSBMT0dfREVCVUcJNworCisjZGVmaW5lIExPR19QUklNQVNLCTcKKyNkZWZpbmUgTE9HX1BSSSh4KQkoKHgpICYgTE9HX1BSSU1BU0spCisKKy8qIEZhY2lsaXRpZXM7IG5vdCBhY3R1YWxseSB1c2VkICovCisjZGVmaW5lIExPR19LRVJOCTAwMDAKKyNkZWZpbmUgTE9HX1VTRVIJMDAxMAorI2RlZmluZSBMT0dfTUFJTAkwMDIwCisjZGVmaW5lIExPR19EQUVNT04JMDAzMAorI2RlZmluZSBMT0dfQVVUSAkwMDQwCisjZGVmaW5lIExPR19TWVNMT0cJMDA1MAorI2RlZmluZSBMT0dfTFBSCQkwMDYwCisjZGVmaW5lIExPR19ORVdTCTAwNzAKKyNkZWZpbmUgTE9HX1VVQ1AJMDEwMAorI2RlZmluZSBMT0dfQ1JPTgkwMTEwCisjZGVmaW5lIExPR19BVVRIUFJJVgkwMTIwCisjZGVmaW5lIExPR19GVFAJCTAxMzAKKyNkZWZpbmUgTE9HX0xPQ0FMMAkwMjAwCisjZGVmaW5lIExPR19MT0NBTDEJMDIxMAorI2RlZmluZSBMT0dfTE9DQUwyCTAyMjAKKyNkZWZpbmUgTE9HX0xPQ0FMMwkwMjMwCisjZGVmaW5lIExPR19MT0NBTDQJMDI0MAorI2RlZmluZSBMT0dfTE9DQUw1CTAyNTAKKyNkZWZpbmUgTE9HX0xPQ0FMNgkwMjYwCisjZGVmaW5lIExPR19MT0NBTDcJMDI3MAorCisjZGVmaW5lIExPR19GQUNNQVNLCTAxNzcwCisjZGVmaW5lIExPR19GQUMoeCkJKCgoeCkgPj4gMykgJiAoTE9HX0ZBQ01BU0sgPj4gMykpCisKKy8qIG9wZW5sb2coKSBmbGFnczsgb25seSBMT0dfUElEIGFuZCBMT0dfUEVSUk9SIHN1cHBvcnRlZCAqLworI2RlZmluZSAgICAgICAgTE9HX1BJRCAgICAgICAgIDB4MDEJLyogaW5jbHVkZSBwaWQgd2l0aCBtZXNzYWdlICovCisjZGVmaW5lICAgICAgICBMT0dfQ09OUyAgICAgICAgMHgwMgkvKiB3cml0ZSB0byBjb25zb2xlIG9uIGxvZ2dlciBlcnJvciAqLworI2RlZmluZSAgICAgICAgTE9HX09ERUxBWSAgICAgIDB4MDQJLyogZGVsYXkgY29ubmVjdGlvbiB1bnRpbCBzeXNsb2coKSAqLworI2RlZmluZSAgICAgICAgTE9HX05ERUxBWSAgICAgIDB4MDgJLyogb3BlbiBjb25uZWN0aW9uIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lICAgICAgICBMT0dfTk9XQUlUICAgICAgMHgxMAkvKiB3YWl0IGZvciBjaGlsZCBwcm9jZXNzZXMgKHVudXNlZCBvbiBsaW51eCkgKi8KKyNkZWZpbmUgICAgICAgIExPR19QRVJST1IgICAgICAweDIwCS8qIGFkZGl0aW9uYWwgbG9nZ2luZyB0byBzdGRlcnIgKi8KKworX19leHRlcm4gdm9pZCBvcGVubG9nKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworX19leHRlcm4gdm9pZCBzeXNsb2coaW50LCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiB2b2lkIHZzeXNsb2coaW50LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworX19leHRlcm4gdm9pZCBjbG9zZWxvZyh2b2lkKTsKKworI2VuZGlmCQkJCS8qIF9TWVNMT0dfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvdGVybWlvcy5oIGIvdXNyL2luY2x1ZGUvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDk4NTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS90ZXJtaW9zLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIHRlcm1pb3MuaAorICovCisKKyNpZm5kZWYgX1RFUk1JT1NfSAorI2RlZmluZSBfVEVSTUlPU19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisKKy8qIFJlZGVmaW5lIHRoZXNlIHNvIHRoZSBtYWdpYyBjb25zdGFudHMgPT0gdGhlIGlvY3RsIG51bWJlciB0byB1c2UuICovCisjdW5kZWYgVENTQU5PVworI3VuZGVmIFRDU0FEUkFJTgorI3VuZGVmIFRDU0FGTFVTSAorI2RlZmluZSBUQ1NBTk9XCSAgIFRDU0VUUworI2RlZmluZSBUQ1NBRFJBSU4gIFRDU0VUU1cKKyNkZWZpbmUgVENTQUZMVVNIICBUQ1NFVFNGCisKK3N0YXRpYyBfX2lubGluZV9fIGludCB0Y2dldGF0dHIoaW50IF9fZmQsIHN0cnVjdCB0ZXJtaW9zICpfX3MpCit7CisJcmV0dXJuIGlvY3RsKF9fZmQsIFRDR0VUUywgX19zKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHRjc2V0YXR0cihpbnQgX19mZCwgaW50IF9fb3B0LCBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqX19zKQoreworCXJldHVybiBpb2N0bChfX2ZkLCBfX29wdCwgKHZvaWQgKilfX3MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNmbG93KGludCBfX2ZkLCBpbnQgX19hY3Rpb24pCit7CisJcmV0dXJuIGlvY3RsKF9fZmQsIFRDWE9OQywgKHZvaWQgKikoaW50cHRyX3QpIF9fYWN0aW9uKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHRjZmx1c2goaW50IF9fZmQsIGludCBfX3F1ZXVlKQoreworCXJldHVybiBpb2N0bChfX2ZkLCBUQ0ZMU0gsICh2b2lkICopKGludHB0cl90KSBfX3F1ZXVlKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHRjZHJhaW4oaW50IF9fZmQpCit7CisJcmV0dXJuIGlvY3RsKF9fZmQsIFRDU0JSSywgKHZvaWQgKikxTCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHBpZF90IHRjZ2V0cGdycChpbnQgX19mZCkKK3sKKwlwaWRfdCBfX3A7CisJcmV0dXJuIGlvY3RsKF9fZmQsIFRJT0NHUEdSUCwgJl9fcCkgPyAocGlkX3QpIC0gMSA6IF9fcDsKK30KKworc3RhdGljIF9faW5saW5lX18gcGlkX3QgdGNnZXRzaWQoaW50IF9fZmQpCit7CisJcGlkX3QgX19wOworCXJldHVybiBpb2N0bChfX2ZkLCBUSU9DR1NJRCwgJl9fcCkgPyAocGlkX3QpIC0gMSA6IF9fcDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHRjc2VuZGJyZWFrKGludCBfX2ZkLCBpbnQgX19kdXJhdGlvbikKK3sKKwlyZXR1cm4gaW9jdGwoX19mZCwgVENTQlJLUCwgKHZvaWQgKikodWludHB0cl90KSBfX2R1cmF0aW9uKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHRjc2V0cGdycChpbnQgX19mZCwgcGlkX3QgX19wKQoreworCXJldHVybiBpb2N0bChfX2ZkLCBUSU9DU1BHUlAsICZfX3ApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzcGVlZF90IGNmZ2V0b3NwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3MpCit7CisJcmV0dXJuIChzcGVlZF90KSAoX19zLT5jX2NmbGFnICYgQ0JBVUQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzcGVlZF90IGNmZ2V0aXNwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3MpCit7CisJcmV0dXJuIChzcGVlZF90KSAoX19zLT5jX2NmbGFnICYgQ0JBVUQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2ZzZXRvc3BlZWQoc3RydWN0IHRlcm1pb3MgKl9fcywgc3BlZWRfdCBfX3YpCit7CisJX19zLT5jX2NmbGFnID0gKF9fcy0+Y19jZmxhZyAmIH5DQkFVRCkgfCAoX192ICYgQ0JBVUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2ZzZXRpc3BlZWQoc3RydWN0IHRlcm1pb3MgKl9fcywgc3BlZWRfdCBfX3YpCit7CisJX19zLT5jX2NmbGFnID0gKF9fcy0+Y19jZmxhZyAmIH5DQkFVRCkgfCAoX192ICYgQ0JBVUQpOworCXJldHVybiAwOworfQorCisjZW5kaWYJCQkJLyogX1RFUk1JT1NfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvdGltZS5oIGIvdXNyL2luY2x1ZGUvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjI5OTMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS90aW1lLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHRpbWUuaAorICovCisKKyNpZm5kZWYgX1RJTUVfSAorI2RlZmluZSBfVElNRV9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitfX2V4dGVybiB0aW1lX3QgdGltZSh0aW1lX3QgKik7CitfX2V4dGVybiBpbnQgbmFub3NsZWVwKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLCBzdHJ1Y3QgdGltZXNwZWMgKik7CisKKy8qIGtsaWJjLXNwZWNpZmljIGJ1dCB1c2VmdWwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBmbG9hdGluZyBwb2ludCAqLworX19leHRlcm4gY2hhciAqc3RydG90aW1ldmFsKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHRpbWV2YWwgKnR2KTsKK19fZXh0ZXJuIGNoYXIgKnN0cnRvdGltZXNwZWMoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgdGltZXNwZWMgKnR2KTsKKworI2VuZGlmCQkJCS8qIF9USU1FX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3VuaXN0ZC5oIGIvdXNyL2luY2x1ZGUvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmYmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3VuaXN0ZC5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogdW5pc3RkLmgKKyAqLworCisjaWZuZGVmIF9VTklTVERfSAorI2RlZmluZSBfVU5JU1REX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCitfX2V4dGVybiBjaGFyICoqZW52aXJvbjsKK19fZXh0ZXJuIF9fbm9yZXR1cm4gX2V4aXQoaW50KTsKKworX19leHRlcm4gcGlkX3QgZm9yayh2b2lkKTsKK19fZXh0ZXJuIHBpZF90IHZmb3JrKHZvaWQpOworX19leHRlcm4gcGlkX3QgZ2V0cGlkKHZvaWQpOworX19leHRlcm4gcGlkX3QgZ2V0cGdpZChwaWRfdCk7CitfX2V4dGVybiBpbnQgc2V0cGdpZChwaWRfdCwgcGlkX3QpOworX19leHRlcm4gcGlkX3QgZ2V0cHBpZCh2b2lkKTsKK19fZXh0ZXJuIHBpZF90IGdldHBncnAodm9pZCk7CitfX2V4dGVybiBpbnQgc2V0cGdycCh2b2lkKTsKK19fZXh0ZXJuIHBpZF90IHNldHNpZCh2b2lkKTsKK19fZXh0ZXJuIHBpZF90IGdldHNpZChwaWRfdCk7CitfX2V4dGVybiBpbnQgZXhlY3YoY29uc3QgY2hhciAqLCBjaGFyICpjb25zdCAqKTsKK19fZXh0ZXJuIGludCBleGVjdnAoY29uc3QgY2hhciAqLCBjaGFyICpjb25zdCAqKTsKK19fZXh0ZXJuIGludCBleGVjdmUoY29uc3QgY2hhciAqLCBjaGFyICpjb25zdCAqLCBjaGFyICpjb25zdCAqKTsKK19fZXh0ZXJuIGludCBleGVjdnBlKGNvbnN0IGNoYXIgKiwgY2hhciAqY29uc3QgKiwgY2hhciAqY29uc3QgKik7CitfX2V4dGVybiBpbnQgZXhlY2woY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgZXhlY2xwKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IGV4ZWNsZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK19fZXh0ZXJuIGludCBleGVjbHBlKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworCitfX2V4dGVybiBpbnQgc2V0dWlkKHVpZF90KTsKK19fZXh0ZXJuIHVpZF90IGdldHVpZCh2b2lkKTsKK19fZXh0ZXJuIGludCBzZXRldWlkKHVpZF90KTsKK19fZXh0ZXJuIHVpZF90IGdldGV1aWQodm9pZCk7CitfX2V4dGVybiBpbnQgc2V0Z2lkKGdpZF90KTsKK19fZXh0ZXJuIGdpZF90IGdldGdpZCh2b2lkKTsKK19fZXh0ZXJuIGludCBzZXRlZ2lkKGdpZF90KTsKK19fZXh0ZXJuIGdpZF90IGdldGVnaWQodm9pZCk7CitfX2V4dGVybiBpbnQgZ2V0Z3JvdXBzKGludCwgZ2lkX3QgKik7CitfX2V4dGVybiBpbnQgc2V0Z3JvdXBzKHNpemVfdCwgY29uc3QgZ2lkX3QgKik7CitfX2V4dGVybiBpbnQgc2V0cmV1aWQodWlkX3QsIHVpZF90KTsKK19fZXh0ZXJuIGludCBzZXRyZWdpZChnaWRfdCwgZ2lkX3QpOworX19leHRlcm4gaW50IHNldHJlc3VpZCh1aWRfdCwgdWlkX3QsIHVpZF90KTsKK19fZXh0ZXJuIGludCBzZXRyZXNnaWQoZ2lkX3QsIGdpZF90LCBnaWRfdCk7CitfX2V4dGVybiBpbnQgZ2V0ZnN1aWQodWlkX3QpOworX19leHRlcm4gaW50IHNldGZzdWlkKHVpZF90KTsKKworLyogTWFjcm9zIGZvciBhY2Nlc3MoKSAqLworI2RlZmluZSBSX09LCTQJCS8qIFJlYWQgKi8KKyNkZWZpbmUgV19PSwkyCQkvKiBXcml0ZSAqLworI2RlZmluZSBYX09LCTEJCS8qIEV4ZWN1dGUgKi8KKyNkZWZpbmUgRl9PSwkwCQkvKiBFeGlzdGVuY2UgKi8KKworX19leHRlcm4gaW50IGFjY2Vzcyhjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBpbnQgZmFjY2Vzc2F0KGludCwgY29uc3QgY2hhciAqLCBpbnQpOworX19leHRlcm4gaW50IGxpbmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IGxpbmthdChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IHVubGluayhjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IHVubGlua2F0KGludCwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBjaGRpcihjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IGZjaGRpcihpbnQpOworX19leHRlcm4gaW50IGNobW9kKGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKK19fZXh0ZXJuIGludCBmY2htb2QoaW50LCBtb2RlX3QpOworX19leHRlcm4gaW50IGZjaG1vZGF0KGludCwgY29uc3QgY2hhciAqLCBtb2RlX3QpOworX19leHRlcm4gaW50IG1rZGlyKGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKK19fZXh0ZXJuIGludCBta2RpcmF0KGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIG1vZGVfdCk7CitfX2V4dGVybiBpbnQgcm1kaXIoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBwaXBlKGludCAqKTsKK19fZXh0ZXJuIGludCBjaHJvb3QoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBzeW1saW5rKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBzeW1saW5rYXQoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgcmVhZGxpbmsoY29uc3QgY2hhciAqLCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgcmVhZGxpbmthdChpbnQsIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gaW50IGNob3duKGNvbnN0IGNoYXIgKiwgdWlkX3QsIGdpZF90KTsKK19fZXh0ZXJuIGludCBmY2hvd24oaW50LCB1aWRfdCwgZ2lkX3QpOworX19leHRlcm4gaW50IGxjaG93bihjb25zdCBjaGFyICosIHVpZF90LCBnaWRfdCk7CitfX2V4dGVybiBjaGFyICpnZXRjd2QoY2hhciAqLCBzaXplX3QpOworCisvKiBBbHNvIGluIDxmY250bC5oPiAqLworI2lmbmRlZiBfS0xJQkNfSU5fT1BFTl9DCitfX2V4dGVybiBpbnQgb3Blbihjb25zdCBjaGFyICosIGludCwgLi4uKTsKK19fZXh0ZXJuIGludCBvcGVuYXQoaW50LCBjb25zdCBjaGFyICosIGludCwgLi4uKTsKKyNlbmRpZgorX19leHRlcm4gaW50IGNyZWF0KGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKK19fZXh0ZXJuIGludCBvcGVuX2Nsb2V4ZWMoY29uc3QgY2hhciAqLCBpbnQsIG1vZGVfdCk7CitfX2V4dGVybiBpbnQgY2xvc2UoaW50KTsKK19fZXh0ZXJuIG9mZl90IGxzZWVrKGludCwgb2ZmX3QsIGludCk7CisvKiBvZmZfdCBpcyA2NCBiaXRzIG5vdyBldmVuIG9uIDMyLWJpdCBwbGF0Zm9ybXM7IHNlZSBsbHNlZWsuYyAqLworc3RhdGljIF9faW5saW5lX18gb2ZmX3QgbGxzZWVrKGludCBfX2YsIG9mZl90IF9fbywgaW50IF9fdykKK3sKKwlyZXR1cm4gbHNlZWsoX19mLCBfX28sIF9fdyk7Cit9CisKK19fZXh0ZXJuIHNzaXplX3QgcmVhZChpbnQsIHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHNzaXplX3Qgd3JpdGUoaW50LCBjb25zdCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiBzc2l6ZV90IHByZWFkKGludCwgdm9pZCAqLCBzaXplX3QsIG9mZl90KTsKK19fZXh0ZXJuIHNzaXplX3QgcHdyaXRlKGludCwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIG9mZl90KTsKKworX19leHRlcm4gaW50IGR1cChpbnQpOworX19leHRlcm4gaW50IGR1cDIoaW50LCBpbnQpOworX19leHRlcm4gaW50IGZjbnRsKGludCwgaW50LCAuLi4pOworX19leHRlcm4gaW50IGlvY3RsKGludCwgaW50LCB2b2lkICopOworX19leHRlcm4gaW50IGZsb2NrKGludCwgaW50KTsKK19fZXh0ZXJuIGludCBmdHJ1bmNhdGUoaW50LCBvZmZfdCk7CisKKy8qCisgKiBNYWNyb3MgZm9yIHN5bmNfZmlsZV9yYW5nZSgpCisgKi8KKyNkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQkVGT1JFICAgICAxCisjZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XUklURSAgICAgICAgICAgMgorI2RlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9BRlRFUiAgICAgIDQKKworX19leHRlcm4gaW50IHN5bmModm9pZCk7CitfX2V4dGVybiBpbnQgZnN5bmMoaW50KTsKK19fZXh0ZXJuIGludCBmZGF0YXN5bmMoaW50KTsKK19fZXh0ZXJuIGludCBzeW5jX2ZpbGVfcmFuZ2UoaW50LCBvZmZfdCwgb2ZmX3QsIHVuc2lnbmVkIGludCk7CisKK19fZXh0ZXJuIGludCBwYXVzZSh2b2lkKTsKK19fZXh0ZXJuIHVuc2lnbmVkIGludCBhbGFybSh1bnNpZ25lZCBpbnQpOworX19leHRlcm4gdW5zaWduZWQgaW50IHNsZWVwKHVuc2lnbmVkIGludCk7CitfX2V4dGVybiB2b2lkIHVzbGVlcCh1bnNpZ25lZCBsb25nKTsKKworX19leHRlcm4gaW50IGdldGhvc3RuYW1lKGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGludCBzZXRob3N0bmFtZShjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgZ2V0ZG9tYWlubmFtZShjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgc2V0ZG9tYWlubmFtZShjb25zdCBjaGFyICosIHNpemVfdCk7CisKK19fZXh0ZXJuIHZvaWQgKl9fYnJrKHZvaWQgKik7CitfX2V4dGVybiBpbnQgYnJrKHZvaWQgKik7CitfX2V4dGVybiB2b2lkICpzYnJrKHB0cmRpZmZfdCk7CisKK19fZXh0ZXJuIGludCBnZXRvcHQoaW50LCBjaGFyICpjb25zdCAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqb3B0YXJnOworX19leHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CisKK19fZXh0ZXJuIGludCBpc2F0dHkoaW50KTsKKworc3RhdGljIF9faW5saW5lX18gaW50IGdldHBhZ2VzaXplKHZvaWQpCit7CisJZXh0ZXJuIHVuc2lnbmVkIGludCBfX3BhZ2Vfc2l6ZTsKKwlyZXR1cm4gX19wYWdlX3NpemU7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19nZXRwYWdlc2hpZnQodm9pZCkKK3sKKwlleHRlcm4gdW5zaWduZWQgaW50IF9fcGFnZV9zaGlmdDsKKwlyZXR1cm4gX19wYWdlX3NoaWZ0OworfQorCitfX2V4dGVybiBpbnQgZGFlbW9uKGludCwgaW50KTsKKworLyogU3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9yIG51bWJlcnMuICovCisjZGVmaW5lIFNURElOX0ZJTEVOTwkwCisjZGVmaW5lIFNURE9VVF9GSUxFTk8JMQorI2RlZmluZSBTVERFUlJfRklMRU5PCTIKKworI2VuZGlmCQkJCS8qIF9VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvdXRpbWUuaCBiL3Vzci9pbmNsdWRlL3V0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMDYwNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3V0aW1lLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIHV0aW1lLmgKKyAqLworCisjaWZuZGVmIF9VVElNRV9ICisjZGVmaW5lIF9VVElNRV9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91dGltZS5oPgorCitfX2V4dGVybiBpbnQgdXRpbWUoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgdXRpbWJ1ZiAqKTsKKworI2VuZGlmCQkJCS8qIF9VVElNRV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS96Y29uZi5oIGIvdXNyL2luY2x1ZGUvemNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUzMjRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvemNvbmYuaApAQCAtMCwwICsxLDMzMiBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQ6IHpjb25mLmgsdiAxLjEgMjAwNS8wMi8yNyAyMzoxNTozOSBocGEgRXhwICQgKi8KKworI2lmbmRlZiBaQ09ORl9ICisjZGVmaW5lIFpDT05GX0gKKworLyoKKyAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgorICovCisjaWZkZWYgWl9QUkVGSVgKKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXworIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKKyMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjaworIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCisjICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcworIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGRlZmluZSB6RXJyb3IgICAgICAgICAgICAgICAgel96RXJyb3IKKworIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpZiAwICAgICAgICAgICAvKiBIQVZFX1VOSVNURF9IIC0tIHRoaXMgbGluZSBpcyB1cGRhdGVkIGJ5IC4vY29uZmlndXJlICovCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KKyMgIGlmZGVmIFZNUworIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjICBkZWZpbmUgel9vZmZfdCBvZmZfdAorI2VuZGlmCisjaWZuZGVmIFNFRUtfU0VUCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyMgIGlmZGVmIEZBUgorIyAgICB1bmRlZiBGQVIKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS96bGliLmggYi91c3IvaW5jbHVkZS96bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyODE3OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3psaWIuaApAQCAtMCwwICsxLDEzNTcgQEAKKy8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQorICB2ZXJzaW9uIDEuMi4zLCBKdWx5IDE4dGgsIDIwMDUKKworICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKKyAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcyAoUmVxdWVzdCBmb3IKKyAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQKKyAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4KKyovCisKKyNpZm5kZWYgWkxJQl9ICisjZGVmaW5lIFpMSUJfSAorCisjaW5jbHVkZSAiemNvbmYuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjMiCisjZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTIzMAorCisvKgorICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAorICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZAorICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAorICAoZGVmbGF0aW9uKSBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUKKyAgc3RyZWFtIGludGVyZmFjZS4KKworICAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZQorICBlbm91Z2ggKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksIG9yIGNhbiBiZSBkb25lIGJ5CisgIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyAgKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KKworICAgICBUaGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGluLW1lbW9yeSBmdW5jdGlvbnMgaXMKKyAgdGhlIHpsaWIgZm9ybWF0LCB3aGljaCBpcyBhIHpsaWIgd3JhcHBlciBkb2N1bWVudGVkIGluIFJGQyAxOTUwLCB3cmFwcGVkCisgIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLCB3aGljaCBpcyBpdHNlbGYgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MS4KKworICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKKyAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAorICB3aXRoICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhCisgIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KKworICAgICBUaGlzIGxpYnJhcnkgY2FuIG9wdGlvbmFsbHkgcmVhZCBhbmQgd3JpdGUgZ3ppcCBzdHJlYW1zIGluIG1lbW9yeSBhcyB3ZWxsLgorCisgICAgIFRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gYmUgY29tcGFjdCBhbmQgZmFzdCBmb3IgdXNlIGluIG1lbW9yeQorICBhbmQgb24gY29tbXVuaWNhdGlvbnMgY2hhbm5lbHMuICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIGZvciBzaW5nbGUtCisgIGZpbGUgY29tcHJlc3Npb24gb24gZmlsZSBzeXN0ZW1zLCBoYXMgYSBsYXJnZXIgaGVhZGVyIHRoYW4gemxpYiB0byBtYWludGFpbgorICBkaXJlY3RvcnkgaW5mb3JtYXRpb24sIGFuZCB1c2VzIGEgZGlmZmVyZW50LCBzbG93ZXIgY2hlY2sgbWV0aG9kIHRoYW4gemxpYi4KKworICAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKKyAgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKyovCisKK3R5cGVkZWYgdm9pZHBmICgqYWxsb2NfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwordHlwZWRlZiB2b2lkICAgKCpmcmVlX2Z1bmMpICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIGFkZHJlc3MpKTsKKworc3RydWN0IGludGVybmFsX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKKyAgICBCeXRlZiAgICAqbmV4dF9pbjsgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLworICAgIHVJbnQgICAgIGF2YWlsX2luOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCisgICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLworCisgICAgQnl0ZWYgICAgKm5leHRfb3V0OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KKyAgICB1SW50ICAgICBhdmFpbF9vdXQ7IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICovCisgICAgdUxvbmcgICAgdG90YWxfb3V0OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCisKKyAgICBjaGFyICAgICAqbXNnOyAgICAgIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLworICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKnN0YXRlOyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KKworICAgIGFsbG9jX2Z1bmMgemFsbG9jOyAgLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICBmcmVlX2Z1bmMgIHpmcmVlOyAgIC8qIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB2b2lkcGYgICAgIG9wYXF1ZTsgIC8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKi8KKworICAgIGludCAgICAgZGF0YV90eXBlOyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqLworICAgIHVMb25nICAgYWRsZXI7ICAgICAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICB1TG9uZyAgIHJlc2VydmVkOyAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHpfc3RyZWFtOworCit0eXBlZGVmIHpfc3RyZWFtIEZBUiAqel9zdHJlYW1wOworCisvKgorICAgICBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gYW5kIGZyb20gemxpYiByb3V0aW5lcy4gIFNlZSBSRkMgMTk1MgorICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBtZWFuaW5ncyBvZiB0aGVzZSBmaWVsZHMuCisqLwordHlwZWRlZiBzdHJ1Y3QgZ3pfaGVhZGVyX3MgeworICAgIGludCAgICAgdGV4dDsgICAgICAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqLworICAgIHVMb25nICAgdGltZTsgICAgICAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKyAgICBpbnQgICAgIHhmbGFnczsgICAgIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCisgICAgaW50ICAgICBvczsgICAgICAgICAvKiBvcGVyYXRpbmcgc3lzdGVtICovCisgICAgQnl0ZWYgICAqZXh0cmE7ICAgICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovCisgICAgdUludCAgICBleHRyYV9sZW47ICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi8KKyAgICB1SW50ICAgIGV4dHJhX21heDsgIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgQnl0ZWYgICAqbmFtZTsgICAgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovCisgICAgdUludCAgICBuYW1lX21heDsgICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgQnl0ZWYgICAqY29tbWVudDsgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqLworICAgIHVJbnQgICAgY29tbV9tYXg7ICAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworICAgIGludCAgICAgaGNyYzsgICAgICAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi8KKyAgICBpbnQgICAgIGRvbmU7ICAgICAgIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCit9IGd6X2hlYWRlcjsKKwordHlwZWRlZiBnel9oZWFkZXIgRkFSICpnel9oZWFkZXJwOworCisvKgorICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luIHdoZW4gYXZhaWxfaW4gaGFzCisgICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQKKyAgIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQKKyAgIG9wYXF1ZSBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQorICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uCisKKyAgIFRoZSBvcGFxdWUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAorICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiB6YWxsb2MgYW5kIHpmcmVlLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQorICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCisgICBvcGFxdWUgdmFsdWUuCisKKyAgIHphbGxvYyBtdXN0IHJldHVybiBaX05VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCisgICBJZiB6bGliIGlzIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbiwgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlCisgICB0aHJlYWQgc2FmZS4KKworICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKKyAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcworICAgaWYgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gV0FSTklORzogT24gTVNET1MsCisgICBwb2ludGVycyByZXR1cm5lZCBieSB6YWxsb2MgZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCoKKyAgIGhhdmUgdGhlaXIgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbgorICAgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiBUbyByZWR1Y2UgbWVtb3J5CisgICByZXF1aXJlbWVudHMgYW5kIGF2b2lkIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZgorICAgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgorCisgICBUaGUgZmllbGRzIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IKKyAgIHByb2dyZXNzIHJlcG9ydHMuIEFmdGVyIGNvbXByZXNzaW9uLCB0b3RhbF9pbiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZgorICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yCisgICAocGFydGljdWxhcmx5IGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluCisgICBhIHNpbmdsZSBzdGVwKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLworCisjZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCisjZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxIC8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIFpfU1lOQ19GTFVTSCBpbnN0ZWFkICovCisjZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCisjZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCisjZGVmaW5lIFpfRklOSVNIICAgICAgICA0CisjZGVmaW5lIFpfQkxPQ0sgICAgICAgICA1CisvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKKyNkZWZpbmUgWl9TVFJFQU1fRU5EICAgIDEKKyNkZWZpbmUgWl9ORUVEX0RJQ1QgICAgIDIKKyNkZWZpbmUgWl9FUlJOTyAgICAgICAgKC0xKQorI2RlZmluZSBaX1NUUkVBTV9FUlJPUiAoLTIpCisjZGVmaW5lIFpfREFUQV9FUlJPUiAgICgtMykKKyNkZWZpbmUgWl9NRU1fRVJST1IgICAgKC00KQorI2RlZmluZSBaX0JVRl9FUlJPUiAgICAoLTUpCisjZGVmaW5lIFpfVkVSU0lPTl9FUlJPUiAoLTYpCisvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUKKyAqIHZhbHVlcyBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCisgKi8KKworI2RlZmluZSBaX05PX0NPTVBSRVNTSU9OICAgICAgICAgMAorI2RlZmluZSBaX0JFU1RfU1BFRUQgICAgICAgICAgICAgMQorI2RlZmluZSBaX0JFU1RfQ09NUFJFU1NJT04gICAgICAgOQorI2RlZmluZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04gICgtMSkKKy8qIGNvbXByZXNzaW9uIGxldmVscyAqLworCisjZGVmaW5lIFpfRklMVEVSRUQgICAgICAgICAgICAxCisjZGVmaW5lIFpfSFVGRk1BTl9PTkxZICAgICAgICAyCisjZGVmaW5lIFpfUkxFICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpfRklYRUQgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpfREVGQVVMVF9TVFJBVEVHWSAgICAwCisvKiBjb21wcmVzc2lvbiBzdHJhdGVneTsgc2VlIGRlZmxhdGVJbml0MigpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9CSU5BUlkgICAwCisjZGVmaW5lIFpfVEVYVCAgICAgMQorI2RlZmluZSBaX0FTQ0lJICAgIFpfVEVYVCAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4yLjIgYW5kIGVhcmxpZXIgKi8KKyNkZWZpbmUgWl9VTktOT1dOICAyCisvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovCisKKyNkZWZpbmUgWl9ERUZMQVRFRCAgIDgKKy8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCisKKyNkZWZpbmUgWl9OVUxMICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIHphbGxvYywgemZyZWUsIG9wYXF1ZSAqLworCisjZGVmaW5lIHpsaWJfdmVyc2lvbiB6bGliVmVyc2lvbigpCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIDwgMS4wLjIgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgZnVuY3Rpb25zICovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24gT0YoKHZvaWQpKTsKKy8qIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSB6bGliVmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCisgICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCisgKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwpKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCisgICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBkZWZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgb3IgYmV0d2VlbiAwIGFuZCA5OgorICAgMSBnaXZlcyBiZXN0IHNwZWVkLCA5IGdpdmVzIGJlc3QgY29tcHJlc3Npb24sIDAgZ2l2ZXMgbm8gY29tcHJlc3Npb24gYXQKKyAgIGFsbCAodGhlIGlucHV0IGRhdGEgaXMgc2ltcGx5IGNvcGllZCBhIGJsb2NrIGF0IGEgdGltZSkuCisgICBaX0RFRkFVTFRfQ09NUFJFU1NJT04gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKKyAgIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KKworICAgICBkZWZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgbGV2ZWwgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbGV2ZWwsCisgICBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzIGluY29tcGF0aWJsZQorICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuCisgICBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgZGVmbGF0ZSBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCisgIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCisgICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgorICAgIEZvcmNpbmcgZmx1c2ggZnJlcXVlbnRseSBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8sIHNvIHRoaXMgcGFyYW1ldGVyCisgICAgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gbmVjZXNzYXJ5IChpbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMpLgorICAgIFNvbWUgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKKyAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dAorICBzaG91bGQgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUKKyAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCisgIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuIElmIGRlZmxhdGUgcmV0dXJucyBaX09LCisgIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX05PX0ZMVVNILCB3aGljaCBhbGxvd3MgZGVmbGF0ZSB0bworICBkZWNpZGUgaG93IG11Y2ggZGF0YSB0byBhY2N1bXVhbHRlIGJlZm9yZSBwcm9kdWNpbmcgb3V0cHV0LCBpbiBvcmRlciB0bworICBtYXhpbWl6ZSBjb21wcmVzc2lvbi4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfU1lOQ19GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCisgIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCisgIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIChJbiBwYXJ0aWN1bGFyCisgIGF2YWlsX2luIGlzIHplcm8gYWZ0ZXIgdGhlIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZAorICBiZWZvcmUgdGhlIGNhbGwuKSAgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUgY29tcHJlc3Npb24KKyAgYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX0ZVTExfRkxVU0gsIGFsbCBvdXRwdXQgaXMgZmx1c2hlZCBhcyB3aXRoCisgIFpfU1lOQ19GTFVTSCwgYW5kIHRoZSBjb21wcmVzc2lvbiBzdGF0ZSBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCisgIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmCisgIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcgWl9GVUxMX0ZMVVNIIHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUKKyAgY29tcHJlc3Npb24uCisKKyAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCisgIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KKyAgYXZhaWxfb3V0KS4gSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdAorICBhdmFpbF9vdXQgaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bworICBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCisgIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBpZiB0aGVyZQorICB3YXMgZW5vdWdoIG91dHB1dCBzcGFjZTsgaWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9PSywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCisgIGNhbGxlZCBhZ2FpbiB3aXRoIFpfRklOSVNIIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCBhdmFpbF9vdXQpIGJ1dCBubworICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuIEFmdGVyCisgIGRlZmxhdGUgaGFzIHJldHVybmVkIFpfU1RSRUFNX0VORCwgdGhlIG9ubHkgcG9zc2libGUgb3BlcmF0aW9ucyBvbiB0aGUKKyAgc3RyZWFtIGFyZSBkZWZsYXRlUmVzZXQgb3IgZGVmbGF0ZUVuZC4KKworICAgIFpfRklOSVNIIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KKyAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0CisgIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuIElmIGRlZmxhdGUgZG9lcyBub3QgcmV0dXJuCisgIFpfU1RSRUFNX0VORCwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgICBkZWZsYXRlKCkgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAorICBzbyBmYXIgKHRoYXQgaXMsIHRvdGFsX2luIGJ5dGVzKS4KKworICAgIGRlZmxhdGUoKSBtYXkgdXBkYXRlIHN0cm0tPmRhdGFfdHlwZSBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKKyAgdGhlIGlucHV0IGRhdGEgdHlwZSAoWl9CSU5BUlkgb3IgWl9URVhUKS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKKyAgYmluYXJ5LiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QKKyAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgorCisgICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKKyAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgorICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bworICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlCisgIChmb3IgZXhhbXBsZSBhdmFpbF9pbiBvciBhdmFpbF9vdXQgd2FzIHplcm8pLiBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90CisgIGZhdGFsLCBhbmQgZGVmbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dAorICBzcGFjZSB0byBjb250aW51ZSBjb21wcmVzc2luZy4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAorICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiBJbiB0aGUgZXJyb3IgY2FzZSwKKyAgIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlCisgICBkZWFsbG9jYXRlZCkuCisqLworCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworCisgICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKKyAgIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKKyAgIHRoZSBjYWxsZXIuIElmIG5leHRfaW4gaXMgbm90IFpfTlVMTCBhbmQgYXZhaWxfaW4gaXMgbGFyZ2UgZW5vdWdoICh0aGUgZXhhY3QKKyAgIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIGluZmxhdGVJbml0IGRldGVybWluZXMgdGhlCisgICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisgICBhY2NvcmRpbmdseTsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKKyAgIGluZmxhdGUuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBpbmZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIGluZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIuICBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IKKyAgIG1lc3NhZ2UuIGluZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24gYXBhcnQgZnJvbSByZWFkaW5nCisgICB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogdGhpcyB3aWxsIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAgKFNvIG5leHRfaW4gYW5kCisgICBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dCBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGFyZSB1bmNoYW5nZWQuKQorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgaW5mbGF0ZSBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlCisgIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuICBpbmZsYXRlKCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIHVudGlsIHRoZXJlCisgICAgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgKHNlZSBiZWxvdworICAgIGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuCisgIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKKyAgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAorICBjYWxsIG9mIGluZmxhdGUoKS4gSWYgaW5mbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0CisgIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKKyAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIFRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIGNhbiBiZSBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsCisgIFpfRklOSVNILCBvciBaX0JMT0NLLiBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgc3RvcAorICBpZiBhbmQgd2hlbiBpdCBnZXRzIHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuIFdoZW4gZGVjb2RpbmcgdGhlCisgIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyCisgIHRoZSBoZWFkZXIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2suIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwgaW5mbGF0ZSgpCisgIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdCBnZXRzIHRvCisgIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCisgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQKKyAgaWYgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sCisgIHBsdXMgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sKKyAgY29kZSBvciBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICBkZWZsYXRlIHN0cmVhbS4gVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbgorICBiaXQgNyBvZiBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZQorICBsZXNzIHRoYW4gZWlnaHQuCisKKyAgICBpbmZsYXRlKCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIFpfU1RSRUFNX0VORCBvciBhbgorICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAorICAoYSBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvCisgIFpfRklOSVNILiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZworICBvdXRwdXQgaXMgZmx1c2hlZDsgYXZhaWxfb3V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCisgIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAorICBiZSBpbmZsYXRlRW5kIHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gc3RhdGUuIFRoZSB1c2Ugb2YgWl9GSU5JU0gKKyAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoCisgIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgorCisgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcworICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCisgIGZpcnN0IGNhbGwuIFNvIHRoZSBvbmx5IGVmZmVjdCBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgaXMgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCksIGFzIG5vdGVkIGJlbG93LCBvciB3aGVuIGl0IHJldHVybnMgZWFybHkKKyAgYmVjYXVzZSBaX0JMT0NLIGlzIHVzZWQuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKKyAgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgaXQgc2V0cworICBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKKyAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKKyAgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCisgIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5ECisgIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisKKyAgICBpbmZsYXRlKCkgd2lsbCBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAorICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4gIEFueSBpbmZvcm1hdGlvbgorICBjb250YWluZWQgaW4gdGhlIGd6aXAgaGVhZGVyIGlzIG5vdCByZXRhaW5lZCwgc28gYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0aGF0CisgIGluZm9ybWF0aW9uIHNob3VsZCBpbnN0ZWFkIHVzZSByYXcgaW5mbGF0ZSwgc2VlIGluZmxhdGVJbml0MigpIGJlbG93LCBvcgorICBpbmZsYXRlQmFjaygpIGFuZCBwZXJmb3JtIHRoZWlyIG93biBwcm9jZXNzaW5nIG9mIHRoZSBnemlwIGhlYWRlciBhbmQKKyAgdHJhaWxlci4KKworICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAorICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCisgIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIFpfTkVFRF9ESUNUIGlmIGEKKyAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKKyAgY29ycnVwdGVkIChpbnB1dCBzdHJlYW0gbm90IGNvbmZvcm1pbmcgdG8gdGhlIHpsaWIgZm9ybWF0IG9yIGluY29ycmVjdCBjaGVjaworICB2YWx1ZSksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCisgIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIE5VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnksCisgIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90IGZhdGFsLCBhbmQKKyAgaW5mbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dCBzcGFjZSB0bworICBjb250aW51ZSBkZWNvbXByZXNzaW5nLiBJZiBaX0RBVEFfRVJST1IgaXMgcmV0dXJuZWQsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbgorICBjYWxsIGluZmxhdGVTeW5jKCkgdG8gbG9vayBmb3IgYSBnb29kIGNvbXByZXNzaW9uIGJsb2NrIGlmIGEgcGFydGlhbCByZWNvdmVyeQorICBvZiB0aGUgZGF0YSBpcyBkZXNpcmVkLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQorICAgcGVuZGluZyBvdXRwdXQuCisKKyAgICAgaW5mbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZQorICAgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIGVycm9yIGNhc2UsIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhCisgICBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZSBkZWFsbG9jYXRlZCkuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlZCBmdW5jdGlvbnMgKi8KKworLyoKKyAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHN0cmF0ZWd5KSk7CisKKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgZGVmbGF0ZUluaXQgd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuIFRoZQorICAgZmllbGRzIG5leHRfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQorICAgdGhlIGNhbGxlci4KKworICAgICBUaGUgbWV0aG9kIHBhcmFtZXRlciBpcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kLiBJdCBtdXN0IGJlIFpfREVGTEFURUQgaW4KKyAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUKKyAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCisgICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBMYXJnZXIgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIKKyAgIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYKKyAgIGRlZmxhdGVJbml0IGlzIHVzZWQgaW5zdGVhZC4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBkZWZsYXRlLiBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gZGVmbGF0ZSgpIHdpbGwgdGhlbiBnZW5lcmF0ZSByYXcgZGVmbGF0ZSBkYXRhCisgICB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZCB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZW5jb2RpbmcuIEFkZAorICAgMTYgdG8gd2luZG93Qml0cyB0byB3cml0ZSBhIHNpbXBsZSBnemlwIGhlYWRlciBhbmQgdHJhaWxlciBhcm91bmQgdGhlCisgICBjb21wcmVzc2VkIGRhdGEgaW5zdGVhZCBvZiBhIHpsaWIgd3JhcHBlci4gVGhlIGd6aXAgaGVhZGVyIHdpbGwgaGF2ZSBubworICAgZmlsZSBuYW1lLCBubyBleHRyYSBkYXRhLCBubyBjb21tZW50LCBubyBtb2RpZmljYXRpb24gdGltZSAoc2V0IHRvIHplcm8pLAorICAgbm8gaGVhZGVyIGNyYywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYmUgc2V0IHRvIDI1NSAodW5rbm93bikuICBJZiBhCisgICBnemlwIHN0cmVhbSBpcyBiZWluZyB3cml0dGVuLCBzdHJtLT5hZGxlciBpcyBhIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KKworICAgICBUaGUgbWVtTGV2ZWwgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZAorICAgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gbWVtTGV2ZWw9MSB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dAorICAgaXMgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbzsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5CisgICBmb3Igb3B0aW1hbCBzcGVlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4gU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeQorICAgdXNhZ2UgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4KKworICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlCisgICB2YWx1ZSBaX0RFRkFVTFRfU1RSQVRFR1kgZm9yIG5vcm1hbCBkYXRhLCBaX0ZJTFRFUkVEIGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKKyAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgWl9IVUZGTUFOX09OTFkgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubworICAgc3RyaW5nIG1hdGNoKSwgb3IgWl9STEUgdG8gbGltaXQgbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aAorICAgZW5jb2RpbmcpLiBGaWx0ZXJlZCBkYXRhIGNvbnNpc3RzIG1vc3RseSBvZiBzbWFsbCB2YWx1ZXMgd2l0aCBhIHNvbWV3aGF0CisgICByYW5kb20gZGlzdHJpYnV0aW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdHVuZWQgdG8KKyAgIGNvbXByZXNzIHRoZW0gYmV0dGVyLiBUaGUgZWZmZWN0IG9mIFpfRklMVEVSRUQgaXMgdG8gZm9yY2UgbW9yZSBIdWZmbWFuCisgICBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nOyBpdCBpcyBzb21ld2hhdCBpbnRlcm1lZGlhdGUgYmV0d2VlbgorICAgWl9ERUZBVUxUIGFuZCBaX0hVRkZNQU5fT05MWS4gWl9STEUgaXMgZGVzaWduZWQgdG8gYmUgYWxtb3N0IGFzIGZhc3QgYXMKKyAgIFpfSFVGRk1BTl9PTkxZLCBidXQgZ2l2ZSBiZXR0ZXIgY29tcHJlc3Npb24gZm9yIFBORyBpbWFnZSBkYXRhLiBUaGUgc3RyYXRlZ3kKKyAgIHBhcmFtZXRlciBvbmx5IGFmZmVjdHMgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZQorICAgY29tcHJlc3NlZCBvdXRwdXQgZXZlbiBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuICBaX0ZJWEVEIHByZXZlbnRzIHRoZQorICAgdXNlIG9mIGR5bmFtaWMgSHVmZm1hbiBjb2RlcywgYWxsb3dpbmcgZm9yIGEgc2ltcGxlciBkZWNvZGVyIGZvciBzcGVjaWFsCisgICBhcHBsaWNhdGlvbnMuCisKKyAgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCisgICBtZXRob2QpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0MiBkb2VzCisgICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCisgICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IgZGVmbGF0ZVJlc2V0LCBiZWZvcmUgYW55CisgICBjYWxsIG9mIGRlZmxhdGUuIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQorICAgZGljdGlvbmFyeSAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KKworICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5CisgICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5CisgICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCisgICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuIGJlCisgICBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlciB0aGFuCisgICB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCisKKyAgICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZXMgc2VsZWN0ZWQgYnkKKyAgIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0MiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKKyAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplIGluCisgICBkZWZsYXRlIG9yIGRlZmxhdGUyLiBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlIHVzZWZ1bCBzaG91bGQgYmUKKyAgIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LiBJbiBhZGRpdGlvbiwgdGhlCisgICBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGRlZmxhdGUgd2lsbCB1c2UgYXQgbW9zdCB0aGUgd2luZG93IHNpemUgbWludXMKKyAgIDI2MiBieXRlcyBvZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeS4KKworICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLT5hZGxlciBpcyBzZXQgdG8gdGhlIGFkbGVyMzIgdmFsdWUKKyAgIG9mIHRoZSBkaWN0aW9uYXJ5OyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKKyAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gKFRoZSBhZGxlcjMyIHZhbHVlCisgICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcworICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pIElmIGEgcmF3IGRlZmxhdGUgd2FzIHJlcXVlc3RlZCwgdGhlbiB0aGUKKyAgIGFkbGVyMzIgdmFsdWUgaXMgbm90IGNvbXB1dGVkIGFuZCBzdHJtLT5hZGxlciBpcyBub3Qgc2V0LgorCisgICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKKyAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgZGVmbGF0ZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KKyAgIG9yIGlmIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgYnNvcnQpLiBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOworLyoKKyAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQorICAgdHJpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBvZiBwcmUtcHJvY2Vzc2luZyB0aGUgaW5wdXQKKyAgIGRhdGEgd2l0aCBhIGZpbHRlci4gVGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZCBzaG91bGQgdGhlbiBiZSBmcmVlZAorICAgYnkgY2FsbGluZyBkZWZsYXRlRW5kLiAgTm90ZSB0aGF0IGRlZmxhdGVDb3B5IGR1cGxpY2F0ZXMgdGhlIGludGVybmFsCisgICBjb21wcmVzc2lvbiBzdGF0ZSB3aGljaCBjYW4gYmUgcXVpdGUgbGFyZ2UsIHNvIHRoaXMgc3RyYXRlZ3kgaXMgc2xvdyBhbmQKKyAgIGNhbiBjb25zdW1lIGxvdHMgb2YgbWVtb3J5LgorCisgICAgIGRlZmxhdGVDb3B5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50CisgICAoc3VjaCBhcyB6YWxsb2MgYmVpbmcgTlVMTCkuIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKKyAgIGRlc3RpbmF0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZGVmbGF0ZUVuZCBmb2xsb3dlZCBieSBkZWZsYXRlSW5pdCwKKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuCisgICBUaGUgc3RyZWFtIHdpbGwga2VlcCB0aGUgc2FtZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMKKyAgIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgZGVmbGF0ZUluaXQyLgorCisgICAgICBkZWZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBOVUxMKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQorICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCisgICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgorICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQKKyAgIHN0cmF0ZWd5LiBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIKKyAgIGlzIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwKKyAgIHRha2UgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCisgICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0bworICAgYmUgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gSW4gcGFydGljdWxhciwgc3RybS0+YXZhaWxfb3V0IG11c3QgYmUgbm9uLXplcm8uCisKKyAgICAgZGVmbGF0ZVBhcmFtcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIFpfQlVGX0VSUk9SCisgICBpZiBzdHJtLT5hdmFpbF9vdXQgd2FzIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVUdW5lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnb29kX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbGF6eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuaWNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY2hhaW4pKTsKKy8qCisgICAgIEZpbmUgdHVuZSBkZWZsYXRlJ3MgaW50ZXJuYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycy4gIFRoaXMgc2hvdWxkIG9ubHkgYmUKKyAgIHVzZWQgYnkgc29tZW9uZSB3aG8gdW5kZXJzdGFuZHMgdGhlIGFsZ29yaXRobSB1c2VkIGJ5IHpsaWIncyBkZWZsYXRlIGZvcgorICAgc2VhcmNoaW5nIGZvciB0aGUgYmVzdCBtYXRjaGluZyBzdHJpbmcsIGFuZCBldmVuIHRoZW4gb25seSBieSB0aGUgbW9zdAorICAgZmFuYXRpYyBvcHRpbWl6ZXIgdHJ5aW5nIHRvIHNxdWVlemUgb3V0IHRoZSBsYXN0IGNvbXByZXNzZWQgYml0IGZvciB0aGVpcgorICAgc3BlY2lmaWMgaW5wdXQgZGF0YS4gIFJlYWQgdGhlIGRlZmxhdGUuYyBzb3VyY2UgY29kZSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlCisgICBtYXhfbGF6eSwgZ29vZF9sZW5ndGgsIG5pY2VfbGVuZ3RoLCBhbmQgbWF4X2NoYWluIHBhcmFtZXRlcnMuCisKKyAgICAgZGVmbGF0ZVR1bmUoKSBjYW4gYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkgb3IgZGVmbGF0ZUluaXQyKCksIGFuZAorICAgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGZvciBhbiBpbnZhbGlkIGRlZmxhdGUgc3RyZWFtLgorICovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBkZWZsYXRlQm91bmQoKSByZXR1cm5zIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUgYWZ0ZXIKKyAgIGRlZmxhdGlvbiBvZiBzb3VyY2VMZW4gYnl0ZXMuICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpCisgICBvciBkZWZsYXRlSW5pdDIoKS4gIFRoaXMgd291bGQgYmUgdXNlZCB0byBhbGxvY2F0ZSBhbiBvdXRwdXQgYnVmZmVyCisgICBmb3IgZGVmbGF0aW9uIGluIGEgc2luZ2xlIHBhc3MsIGFuZCBzbyB3b3VsZCBiZSBjYWxsZWQgYmVmb3JlIGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpKTsKKy8qCisgICAgIGRlZmxhdGVQcmltZSgpIGluc2VydHMgYml0cyBpbiB0aGUgZGVmbGF0ZSBvdXRwdXQgc3RyZWFtLiAgVGhlIGludGVudAorICBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBvZmYgdGhlIGRlZmxhdGUgb3V0cHV0IHdpdGggdGhlCisgIGJpdHMgbGVmdG92ZXIgZnJvbSBhIHByZXZpb3VzIGRlZmxhdGUgc3RyZWFtIHdoZW4gYXBwZW5kaW5nIHRvIGl0LiAgQXMgc3VjaCwKKyAgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGZvciByYXcgZGVmbGF0ZSwgYW5kIG11c3QgYmUgdXNlZCBiZWZvcmUgdGhlCisgIGZpcnN0IGRlZmxhdGUoKSBjYWxsIGFmdGVyIGEgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUKKyAgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mCisgIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIG91dHB1dC4KKworICAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOworLyoKKyAgICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKKyAgIHN0cmVhbSBpcyByZXF1ZXN0ZWQgYnkgZGVmbGF0ZUluaXQyKCkuICBkZWZsYXRlU2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZAorICAgYWZ0ZXIgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZgorICAgZGVmbGF0ZSgpLiAgVGhlIHRleHQsIHRpbWUsIG9zLCBleHRyYSBmaWVsZCwgbmFtZSwgYW5kIGNvbW1lbnQgaW5mb3JtYXRpb24KKyAgIGluIHRoZSBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlIGFyZSB3cml0dGVuIHRvIHRoZSBnemlwIGhlYWRlciAoeGZsYWcgaXMKKyAgIGlnbm9yZWQgLS0gdGhlIGV4dHJhIGZsYWdzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjb21wcmVzc2lvbiBsZXZlbCkuICBUaGUKKyAgIGNhbGxlciBtdXN0IGFzc3VyZSB0aGF0LCBpZiBub3QgWl9OVUxMLCBuYW1lIGFuZCBjb21tZW50IGFyZSB0ZXJtaW5hdGVkIHdpdGgKKyAgIGEgemVybyBieXRlLCBhbmQgdGhhdCBpZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGF0IGV4dHJhX2xlbiBieXRlcyBhcmUKKyAgIGF2YWlsYWJsZSB0aGVyZS4gIElmIGhjcmMgaXMgdHJ1ZSwgYSBnemlwIGhlYWRlciBjcmMgaXMgaW5jbHVkZWQuICBOb3RlIHRoYXQKKyAgIHRoZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSBjb21tYW5kLWxpbmUgdmVyc2lvbiBvZiBnemlwICh1cCB0aHJvdWdoIHZlcnNpb24KKyAgIDEuMy54KSBkbyBub3Qgc3VwcG9ydCBoZWFkZXIgY3JjJ3MsIGFuZCB3aWxsIHJlcG9ydCB0aGF0IGl0IGlzIGEgIm11bHRpLXBhcnQKKyAgIGd6aXAgZmlsZSIgYW5kIGdpdmUgdXAuCisKKyAgICAgIElmIGRlZmxhdGVTZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZSBkZWZhdWx0IGd6aXAgaGVhZGVyIGhhcyB0ZXh0IGZhbHNlLAorICAgdGhlIHRpbWUgc2V0IHRvIHplcm8sIGFuZCBvcyBzZXQgdG8gMjU1LCB3aXRoIG5vIGV4dHJhLCBuYW1lLCBvciBjb21tZW50CisgICBmaWVsZHMuICBUaGUgZ3ppcCBoZWFkZXIgaXMgcmV0dXJuZWQgdG8gdGhlIGRlZmF1bHQgc3RhdGUgYnkgZGVmbGF0ZVJlc2V0KCkuCisKKyAgICAgIGRlZmxhdGVTZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBpbmZsYXRlSW5pdCB3aXRoIGFuIGV4dHJhIHBhcmFtZXRlci4gVGhlCisgICBmaWVsZHMgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkCisgICBiZWZvcmUgYnkgdGhlIGNhbGxlci4KKworICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgbWF4aW11bSB3aW5kb3cKKyAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCisgICBpbnN0ZWFkLiB3aW5kb3dCaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aW5kb3dCaXRzIHZhbHVlCisgICBwcm92aWRlZCB0byBkZWZsYXRlSW5pdDIoKSB3aGlsZSBjb21wcmVzc2luZywgb3IgaXQgbXVzdCBiZSBlcXVhbCB0byAxNSBpZgorICAgZGVmbGF0ZUluaXQyKCkgd2FzIG5vdCB1c2VkLiBJZiBhIGNvbXByZXNzZWQgc3RyZWFtIHdpdGggYSBsYXJnZXIgd2luZG93CisgICBzaXplIGlzIGdpdmVuIGFzIGlucHV0LCBpbmZsYXRlKCkgd2lsbCByZXR1cm4gd2l0aCB0aGUgZXJyb3IgY29kZQorICAgWl9EQVRBX0VSUk9SIGluc3RlYWQgb2YgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIHdpbmRvdy4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBpbmZsYXRlLiBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gaW5mbGF0ZSgpIHdpbGwgdGhlbiBwcm9jZXNzIHJhdyBkZWZsYXRlIGRhdGEsCisgICBub3QgbG9va2luZyBmb3IgYSB6bGliIG9yIGd6aXAgaGVhZGVyLCBub3QgZ2VuZXJhdGluZyBhIGNoZWNrIHZhbHVlLCBhbmQgbm90CisgICBsb29raW5nIGZvciBhbnkgY2hlY2sgdmFsdWVzIGZvciBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhpcworICAgaXMgZm9yIHVzZSB3aXRoIG90aGVyIGZvcm1hdHMgdGhhdCB1c2UgdGhlIGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAorICAgc3VjaCBhcyB6aXAuICBUaG9zZSBmb3JtYXRzIHByb3ZpZGUgdGhlaXIgb3duIGNoZWNrIHZhbHVlcy4gSWYgYSBjdXN0b20KKyAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcworICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KKyAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKKyAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuIE5vdGUgdGhhdCBjb21tZW50cworICAgYWJvdmUgb24gdGhlIHVzZSBpbiBkZWZsYXRlSW5pdDIoKSBhcHBsaWVzIHRvIHRoZSBtYWduaXR1ZGUgb2Ygd2luZG93Qml0cy4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBkZWNvZGluZy4gQWRkCisgICAzMiB0byB3aW5kb3dCaXRzIHRvIGVuYWJsZSB6bGliIGFuZCBnemlwIGRlY29kaW5nIHdpdGggYXV0b21hdGljIGhlYWRlcgorICAgZGV0ZWN0aW9uLCBvciBhZGQgMTYgdG8gZGVjb2RlIG9ubHkgdGhlIGd6aXAgZm9ybWF0ICh0aGUgemxpYiBmb3JtYXQgd2lsbAorICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SKS4gIElmIGEgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgZGVjb2RlZCwgc3RybS0+YWRsZXIgaXMKKyAgIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorCisgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhIG51bGwgc3RybSkuIG1zZworICAgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtCisgICBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbAorICAgYmUgZG9uZSBieSBpbmZsYXRlKCkuIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dCBuZXh0X291dAorICAgYW5kIGF2YWlsX291dCBhcmUgdW5jaGFuZ2VkLikKKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCisgICBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZSwKKyAgIGlmIHRoYXQgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCisgICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoYXQgY2FsbCBvZiBpbmZsYXRlLgorICAgVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lIGRpY3Rpb25hcnkgKHNlZQorICAgZGVmbGF0ZVNldERpY3Rpb25hcnkpLiAgRm9yIHJhdyBpbmZsYXRlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpIGFuZCBiZWZvcmUgYW55IGNhbGwgb2YKKyAgIGluZmxhdGUoKSB0byBzZXQgdGhlIGRpY3Rpb25hcnkuICBUaGUgYXBwbGljYXRpb24gbXVzdCBpbnN1cmUgdGhhdCB0aGUKKyAgIGRpY3Rpb25hcnkgdGhhdCB3YXMgdXNlZCBmb3IgY29tcHJlc3Npb24gaXMgcHJvdmlkZWQuCisKKyAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKKyAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IGFkbGVyMzIgdmFsdWUpLiBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgorICAgaW5mbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU3luYyBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCisgIGRlc2NyaXB0aW9uIG9mIGRlZmxhdGUgd2l0aCBaX0ZVTExfRkxVU0gpIGNhbiBiZSBmb3VuZCwgb3IgdW50aWwgYWxsCisgIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCisKKyAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCBaX0JVRl9FUlJPUgorICBpZiBubyBtb3JlIGlucHV0IHdhcyBwcm92aWRlZCwgWl9EQVRBX0VSUk9SIGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAorICBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgc3VjY2VzcworICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZiB0b3RhbF9pbiB3aGljaAorICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZSBpbnB1dCBlYWNoIHRpbWUsCisgIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CisvKgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyBhIGxhcmdlIHN0cmVhbS4gIFRoZQorICAgZmlyc3QgcGFzcyB0aHJvdWdoIHRoZSBzdHJlYW0gY2FuIHBlcmlvZGljYWxseSByZWNvcmQgdGhlIGluZmxhdGUgc3RhdGUsCisgICBhbGxvd2luZyByZXN0YXJ0aW5nIGluZmxhdGUgYXQgdGhvc2UgcG9pbnRzIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIHRoZQorICAgc3RyZWFtLgorCisgICAgIGluZmxhdGVDb3B5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50CisgICAoc3VjaCBhcyB6YWxsb2MgYmVpbmcgTlVMTCkuIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKKyAgIGRlc3RpbmF0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5mbGF0ZUVuZCBmb2xsb3dlZCBieSBpbmZsYXRlSW5pdCwKKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiBzdGF0ZS4KKyAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIGF0dHJpYnV0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBpbmZsYXRlSW5pdDIuCisKKyAgICAgIGluZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGJpdHMgaW4gdGhlIGluZmxhdGUgaW5wdXQgc3RyZWFtLiAgVGhlIGludGVudCBpcworICB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBpbmZsYXRpbmcgYXQgYSBiaXQgcG9zaXRpb24gaW4gdGhlCisgIG1pZGRsZSBvZiBhIGJ5dGUuICBUaGUgcHJvdmlkZWQgYml0cyB3aWxsIGJlIHVzZWQgYmVmb3JlIGFueSBieXRlcyBhcmUgdXNlZAorICBmcm9tIG5leHRfaW4uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCByYXcgaW5mbGF0ZSwgYW5kCisgIHNob3VsZCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlyc3QgaW5mbGF0ZSgpIGNhbGwgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IKKyAgaW5mbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZQorICBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIGlucHV0LgorCisgICAgICBpbmZsYXRlUHJpbWUgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlR2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7CisvKgorICAgICAgaW5mbGF0ZUdldEhlYWRlcigpIHJlcXVlc3RzIHRoYXQgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gYmUgc3RvcmVkIGluIHRoZQorICAgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZS4gIGluZmxhdGVHZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCisgICBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZiBpbmZsYXRlKCkuCisgICBBcyBpbmZsYXRlKCkgcHJvY2Vzc2VzIHRoZSBnemlwIHN0cmVhbSwgaGVhZC0+ZG9uZSBpcyB6ZXJvIHVudGlsIHRoZSBoZWFkZXIKKyAgIGlzIGNvbXBsZXRlZCwgYXQgd2hpY2ggdGltZSBoZWFkLT5kb25lIGlzIHNldCB0byBvbmUuICBJZiBhIHpsaWIgc3RyZWFtIGlzCisgICBiZWluZyBkZWNvZGVkLCB0aGVuIGhlYWQtPmRvbmUgaXMgc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgd2lsbCBiZQorICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBjYW4gYmUgdXNlZCB0bworICAgZm9yY2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciBoZWFkZXIgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQorICAgYW5kIGJlZm9yZSBhbnkgYWN0dWFsIGRhdGEgaXMgZGVjb21wcmVzc2VkLgorCisgICAgICBUaGUgdGV4dCwgdGltZSwgeGZsYWdzLCBhbmQgb3MgZmllbGRzIGFyZSBmaWxsZWQgaW4gd2l0aCB0aGUgZ3ppcCBoZWFkZXIKKyAgIGNvbnRlbnRzLiAgaGNyYyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBhIGhlYWRlciBDUkMuICAoVGhlIGhlYWRlciBDUkMKKyAgIHdhcyB2YWxpZCBpZiBkb25lIGlzIHNldCB0byBvbmUuKSAgSWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhlbiBleHRyYV9tYXgKKyAgIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBleHRyYS4gIE9uY2UgZG9uZSBpcyB0cnVlLAorICAgZXh0cmFfbGVuIGNvbnRhaW5zIHRoZSBhY3R1YWwgZXh0cmEgZmllbGQgbGVuZ3RoLCBhbmQgZXh0cmEgY29udGFpbnMgdGhlCisgICBleHRyYSBmaWVsZCwgb3IgdGhhdCBmaWVsZCB0cnVuY2F0ZWQgaWYgZXh0cmFfbWF4IGlzIGxlc3MgdGhhbiBleHRyYV9sZW4uCisgICBJZiBuYW1lIGlzIG5vdCBaX05VTEwsIHRoZW4gdXAgdG8gbmFtZV9tYXggY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0aGVyZSwKKyAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIG5hbWVfbWF4LiAgSWYKKyAgIGNvbW1lbnQgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBjb21tX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAorICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gY29tbV9tYXguICBXaGVuCisgICBhbnkgb2YgZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgYXJlIG5vdCBaX05VTEwgYW5kIHRoZSByZXNwZWN0aXZlIGZpZWxkIGlzCisgICBub3QgcHJlc2VudCBpbiB0aGUgaGVhZGVyLCB0aGVuIHRoYXQgZmllbGQgaXMgc2V0IHRvIFpfTlVMTCB0byBzaWduYWwgaXRzCisgICBhYnNlbmNlLiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBkZWZsYXRlU2V0SGVhZGVyKCkgd2l0aCB0aGUgcmV0dXJuZWQKKyAgIHN0cnVjdHVyZSB0byBkdXBsaWNhdGUgdGhlIGhlYWRlci4gIEhvd2V2ZXIgaWYgdGhvc2UgZmllbGRzIGFyZSBzZXQgdG8KKyAgIGFsbG9jYXRlZCBtZW1vcnksIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byBzYXZlIHRob3NlIHBvaW50ZXJzCisgICBlbHNld2hlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBldmVudHVhbGx5IGZyZWVkLgorCisgICAgICBJZiBpbmZsYXRlR2V0SGVhZGVyIGlzIG5vdCB1c2VkLCB0aGVuIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc2ltcGx5CisgICBkaXNjYXJkZWQuICBUaGUgaGVhZGVyIGlzIGFsd2F5cyBjaGVja2VkIGZvciB2YWxpZGl0eSwgaW5jbHVkaW5nIHRoZSBoZWFkZXIKKyAgIENSQyBpZiBwcmVzZW50LiAgaW5mbGF0ZVJlc2V0KCkgd2lsbCByZXNldCB0aGUgcHJvY2VzcyB0byBkaXNjYXJkIHRoZSBoZWFkZXIKKyAgIGluZm9ybWF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIHdvdWxkIG5lZWQgdG8gY2FsbCBpbmZsYXRlR2V0SGVhZGVyKCkgYWdhaW4gdG8KKyAgIHJldHJpZXZlIHRoZSBoZWFkZXIgZnJvbSB0aGUgbmV4dCBnemlwIHN0cmVhbS4KKworICAgICAgaW5mbGF0ZUdldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93KSk7CisKKyAgICAgSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uIHVzaW5nIGluZmxhdGVCYWNrKCkKKyAgIGNhbGxzLiAgVGhlIGZpZWxkcyB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgaW4gc3RybSBtdXN0IGJlIGluaXRpYWxpemVkCisgICBiZWZvcmUgdGhlIGNhbGwuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBaX05VTEwsIHRoZW4gdGhlIGRlZmF1bHQgbGlicmFyeS0KKyAgIGRlcml2ZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgYXJlIHVzZWQuICB3aW5kb3dCaXRzIGlzIHRoZSBiYXNlIHR3bworICAgbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZSwgaW4gdGhlIHJhbmdlIDguLjE1LiAgd2luZG93IGlzIGEgY2FsbGVyCisgICBzdXBwbGllZCBidWZmZXIgb2YgdGhhdCBzaXplLiAgRXhjZXB0IGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucyB3aGVyZSBpdCBpcworICAgYXNzdXJlZCB0aGF0IGRlZmxhdGUgd2FzIHVzZWQgd2l0aCBzbWFsbCB3aW5kb3cgc2l6ZXMsIHdpbmRvd0JpdHMgbXVzdCBiZSAxNQorICAgYW5kIGEgMzJLIGJ5dGUgd2luZG93IG11c3QgYmUgc3VwcGxpZWQgdG8gYmUgYWJsZSB0byBkZWNvbXByZXNzIGdlbmVyYWwKKyAgIGRlZmxhdGUgc3RyZWFtcy4KKworICAgICBTZWUgaW5mbGF0ZUJhY2soKSBmb3IgdGhlIHVzYWdlIG9mIHRoZXNlIHJvdXRpbmVzLgorCisgICAgIGluZmxhdGVCYWNrSW5pdCB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBvZgorICAgdGhlIHBhcmFtYXRlcnMgYXJlIGludmFsaWQsIFpfTUVNX0VSUk9SIGlmIHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3VsZCBub3QKKyAgIGJlIGFsbG9jYXRlZCwgb3IgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXMgbm90CisgICBtYXRjaCB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIGZpbGUuCisqLworCit0eXBlZGVmIHVuc2lnbmVkICgqaW5fZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKK3R5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2Z1bmMgaW4sIHZvaWQgRkFSICppbl9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2Z1bmMgb3V0LCB2b2lkIEZBUiAqb3V0X2Rlc2MpKTsKKy8qCisgICAgIGluZmxhdGVCYWNrKCkgZG9lcyBhIHJhdyBpbmZsYXRlIHdpdGggYSBzaW5nbGUgY2FsbCB1c2luZyBhIGNhbGwtYmFjaworICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGluZmxhdGUoKSBmb3IKKyAgIGZpbGUgaS9vIGFwcGxpY2F0aW9ucyBpbiB0aGF0IGl0IGF2b2lkcyBjb3B5aW5nIGJldHdlZW4gdGhlIG91dHB1dCBhbmQgdGhlCisgICBzbGlkaW5nIHdpbmRvdyBieSBzaW1wbHkgbWFraW5nIHRoZSB3aW5kb3cgaXRzZWxmIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhpcworICAgZnVuY3Rpb24gdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQgYnVmZmVyIHBhc3NlZCBieQorICAgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgorCisgICAgIGluZmxhdGVCYWNrSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQorICAgYW5kIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGggdGhlIHVzZXItcHJvdmlkZWQgd2luZG93IGJ1ZmZlci4KKyAgIGluZmxhdGVCYWNrKCkgbWF5IHRoZW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBpbmZsYXRlIGEgY29tcGxldGUsIHJhdworICAgZGVmbGF0ZSBzdHJlYW0gd2l0aCBlYWNoIGNhbGwuICBpbmZsYXRlQmFja0VuZCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZyZWUKKyAgIHRoZSBhbGxvY2F0ZWQgc3RhdGUuCisKKyAgICAgQSByYXcgZGVmbGF0ZSBzdHJlYW0gaXMgb25lIHdpdGggbm8gemxpYiBvciBnemlwIGhlYWRlciBvciB0cmFpbGVyLgorICAgVGhpcyByb3V0aW5lIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQgaW4gYSB1dGlsaXR5IHRoYXQgcmVhZHMgemlwIG9yIGd6aXAKKyAgIGZpbGVzIGFuZCB3cml0ZXMgb3V0IHVuY29tcHJlc3NlZCBmaWxlcy4gIFRoZSB1dGlsaXR5IHdvdWxkIGRlY29kZSB0aGUKKyAgIGhlYWRlciBhbmQgcHJvY2VzcyB0aGUgdHJhaWxlciBvbiBpdHMgb3duLCBoZW5jZSB0aGlzIHJvdXRpbmUgZXhwZWN0cworICAgb25seSB0aGUgcmF3IGRlZmxhdGUgc3RyZWFtIHRvIGRlY29tcHJlc3MuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZQorICAgbm9ybWFsIGJlaGF2aW9yIG9mIGluZmxhdGUoKSwgd2hpY2ggZXhwZWN0cyBlaXRoZXIgYSB6bGliIG9yIGd6aXAgaGVhZGVyIGFuZAorICAgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgc3RyZWFtLgorCisgICAgIGluZmxhdGVCYWNrKCkgdXNlcyB0d28gc3Vicm91dGluZXMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB0aGF0IGFyZSB0aGVuCisgICBjYWxsZWQgYnkgaW5mbGF0ZUJhY2soKSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIGluZmxhdGVCYWNrKCkgY2FsbHMgdGhvc2UKKyAgIHJvdXRpbmVzIHVudGlsIGl0IHJlYWRzIGEgY29tcGxldGUgZGVmbGF0ZSBzdHJlYW0gYW5kIHdyaXRlcyBvdXQgYWxsIG9mIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEsIG9yIHVudGlsIGl0IGVuY291bnRlcnMgYW4gZXJyb3IuICBUaGUgZnVuY3Rpb24ncworICAgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIGFyZSBkZWZpbmVkIGFib3ZlIGluIHRoZSBpbl9mdW5jIGFuZCBvdXRfZnVuYworICAgdHlwZWRlZnMuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbCBpbihpbl9kZXNjLCAmYnVmKSB3aGljaCBzaG91bGQgcmV0dXJuIHRoZQorICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHByb3ZpZGVkIGlucHV0LCBhbmQgYSBwb2ludGVyIHRvIHRoYXQgaW5wdXQgaW4gYnVmLiAgSWYKKyAgIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZSwgaW4oKSBtdXN0IHJldHVybiB6ZXJvLS1idWYgaXMgaWdub3JlZCBpbiB0aGF0CisgICBjYXNlLS1hbmQgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiBhIGJ1ZmZlciBlcnJvci4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsCisgICBvdXQob3V0X2Rlc2MsIGJ1ZiwgbGVuKSB0byB3cml0ZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYnVmWzAuLmxlbi0xXS4gIG91dCgpCisgICBzaG91bGQgcmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gb24gZmFpbHVyZS4gIElmIG91dCgpIHJldHVybnMKKyAgIG5vbi16ZXJvLCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIHdpdGggYW4gZXJyb3IuICBOZWl0aGVyIGluKCkgbm9yIG91dCgpCisgICBhcmUgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHdpbmRvdyBwcm92aWRlZCB0bworICAgaW5mbGF0ZUJhY2tJbml0KCksIHdoaWNoIGlzIGFsc28gdGhlIGJ1ZmZlciB0aGF0IG91dCgpIHVzZXMgdG8gd3JpdGUgZnJvbS4KKyAgIFRoZSBsZW5ndGggd3JpdHRlbiBieSBvdXQoKSB3aWxsIGJlIGF0IG1vc3QgdGhlIHdpbmRvdyBzaXplLiAgQW55IG5vbi16ZXJvCisgICBhbW91bnQgb2YgaW5wdXQgbWF5IGJlIHByb3ZpZGVkIGJ5IGluKCkuCisKKyAgICAgRm9yIGNvbnZlbmllbmNlLCBpbmZsYXRlQmFjaygpIGNhbiBiZSBwcm92aWRlZCBpbnB1dCBvbiB0aGUgZmlyc3QgY2FsbCBieQorICAgc2V0dGluZyBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbi4gIElmIHRoYXQgaW5wdXQgaXMgZXhoYXVzdGVkLCB0aGVuCisgICBpbigpIHdpbGwgYmUgY2FsbGVkLiAgVGhlcmVmb3JlIHN0cm0tPm5leHRfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAgIGNhbGxpbmcgaW5mbGF0ZUJhY2soKS4gIElmIHN0cm0tPm5leHRfaW4gaXMgWl9OVUxMLCB0aGVuIGluKCkgd2lsbCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGZvciBpbnB1dC4gIElmIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiBzdHJtLT5hdmFpbF9pbgorICAgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlbiBpZiBzdHJtLT5hdmFpbF9pbiBpcyBub3QgemVybywgaW5wdXQgd2lsbAorICAgaW5pdGlhbGx5IGJlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pblswIC4uIHN0cm0tPmF2YWlsX2luIC0gMV0uCisKKyAgICAgVGhlIGluX2Rlc2MgYW5kIG91dF9kZXNjIHBhcmFtZXRlcnMgb2YgaW5mbGF0ZUJhY2soKSBpcyBwYXNzZWQgYXMgdGhlCisgICBmaXJzdCBwYXJhbWV0ZXIgb2YgaW4oKSBhbmQgb3V0KCkgcmVzcGVjdGl2ZWx5IHdoZW4gdGhleSBhcmUgY2FsbGVkLiAgVGhlc2UKKyAgIGRlc2NyaXB0b3JzIGNhbiBiZSBvcHRpb25hbGx5IHVzZWQgdG8gcGFzcyBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgY2FsbGVyLQorICAgc3VwcGxpZWQgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zIG5lZWQgdG8gZG8gdGhlaXIgam9iLgorCisgICAgIE9uIHJldHVybiwgaW5mbGF0ZUJhY2soKSB3aWxsIHNldCBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbiB0bworICAgcGFzcyBiYWNrIGFueSB1bnVzZWQgaW5wdXQgdGhhdCB3YXMgcHJvdmlkZWQgYnkgdGhlIGxhc3QgaW4oKSBjYWxsLiAgVGhlCisgICByZXR1cm4gdmFsdWVzIG9mIGluZmxhdGVCYWNrKCkgY2FuIGJlIFpfU1RSRUFNX0VORCBvbiBzdWNjZXNzLCBaX0JVRl9FUlJPUgorICAgaWYgaW4oKSBvciBvdXQoKSByZXR1cm5lZCBhbiBlcnJvciwgWl9EQVRBX0VSUk9SIGlmIHRoZXJlIHdhcyBhIGZvcm1hdAorICAgZXJyb3IgaW4gdGhlIGRlZmxhdGUgc3RyZWFtIChpbiB3aGljaCBjYXNlIHN0cm0tPm1zZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhlCisgICBuYXR1cmUgb2YgdGhlIGVycm9yKSwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgbm90IHByb3Blcmx5CisgICBpbml0aWFsaXplZC4gIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlCisgICBkaXN0aW5ndWlzaGVkIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkCisgICBhbiBlcnJvci4gIElmIHN0cm0tPm5leHQgaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0bworICAgb3V0KCkgcmV0dXJuaW5nIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28KKyAgIHN0cm0tPm5leHRfaW4gaXMgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSAgTm90ZQorICAgdGhhdCBpbmZsYXRlQmFjaygpIGNhbm5vdCByZXR1cm4gWl9PSy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBpbmZsYXRlQmFja0luaXQoKSBpcyBmcmVlZC4KKworICAgICBpbmZsYXRlQmFja0VuZCgpIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtCisgICBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIHpsaWJDb21waWxlRmxhZ3MgT0YoKHZvaWQpKTsKKy8qIFJldHVybiBmbGFncyBpbmRpY2F0aW5nIGNvbXBpbGUtdGltZSBvcHRpb25zLgorCisgICAgVHlwZSBzaXplcywgdHdvIGJpdHMgZWFjaCwgMDAgPSAxNiBiaXRzLCAwMSA9IDMyLCAxMCA9IDY0LCAxMSA9IG90aGVyOgorICAgICAxLjA6IHNpemUgb2YgdUludAorICAgICAzLjI6IHNpemUgb2YgdUxvbmcKKyAgICAgNS40OiBzaXplIG9mIHZvaWRwZiAocG9pbnRlcikKKyAgICAgNy42OiBzaXplIG9mIHpfb2ZmX3QKKworICAgIENvbXBpbGVyLCBhc3NlbWJsZXIsIGFuZCBkZWJ1ZyBvcHRpb25zOgorICAgICA4OiBERUJVRworICAgICA5OiBBU01WIG9yIEFTTUlORiAtLSB1c2UgQVNNIGNvZGUKKyAgICAgMTA6IFpMSUJfV0lOQVBJIC0tIGV4cG9ydGVkIGZ1bmN0aW9ucyB1c2UgdGhlIFdJTkFQSSBjYWxsaW5nIGNvbnZlbnRpb24KKyAgICAgMTE6IDAgKHJlc2VydmVkKQorCisgICAgT25lLXRpbWUgdGFibGUgYnVpbGRpbmcgKHNtYWxsZXIgY29kZSwgYnV0IG5vdCB0aHJlYWQtc2FmZSBpZiB0cnVlKToKKyAgICAgMTI6IEJVSUxERklYRUQgLS0gYnVpbGQgc3RhdGljIGJsb2NrIGRlY29kaW5nIHRhYmxlcyB3aGVuIG5lZWRlZAorICAgICAxMzogRFlOQU1JQ19DUkNfVEFCTEUgLS0gYnVpbGQgQ1JDIGNhbGN1bGF0aW9uIHRhYmxlcyB3aGVuIG5lZWRlZAorICAgICAxNCwxNTogMCAocmVzZXJ2ZWQpCisKKyAgICBMaWJyYXJ5IGNvbnRlbnQgKGluZGljYXRlcyBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkpOgorICAgICAxNjogTk9fR1pDT01QUkVTUyAtLSBneiogZnVuY3Rpb25zIGNhbm5vdCBjb21wcmVzcyAodG8gYXZvaWQgbGlua2luZworICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZsYXRlIGNvZGUgd2hlbiBub3QgbmVlZGVkKQorICAgICAxNzogTk9fR1pJUCAtLSBkZWZsYXRlIGNhbid0IHdyaXRlIGd6aXAgc3RyZWFtcywgYW5kIGluZmxhdGUgY2FuJ3QgZGV0ZWN0CisgICAgICAgICAgICAgICAgICAgIGFuZCBkZWNvZGUgZ3ppcCBzdHJlYW1zICh0byBhdm9pZCBsaW5raW5nIGNyYyBjb2RlKQorICAgICAxOC0xOTogMCAocmVzZXJ2ZWQpCisKKyAgICBPcGVyYXRpb24gdmFyaWF0aW9ucyAoY2hhbmdlcyBpbiBsaWJyYXJ5IGZ1bmN0aW9uYWxpdHkpOgorICAgICAyMDogUEtaSVBfQlVHX1dPUktBUk9VTkQgLS0gc2xpZ2h0bHkgbW9yZSBwZXJtaXNzaXZlIGluZmxhdGUKKyAgICAgMjE6IEZBU1RFU1QgLS0gZGVmbGF0ZSBhbGdvcml0aG0gd2l0aCBvbmx5IG9uZSwgbG93ZXN0IGNvbXByZXNzaW9uIGxldmVsCisgICAgIDIyLDIzOiAwIChyZXNlcnZlZCkKKworICAgIFRoZSBzcHJpbnRmIHZhcmlhbnQgdXNlZCBieSBnenByaW50ZiAoemVybyBpcyBiZXN0KToKKyAgICAgMjQ6IDAgPSB2cyosIDEgPSBzKiAtLSAxIG1lYW5zIGxpbWl0ZWQgdG8gMjAgYXJndW1lbnRzIGFmdGVyIHRoZSBmb3JtYXQKKyAgICAgMjU6IDAgPSAqbnByaW50ZiwgMSA9ICpwcmludGYgLS0gMSBtZWFucyBnenByaW50ZigpIG5vdCBzZWN1cmUhCisgICAgIDI2OiAwID0gcmV0dXJucyB2YWx1ZSwgMSA9IHZvaWQgLS0gMSBtZWFucyBpbmZlcnJlZCBzdHJpbmcgbGVuZ3RoIHJldHVybmVkCisKKyAgICBSZW1haW5kZXI6CisgICAgIDI3LTMxOiAwIChyZXNlcnZlZCkKKyAqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCisKKy8qCisgICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKKyAgIGJhc2ljIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUKKyAgIGRlZmF1bHQgb3B0aW9ucyBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwKKyAgIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucykuIFRoZSBzb3VyY2UgY29kZSBvZiB0aGVzZQorICAgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGVhc2lseSBiZSBtb2RpZmllZCBpZiB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkCisgICBieSBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICBjb21wcmVzc2VkIGJ1ZmZlci4KKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb21wcmVzcyBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKKyAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC4KKyAgICAgY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzczIgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSk7CisvKgorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCisgICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKKyAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAgIGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIGNvbXByZXNzZWQgYnVmZmVyLgorCisgICAgIGNvbXByZXNzMiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKKyAgIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjb21wcmVzc0JvdW5kIE9GKCh1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIGNvbXByZXNzQm91bmQoKSByZXR1cm5zIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUgYWZ0ZXIKKyAgIGNvbXByZXNzKCkgb3IgY29tcHJlc3MyKCkgb24gc291cmNlTGVuIGJ5dGVzLiAgSXQgd291bGQgYmUgdXNlZCBiZWZvcmUKKyAgIGEgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIHVuY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCisgICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKKyAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCisgICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorCisgICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZCBvciBpbmNvbXBsZXRlLgorKi8KKworCit0eXBlZGVmIHZvaWRwIGd6RmlsZTsKKworWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gIE9GKChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKSk7CisvKgorICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgbW9kZSBwYXJhbWV0ZXIKKyAgIGlzIGFzIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwKKyAgICgid2I5Iikgb3IgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvcgorICAgSHVmZm1hbiBvbmx5IGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgb3IgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nCisgICBhcyBpbiAid2IxUiIuIChTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGRlZmxhdGVJbml0MiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICAgYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCisKKyAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcworICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLgorCisgICAgIGd6b3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBvciBpZiB0aGVyZSB3YXMKKyAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZTsgZXJybm8KKyAgIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZQorICAgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuICAqLworCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gIE9GKChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpKTsKKy8qCisgICAgIGd6ZG9wZW4oKSBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUKKyAgIGRlc2NyaXB0b3JzIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvcgorICAgZmlsZW5vIChpbiB0aGUgZmlsZSBoYXMgYmVlbiBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIGZvcGVuKS4KKyAgIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiBnem9wZW4uCisgICAgIFRoZSBuZXh0IGNhbGwgb2YgZ3pjbG9zZSBvbiB0aGUgcmV0dXJuZWQgZ3pGaWxlIHdpbGwgYWxzbyBjbG9zZSB0aGUKKyAgIGZpbGUgZGVzY3JpcHRvciBmZCwganVzdCBsaWtlIGZjbG9zZShmZG9wZW4oZmQpLCBtb2RlKSBjbG9zZXMgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IgZmQuIElmIHlvdSB3YW50IHRvIGtlZXAgZmQgb3BlbiwgdXNlIGd6ZG9wZW4oZHVwKGZkKSwgbW9kZSkuCisgICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlCisgICB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenNldHBhcmFtcyBPRigoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisgICAgIGd6c2V0cGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgZmlsZSB3YXMgbm90CisgICBvcGVuZWQgZm9yIHdyaXRpbmcuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6cmVhZCAgT0YoKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIG5vdCBpbiBnemlwIGZvcm1hdCwgZ3pyZWFkIGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCisgICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgICAgIGd6cmVhZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCisgICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4gKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnendyaXRlIE9GKChnekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBjIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CisvKgorICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3p3cml0ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4KKyAgICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVFZBICAgZ3pwcmludGYgT0YoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOworLyoKKyAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3MgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSB1bmRlcgorICAgY29udHJvbCBvZiB0aGUgZm9ybWF0IHN0cmluZywgYXMgaW4gZnByaW50Zi4gZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAoMCBpbiBjYXNlIG9mIGVycm9yKS4gIFRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIGlzIGxpbWl0ZWQgdG8gNDA5NS4gVGhlIGNhbGxlciBzaG91bGQgYXNzdXJlIHRoYXQKKyAgIHRoaXMgbGltaXQgaXMgbm90IGV4Y2VlZGVkLiBJZiBpdCBpcyBleGNlZWRlZCwgdGhlbiBnenByaW50ZigpIHdpbGwgcmV0dXJuCisgICByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGggbm90aGluZyB3cml0dGVuLiBJbiB0aGlzIGNhc2UsIHRoZXJlIG1heSBhbHNvIGJlIGEKKyAgIGJ1ZmZlciBvdmVyZmxvdyB3aXRoIHVucHJlZGljdGFibGUgY29uc2VxdWVuY2VzLCB3aGljaCBpcyBwb3NzaWJsZSBvbmx5IGlmCisgICB6bGliIHdhcyBjb21waWxlZCB3aXRoIHRoZSBpbnNlY3VyZSBmdW5jdGlvbnMgc3ByaW50ZigpIG9yIHZzcHJpbnRmKCkKKyAgIGJlY2F1c2UgdGhlIHNlY3VyZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpIGZ1bmN0aW9ucyB3ZXJlIG5vdCBhdmFpbGFibGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6cHV0cyBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnMpKTsKKy8qCisgICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCisgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisgICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCisKK1pFWFRFUk4gY2hhciAqIFpFWFBPUlQgZ3pnZXRzIE9GKChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKSk7CisvKgorICAgICAgUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlIHVudGlsIGxlbi0xIGNoYXJhY3RlcnMgYXJlIHJlYWQsIG9yCisgICBhIG5ld2xpbmUgY2hhcmFjdGVyIGlzIHJlYWQgYW5kIHRyYW5zZmVycmVkIHRvIGJ1Ziwgb3IgYW4gZW5kLW9mLWZpbGUKKyAgIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIFRoZSBzdHJpbmcgaXMgdGhlbiB0ZXJtaW5hdGVkIHdpdGggYSBudWxsCisgICBjaGFyYWN0ZXIuCisgICAgICBnemdldHMgcmV0dXJucyBidWYsIG9yIFpfTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOworLyoKKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZQorICAgb3IgLTEgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3p1bmdldGMgT0YoKGludCBjLCBnekZpbGUgZmlsZSkpOworLyoKKyAgICAgIFB1c2ggb25lIGNoYXJhY3RlciBiYWNrIG9udG8gdGhlIHN0cmVhbSB0byBiZSByZWFkIGFnYWluIGxhdGVyLgorICAgT25seSBvbmUgY2hhcmFjdGVyIG9mIHB1c2gtYmFjayBpcyBhbGxvd2VkLiAgZ3p1bmdldGMoKSByZXR1cm5zIHRoZQorICAgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbCBmYWlsIGlmIGEKKyAgIGNoYXJhY3RlciBoYXMgYmVlbiBwdXNoZWQgYnV0IG5vdCByZWFkIHlldCwgb3IgaWYgYyBpcyAtMS4gVGhlIHB1c2hlZAorICAgY2hhcmFjdGVyIHdpbGwgYmUgZGlzY2FyZGVkIGlmIHRoZSBzdHJlYW0gaXMgcmVwb3NpdGlvbmVkIHdpdGggZ3pzZWVrKCkKKyAgIG9yIGd6cmV3aW5kKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Zmx1c2ggT0YoKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlcgorICAgZmx1c2ggaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgorICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZ3plcnJvciBiZWxvdykuIGd6Zmx1c2ggcmV0dXJucyBaX09LIGlmCisgICB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIFpfRklOSVNIIGFuZCBhbGwgb3V0cHV0IGNvdWxkIGJlIGZsdXNoZWQuCisgICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgY2FuCisgICBkZWdyYWRlIGNvbXByZXNzaW9uLgorKi8KKworWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3pzZWVrIE9GKChnekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpKTsKKy8qCisgICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4gVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKKyAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQorICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQorICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKKyAgIHN0YXJ0aW5nIHBvc2l0aW9uLgorCisgICAgICBnenNlZWsgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgorICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KKyAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZXdpbmQgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXdpbmRzIHRoZSBnaXZlbiBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciByZWFkaW5nLgorCisgICBnenJld2luZChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIChpbnQpZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkKKyovCisKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUICAgIGd6dGVsbCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorCisgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuCisgICBpbnB1dCBzdHJlYW0sIG90aGVyd2lzZSB6ZXJvLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemRpcmVjdCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgMSBpZiBmaWxlIGlzIGJlaW5nIHJlYWQgZGlyZWN0bHkgd2l0aG91dCBkZWNvbXByZXNzaW9uLCBvdGhlcndpc2UKKyAgIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKKyAgIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLgorKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCBnemVycm9yIE9GKChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pKTsKKy8qCisgICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCisgICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorKi8KKworWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUKKyAgIGNsZWFyZXJyKCkgZnVuY3Rpb24gaW4gc3RkaW8uIFRoaXMgaXMgdXNlZnVsIGZvciBjb250aW51aW5nIHRvIHJlYWQgYSBnemlwCisgICBmaWxlIHRoYXQgaXMgYmVpbmcgd3JpdHRlbiBjb25jdXJyZW50bHkuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja3N1bSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCisgICBhbnl3YXkgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCisgICBjb21wcmVzc2lvbiBsaWJyYXJ5LgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzIgT0YoKHVMb25nIGFkbGVyLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAorICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgorICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSBPRigodUxvbmcgYWRsZXIxLCB1TG9uZyBhZGxlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X29mZl90IGxlbjIpKTsKKy8qCisgICAgIENvbWJpbmUgdHdvIEFkbGVyLTMyIGNoZWNrc3VtcyBpbnRvIG9uZS4gIEZvciB0d28gc2VxdWVuY2VzIG9mIGJ5dGVzLCBzZXExCisgICBhbmQgc2VxMiB3aXRoIGxlbmd0aHMgbGVuMSBhbmQgbGVuMiwgQWRsZXItMzIgY2hlY2tzdW1zIHdlcmUgY2FsY3VsYXRlZCBmb3IKKyAgIGVhY2gsIGFkbGVyMSBhbmQgYWRsZXIyLiAgYWRsZXIzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YKKyAgIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBhZGxlcjEsIGFkbGVyMiwgYW5kIGxlbjIuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQorICAgdXBkYXRlZCBDUkMtMzIuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwKKyAgIHZhbHVlIGZvciB0aGUgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcworICAgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICBjcmMgPSBjcmMzMihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgfQorICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZyBjcmMxLCB1TG9uZyBjcmMyLCB6X29mZl90IGxlbjIpKTsKKworLyoKKyAgICAgQ29tYmluZSB0d28gQ1JDLTMyIGNoZWNrIHZhbHVlcyBpbnRvIG9uZS4gIEZvciB0d28gc2VxdWVuY2VzIG9mIGJ5dGVzLAorICAgc2VxMSBhbmQgc2VxMiB3aXRoIGxlbmd0aHMgbGVuMSBhbmQgbGVuMiwgQ1JDLTMyIGNoZWNrIHZhbHVlcyB3ZXJlCisgICBjYWxjdWxhdGVkIGZvciBlYWNoLCBjcmMxIGFuZCBjcmMyLiAgY3JjMzJfY29tYmluZSgpIHJldHVybnMgdGhlIENSQy0zMgorICAgY2hlY2sgdmFsdWUgb2Ygc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGNyYzEsIGNyYzIsIGFuZAorICAgbGVuMi4KKyovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFyaW91cyBoYWNrcywgZG9uJ3QgbG9vayA6KSAqLworCisvKiBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG1hY3JvcyB0byBhbGxvdyBjaGVja2luZyB0aGUgemxpYiB2ZXJzaW9uCisgKiBhbmQgdGhlIGNvbXBpbGVyJ3MgdmlldyBvZiB6X3N0cmVhbToKKyAqLworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIGxldmVsLCBpbnQgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsIGludCBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5LCBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7CisjZGVmaW5lIGRlZmxhdGVJbml0KHN0cm0sIGxldmVsKSBcCisgICAgICAgIGRlZmxhdGVJbml0Xygoc3RybSksIChsZXZlbCksICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAorICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIFwKKyAgICAgICAgZGVmbGF0ZUluaXQyXygoc3RybSksKGxldmVsKSwobWV0aG9kKSwod2luZG93Qml0cyksKG1lbUxldmVsKSxcCisgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5KSwgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKKyAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCisgICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCisgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKworCisjaWYgIWRlZmluZWQoWlVUSUxfSCkgJiYgIWRlZmluZWQoTk9fRFVNTVlfREVDTCkKKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCitaRVhURVJOIGNvbnN0IGNoYXIgICAqIFpFWFBPUlQgekVycm9yICAgICAgICAgICBPRigoaW50KSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludCBPRigoel9zdHJlYW1wIHopKTsKK1pFWFRFUk4gY29uc3QgdUxvbmdmICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlICAgIE9GKCh2b2lkKSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBaTElCX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbml0cmFtZnMuZGVmYXVsdCBiL3Vzci9pbml0cmFtZnMuZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjM0MzdhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luaXRyYW1mcy5kZWZhdWx0CkBAIC0wLDAgKzEsOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSwgZGVmYXVsdCBpbml0cmFtZnMKKyMgU2VlIGdlbl9pbml0X2NwaW8gZm9yIHN5bnRheAorCitkaXIgZGV2IDA3NTUgMCAwCitub2QgZGV2L2NvbnNvbGUgMDYwMCAwIDAgYyA1IDEKK2RpciByb290IDA3MDAgMCAwCitmaWxlIGtpbml0IHVzci9raW5pdC9raW5pdCAwNzU1IDAgMAorc2xpbmsgaW5pdCBraW5pdCAwNzU1IDAgMApkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L0tidWlsZCBiL3Vzci9raW5pdC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxZDQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9LYnVpbGQKQEAgLTAsMCArMSwzNyBAQAorIworIyBLYnVpbGQgZmlsZSBmb3Iga2luaXQKKyMKKworIyBsaWJyYXJ5IHBhcnQgb2Yga2luaXQuIElzIHVzZWQgYnkgcHJvZ3JhbXMgaW4gc3ViLWRpcmVjdG9yaWVzIChyZXN1bWUgZXQgYWwpCitsaWIteSAgIDo9IG5hbWVfdG9fZGV2Lm8gZGV2bmFtZS5vIGdldGFyZy5vCisjIHVzZSBsaWIgZm9yIGtpbml0CitraW5pdC15ICA6PSBsaWIuYQorCitraW5pdC15ICArPSBraW5pdC5vIGRvX21vdW50cy5vIHJhbWRpc2tfbG9hZC5vIGluaXRyZC5vCitraW5pdC15ICArPSBnZXRpbnRmaWxlLm8gcmVhZGZpbGUubyB4cGlvLm8KK2tpbml0LXkgICs9IGRvX21vdW50c19tZC5vIGRvX21vdW50c19tdGQubyBuZnNyb290Lm8KKwora2luaXQteSAgKz0gaXBjb25maWcvCitraW5pdC15ICArPSBuZnNtb3VudC8KK2tpbml0LXkgICs9IHJ1bi1pbml0Lwora2luaXQteSAgKz0gZnN0eXBlLwora2luaXQteSAgKz0gcmVzdW1lLworCitzdGF0aWMteSA6PSBraW5pdAorc2hhcmVkLXkgOj0ga2luaXQuc2hhcmVkCitraW5pdC5zaGFyZWQteSA6PSAkKGtpbml0LXkpCisKKyMgQWRkaXRpb25hbCBpbmNsdWRlIHBhdGhzIGZpbGVzCitLTElCQ0NGTEFHUyArPSAtSSQoc3JjdHJlZSkvJChzcmMpL2ZzdHlwZSBcCisJICAgICAgIC1JJChzcmN0cmVlKS8kKHNyYykvaXBjb25maWcgXAorICAJICAgICAgIC1JJChzcmN0cmVlKS8kKHNyYykvbmZzbW91bnQgXAorICAJICAgICAgIC1JJChzcmN0cmVlKS8kKHNyYykvcmVzdW1lIFwKKyAJICAgICAgIC1JJChzcmN0cmVlKS8kKHNyYykvcnVuLWluaXQKKworIyBDbGVhbmluZwordGFyZ2V0cyArPSBraW5pdCBraW5pdC5nIGtpbml0LnNoYXJlZCBraW5pdC5zaGFyZWQuZworc3ViZGlyLSA6PSBmc3R5cGUgaXBjb25maWcgbmZzbW91bnQgcmVzdW1lIHJ1bi1pbml0CisKKworIyBpbnN0YWxsIGJpbmFyeQoraW5zdGFsbC15IDo9IGtpbml0IGtpbml0LnNoYXJlZApkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L1JFQURNRSBiL3Vzci9raW5pdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3ZjY0NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9SRUFETUUKQEAgLTAsMCArMSw5IEBACitraW5pdCAtIHRpbnkgaW5pdCBwcm9ncmFtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcHJvZ3JhbSBpcyBpbnRlbmRlZCBmb3IgdXNlIGFzIC9zYmluL2luaXQgaW4gYW4gaW5pdHJhbWZzCitlbnZpcm9ubWVudC4gIEl0IGN1cnJlbnRseSByZXBsYWNlcyB0aGUga2VybmVsJ3MgaXBjb25maWcgYW5kIG5mc3Jvb3QKK2NvZGUuCisKKy0tCitCcnlhbiBPJ1N1bGxpdmFuICgyMDAzLzA1LzA1KQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2Rldm5hbWUuYyBiL3Vzci9raW5pdC9kZXZuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViMjEzNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9kZXZuYW1lLmMKQEAgLTAsMCArMSwxMTIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKworLyoKKyAqIFByaW50IHRoZSBuYW1lIG9mIGEgYmxvY2sgZGV2aWNlLgorICovCisjZGVmaW5lIEJVRl9TSVpFCTUxMgorCitzdGF0aWMgaW50IHNjYW5zeXNkaXIoY2hhciAqbmFtZWJ1ZiwgY2hhciAqc3lzZGlyLCBkZXZfdCBkZXYpCit7CisJY2hhciAqZGlydGFpbHB0ciA9IHN0cmNocihzeXNkaXIsICdcMCcpOworCURJUiAqZGlyOworCWludCBkb25lID0gMDsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwljaGFyICpzeXN0YWlsOworCUZJTEUgKnN5c2RldjsKKwl1bnNpZ25lZCBsb25nIG1hLCBtaTsKKwljaGFyICplcDsKKwlzc2l6ZV90IHJkOworCisJaWYgKCEoZGlyID0gb3BlbmRpcihzeXNkaXIpKSkKKwkJcmV0dXJuIDA7CisKKwkqZGlydGFpbHB0cisrID0gJy8nOworCisJd2hpbGUgKCFkb25lICYmIChkZSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJLyogQXNzdW1lIGlmIHdlIHNlZSBhIGRvdC1uYW1lIGluIHN5c2ZzIGl0J3Mgc3BlY2lhbCAqLworCQlpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisJCQljb250aW51ZTsKKworCQlpZiAoZGUtPmRfdHlwZSAhPSBEVF9VTktOT1dOICYmIGRlLT5kX3R5cGUgIT0gRFRfRElSKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmxlbihkZS0+ZF9uYW1lKSA+PQorCQkgICAgKEJVRl9TSVpFIC0gNjQpIC0gKGRpcnRhaWxwdHIgLSBzeXNkaXIpKQorCQkJY29udGludWU7CS8qIEJhZG5lc3MuLi4gKi8KKworCQlzdHJjcHkoZGlydGFpbHB0ciwgZGUtPmRfbmFtZSk7CisJCXN5c3RhaWwgPSBzdHJjaHIoc3lzZGlyLCAnXDAnKTsKKworCQlzdHJjcHkoc3lzdGFpbCwgIi9kZXYiKTsKKwkJaWYgKCEoc3lzZGV2ID0gZm9wZW4oc3lzZGlyLCAiciIpKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFidXNpbmcgdGhlIG5hbWVidWYgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UgaGVyZS4gKi8KKwkJcmQgPSBmcmVhZChuYW1lYnVmLCAxLCBCVUZfU0laRSwgc3lzZGV2KTsKKwkJbmFtZWJ1ZltyZF0gPSAnXDAnOwkvKiBKdXN0IGluIGNhc2UuLi4gKi8KKworCQlmY2xvc2Uoc3lzZGV2KTsKKworCQltYSA9IHN0cnRvdWwobmFtZWJ1ZiwgJmVwLCAxMCk7CisJCWlmIChtYSAhPSBtYWpvcihkZXYpIHx8ICplcCAhPSAnOicpCisJCQljb250aW51ZTsKKworCQltaSA9IHN0cnRvdWwoZXAgKyAxLCAmZXAsIDEwKTsKKwkJaWYgKCplcCAhPSAnXG4nKQorCQkJY29udGludWU7CisKKwkJaWYgKG1pID09IG1pbm9yKGRldikpIHsKKwkJCS8qIEZvdW5kIGl0ISAqLworCQkJc3RyY3B5KG5hbWVidWYsIGRlLT5kX25hbWUpOworCQkJZG9uZSA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBoYXZlIGEgbWFqb3IgbnVtYmVyIG1hdGNoLCBzY2FuIGZvciBwYXJ0aXRpb25zICovCisJCQkqc3lzdGFpbCA9ICdcMCc7CisJCQlkb25lID0gc2NhbnN5c2RpcihuYW1lYnVmLCBzeXNkaXIsIGRldik7CisJCX0KKwl9CisKKwljbG9zZWRpcihkaXIpOworCXJldHVybiBkb25lOworfQorCitjb25zdCBjaGFyICpiZGV2bmFtZShkZXZfdCBkZXYpCit7CisJc3RhdGljIGNoYXIgYnVmW0JVRl9TSVpFXTsKKwljaGFyIHN5c2RpcltCVUZfU0laRV07CisJY2hhciAqcDsKKworCXN0cmNweShzeXNkaXIsICIvc3lzL2Jsb2NrIik7CisKKwlpZiAoIXNjYW5zeXNkaXIoYnVmLCBzeXNkaXIsIGRldikpCisJCXN0cmNweShidWYsICJkZXYiKTsJLyogcHJpbnRzIGUuZy4gZGV2KDMsNSkgKi8KKworCXAgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKwlzbnByaW50ZihwLCBzaXplb2YgYnVmIC0gKHAgLSBidWYpLCAiKCVkLCVkKSIsIG1ham9yKGRldiksIG1pbm9yKGRldikpOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2lmZGVmIFRFU1RfREVWTkFNRQkJLyogU3RhbmRhbG9uZSB0ZXN0ICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJZGV2X3QgZGV2OworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlkZXYgPSBzdHJ0b3VsKGFyZ3ZbaV0sIE5VTEwsIDApOworCisJCXByaW50ZigiMHglMDh4ID0gJXNcbiIsICh1bnNpZ25lZCBpbnQpZGV2LCBiZGV2bmFtZShkZXYpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCQkJCS8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9kb19tb3VudHMuYyBiL3Vzci9raW5pdC9kb19tb3VudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFhMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2RvX21vdW50cy5jCkBAIC0wLDAgKzEsMjIxIEBACisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJkb19tb3VudHMuaCIKKyNpbmNsdWRlICJraW5pdC5oIgorI2luY2x1ZGUgImZzdHlwZS5oIgorI2luY2x1ZGUgInpsaWIuaCIKKworLyogQ3JlYXRlIHRoZSBkZXZpY2Ugbm9kZSAibmFtZSIgKi8KK2ludCBjcmVhdGVfZGV2KGNvbnN0IGNoYXIgKm5hbWUsIGRldl90IGRldikKK3sKKwl1bmxpbmsobmFtZSk7CisJcmV0dXJuIG1rbm9kKG5hbWUsIFNfSUZCTEsgfCAwNjAwLCBkZXYpOworfQorCisvKiBtb3VudCBhIGZpbGVzeXN0ZW0sIHBvc3NpYmx5IHRyeWluZyBhIHNldCBvZiBkaWZmZXJlbnQgdHlwZXMgKi8KK2NvbnN0IGNoYXIgKm1vdW50X2Jsb2NrKGNvbnN0IGNoYXIgKnNvdXJjZSwgY29uc3QgY2hhciAqdGFyZ2V0LAorCQkJY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCWNvbnN0IHZvaWQgKmRhdGEpCit7CisJY2hhciAqZnNsaXN0LCAqcCwgKmVwOworCWNvbnN0IGNoYXIgKnJwOworCXNzaXplX3QgZnNieXRlczsKKwlpbnQgZmQ7CisKKwlpZiAodHlwZSkgeworCQlERUJVRygoImtpbml0OiB0cnlpbmcgdG8gbW91bnQgJXMgb24gJXMgd2l0aCB0eXBlICVzXG4iLAorCQkgICAgICAgc291cmNlLCB0YXJnZXQsIHR5cGUpKTsKKwkJaW50IHJ2ID0gbW91bnQoc291cmNlLCB0YXJnZXQsIHR5cGUsIGZsYWdzLCBkYXRhKTsKKwkJLyogTW91bnQgcmVhZG9ubHkgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChydiA9PSAtMSAmJiBlcnJubyA9PSBFQUNDRVMgJiYgIShmbGFncyAmIE1TX1JET05MWSkpCisJCQlydiA9IG1vdW50KHNvdXJjZSwgdGFyZ2V0LCB0eXBlLCBmbGFncyB8IE1TX1JET05MWSwKKwkJCQkgICBkYXRhKTsKKwkJcmV0dXJuIHJ2ID8gTlVMTCA6IHR5cGU7CisJfQorCisJLyogSWYgbm8gdHlwZSBnaXZlbiwgdHJ5IHRvIGlkZW50aWZ5IHRoZSB0eXBlIGZpcnN0OyB0aGlzCisJICAgYWxzbyB0YWtlcyBjYXJlIG9mIHNwZWNpZmljIG9yZGVyaW5nIHJlcXVpcmVtZW50cywgbGlrZQorCSAgIGV4dDMgYmVmb3JlIGV4dDIuLi4gKi8KKwlmZCA9IG9wZW4oc291cmNlLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJaW50IGVyciA9IGlkZW50aWZ5X2ZzKGZkLCAmdHlwZSwgTlVMTCwgMCk7CisJCWNsb3NlKGZkKTsKKworCQlpZiAoIWVyciAmJiB0eXBlKSB7CisJCQlERUJVRygoImtpbml0OiAlcyBhcHBlYXJzIHRvIGJlIGEgJXMgZmlsZXN5c3RlbVxuIiwKKwkJCSAgICAgICBzb3VyY2UsIHR5cGUpKTsKKwkJCXR5cGUgPSBtb3VudF9ibG9jayhzb3VyY2UsIHRhcmdldCwgdHlwZSwgZmxhZ3MsIGRhdGEpOworCQkJaWYgKHR5cGUpCisJCQkJcmV0dXJuIHR5cGU7CisJCX0KKwl9CisKKwlERUJVRygoImtpbml0OiBmYWlsZWQgdG8gaWRlbnRpZnkgZmlsZXN5c3RlbSAlcywgdHJ5aW5nIGFsbFxuIiwKKwkgICAgICAgc291cmNlKSk7CisKKwlmc2J5dGVzID0gcmVhZGZpbGUoIi9wcm9jL2ZpbGVzeXN0ZW1zIiwgJmZzbGlzdCk7CisKKwllcnJubyA9IEVJTlZBTDsKKwlpZiAoZnNieXRlcyA8IDApCisJCXJldHVybiBOVUxMOworCisJcCA9IGZzbGlzdDsKKwllcCA9IGZzbGlzdCArIGZzYnl0ZXM7CisKKwlycCA9IE5VTEw7CisKKwl3aGlsZSAocCA8IGVwKSB7CisJCXR5cGUgPSBwOworCQlwID0gc3RyY2hyKHAsICdcbicpOworCQlpZiAoIXApCisJCQlicmVhazsKKwkJKnArKyA9ICdcMCc7CisJCWlmICgqdHlwZSAhPSAnXHQnKQkvKiBXZSBjYW4ndCBtb3VudCBhIGJsb2NrIGRldmljZSBhcyBhICJub2RldiIgZnMgKi8KKwkJCWNvbnRpbnVlOworCisJCXR5cGUrKzsKKwkJcnAgPSBtb3VudF9ibG9jayhzb3VyY2UsIHRhcmdldCwgdHlwZSwgZmxhZ3MsIGRhdGEpOworCQlpZiAocnApCisJCQlicmVhazsKKwkJaWYgKGVycm5vICE9IEVJTlZBTCkKKwkJCWJyZWFrOworCX0KKworCWZyZWUoZnNsaXN0KTsKKwlyZXR1cm4gcnA7Cit9CisKKy8qIG1vdW50IHRoZSByb290IGZpbGVzeXN0ZW0gZnJvbSBhIGJsb2NrIGRldmljZSAqLworc3RhdGljIGludAorbW91bnRfYmxvY2tfcm9vdChpbnQgYXJnYywgY2hhciAqYXJndltdLCBkZXZfdCByb290X2RldiwKKwkJIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJY29uc3QgY2hhciAqZGF0YSwgKnJwOworCisJZGF0YSA9IGdldF9hcmcoYXJnYywgYXJndiwgInJvb3RmbGFncz0iKTsKKwljcmVhdGVfZGV2KCIvZGV2L3Jvb3QiLCByb290X2Rldik7CisKKwllcnJubyA9IDA7CisKKwlpZiAodHlwZSkgeworCQlpZiAoKHJwID0gbW91bnRfYmxvY2soIi9kZXYvcm9vdCIsICIvcm9vdCIsIHR5cGUsIGZsYWdzLCBkYXRhKSkpCisJCQlnb3RvIG9rOworCQlpZiAoZXJybm8gIT0gRUlOVkFMKQorCQkJZ290byBiYWQ7CisJfQorCisJaWYgKCFlcnJubworCSAgICAmJiAocnAgPSBtb3VudF9ibG9jaygiL2Rldi9yb290IiwgIi9yb290IiwgTlVMTCwgZmxhZ3MsIGRhdGEpKSkKKwkJZ290byBvazsKKworICAgICAgYmFkOgorCWlmIChlcnJubyAhPSBFSU5WQUwpIHsKKwkJLyoKKwkJICogQWxsb3cgdGhlIHVzZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmYWlsZWQgb3BlbgorCQkgKiBhbmQgYmFkIHN1cGVyYmxvY2sgb24gcm9vdCBkZXZpY2UuCisJCSAqLworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDYW5ub3Qgb3BlbiByb290IGRldmljZSAlc1xuIiwKKwkJCXByb2duYW1lLCBiZGV2bmFtZShyb290X2RldikpOworCQlyZXR1cm4gLWVycm5vOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IFVuYWJsZSB0byBtb3VudCByb290IGZzIG9uIGRldmljZSAlc1xuIiwKKwkJCXByb2duYW1lLCBiZGV2bmFtZShyb290X2RldikpOworCQlyZXR1cm4gLUVTUkNIOworCX0KKworICAgICAgb2s6CisJcHJpbnRmKCIlczogTW91bnRlZCByb290ICglcyBmaWxlc3lzdGVtKSVzLlxuIiwKKwkgICAgICAgcHJvZ25hbWUsIHJwLCAoZmxhZ3MgJiBNU19SRE9OTFkpID8gIiByZWFkb25seSIgOiAiIik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbW91bnRfcm9vdChpbnQgYXJnYywgY2hhciAqYXJndltdLCBkZXZfdCByb290X2RldiwgY29uc3QgY2hhciAqcm9vdF9kZXZfbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gTVNfUkRPTkxZIHwgTVNfVkVSQk9TRTsKKwlpbnQgcmV0OworCWNvbnN0IGNoYXIgKnR5cGUgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyb290ZnN0eXBlPSIpOworCisJaWYgKGdldF9mbGFnKGFyZ2MsIGFyZ3YsICJydyIpID4gZ2V0X2ZsYWcoYXJnYywgYXJndiwgInJvIikpIHsKKwkJREVCVUcoKCJraW5pdDogbW91bnRpbmcgcm9vdCByd1xuIikpOworCQlmbGFncyAmPSB+TVNfUkRPTkxZOworCX0KKworCWlmICh0eXBlKSB7CisJCWlmICghc3RyY21wKHR5cGUsICJuZnMiKSkKKwkJCXJvb3RfZGV2ID0gUm9vdF9ORlM7CisJCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImpmZnMyIikgJiYgIW1ham9yKHJvb3RfZGV2KSkKKwkJCXJvb3RfZGV2ID0gUm9vdF9NVEQ7CisJfQorCisJc3dpdGNoIChyb290X2RldikgeworCWNhc2UgUm9vdF9ORlM6CisJCXJldCA9IG1vdW50X25mc19yb290KGFyZ2MsIGFyZ3YsIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBSb290X01URDoKKwkJcmV0ID0gbW91bnRfbXRkX3Jvb3QoYXJnYywgYXJndiwgcm9vdF9kZXZfbmFtZSwgdHlwZSwgZmxhZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBtb3VudF9ibG9ja19yb290KGFyZ2MsIGFyZ3YsIHJvb3RfZGV2LCB0eXBlLCBmbGFncyk7CisJCWJyZWFrOworCX0KKworCWlmICghcmV0KQorCQljaGRpcigiL3Jvb3QiKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBkb19tb3VudHMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljb25zdCBjaGFyICpyb290X2Rldl9uYW1lID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAicm9vdD0iKTsKKwljb25zdCBjaGFyICpyb290X2RlbGF5ID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAicm9vdGRlbGF5PSIpOworCWNvbnN0IGNoYXIgKmxvYWRfcmFtZGlzayA9IGdldF9hcmcoYXJnYywgYXJndiwgImxvYWRfcmFtZGlzaz0iKTsKKwlkZXZfdCByb290X2RldiA9IDA7CisKKwlERUJVRygoImtpbml0OiBkb19tb3VudHNcbiIpKTsKKworCWlmIChyb290X2RlbGF5KSB7CisJCWludCBkZWxheSA9IGF0b2kocm9vdF9kZWxheSk7CisJCWZwcmludGYoc3RkZXJyLCAiV2FpdGluZyAlZCBzIGJlZm9yZSBtb3VudGluZyByb290IGRldmljZS4uLlxuIiwKKwkJCWRlbGF5KTsKKwkJc2xlZXAoZGVsYXkpOworCX0KKworCW1kX3J1bihhcmdjLCBhcmd2KTsKKworCWlmIChyb290X2Rldl9uYW1lKSB7CisJCXJvb3RfZGV2ID0gbmFtZV90b19kZXZfdChyb290X2Rldl9uYW1lKTsKKwl9IGVsc2UgaWYgKGdldF9hcmcoYXJnYywgYXJndiwgIm5mc3Jvb3Q9IikgfHwKKwkJICAgZ2V0X2FyZyhhcmdjLCBhcmd2LCAibmZzYWRkcnM9IikpIHsKKwkJcm9vdF9kZXYgPSBSb290X05GUzsKKwl9IGVsc2UgeworCQlsb25nIHJvb3RkZXY7CisJCWdldGludGZpbGUoIi9wcm9jL3N5cy9rZXJuZWwvcmVhbC1yb290LWRldiIsICZyb290ZGV2KTsKKwkJcm9vdF9kZXYgPSAoZGV2X3QpIHJvb3RkZXY7CisJfQorCisJREVCVUcoKCJraW5pdDogcm9vdF9kZXYgPSAlc1xuIiwgYmRldm5hbWUocm9vdF9kZXYpKSk7CisKKwlpZiAoaW5pdHJkX2xvYWQoYXJnYywgYXJndiwgcm9vdF9kZXYpKSB7CisJCURFQlVHKCgiaW5pdHJkIGxvYWRlZFxuIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobG9hZF9yYW1kaXNrICYmIGF0b2kobG9hZF9yYW1kaXNrKSkgeworCQlpZiAocmFtZGlza19sb2FkKGFyZ2MsIGFyZ3YsIHJvb3RfZGV2KSkKKwkJCXJvb3RfZGV2ID0gUm9vdF9SQU0wOworCX0KKworCXJldHVybiBtb3VudF9yb290KGFyZ2MsIGFyZ3YsIHJvb3RfZGV2LCByb290X2Rldl9uYW1lKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9kb19tb3VudHMuaCBiL3Vzci9raW5pdC9kb19tb3VudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDI0ZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2RvX21vdW50cy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBkb19tb3VudHMuaAorICovCisKKyNpZm5kZWYgRE9fTU9VTlRTX0gKKyNkZWZpbmUgRE9fTU9VTlRTX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjZGVmaW5lCVJvb3RfUkFNMAlfX21ha2VkZXYoMSwwKQorCisvKiBUaGVzZSBkZXZpY2UgbnVtYmVycyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgKi8KKyNkZWZpbmUgUm9vdF9ORlMJX19tYWtlZGV2KDAsMjU1KQorI2RlZmluZSBSb290X01URAlfX21ha2VkZXYoMCwyNTQpCisKK2ludCBjcmVhdGVfZGV2KGNvbnN0IGNoYXIgKm5hbWUsIGRldl90IGRldik7CisKK2Rldl90IG5hbWVfdG9fZGV2X3QoY29uc3QgY2hhciAqbmFtZSk7CisKK2NvbnN0IGNoYXIgKm1vdW50X2Jsb2NrKGNvbnN0IGNoYXIgKnNvdXJjZSwgY29uc3QgY2hhciAqdGFyZ2V0LAorCQkJY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCWNvbnN0IHZvaWQgKmRhdGEpOworCitpbnQgbW91bnRfcm9vdChpbnQgYXJnYywgY2hhciAqYXJndltdLCBkZXZfdCByb290X2RldiwKKwkgICAgICAgY29uc3QgY2hhciAqcm9vdF9kZXZfbmFtZSk7CisKK2ludCBtb3VudF9tdGRfcm9vdChpbnQgYXJnYywgY2hhciAqYXJndltdLCBjb25zdCBjaGFyICpyb290X2Rldl9uYW1lLAorCQkgICBjb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworaW50IGRvX21vdW50cyhpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworaW50IGluaXRyZF9sb2FkKGludCBhcmdjLCBjaGFyICphcmd2W10sIGRldl90IHJvb3RfZGV2KTsKKworc3RhdGljIGlubGluZSBkZXZfdCBic3RhdChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKHN0YXQobmFtZSwgJnN0KSB8fCAhU19JU0JMSyhzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHN0LnN0X3JkZXY7Cit9CisKK2ludCBsb2FkX3JhbWRpc2tfY29tcHJlc3NlZChjb25zdCBjaGFyICpkZXZwYXRoLCBGSUxFICogd2ZkLAorCQkJICAgIG9mZl90IHJhbWRpc2tfc3RhcnQpOworCisjZW5kaWYJCQkJLyogRE9fTU9VTlRTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9kb19tb3VudHNfbWQuYyBiL3Vzci9raW5pdC9kb19tb3VudHNfbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTZmZmJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2RvX21vdW50c19tZC5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogSGFuZGxlIGF1dG9jb25maWd1cmF0aW9uIG9mIG1kIGRldmljZXMuICBUaGlzIGlzIHVnbHksIHBhcnRpYWxseSBzaW5jZQorICogaXQgc3RpbGwgcmVsaWVzIG9uIGEgc2l6YWJsZSBrZXJuZWwgY29tcG9uZW50LgorICoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IGtlcm5lbC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy9tZC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisKKyNpbmNsdWRlICJkb19tb3VudHMuaCIKKworI2RlZmluZSAgTEVWRUxfTk9ORSAgICAgICAgICAgICAgKC0xMDAwMDAwKQorCisvKgorICogV2hlbiBtZCAoYW5kIGFueSByZXF1aXJlIHBlcnNvbmFsaXRpZXMpIGFyZSBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwKKyAqIChub3QgYSBtb2R1bGUpLCBhcnJheXMgY2FuIGJlIGFzc2VtYmxlcyBhcmUgYm9vdCB0aW1lIHVzaW5nIHdpdGggQVVUT0RFVEVDVAorICogd2hlcmUgc3BlY2lhbGx5IG1hcmtlZCBwYXJ0aXRpb25zIGFyZSByZWdpc3RlcmVkIHdpdGggbWRfYXV0b2RldGVjdF9kZXYoKSwKKyAqIGFuZCB3aXRoIE1EX0JPT1Qgd2hlcmUgZGV2aWNlcyB0byBiZSBjb2xsZWN0ZWQgYXJlIGdpdmVuIG9uIHRoZSBib290IGxpbmUKKyAqIHdpdGggbWQ9Li4uLi4KKyAqIFRoZSBjb2RlIGZvciB0aGF0IGlzIGhlcmUuCisgKi8KKworc3RhdGljIGludCByYWlkX25vYXV0b2RldGVjdCwgcmFpZF9hdXRvcGFydDsKKworc3RhdGljIHN0cnVjdCB7CisJaW50IG1pbm9yOworCWludCBwYXJ0aXRpb25lZDsKKwlpbnQgbGV2ZWw7CisJaW50IGNodW5rOworCWNoYXIgKmRldmljZV9uYW1lczsKK30gbWRfc2V0dXBfYXJnc1tNQVhfTURfREVWU107CisKK3N0YXRpYyBpbnQgbWRfc2V0dXBfZW50czsKKworLyoqCisgKglnZXRfb3B0aW9uIC0gUGFyc2UgaW50ZWdlciBmcm9tIGFuIG9wdGlvbiBzdHJpbmcKKyAqCUBzdHI6IG9wdGlvbiBzdHJpbmcKKyAqCUBwaW50OiAob3V0cHV0KSBpbnRlZ2VyIHZhbHVlIHBhcnNlZCBmcm9tIEBzdHIKKyAqCisgKglSZWFkIGFuIGludCBmcm9tIGFuIG9wdGlvbiBzdHJpbmc7IGlmIGF2YWlsYWJsZSBhY2NlcHQgYSBzdWJzZXF1ZW50CisgKgljb21tYSBhcyB3ZWxsLgorICoKKyAqCVJldHVybiB2YWx1ZXM6CisgKgkwIDogbm8gaW50IGluIHN0cmluZworICoJMSA6IGludCBmb3VuZCwgbm8gc3Vic2VxdWVudCBjb21tYQorICoJMiA6IGludCBmb3VuZCBpbmNsdWRpbmcgYSBzdWJzZXF1ZW50IGNvbW1hCisgKi8KKworc3RhdGljIGludCBnZXRfb3B0aW9uKGNoYXIgKipzdHIsIGludCAqcGludCkKK3sKKwljaGFyICpjdXIgPSAqc3RyOworCisJaWYgKCFjdXIgfHwgISgqY3VyKSkKKwkJcmV0dXJuIDA7CisJKnBpbnQgPSBzdHJ0b2woY3VyLCBzdHIsIDApOworCWlmIChjdXIgPT0gKnN0cikKKwkJcmV0dXJuIDA7CisJaWYgKCoqc3RyID09ICcsJykgeworCQkoKnN0cikrKzsKKwkJcmV0dXJuIDI7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBwYXJ0aXRpb25lZCBtZCBkZXZpY2UgbWFqb3IgbnVtYmVyLi4uIG9mIGNvdXJzZSB0aGlzICpIQUQqCisgKiB0byBiZSBkb25lIGR5bmFtaWNhbGx5IGluc3RlYWQgb2YgdXNpbmcgYSByZWdpc3RlcmVkIG51bWJlci4KKyAqIFNpZ2guICBEb3VibGUgc2lnaC4KKyAqLworc3RhdGljIGludCBtZHBfbWFqb3Iodm9pZCkKK3sKKwlzdGF0aWMgaW50IGZvdW5kID0gMDsKKwlGSUxFICpmOworCWNoYXIgbGluZVs1MTJdLCAqcDsKKwlpbnQgaXNfYmxrLCBtYWpvcl9ubzsKKworCWlmIChmb3VuZCkKKwkJcmV0dXJuIGZvdW5kOworCisJZiA9IGZvcGVuKCIvcHJvYy9kZXZpY2VzIiwgInIiKTsKKwlpc19ibGsgPSAwOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZikpIHsKKwkJaWYgKCFzdHJjbXAobGluZSwgIkJsb2NrIGRldmljZXM6XG4iKSkKKwkJCWlzX2JsayA9IDE7CisJCWlmIChpc19ibGspIHsKKwkJCW1ham9yX25vID0gc3RydG9sKGxpbmUsICZwLCAxMCk7CisJCQl3aGlsZSAoKnAgJiYgaXNzcGFjZSgqcCkpCisJCQkJcCsrOworCisJCQlpZiAobWFqb3Jfbm8gPT0gMCkJLyogTm90IGEgbnVtYmVyICovCisJCQkJaXNfYmxrID0gMDsKKwkJCWVsc2UgaWYgKG1ham9yX25vID4gMCAmJiAhc3RyY21wKHAsICJtZHAiKSkgeworCQkJCWZvdW5kID0gbWFqb3Jfbm87CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGYpOworCisJaWYgKCFmb3VuZCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJFcnJvcjogbWRwIGRldmljZXMgZGV0ZWN0ZWQgYnV0IG5vIG1kcCBkZXZpY2UgZm91bmQhXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qCisgKiBQYXJzZSB0aGUgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMgZ2l2ZW4gb3VyIGtlcm5lbCwgYnV0IGRvIG5vdAorICogYWN0dWFsbHkgdHJ5IHRvIGludm9rZSB0aGUgTUQgZGV2aWNlIG5vdzsgdGhhdCBpcyBoYW5kbGVkIGJ5CisgKiBtZF9zZXR1cF9kcml2ZSBhZnRlciB0aGUgbG93LWxldmVsIGRpc2sgZHJpdmVycyBoYXZlIGluaXRpYWxpc2VkLgorICoKKyAqIDI3LzExLzE5OTk6IEZpeGVkIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIDIuMyBrZXJuZWwgKHdoaWNoCisgKiAgICAgICAgICAgICBhc3NpZ25zIHRoZSB0YXNrIG9mIHBhcnNpbmcgaW50ZWdlciBhcmd1bWVudHMgdG8gdGhlCisgKiAgICAgICAgICAgICBpbnZva2VkIHByb2dyYW0gbm93KS4gIEFkZGVkIGFiaWxpdHkgdG8gaW5pdGlhbGlzZSBhbGwKKyAqICAgICAgICAgICAgIHRoZSBNRCBkZXZpY2VzIChieSBzcGVjaWZ5aW5nIG11bHRpcGxlICJtZD0iIGxpbmVzKQorICogICAgICAgICAgICAgaW5zdGVhZCBvZiBqdXN0IG9uZS4gIC0tIEtUSworICogMThNYXkyMDAwOiBBZGRlZCBzdXBwb3J0IGZvciBwZXJzaXN0ZW50LXN1cGVyYmxvY2sgYXJyYXlzOgorICogICAgICAgICAgICAgbWQ9biwwLGZhY3RvcixmYXVsdCxkZXZpY2UtbGlzdCAgIHVzZXMgUkFJRDAgZm9yIGRldmljZSBuCisgKiAgICAgICAgICAgICBtZD1uLC0xLGZhY3RvcixmYXVsdCxkZXZpY2UtbGlzdCAgdXNlcyBMSU5FQVIgZm9yIGRldmljZSBuCisgKiAgICAgICAgICAgICBtZD1uLGRldmljZS1saXN0ICAgICAgcmVhZHMgYSBSQUlEIHN1cGVyYmxvY2sgZnJvbSB0aGUgZGV2aWNlcworICogICAgICAgICAgICAgZWxlbWVudHMgaW4gZGV2aWNlLWxpc3QgYXJlIHJlYWQgYnkgbmFtZV90b19rZGV2X3Qgc28gY2FuIGJlCisgKiAgICAgICAgICAgICBhIGhleCBudW1iZXIgb3Igc29tZXRoaW5nIGxpa2UgL2Rldi9oZGExIC9kZXYvc2RiCisgKiAyMDAxLTA2LTAzOiBEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorICoJCVNoaWZ0ZWQgbmFtZV90b19rZGV2X3QoKSBhbmQgcmVsYXRlZCBvcGVyYXRpb25zIHRvIG1kX3NldF9kcml2ZSgpCisgKgkJZm9yIGxhdGVyIGV4ZWN1dGlvbi4gUmV3cm90ZSBzZWN0aW9uIHRvIG1ha2UgZGV2ZnMgY29tcGF0aWJsZS4KKyAqLworc3RhdGljIGludCBtZF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IG1pbm9yLCBsZXZlbCwgZmFjdG9yLCBmYXVsdCwgcGFydGl0aW9uZWQgPSAwOworCWNoYXIgKnBlcm5hbWUgPSAiIjsKKwljaGFyICpzdHIxOworCWludCBlbnQ7CisKKwlpZiAoKnN0ciA9PSAnZCcpIHsKKwkJcGFydGl0aW9uZWQgPSAxOworCQlzdHIrKzsKKwl9CisJaWYgKGdldF9vcHRpb24oJnN0ciwgJm1pbm9yKSAhPSAyKSB7CS8qIE1EIE51bWJlciAqLworCQlmcHJpbnRmKHN0ZGVyciwgIm1kOiBUb28gZmV3IGFyZ3VtZW50cyBzdXBwbGllZCB0byBtZD0uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXN0cjEgPSBzdHI7CisJaWYgKG1pbm9yID49IE1BWF9NRF9ERVZTKSB7CisJCWZwcmludGYoc3RkZXJyLCAibWQ6IG1kPSVkLCBNaW5vciBkZXZpY2UgbnVtYmVyIHRvbyBoaWdoLlxuIiwKKwkJCW1pbm9yKTsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoZW50ID0gMDsgZW50IDwgbWRfc2V0dXBfZW50czsgZW50KyspCisJCWlmIChtZF9zZXR1cF9hcmdzW2VudF0ubWlub3IgPT0gbWlub3IgJiYKKwkJICAgIG1kX3NldHVwX2FyZ3NbZW50XS5wYXJ0aXRpb25lZCA9PSBwYXJ0aXRpb25lZCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIm1kOiBtZD0lcyVkLCBTcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuICIKKwkJCQkiUmVwbGFjaW5nIHByZXZpb3VzIGRlZmluaXRpb24uXG4iLAorCQkJCXBhcnRpdGlvbmVkID8gImQiIDogIiIsIG1pbm9yKTsKKwkJCWJyZWFrOworCQl9CisJaWYgKGVudCA+PSBNQVhfTURfREVWUykgeworCQlmcHJpbnRmKHN0ZGVyciwgIm1kOiBtZD0lcyVkIC0gdG9vIG1hbnkgbWQgaW5pdGlhbGlzYXRpb25zXG4iLAorCQkJcGFydGl0aW9uZWQgPyAiZCIgOiAiIiwgbWlub3IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGVudCA+PSBtZF9zZXR1cF9lbnRzKQorCQltZF9zZXR1cF9lbnRzKys7CisJc3dpdGNoIChnZXRfb3B0aW9uKCZzdHIsICZsZXZlbCkpIHsJLyogUkFJRCBsZXZlbCAqLworCWNhc2UgMjoJCS8qIGNvdWxkIGJlIDAgb3IgLTEuLiAqLworCQlpZiAobGV2ZWwgPT0gMCB8fCBsZXZlbCA9PSBMRVZFTF9MSU5FQVIpIHsKKwkJCWlmIChnZXRfb3B0aW9uKCZzdHIsICZmYWN0b3IpICE9IDIgfHwJLyogQ2h1bmsgU2l6ZSAqLworCQkJICAgIGdldF9vcHRpb24oJnN0ciwgJmZhdWx0KSAhPSAyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJtZDogVG9vIGZldyBhcmd1bWVudHMgc3VwcGxpZWQgdG8gbWQ9LlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltZF9zZXR1cF9hcmdzW2VudF0ubGV2ZWwgPSBsZXZlbDsKKwkJCW1kX3NldHVwX2FyZ3NbZW50XS5jaHVuayA9IDEgPDwgKGZhY3RvciArIDEyKTsKKwkJCWlmIChsZXZlbCA9PSBMRVZFTF9MSU5FQVIpCisJCQkJcGVybmFtZSA9ICJsaW5lYXIiOworCQkJZWxzZQorCQkJCXBlcm5hbWUgPSAicmFpZDAiOworCQkJYnJlYWs7CisJCX0KKwkJLyogRkFMTCBUSFJPVUdIICovCisJY2FzZSAxOgkJLyogdGhlIGZpcnN0IGRldmljZSBpcyBudW1lcmljICovCisJCXN0ciA9IHN0cjE7CisJCS8qIEZBTEwgVEhST1VHSCAqLworCWNhc2UgMDoKKwkJbWRfc2V0dXBfYXJnc1tlbnRdLmxldmVsID0gTEVWRUxfTk9ORTsKKwkJcGVybmFtZSA9ICJzdXBlci1ibG9jayI7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJtZDogV2lsbCBjb25maWd1cmUgbWQlcyVkICglcykgZnJvbSAlcywgYmVsb3cuXG4iLAorCQlwYXJ0aXRpb25lZD8iX2QiOiIiLCBtaW5vciwgcGVybmFtZSwgc3RyKTsKKwltZF9zZXR1cF9hcmdzW2VudF0uZGV2aWNlX25hbWVzID0gc3RyOworCW1kX3NldHVwX2FyZ3NbZW50XS5wYXJ0aXRpb25lZCA9IHBhcnRpdGlvbmVkOworCW1kX3NldHVwX2FyZ3NbZW50XS5taW5vciA9IG1pbm9yOworCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgTWRwTWlub3JTaGlmdCA2CisKK3N0YXRpYyB2b2lkIG1kX3NldHVwX2RyaXZlKHZvaWQpCit7CisJaW50IGRldl9taW5vciwgaSwgZW50LCBwYXJ0aXRpb25lZDsKKwlkZXZfdCBkZXY7CisJZGV2X3QgZGV2aWNlc1tNRF9TQl9ESVNLUyArIDFdOworCisJZm9yIChlbnQgPSAwOyBlbnQgPCBtZF9zZXR1cF9lbnRzOyBlbnQrKykgeworCQlpbnQgZmQ7CisJCWludCBlcnIgPSAwOworCQljaGFyICpkZXZuYW1lOworCQltZHVfZGlza19pbmZvX3QgZGluZm87CisJCWNoYXIgbmFtZVsxNl07CisKKwkJZGV2X21pbm9yID0gbWRfc2V0dXBfYXJnc1tlbnRdLm1pbm9yOworCQlwYXJ0aXRpb25lZCA9IG1kX3NldHVwX2FyZ3NbZW50XS5wYXJ0aXRpb25lZDsKKwkJZGV2bmFtZSA9IG1kX3NldHVwX2FyZ3NbZW50XS5kZXZpY2VfbmFtZXM7CisKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsCisJCQkgIi9kZXYvbWQlcyVkIiwgcGFydGl0aW9uZWQgPyAiX2QiIDogIiIsIGRldl9taW5vcik7CisKKwkJaWYgKHBhcnRpdGlvbmVkKQorCQkJZGV2ID0gbWFrZWRldihtZHBfbWFqb3IoKSwgZGV2X21pbm9yIDw8IE1kcE1pbm9yU2hpZnQpOworCQllbHNlCisJCQlkZXYgPSBtYWtlZGV2KE1EX01BSk9SLCBkZXZfbWlub3IpOworCQljcmVhdGVfZGV2KG5hbWUsIGRldik7CisJCWZvciAoaSA9IDA7IGkgPCBNRF9TQl9ESVNLUyAmJiBkZXZuYW1lICE9IDA7IGkrKykgeworCQkJY2hhciAqcDsKKworCQkJcCA9IHN0cmNocihkZXZuYW1lLCAnLCcpOworCQkJaWYgKHApCisJCQkJKnArKyA9IDA7CisKKwkJCWRldiA9IG5hbWVfdG9fZGV2X3QoZGV2bmFtZSk7CisJCQlpZiAoIWRldikgeworCQkJCWZwcmludGYoc3RkZXJyLCAibWQ6IFVua25vd24gZGV2aWNlIG5hbWU6ICVzXG4iLAorCQkJCQlkZXZuYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGV2aWNlc1tpXSA9IGRldjsKKworCQkJZGV2bmFtZSA9IHA7CisJCX0KKwkJZGV2aWNlc1tpXSA9IDA7CisKKwkJaWYgKCFpKQorCQkJY29udGludWU7CisKKwkJZnByaW50ZihzdGRlcnIsICJtZDogTG9hZGluZyBtZCVzJWQ6ICVzXG4iLAorCQkJcGFydGl0aW9uZWQgPyAiX2QiIDogIiIsIGRldl9taW5vciwKKwkJCW1kX3NldHVwX2FyZ3NbZW50XS5kZXZpY2VfbmFtZXMpOworCisJCWZkID0gb3BlbihuYW1lLCAwLCAwKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJtZDogb3BlbiBmYWlsZWQgLSBjYW5ub3Qgc3RhcnQgIgorCQkJCSJhcnJheSAlc1xuIiwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaW9jdGwoZmQsIFNFVF9BUlJBWV9JTkZPLCAwKSA9PSAtRUJVU1kpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJtZDogSWdub3JpbmcgbWQ9JWQsIGFscmVhZHkgYXV0b2RldGVjdGVkLiAoVXNlIHJhaWQ9bm9hdXRvZGV0ZWN0KVxuIiwKKwkJCQlkZXZfbWlub3IpOworCQkJY2xvc2UoZmQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobWRfc2V0dXBfYXJnc1tlbnRdLmxldmVsICE9IExFVkVMX05PTkUpIHsKKwkJCS8qIG5vbi1wZXJzaXN0ZW50ICovCisJCQltZHVfYXJyYXlfaW5mb190IGFpbmZvOworCQkJYWluZm8ubGV2ZWwgPSBtZF9zZXR1cF9hcmdzW2VudF0ubGV2ZWw7CisJCQlhaW5mby5zaXplID0gMDsKKwkJCWFpbmZvLm5yX2Rpc2tzID0gMDsKKwkJCWFpbmZvLnJhaWRfZGlza3MgPSAwOworCQkJd2hpbGUgKGRldmljZXNbYWluZm8ucmFpZF9kaXNrc10pCisJCQkJYWluZm8ucmFpZF9kaXNrcysrOworCQkJYWluZm8ubWRfbWlub3IgPSBkZXZfbWlub3I7CisJCQlhaW5mby5ub3RfcGVyc2lzdGVudCA9IDE7CisKKwkJCWFpbmZvLnN0YXRlID0gKDEgPDwgTURfU0JfQ0xFQU4pOworCQkJYWluZm8ubGF5b3V0ID0gMDsKKwkJCWFpbmZvLmNodW5rX3NpemUgPSBtZF9zZXR1cF9hcmdzW2VudF0uY2h1bms7CisJCQllcnIgPSBpb2N0bChmZCwgU0VUX0FSUkFZX0lORk8sICZhaW5mbyk7CisJCQlmb3IgKGkgPSAwOyAhZXJyICYmIGkgPD0gTURfU0JfRElTS1M7IGkrKykgeworCQkJCWRldiA9IGRldmljZXNbaV07CisJCQkJaWYgKCFkZXYpCisJCQkJCWJyZWFrOworCQkJCWRpbmZvLm51bWJlciA9IGk7CisJCQkJZGluZm8ucmFpZF9kaXNrID0gaTsKKwkJCQlkaW5mby5zdGF0ZSA9CisJCQkJICAgICgxIDw8IE1EX0RJU0tfQUNUSVZFKSB8ICgxIDw8IE1EX0RJU0tfU1lOQyk7CisJCQkJZGluZm8ubWFqb3IgPSBtYWpvcihkZXYpOworCQkJCWRpbmZvLm1pbm9yID0gbWlub3IoZGV2KTsKKwkJCQllcnIgPSBpb2N0bChmZCwgQUREX05FV19ESVNLLCAmZGluZm8pOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogcGVyc2lzdGVudCAqLworCQkJZm9yIChpID0gMDsgaSA8PSBNRF9TQl9ESVNLUzsgaSsrKSB7CisJCQkJZGV2ID0gZGV2aWNlc1tpXTsKKwkJCQlpZiAoIWRldikKKwkJCQkJYnJlYWs7CisJCQkJZGluZm8ubWFqb3IgPSBtYWpvcihkZXYpOworCQkJCWRpbmZvLm1pbm9yID0gbWlub3IoZGV2KTsKKwkJCQlpb2N0bChmZCwgQUREX05FV19ESVNLLCAmZGluZm8pOworCQkJfQorCQl9CisJCWlmICghZXJyKQorCQkJZXJyID0gaW9jdGwoZmQsIFJVTl9BUlJBWSwgMCk7CisJCWlmIChlcnIpCisJCQlmcHJpbnRmKHN0ZGVyciwgIm1kOiBzdGFydGluZyBtZCVkIGZhaWxlZFxuIiwKKwkJCQlkZXZfbWlub3IpOworCQllbHNlIHsKKwkJCS8qIHJlcmVhZCB0aGUgcGFydGl0aW9uIHRhYmxlLgorCQkJICogSSAobmVpbGIpIGFuZCBub3Qgc3VyZSB3aHkgdGhpcyBpcyBuZWVkZWQsIGJ1dCBJIGNhbm5vdAorCQkJICogYm9vdCBhIGtlcm5lbCB3aXRoIGRldmZzIGNvbXBpbGVkIGluIGZyb20gcGFydGl0aW9uZWQgbWQKKwkJCSAqIGFycmF5IHdpdGhvdXQgaXQKKwkJCSAqLworCQkJY2xvc2UoZmQpOworCQkJZmQgPSBvcGVuKG5hbWUsIDAsIDApOworCQkJaW9jdGwoZmQsIEJMS1JSUEFSVCwgMCk7CisJCX0KKwkJY2xvc2UoZmQpOworCX0KK30KKworc3RhdGljIGludCByYWlkX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuLCBwb3M7CisKKwlsZW4gPSBzdHJsZW4oc3RyKSArIDE7CisJcG9zID0gMDsKKworCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJY2hhciAqY29tbWEgPSBzdHJjaHIoc3RyICsgcG9zLCAnLCcpOworCQlpbnQgd2xlbjsKKwkJaWYgKGNvbW1hKQorCQkJd2xlbiA9IChjb21tYSAtIHN0cikgLSBwb3M7CisJCWVsc2UKKwkJCXdsZW4gPSAobGVuIC0gMSkgLSBwb3M7CisKKwkJaWYgKCFzdHJuY21wKHN0ciwgIm5vYXV0b2RldGVjdCIsIHdsZW4pKQorCQkJcmFpZF9ub2F1dG9kZXRlY3QgPSAxOworCQlpZiAoc3RybmNtcChzdHIsICJwYXJ0aXRpb25hYmxlIiwgd2xlbikgPT0gMCkKKwkJCXJhaWRfYXV0b3BhcnQgPSAxOworCQlpZiAoc3RybmNtcChzdHIsICJwYXJ0Iiwgd2xlbikgPT0gMCkKKwkJCXJhaWRfYXV0b3BhcnQgPSAxOworCQlwb3MgKz0gd2xlbiArIDE7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBtZF9ydW5fc2V0dXAodm9pZCkKK3sKKwljcmVhdGVfZGV2KCIvZGV2L21kMCIsIG1ha2VkZXYoTURfTUFKT1IsIDApKTsKKwlpZiAocmFpZF9ub2F1dG9kZXRlY3QpCisJCWZwcmludGYoc3RkZXJyLAorCQkJIm1kOiBTa2lwcGluZyBhdXRvZGV0ZWN0aW9uIG9mIFJBSUQgYXJyYXlzLiAocmFpZD1ub2F1dG9kZXRlY3QpXG4iKTsKKwllbHNlIHsKKwkJaW50IGZkID0gb3BlbigiL2Rldi9tZDAiLCAwLCAwKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWlvY3RsKGZkLCBSQUlEX0FVVE9SVU4sCisJCQkgICAgICAodm9pZCAqKShpbnRwdHJfdCkgcmFpZF9hdXRvcGFydCk7CisJCQljbG9zZShmZCk7CisJCX0KKwl9CisJbWRfc2V0dXBfZHJpdmUoKTsKK30KKwordm9pZCBtZF9ydW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICoqcHAsICpwOworCisJZm9yIChwcCA9IGFyZ3Y7IChwID0gKnBwKTsgcHArKykgeworCQlpZiAoIXN0cm5jbXAocCwgInJhaWQ9IiwgNSkpCisJCQlyYWlkX3NldHVwKHAgKyA1KTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAocCwgIm1kPSIsIDMpKQorCQkJbWRfc2V0dXAocCArIDMpOworCX0KKworCW1kX3J1bl9zZXR1cCgpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2RvX21vdW50c19tdGQuYyBiL3Vzci9raW5pdC9kb19tb3VudHNfbXRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzMDkyMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9kb19tb3VudHNfbXRkLmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIE1vdW50IGFuIE1URCBkZXZpY2UgYXMgYSBjaGFyYWN0ZXIgZGV2aWNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJraW5pdC5oIgorI2luY2x1ZGUgImRvX21vdW50cy5oIgorCitpbnQgbW91bnRfbXRkX3Jvb3QoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY29uc3QgY2hhciAqcm9vdF9kZXZfbmFtZSwKKwkJICAgY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwljb25zdCBjaGFyICpkYXRhID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAicm9vdGZsYWdzPSIpOworCisJaWYgKCF0eXBlKQorCQl0eXBlID0gImpmZnMyIjsKKworCURFQlVHKCgiVHJ5aW5nIHRvIG1vdW50IE1URCAlcyBhcyByb290ICglcyBmaWxlc3lzdGVtKVxuIiwKKwkgICAgICAgcm9vdF9kZXZfbmFtZSwgdHlwZSkpOworCisJaWYgKG1vdW50KHJvb3RfZGV2X25hbWUsICIvcm9vdCIsIHR5cGUsIGZsYWdzLCBkYXRhKSkgeworCQlpbnQgZXJyID0gZXJybm87CisJCWZwcmludGYoc3RkZXJyLAorCQkJIiVzOiBVbmFibGUgdG8gbW91bnQgTVREICVzICglcyBmaWxlc3lzdGVtKSAiCisJCQkiYXMgcm9vdDogJXNcbiIsCisJCQlwcm9nbmFtZSwgcm9vdF9kZXZfbmFtZSwgdHlwZSwgc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiAtZXJyOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IE1vdW50ZWQgcm9vdCAoJXMgZmlsZXN5c3RlbSklcy5cbiIsCisJCQlwcm9nbmFtZSwgdHlwZSwgKGZsYWdzICYgTVNfUkRPTkxZKSA/ICIgcmVhZG9ubHkiIDogIiIpOworCQlyZXR1cm4gMDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvS2J1aWxkIGIvdXNyL2tpbml0L2ZzdHlwZS9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyMGRiMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvS2J1aWxkCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIGZzdHlwZQorIworCitzdGF0aWMteSA6PSBzdGF0aWMvZnN0eXBlCitzaGFyZWQteSA6PSBzaGFyZWQvZnN0eXBlCisKKyMgY29tbW9uIC5vIGZpbGVzCitvYmpzIDo9IG1haW4ubyBmc3R5cGUubworCisjIFRPRE8gLSBkbyB3ZSB3YW50IGEgc3RyaXBwZWQgdmVyc2lvbgorIyBUT0RPIC0gZG8gd2Ugd2FudCB0aGUgc3RhdGljLmcgKyBzaGFyZWQuZyBkaXJlY3Rvcmllcz8KKworIyBDcmVhdGUgYnVpbHQtaW4ubyB3aXRoIGFsbCBvYmplY3QgZmlsZXMgKHVzZWQgYnkga2luaXQpCitsaWIteSA6PSAkKG9ianMpCisKKyMgLm8gZmlsZXMgdXNlZCB0byBidWlsdCBleGVjdXRhYmxlcworc3RhdGljL2ZzdHlwZS15IDo9ICQob2JqcykKK3NoYXJlZC9mc3R5cGUteSA6PSAkKG9ianMpCisKKyMgQ2xlYW5pbmcKK2NsZWFuLWRpcnMgOj0gc3RhdGljIHNoYXJlZAorCisjIGluc3RhbGwgYmluYXJ5CitpbnN0YWxsLXkgOj0gJChzaGFyZWQteSkKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvY3JhbWZzX2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL2NyYW1mc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNWFkNGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2NyYW1mc19mcy5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX19DUkFNRlNfSAorI2RlZmluZSBfX0NSQU1GU19ICisKKyNkZWZpbmUgQ1JBTUZTX01BR0lDCQkweDI4Y2QzZDQ1CS8qIHNvbWUgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBDUkFNRlNfU0lHTkFUVVJFCSJDb21wcmVzc2VkIFJPTUZTIgorCisvKgorICogV2lkdGggb2YgdmFyaW91cyBiaXRmaWVsZHMgaW4gc3RydWN0IGNyYW1mc19pbm9kZS4KKyAqIFByaW1hcmlseSB1c2VkIHRvIGdlbmVyYXRlIHdhcm5pbmdzIGluIG1rY3JhbWZzLgorICovCisjZGVmaW5lIENSQU1GU19NT0RFX1dJRFRIIDE2CisjZGVmaW5lIENSQU1GU19VSURfV0lEVEggMTYKKyNkZWZpbmUgQ1JBTUZTX1NJWkVfV0lEVEggMjQKKyNkZWZpbmUgQ1JBTUZTX0dJRF9XSURUSCA4CisjZGVmaW5lIENSQU1GU19OQU1FTEVOX1dJRFRIIDYKKyNkZWZpbmUgQ1JBTUZTX09GRlNFVF9XSURUSCAyNgorCisvKgorICogU2luY2UgaW5vZGUubmFtZWxlbiBpcyBhIHVuc2lnbmVkIDYtYml0IG51bWJlciwgdGhlIG1heGltdW0gY3JhbWZzCisgKiBwYXRoIGxlbmd0aCBpcyA2MyA8PCAyID0gMjUyLgorICovCisjZGVmaW5lIENSQU1GU19NQVhQQVRITEVOICgoKDEgPDwgQ1JBTUZTX05BTUVMRU5fV0lEVEgpIC0gMSkgPDwgMikKKworLyoKKyAqIFJlYXNvbmFibHkgdGVyc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlub2RlIGRhdGEuCisgKi8KK3N0cnVjdCBjcmFtZnNfaW5vZGUgeworCV9fdTMyIG1vZGU6Q1JBTUZTX01PREVfV0lEVEgsIHVpZDpDUkFNRlNfVUlEX1dJRFRIOworCS8qIFNJWkUgZm9yIGRldmljZSBmaWxlcyBpcyBpX3JkZXYgKi8KKwlfX3UzMiBzaXplOkNSQU1GU19TSVpFX1dJRFRILCBnaWQ6Q1JBTUZTX0dJRF9XSURUSDsKKwkvKiBOQU1FTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgbmFtZSwgZGl2aWRlZCBieSA0IGFuZAorCSAgIHJvdW5kZWQgdXAuICAoY3JhbWZzIGRvZXNuJ3Qgc3VwcG9ydCBoYXJkIGxpbmtzLikgKi8KKwkvKiBPRkZTRVQ6IEZvciBzeW1saW5rcyBhbmQgbm9uLWVtcHR5IHJlZ3VsYXIgZmlsZXMsIHRoaXMKKwkgICBjb250YWlucyB0aGUgb2Zmc2V0IChkaXZpZGVkIGJ5IDQpIG9mIHRoZSBmaWxlIGRhdGEgaW4KKwkgICBjb21wcmVzc2VkIGZvcm0gKHN0YXJ0aW5nIHdpdGggYW4gYXJyYXkgb2YgYmxvY2sgcG9pbnRlcnM7CisJICAgc2VlIFJFQURNRSkuICBGb3Igbm9uLWVtcHR5IGRpcmVjdG9yaWVzIGl0IGlzIHRoZSBvZmZzZXQKKwkgICAoZGl2aWRlZCBieSA0KSBvZiB0aGUgaW5vZGUgb2YgdGhlIGZpcnN0IGZpbGUgaW4gdGhhdAorCSAgIGRpcmVjdG9yeS4gIEZvciBhbnl0aGluZyBlbHNlLCBvZmZzZXQgaXMgemVyby4gKi8KKwlfX3UzMiBuYW1lbGVuOkNSQU1GU19OQU1FTEVOX1dJRFRILCBvZmZzZXQ6Q1JBTUZTX09GRlNFVF9XSURUSDsKK307CisKK3N0cnVjdCBjcmFtZnNfaW5mbyB7CisJX191MzIgY3JjOworCV9fdTMyIGVkaXRpb247CisJX191MzIgYmxvY2tzOworCV9fdTMyIGZpbGVzOworfTsKKworLyoKKyAqIFN1cGVyYmxvY2sgaW5mb3JtYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgRlMuCisgKi8KK3N0cnVjdCBjcmFtZnNfc3VwZXIgeworCV9fdTMyIG1hZ2ljOwkJLyogMHgyOGNkM2Q0NSAtIHJhbmRvbSBudW1iZXIgKi8KKwlfX3UzMiBzaXplOwkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJX191MzIgZmxhZ3M7CQkvKiBmZWF0dXJlIGZsYWdzICovCisJX191MzIgZnV0dXJlOwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwlfX3U4IHNpZ25hdHVyZVsxNl07CS8qICJDb21wcmVzc2VkIFJPTUZTIiAqLworCXN0cnVjdCBjcmFtZnNfaW5mbyBmc2lkOwkvKiB1bmlxdWUgZmlsZXN5c3RlbSBpbmZvICovCisJX191OCBuYW1lWzE2XTsJCS8qIHVzZXItZGVmaW5lZCBuYW1lICovCisJc3RydWN0IGNyYW1mc19pbm9kZSByb290OwkvKiByb290IGlub2RlIGRhdGEgKi8KK307CisKKy8qCisgKiBGZWF0dXJlIGZsYWdzCisgKgorICogMHgwMDAwMDAwMCAtIDB4MDAwMDAwZmY6IGZlYXR1cmVzIHRoYXQgd29yayBmb3IgYWxsIHBhc3Qga2VybmVscworICogMHgwMDAwMDEwMCAtIDB4ZmZmZmZmZmY6IGZlYXR1cmVzIHRoYXQgZG9uJ3Qgd29yayBmb3IgcGFzdCBrZXJuZWxzCisgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfRlNJRF9WRVJTSU9OXzIJMHgwMDAwMDAwMQkvKiBmc2lkIHZlcnNpb24gIzIgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfU09SVEVEX0RJUlMJCTB4MDAwMDAwMDIJLyogc29ydGVkIGRpcnMgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfSE9MRVMJCTB4MDAwMDAxMDAJLyogc3VwcG9ydCBmb3IgaG9sZXMgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfV1JPTkdfU0lHTkFUVVJFCTB4MDAwMDAyMDAJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1JBTUZTX0ZMQUdfU0hJRlRFRF9ST09UX09GRlNFVAkweDAwMDAwNDAwCS8qIHNoaWZ0ZWQgcm9vdCBmcyAqLworCisvKgorICogVmFsaWQgdmFsdWVzIGluIHN1cGVyLmZsYWdzLiAgQ3VycmVudGx5IHdlIHJlZnVzZSB0byBtb3VudAorICogaWYgKGZsYWdzICYgfkNSQU1GU19TVVBQT1JURURfRkxBR1MpLiAgTWF5YmUgdGhhdCBzaG91bGQgYmUKKyAqIGNoYW5nZWQgdG8gdGVzdCBzdXBlci5mdXR1cmUgaW5zdGVhZC4KKyAqLworI2RlZmluZSBDUkFNRlNfU1VQUE9SVEVEX0ZMQUdTCSggMHgwMDAwMDBmZiBcCisJCQkJfCBDUkFNRlNfRkxBR19IT0xFUyBcCisJCQkJfCBDUkFNRlNfRkxBR19XUk9OR19TSUdOQVRVUkUgXAorCQkJCXwgQ1JBTUZTX0ZMQUdfU0hJRlRFRF9ST09UX09GRlNFVCApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9leHQyX2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL2V4dDJfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNjNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2ZzdHlwZS9leHQyX2ZzLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gbWFnaWMgbnVtYmVyCisgKi8KKyNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQwkweEVGNTMKKworLyoKKyAqIFN0cnVjdHVyZSBvZiB0aGUgc3VwZXIgYmxvY2sKKyAqLworc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgeworCV9fbGUzMiBzX2lub2Rlc19jb3VudDsJLyogSW5vZGVzIGNvdW50ICovCisJX19sZTMyIHNfYmxvY2tzX2NvdW50OwkvKiBCbG9ja3MgY291bnQgKi8KKwlfX2xlMzIgc19yX2Jsb2Nrc19jb3VudDsJLyogUmVzZXJ2ZWQgYmxvY2tzIGNvdW50ICovCisJX19sZTMyIHNfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJX19sZTMyIHNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX19sZTMyIHNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCV9fbGUzMiBzX2xvZ19ibG9ja19zaXplOwkvKiBCbG9jayBzaXplICovCisJX19sZTMyIHNfbG9nX2ZyYWdfc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCV9fbGUzMiBzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCV9fbGUzMiBzX2ZyYWdzX3Blcl9ncm91cDsJLyogIyBGcmFnbWVudHMgcGVyIGdyb3VwICovCisJX19sZTMyIHNfaW5vZGVzX3Blcl9ncm91cDsJLyogIyBJbm9kZXMgcGVyIGdyb3VwICovCisJX19sZTMyIHNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisJX19sZTMyIHNfd3RpbWU7CQkvKiBXcml0ZSB0aW1lICovCisJX19sZTE2IHNfbW50X2NvdW50OwkvKiBNb3VudCBjb3VudCAqLworCV9fbGUxNiBzX21heF9tbnRfY291bnQ7CS8qIE1heGltYWwgbW91bnQgY291bnQgKi8KKwlfX2xlMTYgc19tYWdpYzsJCS8qIE1hZ2ljIHNpZ25hdHVyZSAqLworCV9fbGUxNiBzX3N0YXRlOwkJLyogRmlsZSBzeXN0ZW0gc3RhdGUgKi8KKwlfX2xlMTYgc19lcnJvcnM7CS8qIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMgKi8KKwlfX2xlMTYgc19taW5vcl9yZXZfbGV2ZWw7CS8qIG1pbm9yIHJldmlzaW9uIGxldmVsICovCisJX19sZTMyIHNfbGFzdGNoZWNrOwkvKiB0aW1lIG9mIGxhc3QgY2hlY2sgKi8KKwlfX2xlMzIgc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwlfX2xlMzIgc19jcmVhdG9yX29zOwkvKiBPUyAqLworCV9fbGUzMiBzX3Jldl9sZXZlbDsJLyogUmV2aXNpb24gbGV2ZWwgKi8KKwlfX2xlMTYgc19kZWZfcmVzdWlkOwkvKiBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJX19sZTE2IHNfZGVmX3Jlc2dpZDsJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUMl9EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICoKKwkgKiBlMmZzY2sncyByZXF1aXJlbWVudHMgYXJlIG1vcmUgc3RyaWN0OyBpZiBpdCBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBhIGZlYXR1cmUgaW4gZWl0aGVyIHRoZSBjb21wYXRpYmxlIG9yIGluY29tcGF0aWJsZQorCSAqIGZlYXR1cmUgc2V0LCBpdCBtdXN0IGFib3J0IGFuZCBub3QgdHJ5IHRvIG1lZGRsZSB3aXRoCisJICogdGhpbmdzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgorCSAqLworCV9fbGUzMiBzX2ZpcnN0X2lubzsJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJX19sZTE2IHNfaW5vZGVfc2l6ZTsJLyogc2l6ZSBvZiBpbm9kZSBzdHJ1Y3R1cmUgKi8KKwlfX2xlMTYgc19ibG9ja19ncm91cF9ucjsJLyogYmxvY2sgZ3JvdXAgIyBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KKwlfX2xlMzIgc19mZWF0dXJlX2NvbXBhdDsJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fbGUzMiBzX2ZlYXR1cmVfaW5jb21wYXQ7CS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fbGUzMiBzX2ZlYXR1cmVfcm9fY29tcGF0OwkvKiByZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX191OCBzX3V1aWRbMTZdOwkvKiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIgc192b2x1bWVfbmFtZVsxNl07CS8qIHZvbHVtZSBuYW1lICovCisJY2hhciBzX2xhc3RfbW91bnRlZFs2NF07CS8qIGRpcmVjdG9yeSB3aGVyZSBsYXN0IG1vdW50ZWQgKi8KKwlfX2xlMzIgc19hbGdvcml0aG1fdXNhZ2VfYml0bWFwOwkvKiBGb3IgY29tcHJlc3Npb24gKi8KKwkvKgorCSAqIFBlcmZvcm1hbmNlIGhpbnRzLiAgRGlyZWN0b3J5IHByZWFsbG9jYXRpb24gc2hvdWxkIG9ubHkKKwkgKiBoYXBwZW4gaWYgdGhlIEVYVDJfQ09NUEFUX1BSRUFMTE9DIGZsYWcgaXMgb24uCisJICovCisJX191OCBzX3ByZWFsbG9jX2Jsb2NrczsJLyogTnIgb2YgYmxvY2tzIHRvIHRyeSB0byBwcmVhbGxvY2F0ZSAqLworCV9fdTggc19wcmVhbGxvY19kaXJfYmxvY2tzOwkvKiBOciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycyAqLworCV9fdTE2IHNfcGFkZGluZzE7CisJLyoKKwkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisJICovCisJX191OCBzX2pvdXJuYWxfdXVpZFsxNl07CS8qIHV1aWQgb2Ygam91cm5hbCBzdXBlcmJsb2NrICovCisJX191MzIgc19qb3VybmFsX2ludW07CS8qIGlub2RlIG51bWJlciBvZiBqb3VybmFsIGZpbGUgKi8KKwlfX3UzMiBzX2pvdXJuYWxfZGV2OwkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyIHNfbGFzdF9vcnBoYW47CS8qIHN0YXJ0IG9mIGxpc3Qgb2YgaW5vZGVzIHRvIGRlbGV0ZSAqLworCV9fdTMyIHNfaGFzaF9zZWVkWzRdOwkvKiBIVFJFRSBoYXNoIHNlZWQgKi8KKwlfX3U4IHNfZGVmX2hhc2hfdmVyc2lvbjsJLyogRGVmYXVsdCBoYXNoIHZlcnNpb24gdG8gdXNlICovCisJX191OCBzX3Jlc2VydmVkX2NoYXJfcGFkOworCV9fdTE2IHNfcmVzZXJ2ZWRfd29yZF9wYWQ7CisJX19sZTMyIHNfZGVmYXVsdF9tb3VudF9vcHRzOworCV9fbGUzMiBzX2ZpcnN0X21ldGFfYmc7CS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLworCV9fdTMyIHNfcmVzZXJ2ZWRbMTkwXTsJLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworfTsKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvZXh0M19mcy5oIGIvdXNyL2tpbml0L2ZzdHlwZS9leHQzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjMWJkZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvZXh0M19mcy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBUaGUgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIG1hZ2ljIG51bWJlcgorICovCisjZGVmaW5lIEVYVDNfU1VQRVJfTUFHSUMgICAgICAgIDB4RUY1MworCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgICAgICAgICAweDAwMDQKKworLyoKKyAqIFN0cnVjdHVyZSBvZiB0aGUgc3VwZXIgYmxvY2sKKyAqLworc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgeworCQkJCQkvKjAwKi8gX191MzIgc19pbm9kZXNfY291bnQ7CisJCQkJCS8qIElub2RlcyBjb3VudCAqLworCV9fdTMyIHNfYmxvY2tzX2NvdW50OwkvKiBCbG9ja3MgY291bnQgKi8KKwlfX3UzMiBzX3JfYmxvY2tzX2NvdW50OwkvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKwlfX3UzMiBzX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCQkJCQkJLyoxMCovIF9fdTMyIHNfZnJlZV9pbm9kZXNfY291bnQ7CisJCQkJCQkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCV9fdTMyIHNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCV9fdTMyIHNfbG9nX2Jsb2NrX3NpemU7CS8qIEJsb2NrIHNpemUgKi8KKwlfX3MzMiBzX2xvZ19mcmFnX3NpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCQkJCS8qMjAqLyBfX3UzMiBzX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCQkJCQkvKiAjIEJsb2NrcyBwZXIgZ3JvdXAgKi8KKwlfX3UzMiBzX2ZyYWdzX3Blcl9ncm91cDsJLyogIyBGcmFnbWVudHMgcGVyIGdyb3VwICovCisJX191MzIgc19pbm9kZXNfcGVyX2dyb3VwOwkvKiAjIElub2RlcyBwZXIgZ3JvdXAgKi8KKwlfX3UzMiBzX210aW1lOwkJLyogTW91bnQgdGltZSAqLworCQkJCS8qMzAqLyBfX3UzMiBzX3d0aW1lOworCQkJCS8qIFdyaXRlIHRpbWUgKi8KKwlfX3UxNiBzX21udF9jb3VudDsJLyogTW91bnQgY291bnQgKi8KKwlfX3MxNiBzX21heF9tbnRfY291bnQ7CS8qIE1heGltYWwgbW91bnQgY291bnQgKi8KKwlfX3UxNiBzX21hZ2ljOwkJLyogTWFnaWMgc2lnbmF0dXJlICovCisJX191MTYgc19zdGF0ZTsJCS8qIEZpbGUgc3lzdGVtIHN0YXRlICovCisJX191MTYgc19lcnJvcnM7CQkvKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzICovCisJX191MTYgc19taW5vcl9yZXZfbGV2ZWw7CS8qIG1pbm9yIHJldmlzaW9uIGxldmVsICovCisJCQkJCS8qNDAqLyBfX3UzMiBzX2xhc3RjaGVjazsKKwkJCQkJLyogdGltZSBvZiBsYXN0IGNoZWNrICovCisJX191MzIgc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwlfX3UzMiBzX2NyZWF0b3Jfb3M7CS8qIE9TICovCisJX191MzIgc19yZXZfbGV2ZWw7CS8qIFJldmlzaW9uIGxldmVsICovCisJCQkJCS8qNTAqLyBfX3UxNiBzX2RlZl9yZXN1aWQ7CisJCQkJCS8qIERlZmF1bHQgdWlkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwlfX3UxNiBzX2RlZl9yZXNnaWQ7CS8qIERlZmF1bHQgZ2lkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgZm9yIEVYVDNfRFlOQU1JQ19SRVYgc3VwZXJibG9ja3Mgb25seS4KKwkgKgorCSAqIE5vdGU6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgYW5kCisJICogdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCBpcyB0aGF0IGlmIHRoZXJlIGlzIGEgYml0IHNldAorCSAqIGluIHRoZSBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgdGhhdCB0aGUga2VybmVsIGRvZXNuJ3QKKwkgKiBrbm93IGFib3V0LCBpdCBzaG91bGQgcmVmdXNlIHRvIG1vdW50IHRoZSBmaWxlc3lzdGVtLgorCSAqCisJICogZTJmc2NrJ3MgcmVxdWlyZW1lbnRzIGFyZSBtb3JlIHN0cmljdDsgaWYgaXQgZG9lc24ndCBrbm93CisJICogYWJvdXQgYSBmZWF0dXJlIGluIGVpdGhlciB0aGUgY29tcGF0aWJsZSBvciBpbmNvbXBhdGlibGUKKwkgKiBmZWF0dXJlIHNldCwgaXQgbXVzdCBhYm9ydCBhbmQgbm90IHRyeSB0byBtZWRkbGUgd2l0aAorCSAqIHRoaW5ncyBpdCBkb2Vzbid0IHVuZGVyc3RhbmQuLi4KKwkgKi8KKwlfX3UzMiBzX2ZpcnN0X2lubzsJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJX191MTYgc19pbm9kZV9zaXplOwkvKiBzaXplIG9mIGlub2RlIHN0cnVjdHVyZSAqLworCV9fdTE2IHNfYmxvY2tfZ3JvdXBfbnI7CS8qIGJsb2NrIGdyb3VwICMgb2YgdGhpcyBzdXBlcmJsb2NrICovCisJX191MzIgc19mZWF0dXJlX2NvbXBhdDsJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCQkJCQkJLyo2MCovIF9fdTMyIHNfZmVhdHVyZV9pbmNvbXBhdDsKKwkJCQkJCS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTMyIHNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwkJCQkvKjY4Ki8gX191OCBzX3V1aWRbMTZdOworCQkJCS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisJCQkJCS8qNzgqLyBjaGFyIHNfdm9sdW1lX25hbWVbMTZdOworCQkJCQkvKiB2b2x1bWUgbmFtZSAqLworCQkJCQkvKjg4Ki8gY2hhciBzX2xhc3RfbW91bnRlZFs2NF07CisJCQkJCS8qIGRpcmVjdG9yeSB3aGVyZSBsYXN0IG1vdW50ZWQgKi8KKwkJCQkJCS8qQzgqLyBfX3UzMiBzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7CisJCQkJCQkvKiBGb3IgY29tcHJlc3Npb24gKi8KKwkvKgorCSAqIFBlcmZvcm1hbmNlIGhpbnRzLiAgRGlyZWN0b3J5IHByZWFsbG9jYXRpb24gc2hvdWxkIG9ubHkKKwkgKiBoYXBwZW4gaWYgdGhlIEVYVDNfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DIGZsYWcgaXMgb24uCisJICovCisJX191OCBzX3ByZWFsbG9jX2Jsb2NrczsJLyogTnIgb2YgYmxvY2tzIHRvIHRyeSB0byBwcmVhbGxvY2F0ZSAqLworCV9fdTggc19wcmVhbGxvY19kaXJfYmxvY2tzOwkvKiBOciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycyAqLworCV9fdTE2IHNfcGFkZGluZzE7CisJLyoKKwkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisJICovCisJCQkJCS8qRDAqLyBfX3U4IHNfam91cm5hbF91dWlkWzE2XTsKKwkJCQkJLyogdXVpZCBvZiBqb3VybmFsIHN1cGVyYmxvY2sgKi8KKwkJCQkJLypFMCovIF9fdTMyIHNfam91cm5hbF9pbnVtOworCQkJCQkvKiBpbm9kZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIgc19qb3VybmFsX2RldjsJLyogZGV2aWNlIG51bWJlciBvZiBqb3VybmFsIGZpbGUgKi8KKwlfX3UzMiBzX2xhc3Rfb3JwaGFuOwkvKiBzdGFydCBvZiBsaXN0IG9mIGlub2RlcyB0byBkZWxldGUgKi8KKwlfX3UzMiBzX2hhc2hfc2VlZFs0XTsJLyogSFRSRUUgaGFzaCBzZWVkICovCisJX191OCBzX2RlZl9oYXNoX3ZlcnNpb247CS8qIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZSAqLworCV9fdTggc19yZXNlcnZlZF9jaGFyX3BhZDsKKwlfX3UxNiBzX3Jlc2VydmVkX3dvcmRfcGFkOworCV9fdTMyIHNfcmVzZXJ2ZWRbMTkyXTsJLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworfTsKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvZnN0eXBlLmMgYi91c3Iva2luaXQvZnN0eXBlL2ZzdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYmU3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2ZzdHlwZS5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogYnkgcm1rCisgKgorICogRGV0ZWN0IGZpbGVzeXN0ZW0gdHlwZSAob24gc3RkaW4pIGFuZCBvdXRwdXQgc3RyaW5ncyBmb3IgdHdvCisgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgKiAgRlNUWVBFIC0gZmlsZXN5c3RlbSB0eXBlCisgKiAgRlNTSVpFIC0gZmlsZXN5c3RlbSBzaXplIChpZiBrbm93bikKKyAqCisgKiBXZSBjdXJyZW50bHkgZGV0ZWN0IHRoZSBmaWxlc3lzdGVtcyBsaXN0ZWQgYmVsb3cgaW4gdGhlIHN0cnVjdAorICogImltYWdldHlwZSBpbWFnZXMiIChpbiB0aGUgb3JkZXIgdGhleSBhcmUgbGlzdGVkKS4KKyAqCisgKiBNSU5JWCwgZXh0MyBhbmQgUmVpc2VyZnMgYml0cyBhcmUgY3VycmVudGx5IHVudGVzdGVkLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKworI2RlZmluZSBjcHVfdG9fYmUzMih4KSBfX2NwdV90b19iZTMyKHgpCS8qIE5lZWRlZCBieSByb21mc19mcy5oICovCisKKyNpbmNsdWRlICJyb21mc19mcy5oIgorI2luY2x1ZGUgImNyYW1mc19mcy5oIgorI2luY2x1ZGUgIm1pbml4X2ZzLmgiCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJsdWtzX2ZzLmgiCisjaW5jbHVkZSAibHZtMl9zYi5oIgorI2luY2x1ZGUgImlzbzk2NjBfc2IuaCIKKworLyoKKyAqIFNsaWdodGx5IGNsZWFuZWQgdXAgdmVyc2lvbiBvZiBqZnNfc3VwZXJibG9jayB0bworICogYXZvaWQgcHVsbGluZyBpbiBvdGhlciBrZXJuZWwgaGVhZGVyIGZpbGVzLgorICovCisjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKKworLyoKKyAqIHJlaXNlcmZzX2ZzLmggaXMgdG9vIHNpY2sgdG8gaW5jbHVkZSBkaXJlY3RseS4KKyAqIFVzZSBhIGNsZWFuZWQgdXAgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgInJlaXNlcmZzX2ZzLmgiCisKKyNpbmNsdWRlICJmc3R5cGUuaCIKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpCShzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisKKyNkZWZpbmUgQkxPQ0tfU0laRSAxMDI0CisKKy8qIFN3YXAgbmVlZHMgdGhlIGRlZmluaXRpb24gb2YgYmxvY2sgc2l6ZSAqLworI2luY2x1ZGUgInN3YXBfZnMuaCIKKworc3RhdGljIGludCBnemlwX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpieXRlcykKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gYnVmOworCisJaWYgKHBbMF0gPT0gMDM3ICYmIChwWzFdID09IDAyMTMgfHwgcFsxXSA9PSAwMjM2KSkgeworCQkvKiBUaGUgbGVuZ3RoIG9mIGEgZ3ppcCBzdHJlYW0gY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZAorCQkgICBieSBwcm9jZXNzaW5nIHRoZSB3aG9sZSBzdHJlYW0gKi8KKwkJKmJ5dGVzID0gMFVMTDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyYW1mc19pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMpCit7CisJY29uc3Qgc3RydWN0IGNyYW1mc19zdXBlciAqc2IgPSAoY29uc3Qgc3RydWN0IGNyYW1mc19zdXBlciAqKWJ1ZjsKKworCWlmIChzYi0+bWFnaWMgPT0gQ1JBTUZTX01BR0lDKSB7CisJCWlmIChzYi0+ZmxhZ3MgJiBDUkFNRlNfRkxBR19GU0lEX1ZFUlNJT05fMikKKwkJCSpieXRlcyA9ICh1bnNpZ25lZCBsb25nIGxvbmcpc2ItPmZzaWQuYmxvY2tzIDw8IDEwOworCQllbHNlCisJCQkqYnl0ZXMgPSAwOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9tZnNfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzKQoreworCWNvbnN0IHN0cnVjdCByb21mc19zdXBlcl9ibG9jayAqc2IgPQorCSAgICAoY29uc3Qgc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHNiLT53b3JkMCA9PSBST01TQl9XT1JEMCAmJiBzYi0+d29yZDEgPT0gUk9NU0JfV09SRDEpIHsKKwkJKmJ5dGVzID0gX19iZTMyX3RvX2NwdShzYi0+c2l6ZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaW5peF9pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMpCit7CisJY29uc3Qgc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICpzYiA9CisJICAgIChjb25zdCBzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoc2ItPnNfbWFnaWMgPT0gTUlOSVhfU1VQRVJfTUFHSUMgfHwKKwkgICAgc2ItPnNfbWFnaWMgPT0gTUlOSVhfU1VQRVJfTUFHSUMyKSB7CisJCSpieXRlcyA9ICh1bnNpZ25lZCBsb25nIGxvbmcpc2ItPnNfbnpvbmVzCisJCSAgICA8PCAoc2ItPnNfbG9nX3pvbmVfc2l6ZSArIDEwKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDNfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzKQoreworCWNvbnN0IHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICpzYiA9CisJICAgIChjb25zdCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzYi0+c19tYWdpYyA9PSBfX2NwdV90b19sZTE2KEVYVDJfU1VQRVJfTUFHSUMpICYmCisJICAgIHNiLT4KKwkgICAgc19mZWF0dXJlX2NvbXBhdCAmIF9fY3B1X3RvX2xlMzIoRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpIHsKKwkJKmJ5dGVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZylfX2xlMzJfdG9fY3B1KHNiLT5zX2Jsb2Nrc19jb3VudCkKKwkJICAgIDw8ICgxMCArIF9fbGUzMl90b19jcHUoc2ItPnNfbG9nX2Jsb2NrX3NpemUpKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDJfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzKQoreworCWNvbnN0IHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYiA9CisJICAgIChjb25zdCBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzYi0+c19tYWdpYyA9PSBfX2NwdV90b19sZTE2KEVYVDJfU1VQRVJfTUFHSUMpKSB7CisJCSpieXRlcyA9ICh1bnNpZ25lZCBsb25nIGxvbmcpX19sZTMyX3RvX2NwdShzYi0+c19ibG9ja3NfY291bnQpCisJCSAgICA8PCAoMTAgKyBfX2xlMzJfdG9fY3B1KHNiLT5zX2xvZ19ibG9ja19zaXplKSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWlzZXJmc19pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMpCit7CisJY29uc3Qgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpzYiA9CisJICAgIChjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAobWVtY21wKFJFSVNFUkZTX01BR0lDKHNiKSwgUkVJU0VSRlNfU1VQRVJfTUFHSUNfU1RSSU5HLAorCQkgICBzaXplb2YoUkVJU0VSRlNfU1VQRVJfTUFHSUNfU1RSSU5HKSAtIDEpID09IDAgfHwKKwkgICAgbWVtY21wKFJFSVNFUkZTX01BR0lDKHNiKSwgUkVJU0VSMkZTX1NVUEVSX01BR0lDX1NUUklORywKKwkJICAgc2l6ZW9mKFJFSVNFUjJGU19TVVBFUl9NQUdJQ19TVFJJTkcpIC0gMSkgPT0gMCB8fAorCSAgICBtZW1jbXAoUkVJU0VSRlNfTUFHSUMoc2IpLCBSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HLAorCQkgICBzaXplb2YoUkVJU0VSMkZTX0pSX1NVUEVSX01BR0lDX1NUUklORykgLSAxKSA9PSAwKSB7CisJCSpieXRlcyA9ICh1bnNpZ25lZCBsb25nIGxvbmcpUkVJU0VSRlNfQkxPQ0tfQ09VTlQoc2IpICoKKwkJICAgIFJFSVNFUkZTX0JMT0NLU0laRShzYik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnNfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzKQoreworCWNvbnN0IHN0cnVjdCB4ZnNfc2IgKnNiID0gKGNvbnN0IHN0cnVjdCB4ZnNfc2IgKilidWY7CisKKwlpZiAoX19iZTMyX3RvX2NwdShzYi0+c2JfbWFnaWNudW0pID09IFhGU19TQl9NQUdJQykgeworCQkqYnl0ZXMgPSBfX2JlNjRfdG9fY3B1KHNiLT5zYl9kYmxvY2tzKSAqCisJCSAgICBfX2JlMzJfdG9fY3B1KHNiLT5zYl9ibG9ja3NpemUpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgamZzX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpieXRlcykKK3sKKwljb25zdCBzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgKnNiID0gKGNvbnN0IHN0cnVjdCBqZnNfc3VwZXJibG9jayAqKWJ1ZjsKKworCWlmICghbWVtY21wKHNiLT5zX21hZ2ljLCBKRlNfTUFHSUMsIDQpKSB7CisJCSpieXRlcyA9IF9fbGUzMl90b19jcHUoc2ItPnNfc2l6ZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdWtzX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpibG9ja3MpCit7CisJY29uc3Qgc3RydWN0IGx1a3NfcGFydGl0aW9uX2hlYWRlciAqbHBoID0KKwkgICAgKGNvbnN0IHN0cnVjdCBsdWtzX3BhcnRpdGlvbl9oZWFkZXIgKilidWY7CisKKwlpZiAoIW1lbWNtcChscGgtPm1hZ2ljLCBMVUtTX01BR0lDLCBMVUtTX01BR0lDX0wpKSB7CisJCS8qIEZTU0laRSBpcyBkaWN0YXRlZCBieSB0aGUgdW5kZXJseWluZyBmcywgbm90IGJ5IExVS1MgKi8KKwkJKmJsb2NrcyA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd2FwX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpibG9ja3MpCit7CisJY29uc3Qgc3RydWN0IHN3YXBfc3VwZXJfYmxvY2sgKnNzYiA9CisJICAgIChjb25zdCBzdHJ1Y3Qgc3dhcF9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmICghbWVtY21wKHNzYi0+bWFnaWMsIFNXQVBfTUFHSUNfMSwgU1dBUF9NQUdJQ19MKSB8fAorCSAgICAhbWVtY21wKHNzYi0+bWFnaWMsIFNXQVBfTUFHSUNfMiwgU1dBUF9NQUdJQ19MKSkgeworCQkqYmxvY2tzID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1c3BlbmRfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2NrcykKK3sKKwljb25zdCBzdHJ1Y3Qgc3dhcF9zdXBlcl9ibG9jayAqc3NiID0KKwkgICAgKGNvbnN0IHN0cnVjdCBzd2FwX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKCFtZW1jbXAoc3NiLT5tYWdpYywgU1VTUF9NQUdJQ18xLCBTVVNQX01BR0lDX0wpIHx8CisJICAgICFtZW1jbXAoc3NiLT5tYWdpYywgU1VTUF9NQUdJQ18yLCBTVVNQX01BR0lDX0wpIHx8CisJICAgICFtZW1jbXAoc3NiLT5tYWdpYywgU1VTUF9NQUdJQ19VLCBTVVNQX01BR0lDX0wpKSB7CisJCSpibG9ja3MgPSAwOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHZtMl9pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYmxvY2tzKQoreworCWNvbnN0IHN0cnVjdCBsdm0yX3N1cGVyX2Jsb2NrICpsc2I7CisJaW50IGk7CisKKwkvKiBXZSBtdXN0IGNoZWNrIGV2ZXJ5IDUxMiBieXRlIHNlY3RvciAqLworCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFOyBpICs9IDB4MjAwKSB7CisJCWxzYiA9IChjb25zdCBzdHJ1Y3QgbHZtMl9zdXBlcl9ibG9jayAqKShidWYgKyBpKTsKKworCQlpZiAoIW1lbWNtcChsc2ItPm1hZ2ljLCBMVk0yX01BR0lDLCBMVk0yX01BR0lDX0wpICYmCisJCSAgICAhbWVtY21wKGxzYi0+dHlwZSwgTFZNMl9UWVBFLCBMVk0yX1RZUEVfTCkpIHsKKwkJCS8qIFRoaXMgaXMganVzdCBvbmUgb2YgcG9zc2libHkgbWFueSBQVidzICovCisJCQkqYmxvY2tzID0gMDsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNvX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpibG9ja3MpCit7CisJY29uc3Qgc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAqaXNvdmQgPQorCSAgICAoY29uc3Qgc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAqKWJ1ZjsKKwljb25zdCBzdHJ1Y3QgaXNvX2hzX3ZvbHVtZV9kZXNjcmlwdG9yICppc29oc3ZkID0KKwkgICAgKGNvbnN0IHN0cnVjdCBpc29faHNfdm9sdW1lX2Rlc2NyaXB0b3IgKilidWY7CisKKwlpZiAoIW1lbWNtcChpc292ZC0+aWQsIElTT19NQUdJQywgSVNPX01BR0lDX0wpIHx8CisJICAgICFtZW1jbXAoaXNvaHN2ZC0+aWQsIElTT19IU19NQUdJQywgSVNPX0hTX01BR0lDX0wpKSB7CisJCSpibG9ja3MgPSAwOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbWFnZXR5cGUgeworCW9mZl90IGJsb2NrOworCWNvbnN0IGNoYXIgbmFtZVsxMl07CisJaW50ICgqaWRlbnRpZnkpIChjb25zdCB2b2lkICosIHVuc2lnbmVkIGxvbmcgbG9uZyAqKTsKK307CisKKy8qCisgKiBOb3RlOgorICoKKyAqIE1pbml4IHRlc3QgbmVlZHMgdG8gY29tZSBhZnRlciBleHQzL2V4dDIsIHNpbmNlIGl0J3MgcG9zc2libGUgZm9yCisgKiBleHQzL2V4dDIgdG8gbG9vayBsaWtlIG1pbml4IGJ5IHB1cmUgcmFuZG9tIGNoYW5jZS4KKyAqCisgKiBMVk0gY29tZXMgYWZ0ZXIgYWxsIG90aGVyIGZpbGVzeXN0ZW1zIHNpbmNlIGl0J3MgcG9zc2libGUKKyAqIHRoYXQgYW4gb2xkIGx2bSBzaWduYXR1cmUgaXMgbGVmdCBvbiB0aGUgZGlzayBpZiBwdnJlbW92ZQorICogaXMgbm90IHVzZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBuZXcgZnMuCisgKgorICogVGhlIHNhbWUgZ29lcyBmb3IgTFVLUyBhcyBmb3IgTFZNLgorICovCitzdGF0aWMgc3RydWN0IGltYWdldHlwZSBpbWFnZXNbXSA9IHsKKwl7MCwgImd6aXAiLCBnemlwX2ltYWdlfSwKKwl7MCwgImNyYW1mcyIsIGNyYW1mc19pbWFnZX0sCisJezAsICJyb21mcyIsIHJvbWZzX2ltYWdlfSwKKwl7MCwgInhmcyIsIHhmc19pbWFnZX0sCisJezEsICJleHQzIiwgZXh0M19pbWFnZX0sCisJezEsICJleHQyIiwgZXh0Ml9pbWFnZX0sCisJezEsICJtaW5peCIsIG1pbml4X2ltYWdlfSwKKwl7OCwgInJlaXNlcmZzIiwgcmVpc2VyZnNfaW1hZ2V9LAorCXs2NCwgInJlaXNlcmZzIiwgcmVpc2VyZnNfaW1hZ2V9LAorCXszMiwgImpmcyIsIGpmc19pbWFnZX0sCisJezMyLCAiaXNvOTY2MCIsIGlzb19pbWFnZX0sCisJezAsICJsdWtzIiwgbHVrc19pbWFnZX0sCisJezAsICJsdm0yIiwgbHZtMl9pbWFnZX0sCisJezEsICJsdm0yIiwgbHZtMl9pbWFnZX0sCisJey0xLCAic3dhcCIsIHN3YXBfaW1hZ2V9LAorCXstMSwgInN1c3BlbmQiLCBzdXNwZW5kX2ltYWdlfSwKKwl7MCwgIiIsIE5VTEx9Cit9OworCitpbnQgaWRlbnRpZnlfZnMoaW50IGZkLCBjb25zdCBjaGFyICoqZnN0eXBlLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzLCBvZmZfdCBvZmZzZXQpCit7CisJdWludDY0X3QgYnVmW0JMT0NLX1NJWkUgPj4gM107CS8qIDY0LWJpdCB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworCW9mZl90IGN1cl9ibG9jayA9IChvZmZfdCkgLSAxOworCXN0cnVjdCBpbWFnZXR5cGUgKmlwOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGR1bW15OworCisJaWYgKCFieXRlcykKKwkJYnl0ZXMgPSAmZHVtbXk7CisKKwkqZnN0eXBlID0gTlVMTDsKKwkqYnl0ZXMgPSAwOworCisJZm9yIChpcCA9IGltYWdlczsgaXAtPmlkZW50aWZ5OyBpcCsrKSB7CisJCS8qIEhhY2sgZm9yIHN3YXAsIHdoaWNoIGFwcGFyZW50bHkgaXMgZGVwZW5kZW50IG9uIHBhZ2Ugc2l6ZSAqLworCQlpZiAoaXAtPmJsb2NrID09IC0xKQorCQkJaXAtPmJsb2NrID0gU1dBUF9PRkZTRVQoKTsKKworCQlpZiAoY3VyX2Jsb2NrICE9IGlwLT5ibG9jaykgeworCQkJLyoKKwkJCSAqIFJlYWQgYmxvY2suCisJCQkgKi8KKwkJCWN1cl9ibG9jayA9IGlwLT5ibG9jazsKKwkJCXJldCA9IHByZWFkKGZkLCBidWYsIEJMT0NLX1NJWkUsCisJCQkJICAgIG9mZnNldCArIGN1cl9ibG9jayAqIEJMT0NLX1NJWkUpOworCQkJaWYgKHJldCAhPSBCTE9DS19TSVpFKQorCQkJCXJldHVybiAtMTsJLyogZXJyb3IgKi8KKwkJfQorCisJCWlmIChpcC0+aWRlbnRpZnkoYnVmLCBieXRlcykpIHsKKwkJCSpmc3R5cGUgPSBpcC0+bmFtZTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7CQkvKiBVbmtub3duIGZpbGVzeXN0ZW0gKi8KK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvZnN0eXBlLmggYi91c3Iva2luaXQvZnN0eXBlL2ZzdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjE5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2ZzdHlwZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBieSBybWsKKyAqCisgKiBEZXRlY3QgZmlsZXN5c3RlbSB0eXBlIChvbiBzdGRpbikgYW5kIG91dHB1dCBzdHJpbmdzIGZvciB0d28KKyAqIGVudmlyb25tZW50IHZhcmlhYmxlczoKKyAqICBGU1RZUEUgLSBmaWxlc3lzdGVtIHR5cGUKKyAqICBGU1NJWkUgLSBmaWxlc3lzdGVtIHNpemUgKGlmIGtub3duKQorICoKKyAqIFdlIGN1cnJlbnRseSBkZXRlY3QgKGluIG9yZGVyKToKKyAqICBnemlwLCBjcmFtZnMsIHJvbWZzLCB4ZnMsIG1pbml4LCBleHQzLCBleHQyLCByZWlzZXJmcywgamZzCisgKgorICogTUlOSVgsIGV4dDMgYW5kIFJlaXNlcmZzIGJpdHMgYXJlIGN1cnJlbnRseSB1bnRlc3RlZC4KKyAqLworCisjaWZuZGVmIEZTVFlQRV9ICisjZGVmaW5lIEZTVFlQRV9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IGlkZW50aWZ5X2ZzKGludCBmZCwgY29uc3QgY2hhciAqKmZzdHlwZSwKKwkJdW5zaWduZWQgbG9uZyBsb25nICpieXRlcywgb2ZmX3Qgb2Zmc2V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL2lzbzk2NjBfc2IuaCBiL3Vzci9raW5pdC9mc3R5cGUvaXNvOTY2MF9zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZTA3MzMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2lzbzk2NjBfc2IuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9fSVNPOTY2MF9TQl9ICisjZGVmaW5lIF9fSVNPOTY2MF9TQl9ICisKKyNkZWZpbmUgSVNPX01BR0lDX0wJNQorI2RlZmluZSBJU09fTUFHSUMJIkNEMDAxIgorI2RlZmluZSBJU09fSFNfTUFHSUNfTAk1CisjZGVmaW5lIElTT19IU19NQUdJQwkiQ0RST00iCisKKy8qIElTTzk2NjAgVm9sdW1lIERlc2NyaXB0b3IgKi8KK3N0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgeworCV9fdTggdHlwZTsKKwljaGFyIGlkW0lTT19NQUdJQ19MXTsKKwlfX3U4IHZlcnNpb247Cit9OworCisvKiBIaWdoIFNpZXJyYSBWb2x1bWUgRGVzY3JpcHRvciAqLworc3RydWN0IGlzb19oc192b2x1bWVfZGVzY3JpcHRvciB7CisJY2hhciBmb29bOF07CisJX191OCB0eXBlOworCWNoYXIgaWRbSVNPX0hTX01BR0lDX0xdOworCV9fdTggdmVyc2lvbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9qZnNfc3VwZXJibG9jay5oIGIvdXNyL2tpbml0L2ZzdHlwZS9qZnNfc3VwZXJibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTMyYTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2pmc19zdXBlcmJsb2NrLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX1NVUEVSQkxPQ0sKKyNkZWZpbmUgX0hfSkZTX1NVUEVSQkxPQ0sKKworc3RydWN0IHRpbWVzdHJ1Y190IHsKKwlfX2xlMzIgdHZfc2VjOworCV9fbGUzMiB0dl9uc2VjOworfTsKKworLyoKKyAqIG1ha2UgdGhlIG1hZ2ljIG51bWJlciBzb21ldGhpbmcgYSBodW1hbiBjb3VsZCByZWFkCisgKi8KKyNkZWZpbmUgSkZTX01BR0lDIAkiSkZTMSIJLyogTWFnaWMgd29yZCAqLworCisjZGVmaW5lIEpGU19WRVJTSU9OCTIJLyogVmVyc2lvbiBudW1iZXI6IFZlcnNpb24gMiAqLworCisjZGVmaW5lIExWX05BTUVfU0laRQkxMQkvKiBNVVNUIEJFIDExIGZvciBPUy8yIGJvb3Qgc2VjdG9yICovCisKKy8qCisgKglhZ2dyZWdhdGUgc3VwZXJibG9jaworICoKKyAqIFRoZSBuYW1lIHN1cGVyYmxvY2sgaXMgdG9vIGNsb3NlIHRvIHN1cGVyX2Jsb2NrLCBzbyB0aGUgbmFtZSBoYXMgYmVlbgorICogY2hhbmdlZCB0byBqZnNfc3VwZXJibG9jay4gIFRoZSB1dGlsaXRpZXMgYXJlIHN0aWxsIHVzaW5nIHRoZSBvbGQgbmFtZS4KKyAqLworc3RydWN0IGpmc19zdXBlcmJsb2NrIHsKKwljaGFyIHNfbWFnaWNbNF07CS8qIDQ6IG1hZ2ljIG51bWJlciAqLworCV9fbGUzMiBzX3ZlcnNpb247CS8qIDQ6IHZlcnNpb24gbnVtYmVyICovCisKKwlfX2xlNjQgc19zaXplOwkJLyogODogYWdncmVnYXRlIHNpemUgaW4gaGFyZHdhcmUvTFZNIGJsb2NrczsKKwkJCQkgKiBWRlM6IG51bWJlciBvZiBibG9ja3MKKwkJCQkgKi8KKwlfX2xlMzIgc19ic2l6ZTsJCS8qIDQ6IGFnZ3JlZ2F0ZSBibG9jayBzaXplIGluIGJ5dGVzOworCQkJCSAqIFZGUzogZnJhZ21lbnQgc2l6ZQorCQkJCSAqLworCV9fbGUxNiBzX2wyYnNpemU7CS8qIDI6IGxvZzIgb2Ygc19ic2l6ZSAqLworCV9fbGUxNiBzX2wyYmZhY3RvcjsJLyogMjogbG9nMihzX2JzaXplL2hhcmR3YXJlIGJsb2NrIHNpemUpICovCisJX19sZTMyIHNfcGJzaXplOwkvKiA0OiBoYXJkd2FyZS9MVk0gYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworCV9fbGUxNiBzX2wycGJzaXplOwkvKiAyOiBsb2cyIG9mIHNfcGJzaXplICovCisJX19sZTE2IHBhZDsJCS8qIDI6IHBhZGRpbmcgbmVjZXNzYXJ5IGZvciBhbGlnbm1lbnQgKi8KKworCV9fbGUzMiBzX2Fnc2l6ZTsJLyogNDogYWxsb2NhdGlvbiBncm91cCBzaXplIGluIGFnZ3IuIGJsb2NrcyAqLworCisJX19sZTMyIHNfZmxhZzsJCS8qIDQ6IGFnZ3JlZ2F0ZSBhdHRyaWJ1dGVzOgorCQkJCSAqICAgIHNlZSBqZnNfZmlsc3lzLmgKKwkJCQkgKi8KKwlfX2xlMzIgc19zdGF0ZTsJCS8qIDQ6IG1vdW50L3VubW91bnQvcmVjb3Zlcnkgc3RhdGU6CisJCQkJICogICAgc2VlIGpmc19maWxzeXMuaAorCQkJCSAqLworCV9fbGUzMiBzX2NvbXByZXNzOwkvKiA0OiA+IDAgaWYgZGF0YSBjb21wcmVzc2lvbiAqLworCisJX19sZTY0IHNfYWl0MjsJCS8qIDg6IGZpcnN0IGV4dGVudCBvZiBzZWNvbmRhcnkKKwkJCQkgKiAgICBhZ2dyZWdhdGUgaW5vZGUgdGFibGUKKwkJCQkgKi8KKworCV9fbGU2NCBzX2FpbTI7CQkvKiA4OiBmaXJzdCBleHRlbnQgb2Ygc2Vjb25kYXJ5CisJCQkJICogICAgYWdncmVnYXRlIGlub2RlIG1hcAorCQkJCSAqLworCV9fbGUzMiBzX2xvZ2RldjsJLyogNDogZGV2aWNlIGFkZHJlc3Mgb2YgbG9nICovCisJX19sZTMyIHNfbG9nc2VyaWFsOwkvKiA0OiBsb2cgc2VyaWFsIG51bWJlciBhdCBhZ2dyZWdhdGUgbW91bnQgKi8KKwlfX2xlNjQgc19sb2dweGQ7CS8qIDg6IGlubGluZSBsb2cgZXh0ZW50ICovCisKKwlfX2xlNjQgc19mc2NrcHhkOwkvKiA4OiBpbmxpbmUgZnNjayB3b3JrIHNwYWNlIGV4dGVudCAqLworCisJc3RydWN0IHRpbWVzdHJ1Y190IHNfdGltZTsJLyogODogdGltZSBsYXN0IHVwZGF0ZWQgKi8KKworCV9fbGUzMiBzX2ZzY2tsb2dsZW47CS8qIDQ6IE51bWJlciBvZiBmaWxlc3lzdGVtIGJsb2NrcyByZXNlcnZlZCBmb3IKKwkJCQkgKiAgICB0aGUgZnNjayBzZXJ2aWNlIGxvZy4KKwkJCQkgKiAgICBOLkIuIFRoZXNlIGJsb2NrcyBhcmUgZGl2aWRlZCBhbW9uZyB0aGUKKwkJCQkgKiAgICAgICAgIHZlcnNpb25zIGtlcHQuICBUaGlzIGlzIG5vdCBhIHBlcgorCQkJCSAqICAgICAgICAgdmVyc2lvbiBzaXplLgorCQkJCSAqICAgIE4uQi4gVGhlc2UgYmxvY2tzIGFyZSBpbmNsdWRlZCBpbiB0aGUKKwkJCQkgKiAgICAgICAgIGxlbmd0aCBmaWVsZCBvZiBzX2ZzY2tweGQuCisJCQkJICovCisJY2hhciBzX2ZzY2tsb2c7CQkvKiAxOiB3aGljaCBmc2NrIHNlcnZpY2UgbG9nIGlzIG1vc3QgcmVjZW50CisJCQkJICogICAgMCA9PiBubyBzZXJ2aWNlIGxvZyBkYXRhIHlldAorCQkJCSAqICAgIDEgPT4gdGhlIGZpcnN0IG9uZQorCQkJCSAqICAgIDIgPT4gdGhlIDJuZCBvbmUKKwkJCQkgKi8KKwljaGFyIHNfZnBhY2tbMTFdOwkvKiAxMTogZmlsZSBzeXN0ZW0gdm9sdW1lIG5hbWUKKwkJCQkgKiAgICAgTi5CLiBUaGlzIG11c3QgYmUgMTEgYnl0ZXMgdG8KKwkJCQkgKiAgICAgICAgICBjb25mb3JtIHdpdGggdGhlIE9TLzIgQm9vdFNlY3RvcgorCQkJCSAqICAgICAgICAgIHJlcXVpcmVtZW50cworCQkJCSAqICAgICAgICAgIE9ubHkgdXNlZCB3aGVuIHNfdmVyc2lvbiBpcyAxCisJCQkJICovCisKKwkvKiBleHRlbmRmcygpIHBhcmFtZXRlciB1bmRlciBzX3N0YXRlICYgRk1fRVhURU5ERlMgKi8KKwlfX2xlNjQgc194c2l6ZTsJCS8qIDg6IGV4dGVuZGZzIHNfc2l6ZSAqLworCV9fbGU2NCBzX3hmc2NrcHhkOwkvKiA4OiBleHRlbmRmcyBmc2NrcHhkICovCisJX19sZTY0IHNfeGxvZ3B4ZDsJLyogODogZXh0ZW5kZnMgbG9ncHhkICovCisJLyogLSAxMjggYnl0ZSBib3VuZGFyeSAtICovCisKKwljaGFyIHNfdXVpZFsxNl07CS8qIDE2OiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIgc19sYWJlbFsxNl07CS8qIDE2OiB2b2x1bWUgbGFiZWwgKi8KKwljaGFyIHNfbG9ndXVpZFsxNl07CS8qIDE2OiAxMjgtYml0IHV1aWQgZm9yIGxvZyBkZXZpY2UgKi8KKworfTsKKworI2VuZGlmIC8qX0hfSkZTX1NVUEVSQkxPQ0sgKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvbHVrc19mcy5oIGIvdXNyL2tpbml0L2ZzdHlwZS9sdWtzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4ZGUzMTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2x1a3NfZnMuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9fTElOVVhfTFVLU19GU19ICisjZGVmaW5lIF9fTElOVVhfTFVLU19GU19ICisKKy8qIFRoZSBiYXNpYyBzdHJ1Y3R1cmVzIG9mIHRoZSBsdWtzIHBhcnRpdGlvbiBoZWFkZXIgKi8KKyNkZWZpbmUgTFVLU19NQUdJQ19MCQk2CisjZGVmaW5lIExVS1NfQ0lQSEVSTkFNRV9MCTMyCisjZGVmaW5lIExVS1NfQ0lQSEVSTU9ERV9MCTMyCisjZGVmaW5lIExVS1NfSEFTSFNQRUNfTAkJMzIKKyNkZWZpbmUgTFVLU19VVUlEX1NUUklOR19MCTQwCisKKyNkZWZpbmUgTFVLU19NQUdJQwkJIkxVS1NceEJBXHhCRSIKKyNkZWZpbmUgTFVLU19ESUdFU1RTSVpFCQkyMAorI2RlZmluZSBMVUtTX1NBTFRTSVpFCQkzMgorI2RlZmluZSBMVUtTX05VTUtFWVMJCTgKKyNkZWZpbmUgTFVLU19NS0RfSVRFUgkJMTAKKyNkZWZpbmUgTFVLU19LRVlfRElTQUJMRUQJMHgwMDAwREVBRAorI2RlZmluZSBMVUtTX0tFWV9FTkFCTEVECTB4MDBBQzcxRjMKKyNkZWZpbmUgTFVLU19TVFJJUEVTCQk0MDAwCisKKy8qIE9uLWRpc2sgInN1cGVyIGJsb2NrIiAqLworc3RydWN0IGx1a3NfcGFydGl0aW9uX2hlYWRlciB7CisJY2hhcgltYWdpY1tMVUtTX01BR0lDX0xdOworCV9fYmUxNgl2ZXJzaW9uOworCWNoYXIJY2lwaGVyTmFtZVtMVUtTX0NJUEhFUk5BTUVfTF07CisJY2hhcgljaXBoZXJNb2RlW0xVS1NfQ0lQSEVSTU9ERV9MXTsKKwljaGFyCWhhc2hTcGVjW0xVS1NfSEFTSFNQRUNfTF07CisJX19iZTMyCXBheWxvYWRPZmZzZXQ7CisJX19iZTMyCWtleUJ5dGVzOworCWNoYXIJbWtEaWdlc3RbTFVLU19ESUdFU1RTSVpFXTsKKwljaGFyCW1rRGlnZXN0U2FsdFtMVUtTX1NBTFRTSVpFXTsKKwlfX2JlMzIJbWtEaWdlc3RJdGVyYXRpb25zOworCWNoYXIJdXVpZFtMVUtTX1VVSURfU1RSSU5HX0xdOworCisJc3RydWN0IHsKKwkJX19iZTMyCWFjdGl2ZTsKKwkJLyogUGFyYW1ldGVycyBmb3IgUEJLREYyIHByb2Nlc3NpbmcgKi8KKwkJX19iZTMyCXBhc3N3b3JkSXRlcmF0aW9uczsKKwkJY2hhcglwYXNzd29yZFNhbHRbTFVLU19TQUxUU0laRV07CisJCV9fYmUzMglrZXlNYXRlcmlhbE9mZnNldDsKKwkJX19iZTMyCXN0cmlwZXM7CisJfSBrZXlibG9ja1tMVUtTX05VTUtFWVNdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL2x2bTJfc2IuaCBiL3Vzci9raW5pdC9mc3R5cGUvbHZtMl9zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGZjMTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2x2bTJfc2IuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9fTFZNMl9TQl9ICisjZGVmaW5lIF9fTFZNMl9TQl9ICisKKy8qIExWTTIgc3VwZXIgYmxvY2sgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTFZNMl9NQUdJQ19MCQk4CisjZGVmaW5lIExWTTJfTUFHSUMJCSJMQUJFTE9ORSIKKyNkZWZpbmUgTFZNMl9UWVBFX0wJCTgKKyNkZWZpbmUgTFZNMl9UWVBFCQkiTFZNMiAwMDEiCisKK3N0cnVjdCBsdm0yX3N1cGVyX2Jsb2NrIHsKKwljaGFyIG1hZ2ljW0xWTTJfTUFHSUNfTF07CisJX19iZTY0IHNlY3RvcjsKKwlfX2JlMzIgY3JjOworCV9fYmUzMiBvZmZzZXQ7CisJY2hhciB0eXBlW0xWTTJfVFlQRV9MXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9tYWluLmMgYi91c3Iva2luaXQvZnN0eXBlL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ViNTkzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2ZzdHlwZS9tYWluLmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIGJ5IHJtaworICoKKyAqIERldGVjdCBmaWxlc3lzdGVtIHR5cGUgKG9uIHN0ZGluKSBhbmQgb3V0cHV0IHN0cmluZ3MgZm9yIHR3bworICogZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICogIEZTVFlQRSAtIGZpbGVzeXN0ZW0gdHlwZQorICogIEZTU0laRSAtIGZpbGVzeXN0ZW0gc2l6ZSAoaWYga25vd24pCisgKgorICogV2UgY3VycmVudGx5IGRldGVjdCAoaW4gb3JkZXIpOgorICogIGd6aXAsIGNyYW1mcywgcm9tZnMsIHhmcywgbWluaXgsIGV4dDMsIGV4dDIsIHJlaXNlcmZzLCBqZnMKKyAqCisgKiBNSU5JWCwgZXh0MyBhbmQgUmVpc2VyZnMgYml0cyBhcmUgY3VycmVudGx5IHVudGVzdGVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJmc3R5cGUuaCIKKworY2hhciAqcHJvZ25hbWU7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGZkID0gMDsKKwlpbnQgcnY7CisJY29uc3QgY2hhciAqZnN0eXBlOworCWNvbnN0IGNoYXIgKmZpbGUgPSAic3RkaW4iOworCXVuc2lnbmVkIGxvbmcgbG9uZyBieXRlczsKKworCXByb2duYW1lID0gYXJndlswXTsKKworCWlmIChhcmdjID4gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbZmlsZV1cbiIsIHByb2duYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGFyZ2MgPiAxICYmICEoYXJndlsxXVswXSA9PSAnLScgJiYgYXJndlsxXVsxXSA9PSAnXDAnKSkgeworCQlmZCA9IG9wZW4oZmlsZSA9IGFyZ3ZbMV0sIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJcGVycm9yKGFyZ3ZbMV0pOworCQkJcmV0dXJuIDI7CisJCX0KKwl9CisKKwlydiA9IGlkZW50aWZ5X2ZzKGZkLCAmZnN0eXBlLCAmYnl0ZXMsIDApOworCWlmIChydiA9PSAtMSkgeworCQlwZXJyb3IoZmlsZSk7CisJCXJldHVybiAyOworCX0KKworCWZzdHlwZSA9IGZzdHlwZSA/IGZzdHlwZSA6ICJ1bmtub3duIjsKKworCWZwcmludGYoc3Rkb3V0LCAiRlNUWVBFPSVzXG5GU1NJWkU9JWxsdVxuIiwgZnN0eXBlLCBieXRlcyk7CisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9taW5peF9mcy5oIGIvdXNyL2tpbml0L2ZzdHlwZS9taW5peF9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODk5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL21pbml4X2ZzLmgKQEAgLTAsMCArMSw4NSBAQAorI2lmbmRlZiBfTElOVVhfTUlOSVhfRlNfSAorI2RlZmluZSBfTElOVVhfTUlOSVhfRlNfSAorCisvKgorICogVGhlIG1pbml4IGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKKyAqLworCisvKgorICogVGhhbmtzIHRvIEtlZXMgSiBCb3QgZm9yIHNlbmRpbmcgbWUgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBuZXcKKyAqIG1pbml4IGZpbGVzeXN0ZW0gKGFrYSBWMikgd2l0aCBiaWdnZXIgaW5vZGVzIGFuZCAzMi1iaXQgYmxvY2sKKyAqIHBvaW50ZXJzLgorICovCisKKyNkZWZpbmUgTUlOSVhfUk9PVF9JTk8gMQorCisvKiBOb3QgdGhlIHNhbWUgYXMgdGhlIGJvZ3VzIExJTktfTUFYIGluIDxsaW51eC9saW1pdHMuaD4uIE9oIHdlbGwuICovCisjZGVmaW5lIE1JTklYX0xJTktfTUFYCTI1MAorI2RlZmluZSBNSU5JWDJfTElOS19NQVgJNjU1MzAKKworI2RlZmluZSBNSU5JWF9JX01BUF9TTE9UUwk4CisjZGVmaW5lIE1JTklYX1pfTUFQX1NMT1RTCTY0CisjZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDCTB4MTM3RgkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLworI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIJMHgxMzhGCS8qIG1pbml4IGZzLCAzMCBjaGFyIG5hbWVzICovCisjZGVmaW5lIE1JTklYMl9TVVBFUl9NQUdJQwkweDI0NjgJLyogbWluaXggVjIgZnMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDMgkweDI0NzgJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVhfVkFMSURfRlMJCTB4MDAwMQkvKiBDbGVhbiBmcy4gKi8KKyNkZWZpbmUgTUlOSVhfRVJST1JfRlMJCTB4MDAwMgkvKiBmcyBoYXMgZXJyb3JzLiAqLworCisjZGVmaW5lIE1JTklYX0lOT0RFU19QRVJfQkxPQ0sgKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXhfaW5vZGUpKSkKKyNkZWZpbmUgTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXgyX2lub2RlKSkpCisKKy8qCisgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBtaW5peCBpbm9kZSBsYXlvdXQgb24gZGlzay4KKyAqIE5vdGUgdGhlIDgtYml0IGdpZCBhbmQgYXRpbWUgYW5kIGN0aW1lLgorICovCitzdHJ1Y3QgbWluaXhfaW5vZGUgeworCV9fdTE2IGlfbW9kZTsKKwlfX3UxNiBpX3VpZDsKKwlfX3UzMiBpX3NpemU7CisJX191MzIgaV90aW1lOworCV9fdTggIGlfZ2lkOworCV9fdTggIGlfbmxpbmtzOworCV9fdTE2IGlfem9uZVs5XTsKK307CisKKy8qCisgKiBUaGUgbmV3IG1pbml4IGlub2RlIGhhcyBhbGwgdGhlIHRpbWUgZW50cmllcywgYXMgd2VsbCBhcworICogbG9uZyBibG9jayBudW1iZXJzIGFuZCBhIHRoaXJkIGluZGlyZWN0IGJsb2NrICg3KzErMSsxCisgKiBpbnN0ZWFkIG9mIDcrMSsxKS4gQWxzbywgc29tZSBwcmV2aW91c2x5IDgtYml0IHZhbHVlcyBhcmUKKyAqIG5vdyAxNi1iaXQuIFRoZSBpbm9kZSBpcyBub3cgNjQgYnl0ZXMgaW5zdGVhZCBvZiAzMi4KKyAqLworc3RydWN0IG1pbml4Ml9pbm9kZSB7CisJX191MTYgaV9tb2RlOworCV9fdTE2IGlfbmxpbmtzOworCV9fdTE2IGlfdWlkOworCV9fdTE2IGlfZ2lkOworCV9fdTMyIGlfc2l6ZTsKKwlfX3UzMiBpX2F0aW1lOworCV9fdTMyIGlfbXRpbWU7CisJX191MzIgaV9jdGltZTsKKwlfX3UzMiBpX3pvbmVbMTBdOworfTsKKworLyoKKyAqIG1pbml4IHN1cGVyLWJsb2NrIGRhdGEgb24gZGlzaworICovCitzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgeworCV9fdTE2IHNfbmlub2RlczsKKwlfX3UxNiBzX256b25lczsKKwlfX3UxNiBzX2ltYXBfYmxvY2tzOworCV9fdTE2IHNfem1hcF9ibG9ja3M7CisJX191MTYgc19maXJzdGRhdGF6b25lOworCV9fdTE2IHNfbG9nX3pvbmVfc2l6ZTsKKwlfX3UzMiBzX21heF9zaXplOworCV9fdTE2IHNfbWFnaWM7CisJX191MTYgc19zdGF0ZTsKKwlfX3UzMiBzX3pvbmVzOworfTsKKworc3RydWN0IG1pbml4X2Rpcl9lbnRyeSB7CisJX191MTYgaW5vZGU7CisJY2hhciAgbmFtZVswXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9yZWlzZXJmc19mcy5oIGIvdXNyL2tpbml0L2ZzdHlwZS9yZWlzZXJmc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDc5OTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL3JlaXNlcmZzX2ZzLmgKQEAgLTAsMCArMSw2OSBAQAorc3RydWN0IGpvdXJuYWxfcGFyYW1zIHsKKwlfX3UzMiBqcF9qb3VybmFsXzFzdF9ibG9jazsJLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzCisJCQkJCSAqIGRldmljZSAqLworCV9fdTMyIGpwX2pvdXJuYWxfZGV2OwkvKiBqb3VybmFsIGRldmljZSBzdF9yZGV2ICovCisJX191MzIganBfam91cm5hbF9zaXplOwkvKiBzaXplIG9mIHRoZSBqb3VybmFsICovCisJX191MzIganBfam91cm5hbF90cmFuc19tYXg7CS8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICovCisJX191MzIganBfam91cm5hbF9tYWdpYzsJLyogcmFuZG9tIHZhbHVlIG1hZGUgb24gZnMgY3JlYXRpb24gKHRoaXMKKwkJCQkgKiB3YXMgc2Jfam91cm5hbF9ibG9ja19jb3VudCkgKi8KKwlfX3UzMiBqcF9qb3VybmFsX21heF9iYXRjaDsJLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhCisJCQkJCSAqIHRyYW5zICovCisJX191MzIganBfam91cm5hbF9tYXhfY29tbWl0X2FnZTsJLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMKKwkJCQkJCSAqIGNvbW1pdCBiZSAqLworCV9fdTMyIGpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTsJLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYSB0cmFuc2FjdGlvbgorCQkJCQkgKiBiZSAqLworfTsKKworLyogdGhpcyBpcyB0aGUgc3VwZXIgZnJvbSAzLjUuWCwgd2hlcmUgWCA+PSAxMCAqLworc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxIHsKKwlfX3UzMiBzX2Jsb2NrX2NvdW50OwkvKiBibG9ja3MgY291bnQgICAgICAgICAqLworCV9fdTMyIHNfZnJlZV9ibG9ja3M7CS8qIGZyZWUgYmxvY2tzIGNvdW50ICAgICovCisJX191MzIgc19yb290X2Jsb2NrOwkvKiByb290IGJsb2NrIG51bWJlciAgICAqLworCXN0cnVjdCBqb3VybmFsX3BhcmFtcyBzX2pvdXJuYWw7CisJX191MTYgc19ibG9ja3NpemU7CS8qIGJsb2NrIHNpemUgKi8KKwlfX3UxNiBzX29pZF9tYXhzaXplOwkvKiBtYXggc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXksIHNlZQorCQkJCSAqIGdldF9vYmplY3RpZCgpIGNvbW1lbnRhcnkgICovCisJX191MTYgc19vaWRfY3Vyc2l6ZTsJLyogY3VycmVudCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSAqLworCV9fdTE2IHNfdW1vdW50X3N0YXRlOwkvKiB0aGlzIGlzIHNldCB0byAxIHdoZW4gZmlsZXN5c3RlbSB3YXMKKwkJCQkgKiB1bW91bnRlZCwgdG8gMiAtIHdoZW4gbm90ICovCisJY2hhciBzX21hZ2ljWzEwXTsJLyogcmVpc2VyZnMgbWFnaWMgc3RyaW5nIGluZGljYXRlcyB0aGF0CisJCQkJICogZmlsZSBzeXN0ZW0gaXMgcmVpc2VyZnM6CisJCQkJICogIlJlSXNFckZzIiBvciAiUmVJc0VyMkZzIiBvciAiUmVJc0VyM0ZzIiAqLworCV9fdTE2IHNfZnNfc3RhdGU7CS8qIGl0IGlzIHNldCB0byB1c2VkIGJ5IGZzY2sgdG8gbWFyayB3aGljaAorCQkJCSAqIHBoYXNlIG9mIHJlYnVpbGRpbmcgaXMgZG9uZSAqLworCV9fdTMyIHNfaGFzaF9mdW5jdGlvbl9jb2RlOwkvKiBpbmRpY2F0ZSwgd2hhdCBoYXNoIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZQorCQkJCQkgKiB0byBzb3J0IG5hbWVzIGluIGEgZGlyZWN0b3J5Ki8KKwlfX3UxNiBzX3RyZWVfaGVpZ2h0OwkvKiBoZWlnaHQgb2YgZGlzayB0cmVlICovCisJX191MTYgc19ibWFwX25yOwkvKiBhbW91bnQgb2YgYml0bWFwIGJsb2NrcyBuZWVkZWQgdG8gYWRkcmVzcworCQkJCSAqIGVhY2ggYmxvY2sgb2YgZmlsZSBzeXN0ZW0gKi8KKwlfX3UxNiBzX3ZlcnNpb247CS8qIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtCisJCQkJICogd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLworCV9fdTE2IHNfcmVzZXJ2ZWRfZm9yX2pvdXJuYWw7CS8qIHNpemUgaW4gYmxvY2tzIG9mIGpvdXJuYWwgYXJlYSBvbiBtYWluCisJCQkJCSAqIGRldmljZSwgd2UgbmVlZCB0byBrZWVwIGFmdGVyCisJCQkJCSAqIG1ha2luZyBmcyB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qIHRoaXMgaXMgdGhlIG9uIGRpc2sgc3VwZXIgYmxvY2sgKi8KK3N0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayB7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxIHNfdjE7CisJX191MzIgc19pbm9kZV9nZW5lcmF0aW9uOworCV9fdTMyIHNfZmxhZ3M7CQkvKiBSaWdodCBub3cgdXNlZCBvbmx5IGJ5IGlub2RlLWF0dHJpYnV0ZXMsIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNfdXVpZFsxNl07CS8qIGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHNfbGFiZWxbMTZdOwkvKiBmaWxlc3lzdGVtIHZvbHVtZSBsYWJlbCAqLworCWNoYXIgc191bnVzZWRbODhdOwkvKiB6ZXJvIGZpbGxlZCBieSBta3JlaXNlcmZzIGFuZAorCQkJCSAqIHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKCkKKwkJCQkgKiBzbyBhbnkgYWRkaXRpb25zIG11c3QgYmUgdXBkYXRlZAorCQkJCSAqIHRoZXJlIGFzIHdlbGwuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXJGcyIKKyNkZWZpbmUgUkVJU0VSMkZTX1NVUEVSX01BR0lDX1NUUklORyAiUmVJc0VyMkZzIgorI2RlZmluZSBSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIzRnMiCisKKyNkZWZpbmUgU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKSAoJigocyktPnNfdjEpKQorI2RlZmluZSBSRUlTRVJGU19CTE9DS1NJWkUocykgXAorICAgICAgICBfX2xlMzJfdG9fY3B1KChTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2Jsb2Nrc2l6ZSkpCisjZGVmaW5lIFJFSVNFUkZTX0JMT0NLX0NPVU5UKHMpIFwKKyAgICAgICAgX19sZTMyX3RvX2NwdSgoU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKS0+c19ibG9ja19jb3VudCkpCisjZGVmaW5lIFJFSVNFUkZTX01BR0lDKHMpIFwKKyAgICAgICAgKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfbWFnaWMpCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL3JvbWZzX2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL3JvbWZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5MGZiYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvcm9tZnNfZnMuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIF9fTElOVVhfUk9NRlNfRlNfSAorI2RlZmluZSBfX0xJTlVYX1JPTUZTX0ZTX0gKKworLyogVGhlIGJhc2ljIHN0cnVjdHVyZXMgb2YgdGhlIHJvbWZzIGZpbGVzeXN0ZW0gKi8KKworI2RlZmluZSBST01CU0laRSBCTE9DS19TSVpFCisjZGVmaW5lIFJPTUJTQklUUyBCTE9DS19TSVpFX0JJVFMKKyNkZWZpbmUgUk9NQk1BU0sgKFJPTUJTSVpFLTEpCisjZGVmaW5lIFJPTUZTX01BR0lDIDB4NzI3NQorCisjZGVmaW5lIFJPTUZTX01BWEZOIDEyOAorCisjZGVmaW5lIF9fbWt3KGgsbCkgKCgoaCkmMHgwMGZmKTw8IDh8KChsKSYweDAwZmYpKQorI2RlZmluZSBfX21rbChoLGwpICgoKGgpJjB4ZmZmZik8PDE2fCgobCkmMHhmZmZmKSkKKyNkZWZpbmUgX19tazQoYSxiLGMsZCkgY3B1X3RvX2JlMzIoX19ta2woX19ta3coYSxiKSxfX21rdyhjLGQpKSkKKyNkZWZpbmUgUk9NU0JfV09SRDAgX19tazQoJy0nLCdyJywnbycsJ20nKQorI2RlZmluZSBST01TQl9XT1JEMSBfX21rNCgnMScsJ2YnLCdzJywnLScpCisKKy8qIE9uLWRpc2sgInN1cGVyIGJsb2NrIiAqLworCitzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgeworCV9fYmUzMiB3b3JkMDsKKwlfX2JlMzIgd29yZDE7CisJX19iZTMyIHNpemU7CisJX19iZTMyIGNoZWNrc3VtOworCWNoYXIgbmFtZVswXTsJCS8qIHZvbHVtZSBuYW1lICovCit9OworCisvKiBPbiBkaXNrIGlub2RlICovCisKK3N0cnVjdCByb21mc19pbm9kZSB7CisJX19iZTMyIG5leHQ7CQkvKiBsb3cgNCBiaXRzIHNlZSBST01GSF8gKi8KKwlfX2JlMzIgc3BlYzsKKwlfX2JlMzIgc2l6ZTsKKwlfX2JlMzIgY2hlY2tzdW07CisJY2hhciBuYW1lWzBdOworfTsKKworI2RlZmluZSBST01GSF9UWVBFIDcKKyNkZWZpbmUgUk9NRkhfSFJEIDAKKyNkZWZpbmUgUk9NRkhfRElSIDEKKyNkZWZpbmUgUk9NRkhfUkVHIDIKKyNkZWZpbmUgUk9NRkhfU1lNIDMKKyNkZWZpbmUgUk9NRkhfQkxLIDQKKyNkZWZpbmUgUk9NRkhfQ0hSIDUKKyNkZWZpbmUgUk9NRkhfU0NLIDYKKyNkZWZpbmUgUk9NRkhfRklGIDcKKyNkZWZpbmUgUk9NRkhfRVhFQyA4CisKKy8qIEFsaWdubWVudCAqLworCisjZGVmaW5lIFJPTUZIX1NJWkUgMTYKKyNkZWZpbmUgUk9NRkhfUEFEIChST01GSF9TSVpFLTEpCisjZGVmaW5lIFJPTUZIX01BU0sgKH5ST01GSF9QQUQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9zd2FwX2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL3N3YXBfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdmZGRiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2ZzdHlwZS9zd2FwX2ZzLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfX0xJTlVYX1NXQVBfRlNfSAorI2RlZmluZSBfX0xJTlVYX1NXQVBfRlNfSAorCisvKiBUaGUgYmFzaWMgc3RydWN0dXJlcyBvZiB0aGUgc3dhcCBzdXBlciBibG9jayAqLworI2RlZmluZSBTV0FQX01BR0lDX0wJCTEwCisjZGVmaW5lIFNXQVBfUkVTRVJWRURfTAkJKDEwMjQgLSBTV0FQX01BR0lDX0wpCisjZGVmaW5lIFNXQVBfTUFHSUNfMQkJIlNXQVAtU1BBQ0UiCisjZGVmaW5lIFNXQVBfTUFHSUNfMgkJIlNXQVBTUEFDRTIiCisKKy8qIFN1c3BlbmQgc2lnbmF0dXJlcywgbG9jYXRlZCBhdCBzYW1lIGFkZHIgYXMgc3dhcCBtYWdpYyAqLworI2RlZmluZSBTVVNQX01BR0lDX0wJCTkKKyNkZWZpbmUgU1VTUF9NQUdJQ18xCQkiUzFTVVNQRU5EIgorI2RlZmluZSBTVVNQX01BR0lDXzIJCSJTMlNVU1BFTkQiCisjZGVmaW5lIFNVU1BfTUFHSUNfVQkJIlVMU1VTUEVORCIKKworLyogVGhlIHN1cGVyYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGZpcnN0IHBhZ2UgKi8KKyNkZWZpbmUgU1dBUF9PRkZTRVQoKQkJKChnZXRwYWdlc2l6ZSgpIC0gMTAyNCkgPj4gMTApCisKKy8qIE9uLWRpc2sgInN1cGVyIGJsb2NrIiAqLworc3RydWN0IHN3YXBfc3VwZXJfYmxvY2sgeworCWNoYXIgcmVzZXJ2ZWRbU1dBUF9SRVNFUlZFRF9MXTsKKwljaGFyIG1hZ2ljW1NXQVBfTUFHSUNfTF07Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUveGZzX3NiLmggYi91c3Iva2luaXQvZnN0eXBlL3hmc19zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTBlZTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL3hmc19zYi5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBTdXBlciBibG9jaworICogRml0cyBpbnRvIGEgc2VjdG9yLXNpemVkIGJ1ZmZlciBhdCBhZGRyZXNzIDAgb2YgZWFjaCBhbGxvY2F0aW9uIGdyb3VwLgorICogT25seSB0aGUgZmlyc3Qgb2YgdGhlc2UgaXMgZXZlciB1cGRhdGVkIGV4Y2VwdCBkdXJpbmcgZ3Jvd2ZzLgorICovCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19tb3VudDsKKworI2RlZmluZQlYRlNfU0JfTUFHSUMJCTB4NTg0NjUzNDIJLyogJ1hGU0InICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19zYiB7CisJX191MzIgc2JfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfU0JfTUFHSUMgKi8KKwlfX3UzMiBzYl9ibG9ja3NpemU7CS8qIGxvZ2ljYWwgYmxvY2sgc2l6ZSwgYnl0ZXMgKi8KKwlfX3U2NCBzYl9kYmxvY2tzOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi8KK30geGZzX3NiX3Q7CmRpZmYgLS1naXQgYS91c3Iva2luaXQvZ2V0YXJnLmMgYi91c3Iva2luaXQvZ2V0YXJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjZTI0NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9nZXRhcmcuYwpAQCAtMCwwICsxLDU3IEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAia2luaXQuaCIKKworLyoKKyAqIFJvdXRpbmVzIHRoYXQgaHVudCBmb3IgYSBzcGVjaWZpYyBhcmd1bWVudC4gIFBsZWFzZSBub3RlIHRoYXQKKyAqIHRoZXkgYWN0dWFsbHkgc2VhcmNoIHRoZSBhcnJheSBiYWNrd2FyZHMuICBUaGF0IGlzIGJlY2F1c2Ugb24gdGhlCisgKiBrZXJuZWwgY29tbWFuZCBsaW5lcywgaXQncyBsZWdhbCB0byBvdmVycmlkZSBhbiBlYXJsaWVyIGFyZ3VtZW50CisgKiB3aXRoIGEgbGF0ZXIgYXJndW1lbnQuCisgKi8KKworLyoKKyAqIFdhcyB0aGlzIGJvb2xlYW4gYXJndW1lbnQgcGFzc2VkPyAgSWYgc28gcmV0dXJuIHRoZSBpbmRleCBpbiB0aGUKKyAqIGFyZ3YgYXJyYXkgZm9yIGl0LiAgRm9yIGNvbmZsaWN0aW5nIGJvb2xlYW4gb3B0aW9ucywgdXNlIHRoZQorICogb25lIHdpdGggdGhlIGhpZ2hlciBpbmRleC4gIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGUgcmV0dXJuIHZhbHVlCisgKiBjYW4gYmUgZXF1YWwsIGlzIHdoZW4gdGhleSdyZSBib3RoIHplcm87IHNvIGVxdWFsaXR5IGNhbiBiZSB1c2VkCisgKiBhcyB0aGUgZGVmYXVsdCBvcHRpb24gY2hvaWNlLgorICoKKyAqIEluIG90aGVyIHdvcmRzLCBpZiB0d28gb3B0aW9ucyAiYSIgYW5kICJiIiBhcmUgb3Bwb3NpdGVzLCBhbmQgImEiCisgKiBpcyB0aGUgZGVmYXVsdCwgdGhpcyBjYW4gYmUgY29kZWQgYXM6CisgKgorICogaWYgKGdldF9mbGFnKGFyZ2MsYXJndiwiYSIpID49IGdldF9mbGFnKGFyZ2MsYXJndiwiYiIpKQorICogCWRvX2Ffc3R1ZmYoKTsKKyAqIGVsc2UKKyAqCWRvX2Jfc3R1ZmYoKTsKKyAqLworaW50IGdldF9mbGFnKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSBhcmdjLTE7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgbmFtZSkpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYXMgdGhpcyB0ZXh0dWFsIHBhcmFtZXRlciAoZm9vPW9wdGlvbikgcGFzc2VkPworICoKKyAqIFRoaXMgcmV0dXJucyB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHN1Y2ggYW4gb3B0aW9uIGluIHRoZSBhcmd2IGFycmF5LgorICovCitjaGFyICpnZXRfYXJnKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGxlbiA9IHN0cmxlbihuYW1lKTsKKwljaGFyICpyZXQgPSBOVUxMOworCWludCBpOworCisJZm9yIChpID0gYXJnYy0xOyBpID4gMDsgaS0tKSB7CisJCWlmIChhcmd2W2ldICYmIHN0cm5jbXAoYXJndltpXSwgbmFtZSwgbGVuKSA9PSAwICYmCisJCSAgICAoYXJndltpXVtsZW5dICE9ICdcMCcpKSB7CisJCQlyZXQgPSBhcmd2W2ldICsgbGVuOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2dldGludGZpbGUuYyBiL3Vzci9raW5pdC9nZXRpbnRmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNiOTRiYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9nZXRpbnRmaWxlLmMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIE9wZW4gYSBmaWxlIGFuZCByZWFkIGl0LCBhc3N1bWluZyBpdCBjb250YWlucyBhIHNpbmdsZSBsb25nIHZhbHVlLgorICogUmV0dXJuIDAgaWYgd2UgcmVhZCBhIHZhbGlkIHZhbHVlLCBvdGhlcndpc2UgLTEuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBnZXRpbnRmaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgKnZhbCkKK3sKKwljaGFyIGJ1ZmZlcls2NF07CisJY2hhciAqZXA7CisJRklMRSAqZjsKKworCWYgPSBmb3BlbihwYXRoLCAiciIpOworCWlmICghZikKKwkJcmV0dXJuIC0xOworCisJZXAgPSBidWZmZXIgKyBmcmVhZChidWZmZXIsIDEsIHNpemVvZiBidWZmZXIgLSAxLCBmKTsKKwlmY2xvc2UoZik7CisJKmVwID0gJ1wwJzsKKworCSp2YWwgPSBzdHJ0b2woYnVmZmVyLCAmZXAsIDApOworCWlmICgqZXAgJiYgKmVwICE9ICdcbicpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2luaXRyZC5jIGIvdXNyL2tpbml0L2luaXRyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2FmMWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaW5pdHJkLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBIYW5kbGUgaW5pdHJkLCB0aHVzIHB1dHRpbmcgdGhlIGJhY2t3YXJkcyBpbnRvIGJhY2t3YXJkcyBjb21wYXRpYmxlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlICJkb19tb3VudHMuaCIKKyNpbmNsdWRlICJraW5pdC5oIgorI2luY2x1ZGUgInhwaW8uaCIKKworI2RlZmluZSBCVUZfU0laRQk2NTUzNgkvKiBTaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisKKy8qCisgKiBDb3B5IHRoZSBpbml0cmQgdG8gL2Rldi9yYW0wLCBjb3B5IGZyb20gdGhlIGVuZCB0byB0aGUgYmVnaW5uaW5nCisgKiB0byBhdm9pZCB0YWtpbmcgMnggdGhlIG1lbW9yeS4KKyAqLworc3RhdGljIGludCByZF9jb3B5X3VuY29tcHJlc3NlZChpbnQgZmZkLCBpbnQgZGZkKQoreworCWNoYXIgYnVmZmVyW0JVRl9TSVpFXTsKKwlvZmZfdCBieXRlczsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCURFQlVHKCgia2luaXQ6IHVuY29tcHJlc3NlZCBpbml0cmRcbiIpKTsKKworCWlmIChmZmQgPCAwIHx8IGZzdGF0KGZmZCwgJnN0KSB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKSB8fAorCSAgICAoYnl0ZXMgPSBzdC5zdF9zaXplKSA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoYnl0ZXMpIHsKKwkJc3NpemVfdCBibG9ja3NpemUgPSAoKGJ5dGVzIC0gMSkgJiAoQlVGX1NJWkUgLSAxKSkgKyAxOworCQlvZmZfdCBvZmZzZXQgPSBieXRlcyAtIGJsb2Nrc2l6ZTsKKworCQlERUJVRygoImtpbml0OiBjb3B5aW5nICV6ZCBieXRlcyBhdCBvZmZzZXQgJWxsdVxuIiwKKwkJICAgICAgIGJsb2Nrc2l6ZSwgb2Zmc2V0KSk7CisKKwkJaWYgKHhwcmVhZChmZmQsIGJ1ZmZlciwgYmxvY2tzaXplLCBvZmZzZXQpICE9IGJsb2Nrc2l6ZSB8fAorCQkgICAgeHB3cml0ZShkZmQsIGJ1ZmZlciwgYmxvY2tzaXplLCBvZmZzZXQpICE9IGJsb2Nrc2l6ZSkKKwkJCXJldHVybiAtMTsKKworCQlmdHJ1bmNhdGUoZmZkLCBvZmZzZXQpOwkvKiBGcmVlIHVwIG1lbW9yeSAqLworCQlieXRlcyA9IG9mZnNldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmRfY29weV9pbWFnZShjb25zdCBjaGFyICpwYXRoKQoreworCWludCBmZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpbnQgcnYgPSAtMTsKKwl1bnNpZ25lZCBjaGFyIGd6aXBfbWFnaWNbMl07CisKKwlpZiAoZmZkIDwgMCkKKwkJZ290byBiYXJmOworCisJaWYgKHhwcmVhZChmZmQsIGd6aXBfbWFnaWMsIDIsIDApID09IDIgJiYKKwkgICAgZ3ppcF9tYWdpY1swXSA9PSAwMzcgJiYgZ3ppcF9tYWdpY1sxXSA9PSAwMjEzKSB7CisJCUZJTEUgKndmZCA9IGZvcGVuKCIvZGV2L3JhbTAiLCAidyIpOworCQlpZiAoIXdmZCkKKwkJCWdvdG8gYmFyZjsKKwkJcnYgPSBsb2FkX3JhbWRpc2tfY29tcHJlc3NlZChwYXRoLCB3ZmQsIDApOworCQlmY2xvc2Uod2ZkKTsKKwl9IGVsc2UgeworCQlpbnQgZGZkID0gb3BlbigiL2Rldi9yYW0wIiwgT19XUk9OTFkpOworCQlpZiAoZGZkIDwgMCkKKwkJCWdvdG8gYmFyZjsKKwkJcnYgPSByZF9jb3B5X3VuY29tcHJlc3NlZChmZmQsIGRmZCk7CisJCWNsb3NlKGRmZCk7CisJfQorCitiYXJmOgorCWlmIChmZmQgPj0gMCkKKwkJY2xvc2UoZmZkKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBSdW4gL2xpbnV4cmMsIGZvciBlbXVsYXRpb24gb2Ygb2xkLXN0eWxlIGluaXRyZAorICovCitzdGF0aWMgaW50IHJ1bl9saW51eHJjKGludCBhcmdjLCBjaGFyICphcmd2W10sIGRldl90IHJvb3RfZGV2KQoreworCWludCByb290X2ZkLCBvbGRfZmQ7CisJcGlkX3QgcGlkOworCWxvbmcgcmVhbHJvb3QgPSBSb290X1JBTTA7CisJY29uc3QgY2hhciAqcmFtZGlza19uYW1lID0gIi9kZXYvcmFtMCI7CisJRklMRSAqZnA7CisKKwlERUJVRygoImtpbml0OiBtb3VudGluZyBpbml0cmRcbiIpKTsKKwlta2RpcigiL3Jvb3QiLCAwNzAwKTsKKwlpZiAoIW1vdW50X2Jsb2NrKHJhbWRpc2tfbmFtZSwgIi9yb290IiwgTlVMTCwgTVNfVkVSQk9TRSwgTlVMTCkpCisJCXJldHVybiAtZXJybm87CisKKwkvKiBXcml0ZSB0aGUgY3VycmVudCAicmVhbCByb290IGRldmljZSIgb3V0IHRvIHByb2NmcyAqLworCURFQlVHKCgia2luaXQ6IHJlYWxfcm9vdF9kZXYgPSAlI3hcbiIsIHJvb3RfZGV2KSk7CisJZnAgPSBmb3BlbigiL3Byb2Mvc3lzL2tlcm5lbC9yZWFsLXJvb3QtZGV2IiwgInciKTsKKwlmcHJpbnRmKGZwLCAiJXUiLCByb290X2Rldik7CisJZmNsb3NlKGZwKTsKKworCW1rZGlyKCIvb2xkIiwgMDcwMCk7CisJcm9vdF9mZCA9IG9wZW5fY2xvZXhlYygiLyIsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlksIDApOworCW9sZF9mZCA9IG9wZW5fY2xvZXhlYygiL29sZCIsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlksIDApOworCisJaWYgKHJvb3RfZmQgPCAwIHx8IG9sZF9mZCA8IDApCisJCXJldHVybiAtZXJybm87CisKKwlpZiAoY2hkaXIoIi9yb290IikgfHwKKwkgICAgbW91bnQoIi4iLCAiLyIsIE5VTEwsIE1TX01PVkUsIE5VTEwpIHx8IGNocm9vdCgiLiIpKQorCQlyZXR1cm4gLWVycm5vOworCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJc2V0c2lkKCk7CisJCS8qIExvb2tzIGxpa2UgbGludXhyYyBkb2Vzbid0IGdldCB0aGUgaW5pdCBlbnZpcm9ubWVudAorCQkgICBvciBwYXJhbWV0ZXJzLiAgV2VpcmQsIGJ1dCBzbyBpcyB0aGUgd2hvbGUgbGludXhyYyBiaXQuICovCisJCWV4ZWNsKCIvbGludXhyYyIsICJsaW51eHJjIiwgTlVMTCk7CisJCV9leGl0KDI1NSk7CisJfSBlbHNlIGlmIChwaWQgPiAwKSB7CisJCURFQlVHKCgia2luaXQ6IFdhaXRpbmcgZm9yIGxpbnV4cmMgdG8gY29tcGxldGUuLi5cbiIpKTsKKwkJd2hpbGUgKHdhaXRwaWQocGlkLCBOVUxMLCAwKSAhPSBwaWQpIDsKKwkJREVCVUcoKCJraW5pdDogbGludXhyYyBkb25lXG4iKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwlpZiAoZmNoZGlyKG9sZF9mZCkgfHwKKwkgICAgbW91bnQoIi8iLCAiLiIsIE5VTEwsIE1TX01PVkUsIE5VTEwpIHx8CisJICAgIGZjaGRpcihyb290X2ZkKSB8fCBjaHJvb3QoIi4iKSkKKwkJcmV0dXJuIC1lcnJubzsKKworCWNsb3NlKHJvb3RfZmQpOworCWNsb3NlKG9sZF9mZCk7CisKKwlnZXRpbnRmaWxlKCIvcHJvYy9zeXMva2VybmVsL3JlYWwtcm9vdC1kZXYiLCAmcmVhbHJvb3QpOworCisJLyogSWYgcmVhbHJvb3QgaXMgUm9vdF9SQU0wLCB0aGVuIHRoZSBpbml0cmQgZGlkIGFueSBuZWNlc3Nhcnkgd29yayAqLworCWlmIChyZWFscm9vdCA9PSBSb290X1JBTTApIHsKKwkJaWYgKG1vdW50KCIvb2xkIiwgIi9yb290IiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkpCisJCQlyZXR1cm4gLWVycm5vOworCX0gZWxzZSB7CisJCW1vdW50X3Jvb3QoYXJnYywgYXJndiwgKGRldl90KSByZWFscm9vdCwgTlVMTCk7CisKKwkJLyogSWYgL3Jvb3QvaW5pdHJkIGV4aXN0cywgbW92ZSB0aGUgaW5pdHJkIHRoZXJlLCBvdGhlcndpc2UgZGlzY2FyZCAqLworCQlpZiAoIW1vdW50KCIvb2xkIiwgIi9yb290L2luaXRyZCIsIE5VTEwsIE1TX01PVkUsIE5VTEwpKSB7CisJCQkvKiBXZSdyZSBnb29kICovCisJCX0gZWxzZSB7CisJCQlpbnQgb2xkZGV2ID0gb3BlbihyYW1kaXNrX25hbWUsIE9fUkRXUik7CisJCQl1bW91bnQyKCIvb2xkIiwgTU5UX0RFVEFDSCk7CisJCQlpZiAob2xkZGV2IDwgMCB8fAorCQkJICAgIGlvY3RsKG9sZGRldiwgQkxLRkxTQlVGLCAobG9uZykwKSB8fAorCQkJICAgIGNsb3NlKG9sZGRldikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBDYW5ub3QgZmx1c2ggaW5pdHJkIGNvbnRlbnRzXG4iLAorCQkJCQlwcm9nbmFtZSk7CisJCQl9CisJCX0KKwl9CisKKwlybWRpcigiL29sZCIpOworCXJldHVybiAwOworfQorCitpbnQgaW5pdHJkX2xvYWQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgZGV2X3Qgcm9vdF9kZXYpCit7CisJaWYgKGFjY2VzcygiL2luaXRyZC5pbWFnZSIsIFJfT0spKQorCQlyZXR1cm4gMDsJLyogTm8gaW5pdHJkICovCisKKwlERUJVRygoImtpbml0OiBpbml0cmQgZm91bmRcbiIpKTsKKworCWNyZWF0ZV9kZXYoIi9kZXYvcmFtMCIsIFJvb3RfUkFNMCk7CisKKwlpZiAocmRfY29weV9pbWFnZSgiL2luaXRyZC5pbWFnZSIpIHx8IHVubGluaygiL2luaXRyZC5pbWFnZSIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGluaXRyZCBpbnN0YWxsYXRpb24gZmFpbGVkICh0b28gYmlnPylcbiIsCisJCQlwcm9nbmFtZSk7CisJCXJldHVybiAwOwkvKiBGYWlsZWQgdG8gY29weSBpbml0cmQgKi8KKwl9CisKKwlERUJVRygoImtpbml0OiBpbml0cmQgY29waWVkXG4iKSk7CisKKwlpZiAocm9vdF9kZXYgIT0gUm9vdF9SQU0wKSB7CisJCWludCBlcnI7CisJCURFQlVHKCgia2luaXQ6IHJ1bm5pbmcgbGludXhyY1xuIikpOworCQllcnIgPSBydW5fbGludXhyYyhhcmdjLCBhcmd2LCByb290X2Rldik7CisJCWlmIChlcnIpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBydW5uaW5nIGxpbnV4cmM6ICVzXG4iLCBwcm9nbmFtZSwKKwkJCQlzdHJlcnJvcigtZXJyKSk7CisJCXJldHVybiAxOwkvKiBpbml0cmQgaXMgcm9vdCwgb3IgcnVuX2xpbnV4cmMgdG9vayBjYXJlIG9mIGl0ICovCisJfSBlbHNlIHsKKwkJREVCVUcoKCJraW5pdDogcGVybWFtZW50IChvciBwaXZvdGluZykgaW5pdHJkLCBub3QgcnVubmluZyBsaW51eHJjXG4iKSk7CisJCXJldHVybiAwOwkvKiBNb3VudGluZyBpbml0cmQgYXMgb3JkaW5hcnkgcm9vdCAqLworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9LYnVpbGQgYi91c3Iva2luaXQvaXBjb25maWcvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGQxODEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvS2J1aWxkCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIGlwY29uZmlnCisjCisKK3N0YXRpYy15IDo9IHN0YXRpYy9pcGNvbmZpZworc2hhcmVkLXkgOj0gc2hhcmVkL2lwY29uZmlnCisKKyMgY29tbW9uIC5vIGZpbGVzCitvYmpzIDo9IG1haW4ubyBuZXRkZXYubyBwYWNrZXQubworIyBkaGNwCitvYmpzICs9IGRoY3BfcHJvdG8ubworIyBib290cAorb2JqcyArPSBib290cF9wcm90by5vCisKKworIyBUT0RPIC0gZG8gd2Ugd2FudCBhIHN0cmlwcGVkIHZlcnNpb24KKyMgVE9ETyAtIGRvIHdlIHdhbnQgdGhlIHN0YXRpYy5nICsgc2hhcmVkLmcgZGlyZWN0b3JpZXM/CisKKworIyBDcmVhdGUgYnVpbHQtaW4ubyB3aXRoIGFsbCBvYmplY3QgZmlsZXMgKHVzZWQgYnkga2luaXQpCitsaWIteSA6PSAkKG9ianMpCisKKyMgLm8gZmlsZXMgdXNlZCB0byBidWlsdCBleGVjdXRhYmxlcworc3RhdGljL2lwY29uZmlnLXkgOj0gJChvYmpzKQorc2hhcmVkL2lwY29uZmlnLXkgOj0gJChvYmpzKQorCisjIENsZWFuaW5nCitjbGVhbi1kaXJzIDo9IHN0YXRpYyBzaGFyZWQKKworIyBpbnN0YWxsIGJpbmFyeQoraW5zdGFsbC15IDo9ICQoc2hhcmVkLXkpCmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvUkVBRE1FIGIvdXNyL2tpbml0L2lwY29uZmlnL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzgyMjdhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2lwY29uZmlnL1JFQURNRQpAQCAtMCwwICsxLDEwNiBAQAorQk9PVFAvREhDUCBjbGllbnQgZm9yIGtsaWJjCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVXNhZ2U6CisKK2lwY29uZmlnIFstYyBwcm90b10gWy1kIGludGVyZmFjZV0gWy1pIGlkZW50aWZpZXJdCisJIFstbl0gWy1wIHBvcnRdIFstdCB0aW1lb3V0XSBbaW50ZXJmYWNlIC4uLl0KKworLWMgcHJvdG8JVXNlIFBST1RPIGFzIHRoZSBjb25maWd1cmF0aW9uIHByb3RvY29sIGZvciBhbGwKKwkJaW50ZXJmYWNlcywgdW5sZXNzIG92ZXJyaWRkZW4gYnkgc3BlY2lmaWMgaW50ZXJmYWNlcy4KKy1kIGludGVyZmFjZQlFaXRoZXIgdGhlIG5hbWUgb2YgYW4gaW50ZXJmYWNlLCBvciBhIGxvbmcgc3BlYy4KKy1pIGlkZW50aWZpZXIJREhDUCB2ZW5kb3IgY2xhc3MgaWRlbnRpZmllci4gIFRoZSBkZWZhdWx0IGlzCisJCSJMaW51eCBpcGNvbmZpZyIuCistbgkJRG8gbm90aGluZyAtIGp1c3QgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3b3VsZAorCQliZSBwZXJmb3JtZWQuCistcCBwb3J0CQlTZW5kIGJvb3RwL2RoY3AgYnJvYWRjYXN0cyBmcm9tIFBPUlQsIHRvIFBPUlQgLSAxLgorLXQgdGltZW91dAlHaXZlIHVwIG9uIGFsbCB1bmNvbmZpZ3VyZWQgaW50ZXJmYWNlcyBhZnRlciBUSU1FT1VUIHNlY3MuCisKK1lvdSBjYW4gY29uZmlndXJlIG11bHRpcGxlIGludGVyZmFjZXMgYnkgcGFzc2luZyBtdWx0aXBsZSBpbnRlcmZhY2UKK3NwZWNzIG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIGJ5IHVzaW5nIHRoZSBzcGVjaWFsIGludGVyZmFjZSBuYW1lCisiYWxsIi4gIElmIHlvdSdyZSBhdXRvY29uZmlndXJpbmcgYW55IGludGVyZmFjZXMsIGlwY29uZmlnIHdpbGwgd2FpdAordW50aWwgZWl0aGVyIGFsbCBzdWNoIGludGVyZmFjZXMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQsIG9yIHRoZSB0aW1lb3V0CitwYXNzZXMuCisKK1BST1RPIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgd2hpY2ggc2VsZWN0cyB0aGUgYXV0b2NvbmZpZ3VyYXRpb24KK3Byb3RvY29sIHRvIHVzZToKKworbm90IHNwZWNpZmllZAl1c2UgYWxsIHByb3RvY29scyAodGhlIGRlZmF1bHQpCitkaGNwCQl1c2UgYm9vdHAgYW5kIGRoY3AKK2Jvb3RwCQl1c2UgYm9vdHAgb25seQorcmFycAkJdXNlIHJhcnAgKG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKQorbm9uZQkJbm8gYXV0b2NvbmZpZ3VyYXRpb24gLSBlaXRoZXIgc3RhdGljIGNvbmZpZywgb3Igbm9uZSBhdCBhbGwKKworQW4gaW50ZXJmYWNlIHNwZWMgY2FuIGJlIGVpdGhlciBzaG9ydCBmb3JtLCB3aGljaCBpcyBqdXN0IHRoZSBuYW1lIG9mCithbiBpbnRlcmZhY2UgKGV0aDAgb3Igd2hhdGV2ZXIpLCBvciBsb25nIGZvcm0uICBUaGUgbG9uZyBmb3JtIGNvbnNpc3RzCitvZiB1cCB0byBzZXZlbiBlbGVtZW50cywgc2VwYXJhdGVkIGJ5IGNvbG9uczoKKworPGNsaWVudC1pcD46PHNlcnZlci1pcD46PGd3LWlwPjo8bmV0bWFzaz46PGhvc3RuYW1lPjo8ZGV2aWNlPjo8YXV0b2NvbmY+CisKKyAgPGNsaWVudC1pcD4JSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50LiBJZiBlbXB0eSwgdGhlIGFkZHJlc3Mgd2lsbAorICAgICAgICAgICAgICAgIGVpdGhlciBiZSBkZXRlcm1pbmVkIGJ5IFJBUlAvQk9PVFAvREhDUC4gV2hhdCBwcm90b2NvbAorICAgICAgICAgICAgICAgIGlzIHVzZWQgZGUtIHBlbmRzIG9uIHRoZSA8YXV0b2NvbmY+IHBhcmFtZXRlci4gSWYgdGhpcworICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgZW1wdHksIGF1dG9jb25mIHdpbGwgYmUgdXNlZC4KKworICA8c2VydmVyLWlwPiAgIElQIGFkZHJlc3Mgb2YgdGhlIE5GUyBzZXJ2ZXIuIElmIFJBUlAgaXMgdXNlZCB0bworICAgICAgICAgICAgICAgIGRldGVybWluZSB0aGUgY2xpZW50IGFkZHJlc3MgYW5kIHRoaXMgcGFyYW1ldGVyIGlzIE5PVAorICAgICAgICAgICAgICAgIGVtcHR5IG9ubHkgcmVwbGllcyBmcm9tIHRoZSBzcGVjaWZpZWQgc2VydmVyIGFyZQorICAgICAgICAgICAgICAgIGFjY2VwdGVkLiBUbyB1c2UgZGlmZmVyZW50IFJBUlAgYW5kIE5GUyBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgc3BlY2lmeSB5b3VyIFJBUlAgc2VydmVyIGhlcmUgKG9yIGxlYXZlIGl0IGJsYW5rKSwgYW5kCisgICAgICAgICAgICAgICAgc3BlY2lmeSB5b3VyIE5GUyBzZXJ2ZXIgaW4gdGhlIGBuZnNyb290JyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAoc2VlIGFib3ZlKS4gSWYgdGhpcyBlbnRyeSBpcyBibGFuayB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgaXMgdXNlZCB3aGljaCBhbnN3ZXJlZCB0aGUgUkFSUC9CT09UUC9ESENQCisgICAgICAgICAgICAgICAgcmVxdWVzdC4KKworICA8Z3ctaXA+ICAgICAgIElQIGFkZHJlc3Mgb2YgYSBnYXRld2F5IGlmIHRoZSBzZXJ2ZXIgaXMgb24gYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICBzdWJuZXQuIElmIHRoaXMgZW50cnkgaXMgZW1wdHkgbm8gZ2F0ZXdheSBpcyB1c2VkIGFuZCB0aGUKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgaXMgYXNzdW1lZCB0byBiZSBvbiB0aGUgbG9jYWwgbmV0d29yaywgdW5sZXNzIGEKKyAgICAgICAgICAgICAgICB2YWx1ZSBoYXMgYmVlbiByZWNlaXZlZCBieSBCT09UUC9ESENQLgorCisgIDxuZXRtYXNrPiAgICAgTmV0bWFzayBmb3IgbG9jYWwgbmV0d29yayBpbnRlcmZhY2UuIElmIHRoaXMgaXMgZW1wdHksCisgICAgICAgICAgICAgICAgdGhlIG5ldG1hc2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBjbGllbnQgSVAgYWRkcmVzcyBhc3N1bWluZworICAgICAgICAgICAgICAgIGNsYXNzZnVsIGFkZHJlc3NpbmcsIHVubGVzcyBvdmVycmlkZGVuIGluIEJPT1RQL0RIQ1AgcmVwbHkuCisKKyAgPGhvc3RuYW1lPiAgICBOYW1lIG9mIHRoZSBjbGllbnQuIElmIGVtcHR5LCB0aGUgY2xpZW50IElQIGFkZHJlc3MgaXMKKyAgICAgICAgICAgICAgICB1c2VkIGluIEFTQ0lJIG5vdGF0aW9uLCBvciB0aGUgdmFsdWUgcmVjZWl2ZWQgYnkKKyAgICAgICAgICAgICAgICBCT09UUC9ESENQLgorCisgIDxkZXZpY2U+ICAgICAgTmFtZSBvZiBuZXR3b3JrIGRldmljZSB0byB1c2UuIElmIHRoaXMgaXMgZW1wdHksIGFsbAorICAgICAgICAgICAgICAgIGRldmljZXMgYXJlIHVzZWQgZm9yIFJBUlAvQk9PVFAvREhDUCByZXF1ZXN0cywgYW5kIHRoZQorICAgICAgICAgICAgICAgIGZpcnN0IG9uZSB3ZSByZWNlaXZlIGEgcmVwbHkgb24gaXMgY29uZmlndXJlZC4gSWYgeW91CisgICAgICAgICAgICAgICAgaGF2ZSBvbmx5IG9uZSBkZXZpY2UsIHlvdSBjYW4gc2FmZWx5IGxlYXZlIHRoaXMgYmxhbmsuCisKKyAgPGF1dG9jb25mPglNZXRob2QgdG8gdXNlIGZvciBhdXRvY29uZmlndXJhdGlvbi4gSWYgdGhpcyBpcyBlaXRoZXIKKyAgICAgICAgICAgICAgICAncmFycCcsICdib290cCcsIG9yICdkaGNwJyB0aGUgc3BlY2lmaWVkIHByb3RvY29sIGlzCisgICAgICAgICAgICAgICAgdXNlZC4gIElmIHRoZSB2YWx1ZSBpcyAnYm90aCcsICdhbGwnIG9yIGVtcHR5LCBhbGwKKyAgICAgICAgICAgICAgICBwcm90b2NvbHMgYXJlIHVzZWQuICAnb2ZmJywgJ3N0YXRpYycgb3IgJ25vbmUnIG1lYW5zCisgICAgICAgICAgICAgICAgbm8gYXV0b2NvbmZpZ3VyYXRpb24uCisKK0lQIGFkZHJlc3NlcyBhbmQgbmV0bWFza3MgbXVzdCBiZSBlaXRoZXIgYWJzZW50IChkZWZhdWx0aW5nIHRvIHplcm8pCitvciBwcmVzZW50ZWQgaW4gZG90dGVkLXF1YWQgbm90YXRpb24uCisKK0FuIGludGVyZmFjZSBzcGVjIGNhbiBiZSBwcmVmaXhlZCB3aXRoIGVpdGhlciAiaXA9IiwgIm5mc2FkZHJzPSIsIGJvdGgKK29mIHdoaWNoIGFyZSBpZ25vcmVkLiAgVGhlc2UgKGFsb25nIHdpdGggdGhlIHVnbGluZXNzIG9mIHRoZSBsb25nCitmb3JtKSBhcmUgcHJlc2VudCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBpbi1rZXJuZWwgaXBjb25maWcgY29kZQorZnJvbSAyLjQgYW5kIGVhcmxpZXIga2VybmVscy4KKworSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXMgb2YgdmFsaWQgaXBjb25maWcgY29tbWFuZCBsaW5lcy4KKworRW5hYmxlIHRoZSBsb29wYmFjayBpbnRlcmZhY2U6CisgICAgaXBjb25maWcgMTI3LjAuMC4xOjo6Ojpsbzpub25lCisKK1RyeSB0byBjb25maWd1cmUgZXRoMCB1c2luZyBib290cCBmb3IgdXAgdG8gMzAgc2Vjb25kczoKKyAgICBpcGNvbmZpZyAtdCAzMCAtYyBib290cCBldGgwCisKK0NvbmZpZ3VyZSBldGgwIGFuZCBldGgxIHVzaW5nIGRoY3Agb3IgYm9vdHAsIGFuZCBldGgyIHN0YXRpY2FsbHk6CisgICAgaXBjb25maWcgLWMgYW55IGV0aDAgZXRoMSAxOTIuMTY4LjEuMTo6Ojo6ZXRoMjpub25lCisKKy0tCisKK0Zyb20gUnVzc2VsbCdzIG9yaWdpbmFsIFJFQURNRSwgYW5kIHN0aWxsIHRydWU6CisKK1RoZSBjb2RlIGluIG1haW4uYyBpcyB5dWNreSBpbWhvLiAgTmVlZHMgY2xlYW5pbmcuCisKKy0tCitSdXNzZWxsIEtpbmcgKDIwMDIvMTAvMjIpCitCcnlhbiBPJ1N1bGxpdmFuICgyMDAzLzA0LzI5KQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL2Jvb3RwX3BhY2tldC5oIGIvdXNyL2tpbml0L2lwY29uZmlnL2Jvb3RwX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjVlYzMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvYm9vdHBfcGFja2V0LmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBCT09UUF9QQUNLRVRfSAorI2RlZmluZSBCT09UUF9QQUNLRVRfSAorCisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCitzdHJ1Y3QgbmV0ZGV2OworCisvKiBwYWNrZXQgb3BzICovCisjZGVmaW5lIEJPT1RQX1JFUVVFU1QJMQorI2RlZmluZSBCT09UUF9SRVBMWQkyCisKKy8qIHlvdXIgYmFzaWMgYm9vdHAgcGFja2V0ICovCitzdHJ1Y3QgYm9vdHBfaGRyIHsKKwl1aW50OF90CSBvcDsKKwl1aW50OF90CSBodHlwZTsKKwl1aW50OF90CSBobGVuOworCXVpbnQ4X3QJIGhvcHM7CisJdWludDMyX3QgeGlkOworCXVpbnQxNl90IHNlY3M7CisJdWludDE2X3QgZmxhZ3M7CisJdWludDMyX3QgY2lhZGRyOworCXVpbnQzMl90IHlpYWRkcjsKKwl1aW50MzJfdCBzaWFkZHI7CisJdWludDMyX3QgZ2lhZGRyOworCXVpbnQ4X3QJIGNoYWRkclsxNl07CisJY2hhcgkgc2VydmVyX25hbWVbNjRdOworCWNoYXIJIGJvb3RfZmlsZVsxMjhdOworCS8qIDMxMiBieXRlcyBvZiBleHRlbnNpb25zICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9ib290cF9wcm90by5jIGIvdXNyL2tpbml0L2lwY29uZmlnL2Jvb3RwX3Byb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1Nzk4NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9ib290cF9wcm90by5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQk9PVFAgcGFja2V0IHByb3RvY29sIGhhbmRsaW5nLgorICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgImlwY29uZmlnLmgiCisjaW5jbHVkZSAibmV0ZGV2LmgiCisjaW5jbHVkZSAiYm9vdHBfcGFja2V0LmgiCisjaW5jbHVkZSAiYm9vdHBfcHJvdG8uaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKworc3RhdGljIHVpbnQ4X3QgYm9vdHBfb3B0aW9uc1szMTJdID0geworCVsgIDBdID0gOTksIDEzMCwgODMsIDk5LC8qIFJGQzEwNDggbWFnaWMgY29va2llICovCisJWyAgNF0gPSAxLCA0LAkJLyogICA0LSAgOSBzdWJuZXQgbWFzayAqLworCVsgMTBdID0gMywgNCwJCS8qICAxMC0gMTUgZGVmYXVsdCBnYXRld2F5ICovCisJWyAxNl0gPSA1LCA4LAkJLyogIDE2LSAyNSBuYW1lc2VydmVyICovCisJWyAyNl0gPSAxMiwgMzIsCQkvKiAgMjYtIDU5IGhvc3QgbmFtZSAqLworCVsgNjBdID0gNDAsIDMyLAkJLyogIDYwLSA5NSBuaXMgZG9tYWluIG5hbWUgKi8KKwlbIDk2XSA9IDE3LCA0MCwJCS8qICA5Ni0xMzcgYm9vdCBwYXRoICovCisJWzEzOF0gPSA1NywgMiwgMSwgMTUwLAkvKiAxMzgtMTQxIGV4dGVuc2lvbiBidWZmZXIgKi8KKwlbMTQyXSA9IDI1NSwJCS8qIGVuZCBvZiBsaXN0ICovCit9OworCisvKgorICogU2VuZCBhIHBsYWluIGJvb3RwIHJlcXVlc3QgcGFja2V0IHdpdGggb3B0aW9ucworICovCitpbnQgYm9vdHBfc2VuZF9yZXF1ZXN0KHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYm9vdHBfaGRyIGJvb3RwOworCXN0cnVjdCBpb3ZlYyBpb3ZbXSA9IHsKKwkJLyogWzBdID0gaXAgKyB1ZHAgaGVhZGVycyAqLworCQlbMV0gPSB7JmJvb3RwLCBzaXplb2YoYm9vdHApfSwKKwkJWzJdID0ge2Jvb3RwX29wdGlvbnMsIDMxMn0KKwl9OworCisJbWVtc2V0KCZib290cCwgMCwgc2l6ZW9mKHN0cnVjdCBib290cF9oZHIpKTsKKworCWJvb3RwLm9wCT0gQk9PVFBfUkVRVUVTVCwgYm9vdHAuaHR5cGUgPSBkZXYtPmh3dHlwZTsKKwlib290cC5obGVuCT0gZGV2LT5od2xlbjsKKwlib290cC54aWQJPSBkZXYtPmJvb3RwLnhpZDsKKwlib290cC5jaWFkZHIJPSBkZXYtPmlwX2FkZHI7CisJYm9vdHAuc2Vjcwk9IGh0b25zKHRpbWUoTlVMTCkgLSBkZXYtPm9wZW5fdGltZSk7CisJbWVtY3B5KGJvb3RwLmNoYWRkciwgZGV2LT5od2FkZHIsIDE2KTsKKworCURFQlVHKCgiLT4gYm9vdHAgeGlkIDB4JTA4eCBzZWNzIDB4JTA4eCAiLAorCSAgICAgICBib290cC54aWQsIG50b2hzKGJvb3RwLnNlY3MpKSk7CisKKwlyZXR1cm4gcGFja2V0X3NlbmQoZGV2LCBpb3YsIDIpOworfQorCisvKgorICogUGFyc2UgYSBib290cCByZXBseSBwYWNrZXQKKyAqLworaW50IGJvb3RwX3BhcnNlKHN0cnVjdCBuZXRkZXYgKmRldiwgc3RydWN0IGJvb3RwX2hkciAqaGRyLAorCQl1aW50OF90ICpleHRzLCBpbnQgZXh0bGVuKQoreworCWRldi0+Ym9vdHAuZ2F0ZXdheQk9IGhkci0+Z2lhZGRyOworCWRldi0+aXBfYWRkcgkJPSBoZHItPnlpYWRkcjsKKwlkZXYtPmlwX3NlcnZlcgkJPSBoZHItPnNpYWRkcjsKKwlkZXYtPmlwX25ldG1hc2sJCT0gSU5BRERSX0FOWTsKKwlkZXYtPmlwX2Jyb2FkY2FzdAk9IElOQUREUl9BTlk7CisJZGV2LT5pcF9nYXRld2F5CQk9IGhkci0+Z2lhZGRyOworCWRldi0+aXBfbmFtZXNlcnZlclswXQk9IElOQUREUl9BTlk7CisJZGV2LT5pcF9uYW1lc2VydmVyWzFdCT0gSU5BRERSX0FOWTsKKwlkZXYtPmhvc3RuYW1lWzBdCT0gJ1wwJzsKKwlkZXYtPm5pc2RvbWFpbm5hbWVbMF0JPSAnXDAnOworCWRldi0+Ym9vdHBhdGhbMF0JPSAnXDAnOworCW1lbWNweSgmZGV2LT5maWxlbmFtZSwgJmhkci0+Ym9vdF9maWxlLCBGTkxFTik7CisKKwlpZiAoZXh0bGVuID49IDQgJiYgZXh0c1swXSA9PSA5OSAmJiBleHRzWzFdID09IDEzMCAmJgorCSAgICBleHRzWzJdID09IDgzICYmIGV4dHNbM10gPT0gOTkpIHsKKwkJdWludDhfdCAqZXh0OworCisJCWZvciAoZXh0ID0gZXh0cyArIDQ7IGV4dCAtIGV4dHMgPCBleHRsZW47KSB7CisJCQlpbnQgbGVuOworCQkJdWludDhfdCBvcHQgPSAqZXh0Kys7CisKKwkJCWlmIChvcHQgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKG9wdCA9PSAyNTUpCisJCQkJYnJlYWs7CisKKwkJCWxlbiA9ICpleHQrKzsKKworCQkJc3dpdGNoIChvcHQpIHsKKwkJCWNhc2UgMToJLyogc3VibmV0IG1hc2sgKi8KKwkJCQlpZiAobGVuID09IDQpCisJCQkJCW1lbWNweSgmZGV2LT5pcF9uZXRtYXNrLCBleHQsIDQpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgkvKiBkZWZhdWx0IGdhdGV3YXkgKi8KKwkJCQlpZiAobGVuID49IDQpCisJCQkJCW1lbWNweSgmZGV2LT5pcF9nYXRld2F5LCBleHQsIDQpOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgkvKiBETlMgc2VydmVyICovCisJCQkJaWYgKGxlbiA+PSA0KQorCQkJCQltZW1jcHkoJmRldi0+aXBfbmFtZXNlcnZlciwgZXh0LAorCQkJCQkgICAgICAgbGVuID49IDggPyA4IDogNCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEyOgkvKiBob3N0IG5hbWUgKi8KKwkJCQlpZiAobGVuID4gc2l6ZW9mKGRldi0+aG9zdG5hbWUpIC0gMSkKKwkJCQkJbGVuID0gc2l6ZW9mKGRldi0+aG9zdG5hbWUpIC0gMTsKKwkJCQltZW1jcHkoJmRldi0+aG9zdG5hbWUsIGV4dCwgbGVuKTsKKwkJCQlkZXYtPmhvc3RuYW1lW2xlbl0gPSAnXDAnOworCQkJCWJyZWFrOworCQkJY2FzZSAxNToJLyogZG9tYWluIG5hbWUgKi8KKwkJCQlpZiAobGVuID4gc2l6ZW9mKGRldi0+ZG5zZG9tYWlubmFtZSkgLSAxKQorCQkJCQlsZW4gPSBzaXplb2YoZGV2LT5kbnNkb21haW5uYW1lKSAtIDE7CisJCQkJbWVtY3B5KCZkZXYtPmRuc2RvbWFpbm5hbWUsIGV4dCwgbGVuKTsKKwkJCQlkZXYtPmRuc2RvbWFpbm5hbWVbbGVuXSA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIDE3OgkvKiByb290IHBhdGggKi8KKwkJCQlpZiAobGVuID4gc2l6ZW9mKGRldi0+Ym9vdHBhdGgpIC0gMSkKKwkJCQkJbGVuID0gc2l6ZW9mKGRldi0+Ym9vdHBhdGgpIC0gMTsKKwkJCQltZW1jcHkoJmRldi0+Ym9vdHBhdGgsIGV4dCwgbGVuKTsKKwkJCQlkZXYtPmJvb3RwYXRoW2xlbl0gPSAnXDAnOworCQkJCWJyZWFrOworCQkJY2FzZSAyNjoJLyogaW50ZXJmYWNlIE1UVSAqLworCQkJCWlmIChsZW4gPT0gMikKKwkJCQkJZGV2LT5tdHUgPSAoZXh0WzBdIDw8IDgpICsgZXh0WzFdOworCQkJCWJyZWFrOworCQkJY2FzZSAyODoJLyogYnJvYWRjYXN0IGFkZHIgKi8KKwkJCQlpZiAobGVuID09IDQpCisJCQkJCW1lbWNweSgmZGV2LT5pcF9icm9hZGNhc3QsIGV4dCwgNCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDQwOgkvKiBOSVMgZG9tYWluIG5hbWUgKi8KKwkJCQlpZiAobGVuID4gc2l6ZW9mKGRldi0+bmlzZG9tYWlubmFtZSkgLSAxKQorCQkJCQlsZW4gPSBzaXplb2YoZGV2LT5uaXNkb21haW5uYW1lKSAtIDE7CisJCQkJbWVtY3B5KCZkZXYtPm5pc2RvbWFpbm5hbWUsIGV4dCwgbGVuKTsKKwkJCQlkZXYtPm5pc2RvbWFpbm5hbWVbbGVuXSA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIDU0OiAJLyogc2VydmVyIGlkZW50aWZpZXIgKi8KKwkJCQlpZiAobGVuID09IDQgJiYgIWRldi0+aXBfc2VydmVyKQorCQkJCQltZW1jcHkoJmRldi0+aXBfc2VydmVyLCBleHQsIDQpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlleHQgKz0gbGVuOworCQl9CisJfQorCisJLyoKKwkgKiBHb3QgcGFja2V0LgorCSAqLworCXJldHVybiAxOworfQorCisvKgorICogUmVjZWl2ZSBhIGJvb3RwIHJlcGx5IGFuZCBwYXJzZSBwYWNrZXQKKyAqLworaW50IGJvb3RwX3JlY3ZfcmVwbHkoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXN0cnVjdCBib290cF9oZHIgYm9vdHA7CisJdWludDhfdCBib290cF9vcHRpb25zWzMxMl07CisJc3RydWN0IGlvdmVjIGlvdltdID0geworCQkvKiBbMF0gPSBpcCArIHVkcCBoZWFkZXJzICovCisJCVsxXSA9IHsmYm9vdHAsIHNpemVvZihzdHJ1Y3QgYm9vdHBfaGRyKX0sCisJCVsyXSA9IHtib290cF9vcHRpb25zLCAzMTJ9CisJfTsKKwlpbnQgcmV0OworCisJcmV0ID0gcGFja2V0X3JlY3YoaW92LCAzKTsKKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocmV0IDwgc2l6ZW9mKHN0cnVjdCBib290cF9oZHIpIHx8CisJICAgIGJvb3RwLm9wICE9IEJPT1RQX1JFUExZIHx8CS8qIFJGQzk1MSA3LjUgKi8KKwkgICAgYm9vdHAueGlkICE9IGRldi0+Ym9vdHAueGlkIHx8CisJICAgIG1lbWNtcChib290cC5jaGFkZHIsIGRldi0+aHdhZGRyLCAxNikpCisJCXJldHVybiAwOworCisJcmV0IC09IHNpemVvZihzdHJ1Y3QgYm9vdHBfaGRyKTsKKworCXJldHVybiBib290cF9wYXJzZShkZXYsICZib290cCwgYm9vdHBfb3B0aW9ucywgcmV0KTsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgaW50ZXJmYWNlIGZvciBib290cC4KKyAqLworaW50IGJvb3RwX2luaXRfaWYoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXNob3J0IGZsYWdzOworCisJLyoKKwkgKiBHZXQgdGhlIGRldmljZSBmbGFncworCSAqLworCWlmIChuZXRkZXZfZ2V0ZmxhZ3MoZGV2LCAmZmxhZ3MpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIFdlIGNhbid0IGRvIERIQ1Agbm9yIEJPT1RQIGlmIHRoaXMgZGV2aWNlCisJICogZG9lc24ndCBzdXBwb3J0IGJyb2FkY2FzdC4KKwkgKi8KKwlpZiAoZGV2LT5tdHUgPCAzNjQgfHwgKGZsYWdzICYgSUZGX0JST0FEQ0FTVCkgPT0gMCkgeworCQlkZXYtPmNhcHMgJj0gfihDQVBfQk9PVFAgfCBDQVBfREhDUCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogR2V0IGEgcmFuZG9tIFhJRAorCSAqLworCWRldi0+Ym9vdHAueGlkID0gKHVpbnQzMl90KSBscmFuZDQ4KCk7CisJZGV2LT5vcGVuX3RpbWUgPSB0aW1lKE5VTEwpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvYm9vdHBfcHJvdG8uaCBiL3Vzci9raW5pdC9pcGNvbmZpZy9ib290cF9wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODczY2UKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvYm9vdHBfcHJvdG8uaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIElQQ09ORklHX0JPT1RQX1BST1RPX0gKKyNkZWZpbmUgSVBDT05GSUdfQk9PVFBfUFJPVE9fSAorCitpbnQgYm9vdHBfc2VuZF9yZXF1ZXN0KHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgYm9vdHBfcmVjdl9yZXBseShzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworaW50IGJvb3RwX3BhcnNlKHN0cnVjdCBuZXRkZXYgKmRldiwgc3RydWN0IGJvb3RwX2hkciAqaGRyLCB1aW50OF90ICogZXh0cywKKwkJaW50IGV4dGxlbik7CitpbnQgYm9vdHBfaW5pdF9pZihzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworCisjZW5kaWYgLyogSVBDT05GSUdfQk9PVFBfUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL2RoY3BfcHJvdG8uYyBiL3Vzci9raW5pdC9pcGNvbmZpZy9kaGNwX3Byb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwOTBmMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9kaGNwX3Byb3RvLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBESENQIFJGQyAyMTMxIGFuZCAyMTMyCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiaXBjb25maWcuaCIKKyNpbmNsdWRlICJuZXRkZXYuaCIKKyNpbmNsdWRlICJib290cF9wYWNrZXQuaCIKKyNpbmNsdWRlICJib290cF9wcm90by5oIgorI2luY2x1ZGUgImRoY3BfcHJvdG8uaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKworc3RhdGljIHVpbnQ4X3QgZGhjcF9wYXJhbXNbXSA9IHsKKwkxLAkJCS8qIHN1Ym5ldCBtYXNrICovCisJMywJCQkvKiBkZWZhdWx0IGdhdGV3YXkgKi8KKwk2LAkJCS8qIEROUyBzZXJ2ZXIgKi8KKwkxMiwJCQkvKiBob3N0IG5hbWUgKi8KKwkxNSwJCQkvKiBkb21haW4gbmFtZSAqLworCTE3LAkJCS8qIHJvb3QgcGF0aCAqLworCTI2LAkJCS8qIGludGVyZmFjZSBtdHUgKi8KKwkyOCwJCQkvKiBicm9hZGNhc3QgYWRkciAqLworCTQwLAkJCS8qIE5JUyBkb21haW4gbmFtZSAod2h5PykgKi8KK307CisKK3N0YXRpYyB1aW50OF90IGRoY3BfZGlzY292ZXJfaGRyW10gPSB7CisJOTksIDEzMCwgODMsIDk5LAkJLyogYm9vdHAgY29va2llICovCisJNTMsIDEsIERIQ1BESVNDT1ZFUiwJCS8qIGRoY3AgbWVzc2FnZSB0eXBlICovCisJNTUsIHNpemVvZihkaGNwX3BhcmFtcyksCS8qIHBhcmFtZXRlciBsaXN0ICovCit9OworCitzdGF0aWMgdWludDhfdCBkaGNwX3JlcXVlc3RfaGRyW10gPSB7CisJOTksIDEzMCwgODMsIDk5LAkJLyogYm9vdCBjb29raWUgKi8KKwk1MywgMSwgREhDUFJFUVVFU1QsCQkvKiBkaGNwIG1lc3NhZ2UgdHlwZSAqLworI2RlZmluZSBTRVJWRVJfSVBfT0ZGIDkKKwk1NCwgNCwgMCwgMCwgMCwgMCwJCS8qIHNlcnZlciBJUCAqLworI2RlZmluZSBSRVFfSVBfT0ZGIDE1CisJNTAsIDQsIDAsIDAsIDAsIDAsCQkvKiByZXF1ZXN0ZWQgSVAgYWRkcmVzcyAqLworCTU1LCBzaXplb2YoZGhjcF9wYXJhbXMpLAkvKiBwYXJhbWV0ZXIgbGlzdCAqLworfTsKKworc3RhdGljIHVpbnQ4X3QgZGhjcF9lbmRbXSA9IHsKKwkyNTUsCit9OworCisvKiBCb3RoIGlvdmVjcyBiZWxvdyBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLCBzaW5jZSBkaGNwX3NlbmQoKQorICAgcG9rZXMgYXQgdGhlIGludGVybmFscyAqLworI2RlZmluZSBESENQX0lPVl9MRU4gNgorCitzdGF0aWMgc3RydWN0IGlvdmVjIGRoY3BfZGlzY292ZXJfaW92W10gPSB7CisJLyogWzBdID0gaXAgKyB1ZHAgaGVhZGVyICovCisJLyogWzFdID0gYm9vdHAgaGVhZGVyICovCisJWzJdID0ge2RoY3BfZGlzY292ZXJfaGRyLCBzaXplb2YoZGhjcF9kaXNjb3Zlcl9oZHIpfSwKKwlbM10gPSB7ZGhjcF9wYXJhbXMsIHNpemVvZihkaGNwX3BhcmFtcyl9LAorCS8qIFs0XSA9IERIQ1AgdmVuZG9yIGNsYXNzICovCisJWzVdID0ge2RoY3BfZW5kLCBzaXplb2YoZGhjcF9lbmQpfQorfTsKKworc3RhdGljIHN0cnVjdCBpb3ZlYyBkaGNwX3JlcXVlc3RfaW92W10gPSB7CisJLyogWzBdID0gaXAgKyB1ZHAgaGVhZGVyICovCisJLyogWzFdID0gYm9vdHAgaGVhZGVyICovCisJWzJdID0ge2RoY3BfcmVxdWVzdF9oZHIsIHNpemVvZihkaGNwX3JlcXVlc3RfaGRyKX0sCisJWzNdID0ge2RoY3BfcGFyYW1zLCBzaXplb2YoZGhjcF9wYXJhbXMpfSwKKwkvKiBbNF0gPSBESENQIHZlbmRvciBjbGFzcyAqLworCVs1XSA9IHtkaGNwX2VuZCwgc2l6ZW9mKGRoY3BfZW5kKX0KK307CisKKy8qCisgKiBQYXJzZSBhIERIQ1AgcmVzcG9uc2UgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQKK2RoY3BfcGFyc2Uoc3RydWN0IG5ldGRldiAqZGV2LCBzdHJ1Y3QgYm9vdHBfaGRyICpoZHIsIHVpbnQ4X3QgKiBleHRzLCBpbnQgZXh0bGVuKQoreworCXVpbnQ4X3QgdHlwZSA9IDA7CisJdWludDMyX3Qgc2VydmVyaWQgPSBJTkFERFJfTk9ORTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChleHRsZW4gPj0gNCAmJiBleHRzWzBdID09IDk5ICYmIGV4dHNbMV0gPT0gMTMwICYmCisJICAgIGV4dHNbMl0gPT0gODMgJiYgZXh0c1szXSA9PSA5OSkgeworCQl1aW50OF90ICpleHQ7CisKKwkJZm9yIChleHQgPSBleHRzICsgNDsgZXh0IC0gZXh0cyA8IGV4dGxlbjspIHsKKwkJCXVpbnQ4X3QgbGVuLCAqb3B0ID0gZXh0Kys7CisJCQlpZiAoKm9wdCA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlsZW4gPSAqZXh0Kys7CisKKwkJCWV4dCArPSBsZW47CisKKwkJCWlmICgqb3B0ID09IDUzKQorCQkJCXR5cGUgPSBvcHRbMl07CisJCQlpZiAoKm9wdCA9PSA1NCkKKwkJCQltZW1jcHkoJnNlcnZlcmlkLCBvcHQgKyAyLCA0KTsKKwkJfQorCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgREhDUE9GRkVSOgorCQlyZXQgPSBib290cF9wYXJzZShkZXYsIGhkciwgZXh0cywgZXh0bGVuKTsKKwkJaWYgKHJldCA9PSAxICYmIHNlcnZlcmlkICE9IElOQUREUl9OT05FKQorCQkJZGV2LT5zZXJ2ZXJpZCA9IHNlcnZlcmlkOworCQlERUJVRygoIlxuICAgZGhjcCBvZmZlclxuIikpOworCQlicmVhazsKKworCWNhc2UgREhDUEFDSzoKKwkJcmV0ID0gYm9vdHBfcGFyc2UoZGV2LCBoZHIsIGV4dHMsIGV4dGxlbik7CisJCURFQlVHKCgiXG4gICBkaGNwIGFja1xuIikpOworCQlicmVhazsKKworCWNhc2UgREhDUE5BSzoKKwkJcmV0ID0gMjsKKwkJREVCVUcoKCJcbiAgIGRoY3AgbmFrXG4iKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVjZWl2ZSBhbmQgcGFyc2UgYSBESENQIHBhY2tldAorICovCitzdGF0aWMgaW50IGRoY3BfcmVjdihzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc3RydWN0IGJvb3RwX2hkciBib290cDsKKwl1aW50OF90IGRoY3Bfb3B0aW9uc1sxNTAwXTsKKwlzdHJ1Y3QgaW92ZWMgaW92W10gPSB7CisJCS8qIFswXSA9IGlwICsgdWRwIGhlYWRlciAqLworCQlbMV0gPSB7JmJvb3RwLCBzaXplb2Yoc3RydWN0IGJvb3RwX2hkcil9LAorCQlbMl0gPSB7ZGhjcF9vcHRpb25zLCBzaXplb2YoZGhjcF9vcHRpb25zKX0KKwl9OworCWludCByZXQ7CisKKwlyZXQgPSBwYWNrZXRfcmVjdihpb3YsIDMpOworCWlmIChyZXQgPD0gMCkKKwkJcmV0dXJuIHJldDsKKworCURFQlVHKCgiXG4gICBkaGNwIHhpZCAlMDh4ICIsIGRldi0+Ym9vdHAueGlkKSk7CisKKwlpZiAocmV0IDwgc2l6ZW9mKHN0cnVjdCBib290cF9oZHIpIHx8IGJvb3RwLm9wICE9IEJPT1RQX1JFUExZIHx8CS8qIFJGQzk1MSA3LjUgKi8KKwkgICAgYm9vdHAueGlkICE9IGRldi0+Ym9vdHAueGlkIHx8CisJICAgIG1lbWNtcChib290cC5jaGFkZHIsIGRldi0+aHdhZGRyLCAxNikpCisJCXJldHVybiAwOworCisJcmV0IC09IHNpemVvZihzdHJ1Y3QgYm9vdHBfaGRyKTsKKworCXJldHVybiBkaGNwX3BhcnNlKGRldiwgJmJvb3RwLCBkaGNwX29wdGlvbnMsIHJldCk7Cit9CisKK3N0YXRpYyBpbnQgZGhjcF9zZW5kKHN0cnVjdCBuZXRkZXYgKmRldiwgc3RydWN0IGlvdmVjICp2ZWMpCit7CisJc3RydWN0IGJvb3RwX2hkciBib290cDsKKworCW1lbXNldCgmYm9vdHAsIDAsIHNpemVvZihzdHJ1Y3QgYm9vdHBfaGRyKSk7CisKKwlib290cC5vcAk9IEJPT1RQX1JFUVVFU1Q7CisJYm9vdHAuaHR5cGUJPSBkZXYtPmh3dHlwZTsKKwlib290cC5obGVuCT0gZGV2LT5od2xlbjsKKwlib290cC54aWQJPSBkZXYtPmJvb3RwLnhpZDsKKwlib290cC5jaWFkZHIJPSBkZXYtPmlwX2FkZHI7CisJYm9vdHAuZ2lhZGRyCT0gZGV2LT5ib290cC5nYXRld2F5OworCWJvb3RwLnNlY3MJPSBodG9ucyh0aW1lKE5VTEwpIC0gZGV2LT5vcGVuX3RpbWUpOworCW1lbWNweShib290cC5jaGFkZHIsIGRldi0+aHdhZGRyLCAxNik7CisKKwl2ZWNbMV0uaW92X2Jhc2UJPSAmYm9vdHA7CisJdmVjWzFdLmlvdl9sZW4JPSBzaXplb2Yoc3RydWN0IGJvb3RwX2hkcik7CisKKwl2ZWNbNF0uaW92X2Jhc2UgPSB2ZW5kb3JfY2xhc3NfaWRlbnRpZmllcjsKKwl2ZWNbNF0uaW92X2xlbiAgPSB2ZW5kb3JfY2xhc3NfaWRlbnRpZmllcl9sZW47CisKKwlERUJVRygoInhpZCAlMDh4IHNlY3MgJWQgIiwgYm9vdHAueGlkLCBudG9ocyhib290cC5zZWNzKSkpOworCisJcmV0dXJuIHBhY2tldF9zZW5kKGRldiwgdmVjLCBESENQX0lPVl9MRU4pOworfQorCisvKgorICogU2VuZCBhIERIQ1AgZGlzY292ZXIgcGFja2V0CisgKi8KK2ludCBkaGNwX3NlbmRfZGlzY292ZXIoc3RydWN0IG5ldGRldiAqZGV2KQoreworCWRldi0+aXBfYWRkciA9IElOQUREUl9BTlk7CisJZGV2LT5pcF9nYXRld2F5ID0gSU5BRERSX0FOWTsKKworCURFQlVHKCgiLT4gZGhjcCBkaXNjb3ZlciAiKSk7CisKKwlyZXR1cm4gZGhjcF9zZW5kKGRldiwgZGhjcF9kaXNjb3Zlcl9pb3YpOworfQorCisvKgorICogUmVjZWl2ZSBhIERIQ1Agb2ZmZXIgcGFja2V0CisgKi8KK2ludCBkaGNwX3JlY3Zfb2ZmZXIoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXJldHVybiBkaGNwX3JlY3YoZGV2KTsKK30KKworLyoKKyAqIFNlbmQgYSBESENQIHJlcXVlc3QgcGFja2V0CisgKi8KK2ludCBkaGNwX3NlbmRfcmVxdWVzdChzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJbWVtY3B5KCZkaGNwX3JlcXVlc3RfaGRyW1NFUlZFUl9JUF9PRkZdLCAmZGV2LT5zZXJ2ZXJpZCwgNCk7CisJbWVtY3B5KCZkaGNwX3JlcXVlc3RfaGRyW1JFUV9JUF9PRkZdLCAmZGV2LT5pcF9hZGRyLCA0KTsKKworCURFQlVHKCgiLT4gZGhjcCByZXF1ZXN0ICIpKTsKKworCXJldHVybiBkaGNwX3NlbmQoZGV2LCBkaGNwX3JlcXVlc3RfaW92KTsKK30KKworLyoKKyAqIFJlY2VpdmUgYSBESENQIGFjayBwYWNrZXQKKyAqLworaW50IGRoY3BfcmVjdl9hY2soc3RydWN0IG5ldGRldiAqZGV2KQoreworCXJldHVybiBkaGNwX3JlY3YoZGV2KTsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9kaGNwX3Byb3RvLmggYi91c3Iva2luaXQvaXBjb25maWcvZGhjcF9wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmE5MmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvZGhjcF9wcm90by5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgSVBDT05GSUdfREhDUF9QUk9UT19ICisjZGVmaW5lIElQQ09ORklHX0RIQ1BfUFJPVE9fSAorCisvKiBESENQIG1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgREhDUERJU0NPVkVSICAgIDEKKyNkZWZpbmUgREhDUE9GRkVSICAgICAgIDIKKyNkZWZpbmUgREhDUFJFUVVFU1QgICAgIDMKKyNkZWZpbmUgREhDUERFQ0xJTkUgICAgIDQKKyNkZWZpbmUgREhDUEFDSyAgICAgICAgIDUKKyNkZWZpbmUgREhDUE5BSyAgICAgICAgIDYKKyNkZWZpbmUgREhDUFJFTEVBU0UgICAgIDcKKyNkZWZpbmUgREhDUElORk9STSAgICAgIDgKKworaW50IGRoY3Bfc2VuZF9kaXNjb3ZlcihzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworaW50IGRoY3BfcmVjdl9vZmZlcihzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworaW50IGRoY3Bfc2VuZF9yZXF1ZXN0KHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgZGhjcF9yZWN2X2FjayhzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworCisjZW5kaWYgLyogSVBDT05GSUdfREhDUF9QUk9UT19IICovCmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvaXBjb25maWcuaCBiL3Vzci9raW5pdC9pcGNvbmZpZy9pcGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTA0NzQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvaXBjb25maWcuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIElQQ09ORklHX0lQQ09ORklHX0gKKyNkZWZpbmUgSVBDT05GSUdfSVBDT05GSUdfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNkZWZpbmUgTE9DQUxfUE9SVAk2OAorI2RlZmluZSBSRU1PVEVfUE9SVAkoTE9DQUxfUE9SVCAtIDEpCisKK2V4dGVybiB1aW50MTZfdCBjZmdfbG9jYWxfcG9ydDsKK2V4dGVybiB1aW50MTZfdCBjZmdfcmVtb3RlX3BvcnQ7CisKK2V4dGVybiBjaGFyIHZlbmRvcl9jbGFzc19pZGVudGlmaWVyW107CitleHRlcm4gaW50IHZlbmRvcl9jbGFzc19pZGVudGlmaWVyX2xlbjsKKworaW50IGlwY29uZmlnX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Cit1aW50MzJfdCBpcGNvbmZpZ19zZXJ2ZXJfYWRkcmVzcyh2b2lkICpuZXh0KTsKKworLyoKKyAqIE5vdGUgZm9yIGdjYyAzLjIuMjoKKyAqCisgKiBJZiB5b3UncmUgdHVybmluZyBvbiBkZWJ1Z2dpbmcsIG1ha2Ugc3VyZSB5b3UgZ2V0IHJpZCBvZiAtT3MgZnJvbQorICogdGhlIGdjYyBjb21tYW5kIGxpbmUsIG9yIGVsc2UgaXBjb25maWcgd2lsbCBmYWlsIHRvIGxpbmsuCisgKi8KKyNkZWZpbmUgSVBDX0RFQlVHCisKKyN1bmRlZiBERUJVRworI2lmZGVmIElQQ19ERUJVRworI2RlZmluZSBERUJVRyh4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgREVCVUcoeCkgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2VuZGlmIC8qIElQQ09ORklHX0lQQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9tYWluLmMgYi91c3Iva2luaXQvaXBjb25maWcvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMTQxZTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvbWFpbi5jCkBAIC0wLDAgKzEsNzg2IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZm9yIGdldG9wdHMgKi8KKworI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKworI2luY2x1ZGUgImlwY29uZmlnLmgiCisjaW5jbHVkZSAibmV0ZGV2LmgiCisjaW5jbHVkZSAiYm9vdHBfcGFja2V0LmgiCisjaW5jbHVkZSAiYm9vdHBfcHJvdG8uaCIKKyNpbmNsdWRlICJkaGNwX3Byb3RvLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHN5c2ZzX2NsYXNzX25ldFtdID0gIi9zeXMvY2xhc3MvbmV0IjsKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9nbmFtZTsKK3N0YXRpYyBqbXBfYnVmIGFib3J0X2J1ZjsKK3N0YXRpYyBjaGFyIGRvX25vdF9jb25maWc7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfY2FwcyA9IENBUF9ESENQIHwgQ0FQX0JPT1RQIHwgQ0FQX1JBUlA7CitzdGF0aWMgaW50IGxvb3BfdGltZW91dCA9IC0xOworc3RhdGljIGludCBjb25maWd1cmVkOworc3RhdGljIGludCBicmluZ3VwX2ZpcnN0ID0gMDsKKworLyogREhDUCB2ZW5kb3IgY2xhc3MgaWRlbnRpZmllciAqLworY2hhciB2ZW5kb3JfY2xhc3NfaWRlbnRpZmllclsyNjBdOworaW50IHZlbmRvcl9jbGFzc19pZGVudGlmaWVyX2xlbjsKKworc3RydWN0IHN0YXRlIHsKKwlpbnQgc3RhdGU7CisJaW50IHJlc3RhcnRfc3RhdGU7CisJdGltZV90IGV4cGlyZTsKKwlpbnQgcmV0cnlfcGVyaW9kOworCisJc3RydWN0IG5ldGRldiAqZGV2OworCXN0cnVjdCBzdGF0ZSAqbmV4dDsKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqbXlfaW5ldF9udG9hKHVpbnQzMl90IGFkZHIpCit7CisJc3RydWN0IGluX2FkZHIgYTsKKworCWEuc19hZGRyID0gYWRkcjsKKworCXJldHVybiBpbmV0X250b2EoYSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RldmljZV9jb25maWcoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXByaW50ZigiSVAtQ29uZmlnOiAlcyBjb21wbGV0ZSAoZnJvbSAlcyk6XG4iLCBkZXYtPm5hbWUsCisJICAgICAgIG15X2luZXRfbnRvYShkZXYtPnNlcnZlcmlkID8gZGV2LT5zZXJ2ZXJpZCA6IGRldi0+aXBfc2VydmVyKSk7CisJcHJpbnRmKCIgYWRkcmVzczogJS0xNnMgIiwgbXlfaW5ldF9udG9hKGRldi0+aXBfYWRkcikpOworCXByaW50ZigiYnJvYWRjYXN0OiAlLTE2cyAiLCBteV9pbmV0X250b2EoZGV2LT5pcF9icm9hZGNhc3QpKTsKKwlwcmludGYoIm5ldG1hc2s6ICUtMTZzXG4iLCBteV9pbmV0X250b2EoZGV2LT5pcF9uZXRtYXNrKSk7CisJcHJpbnRmKCIgZ2F0ZXdheTogJS0xNnMgIiwgbXlfaW5ldF9udG9hKGRldi0+aXBfZ2F0ZXdheSkpOworCXByaW50ZigiZG5zMCAgICAgOiAlLTE2cyAiLCBteV9pbmV0X250b2EoZGV2LT5pcF9uYW1lc2VydmVyWzBdKSk7CisJcHJpbnRmKCJkbnMxICAgOiAlLTE2c1xuIiwgbXlfaW5ldF9udG9hKGRldi0+aXBfbmFtZXNlcnZlclsxXSkpOworCWlmIChkZXYtPmhvc3RuYW1lWzBdKQorCQlwcmludGYoIiBob3N0ICAgOiAlLTY0c1xuIiwgZGV2LT5ob3N0bmFtZSk7CisJaWYgKGRldi0+ZG5zZG9tYWlubmFtZVswXSkKKwkJcHJpbnRmKCIgZG9tYWluIDogJS02NHNcbiIsIGRldi0+ZG5zZG9tYWlubmFtZSk7CisJaWYgKGRldi0+bmlzZG9tYWlubmFtZVswXSkKKwkJcHJpbnRmKCIgbmlzZG9tYWluOiAlLTY0c1xuIiwgZGV2LT5uaXNkb21haW5uYW1lKTsKKwlwcmludGYoIiByb290c2VydmVyOiAlcyAiLCBteV9pbmV0X250b2EoZGV2LT5pcF9zZXJ2ZXIpKTsKKwlwcmludGYoInJvb3RwYXRoOiAlc1xuIiwgZGV2LT5ib290cGF0aCk7CisJcHJpbnRmKCIgZmlsZW5hbWUgIDogJXNcbiIsIGRldi0+ZmlsZW5hbWUpOworfQorCitzdGF0aWMgdm9pZCBjb25maWd1cmVfZGV2aWNlKHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlpZiAoZG9fbm90X2NvbmZpZykKKwkJcmV0dXJuOworCisJaWYgKG5ldGRldl9zZXRtdHUoZGV2KSkKKwkJcHJpbnRmKCJJUC1Db25maWc6IGZhaWxlZCB0byBzZXQgTVRVIG9uICVzIHRvICV1XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPm10dSk7CisKKwlpZiAobmV0ZGV2X3NldGFkZHJlc3MoZGV2KSkKKwkJcHJpbnRmKCJJUC1Db25maWc6IGZhaWxlZCB0byBzZXQgYWRkcmVzc2VzIG9uICVzXG4iLCBkZXYtPm5hbWUpOworCWlmIChuZXRkZXZfc2V0ZGVmYXVsdHJvdXRlKGRldikpCisJCXByaW50ZigiSVAtQ29uZmlnOiBmYWlsZWQgdG8gc2V0IGRlZmF1bHQgcm91dGUgb24gJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCWlmIChkZXYtPmhvc3RuYW1lWzBdICYmCisJCQlzZXRob3N0bmFtZShkZXYtPmhvc3RuYW1lLCBzdHJsZW4oZGV2LT5ob3N0bmFtZSkpKQorCQlwcmludGYoIklQLUNvbmZpZzogZmFpbGVkIHRvIHNldCBob3N0bmFtZSAnJXMnIGZyb20gJXNcbiIsCisJCQlkZXYtPmhvc3RuYW1lLCBkZXYtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2RldmljZV9jb25maWcoc3RydWN0IG5ldGRldiAqZGV2KQoreworCWNoYXIgZm5bNDBdOworCUZJTEUgKmY7CisKKwlzbnByaW50Zihmbiwgc2l6ZW9mKGZuKSwgIi90bXAvbmV0LSVzLmNvbmYiLCBkZXYtPm5hbWUpOworCWYgPSBmb3BlbihmbiwgInciKTsKKwlpZiAoZikgeworCQlmcHJpbnRmKGYsICJERVZJQ0U9JXNcbiIsIGRldi0+bmFtZSk7CisJCWZwcmludGYoZiwgIklQVjRBRERSPSVzXG4iLCBteV9pbmV0X250b2EoZGV2LT5pcF9hZGRyKSk7CisJCWZwcmludGYoZiwgIklQVjRCUk9BRENBU1Q9JXNcbiIsCisJCQlteV9pbmV0X250b2EoZGV2LT5pcF9icm9hZGNhc3QpKTsKKwkJZnByaW50ZihmLCAiSVBWNE5FVE1BU0s9JXNcbiIsIG15X2luZXRfbnRvYShkZXYtPmlwX25ldG1hc2spKTsKKwkJZnByaW50ZihmLCAiSVBWNEdBVEVXQVk9JXNcbiIsIG15X2luZXRfbnRvYShkZXYtPmlwX2dhdGV3YXkpKTsKKwkJZnByaW50ZihmLCAiSVBWNEROUzA9JXNcbiIsCisJCQlteV9pbmV0X250b2EoZGV2LT5pcF9uYW1lc2VydmVyWzBdKSk7CisJCWZwcmludGYoZiwgIklQVjRETlMxPSVzXG4iLAorCQkJbXlfaW5ldF9udG9hKGRldi0+aXBfbmFtZXNlcnZlclsxXSkpOworCQlmcHJpbnRmKGYsICJIT1NUTkFNRT0lc1xuIiwgZGV2LT5ob3N0bmFtZSk7CisJCWZwcmludGYoZiwgIkROU0RPTUFJTj0lc1xuIiwgZGV2LT5kbnNkb21haW5uYW1lKTsKKwkJZnByaW50ZihmLCAiTklTRE9NQUlOPSVzXG4iLCBkZXYtPm5pc2RvbWFpbm5hbWUpOworCQlmcHJpbnRmKGYsICJST09UU0VSVkVSPSVzXG4iLCBteV9pbmV0X250b2EoZGV2LT5pcF9zZXJ2ZXIpKTsKKwkJZnByaW50ZihmLCAiUk9PVFBBVEg9JXNcbiIsIGRldi0+Ym9vdHBhdGgpOworCQlmcHJpbnRmKGYsICJmaWxlbmFtZT1cIiVzXCJcbiIsIGRldi0+ZmlsZW5hbWUpOworCQlmY2xvc2UoZik7CisJfQorfQorCitzdGF0aWMgdWludDMyX3QgaW5ldF9jbGFzc19uZXRtYXNrKHVpbnQzMl90IGlwKQoreworCWlwID0gbnRvaGwoaXApOworCWlmIChJTl9DTEFTU0EoaXApKQorCQlyZXR1cm4gaHRvbmwoSU5fQ0xBU1NBX05FVCk7CisJaWYgKElOX0NMQVNTQihpcCkpCisJCXJldHVybiBodG9ubChJTl9DTEFTU0JfTkVUKTsKKwlpZiAoSU5fQ0xBU1NDKGlwKSkKKwkJcmV0dXJuIGh0b25sKElOX0NMQVNTQ19ORVQpOworCXJldHVybiBJTkFERFJfQU5ZOworfQorCitzdGF0aWMgdm9pZCBwb3N0cHJvY2Vzc19kZXZpY2Uoc3RydWN0IG5ldGRldiAqZGV2KQoreworCWlmIChkZXYtPmlwX25ldG1hc2sgPT0gSU5BRERSX0FOWSkgeworCQlkZXYtPmlwX25ldG1hc2sgPSBpbmV0X2NsYXNzX25ldG1hc2soZGV2LT5pcF9hZGRyKTsKKwkJcHJpbnRmKCJJUC1Db25maWc6ICVzIGd1ZXNzZWQgbmV0bWFzayAlc1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbXlfaW5ldF9udG9hKGRldi0+aXBfbmV0bWFzaykpOworCX0KKwlpZiAoZGV2LT5pcF9icm9hZGNhc3QgPT0gSU5BRERSX0FOWSkgeworCQlkZXYtPmlwX2Jyb2FkY2FzdCA9CisJCSAgICAoZGV2LT5pcF9hZGRyICYgZGV2LT5pcF9uZXRtYXNrKSB8IH5kZXYtPmlwX25ldG1hc2s7CisJCXByaW50ZigiSVAtQ29uZmlnOiAlcyBndWVzc2VkIGJyb2FkY2FzdCBhZGRyZXNzICVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBteV9pbmV0X250b2EoZGV2LT5pcF9icm9hZGNhc3QpKTsKKwl9CisJaWYgKGRldi0+aXBfbmFtZXNlcnZlclswXSA9PSBJTkFERFJfQU5ZKSB7CisJCWRldi0+aXBfbmFtZXNlcnZlclswXSA9IGRldi0+aXBfc2VydmVyOworCQlwcmludGYoIklQLUNvbmZpZzogJXMgZ3Vlc3NlZCBuYW1lc2VydmVyIGFkZHJlc3MgJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG15X2luZXRfbnRvYShkZXYtPmlwX25hbWVzZXJ2ZXJbMF0pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2RldmljZShzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJcG9zdHByb2Nlc3NfZGV2aWNlKGRldik7CisJY29uZmlndXJlX2RldmljZShkZXYpOworCWR1bXBfZGV2aWNlX2NvbmZpZyhkZXYpOworCXByaW50X2RldmljZV9jb25maWcoZGV2KTsKKworCSsrY29uZmlndXJlZDsKKworCWRldi0+bmV4dCA9IGlmYWNlczsKKwlpZmFjZXMgPSBkZXY7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZWNlaXZlX2V2ZW50KHN0cnVjdCBzdGF0ZSAqcywgdGltZV90IG5vdykKK3sKKwlpbnQgaGFuZGxlZCA9IDE7CisKKwlzd2l0Y2ggKHMtPnN0YXRlKSB7CisJY2FzZSBERVZTVF9CT09UUDoKKwkJcy0+cmVzdGFydF9zdGF0ZSA9IERFVlNUX0JPT1RQOworCQlzd2l0Y2ggKGJvb3RwX3JlY3ZfcmVwbHkocy0+ZGV2KSkgeworCQljYXNlIC0xOgorCQkJcy0+c3RhdGUgPSBERVZTVF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzLT5zdGF0ZSA9IERFVlNUX0NPTVBMRVRFOworCQkJREVCVUcoKCJcbiAgIGJvb3RwIHJlcGx5XG4iKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgREVWU1RfREhDUERJU0M6CisJCXMtPnJlc3RhcnRfc3RhdGUgPSBERVZTVF9ESENQRElTQzsKKwkJc3dpdGNoIChkaGNwX3JlY3Zfb2ZmZXIocy0+ZGV2KSkgeworCQljYXNlIC0xOgorCQkJcy0+c3RhdGUgPSBERVZTVF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIE9mZmVyIHJlY2VpdmVkICovCisJCQlzLT5zdGF0ZSA9IERFVlNUX0RIQ1BSRVE7CisJCQlkaGNwX3NlbmRfcmVxdWVzdChzLT5kZXYpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIERFVlNUX0RIQ1BSRVE6CisJCXMtPnJlc3RhcnRfc3RhdGUgPSBERVZTVF9ESENQRElTQzsKKwkJc3dpdGNoIChkaGNwX3JlY3ZfYWNrKHMtPmRldikpIHsKKwkJY2FzZSAtMToJLyogZXJyb3IgKi8KKwkJCXMtPnN0YXRlID0gREVWU1RfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBBQ0sgcmVjZWl2ZWQgKi8KKwkJCXMtPnN0YXRlID0gREVWU1RfQ09NUExFVEU7CisJCQlicmVhazsKKwkJY2FzZSAyOgkvKiBOQUsgcmVjZWl2ZWQgKi8KKwkJCXMtPnN0YXRlID0gREVWU1RfREhDUERJU0M7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHMtPnN0YXRlKSB7CisJY2FzZSBERVZTVF9DT01QTEVURToKKwkJY29tcGxldGVfZGV2aWNlKHMtPmRldik7CisJCWJyZWFrOworCisJY2FzZSBERVZTVF9FUlJPUjoKKwkJLyogZXJyb3Igb2NjdXJyZWQsIHRyeSBhZ2FpbiBpbiAxMCBzZWNvbmRzICovCisJCXMtPmV4cGlyZSA9IG5vdyArIDEwOworCWRlZmF1bHQ6CisJCURFQlVHKCgiXG4iKSk7CisJCWhhbmRsZWQgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190aW1lb3V0X2V2ZW50KHN0cnVjdCBzdGF0ZSAqcywgdGltZV90IG5vdykKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogSXMgdGhlIGxpbmsgdXA/ICBJZiBub3QsIHRyeSBhZ2FpbiBpbiAxIHNlY29uZC4KKwkgKi8KKwlpZiAoIW5ldGRldl9ydW5uaW5nKHMtPmRldikpIHsKKwkJcy0+ZXhwaXJlID0gbm93ICsgMTsKKwkJcy0+c3RhdGUgPSBzLT5yZXN0YXJ0X3N0YXRlOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYWQgYW4gZXJyb3IsIHJlc3RvcmUgYSBzYW5lIHN0YXRlIHRvCisJICogcmVzdGFydCBmcm9tLgorCSAqLworCWlmIChzLT5zdGF0ZSA9PSBERVZTVF9FUlJPUikKKwkJcy0+c3RhdGUgPSBzLT5yZXN0YXJ0X3N0YXRlOworCisJLyoKKwkgKiBOb3cgc2VuZCBhIHBhY2tldCBkZXBlbmRpbmcgb24gb3VyIHN0YXRlLgorCSAqLworCXN3aXRjaCAocy0+c3RhdGUpIHsKKwljYXNlIERFVlNUX0JPT1RQOgorCQlyZXQgPSBib290cF9zZW5kX3JlcXVlc3Qocy0+ZGV2KTsKKwkJcy0+cmVzdGFydF9zdGF0ZSA9IERFVlNUX0JPT1RQOworCQlicmVhazsKKworCWNhc2UgREVWU1RfREhDUERJU0M6CisJCXJldCA9IGRoY3Bfc2VuZF9kaXNjb3ZlcihzLT5kZXYpOworCQlzLT5yZXN0YXJ0X3N0YXRlID0gREVWU1RfREhDUERJU0M7CisJCWJyZWFrOworCisJY2FzZSBERVZTVF9ESENQUkVROgorCQlyZXQgPSBkaGNwX3NlbmRfcmVxdWVzdChzLT5kZXYpOworCQlzLT5yZXN0YXJ0X3N0YXRlID0gREVWU1RfREhDUERJU0M7CisJCWJyZWFrOworCX0KKworCWlmIChyZXQgPT0gLTEpIHsKKwkJcy0+c3RhdGUgPSBERVZTVF9FUlJPUjsKKwkJcy0+ZXhwaXJlID0gbm93ICsgMTA7CisJfSBlbHNlIHsKKwkJcy0+ZXhwaXJlID0gbm93ICsgcy0+cmV0cnlfcGVyaW9kOworCisJCXMtPnJldHJ5X3BlcmlvZCAqPSAyOworCQlpZiAocy0+cmV0cnlfcGVyaW9kID4gNjApCisJCQlzLT5yZXRyeV9wZXJpb2QgPSA2MDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhdGUgKnNsaXN0Oworc3RydWN0IG5ldGRldiAqaWZhY2VzOworCitzdGF0aWMgaW50IGRvX3BrdF9yZWN2KGludCBwa3RfZmQsIHRpbWVfdCBub3cpCit7CisJaW50IGlmaW5kZXgsIHJldDsKKwlzdHJ1Y3Qgc3RhdGUgKnM7CisKKwlyZXQgPSBwYWNrZXRfcGVlaygmaWZpbmRleCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gYmFpbDsKKworCWZvciAocyA9IHNsaXN0OyBzOyBzID0gcy0+bmV4dCkgeworCQlpZiAocy0+ZGV2LT5pZmluZGV4ID09IGlmaW5kZXgpIHsKKwkJCXJldCB8PSBwcm9jZXNzX3JlY2VpdmVfZXZlbnQocywgbm93KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisgICAgICBiYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbG9vcCh2b2lkKQoreworI2RlZmluZSBOUl9GRFMJMQorCXN0cnVjdCBwb2xsZmQgZmRzW05SX0ZEU107CisJc3RydWN0IHN0YXRlICpzOworCWludCBwa3RfZmQ7CisJaW50IG5yID0gMDsKKwlzdHJ1Y3QgdGltZXZhbCBub3csIHByZXY7CisJdGltZV90IHN0YXJ0OworCisJcGt0X2ZkID0gcGFja2V0X29wZW4oKTsKKwlpZiAocGt0X2ZkID09IC0xKSB7CisJCXBlcnJvcigicGFja2V0X29wZW4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZkc1swXS5mZCA9IHBrdF9mZDsKKwlmZHNbMF0uZXZlbnRzID0gUE9MTFJETk9STTsKKworCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwlzdGFydCA9IG5vdy50dl9zZWM7CisJd2hpbGUgKDEpIHsKKwkJaW50IHRpbWVvdXQgPSA2MDsKKwkJaW50IHBlbmRpbmcgPSAwOworCQlpbnQgZG9uZSA9IDA7CisJCWludCB0aW1lb3V0X21zOworCQlpbnQgeDsKKworCQlmb3IgKHMgPSBzbGlzdDsgczsgcyA9IHMtPm5leHQpIHsKKwkJCURFQlVHKCgiJXM6IHN0YXRlID0gJWRcbiIsIHMtPmRldi0+bmFtZSwgcy0+c3RhdGUpKTsKKworCQkJaWYgKHMtPnN0YXRlID09IERFVlNUX0NPTVBMRVRFKSB7CisJCQkJZG9uZSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwZW5kaW5nKys7CisKKwkJCWlmIChzLT5leHBpcmUgLSBub3cudHZfc2VjIDw9IDApIHsKKwkJCQlERUJVRygoInRpbWVvdXRcbiIpKTsKKwkJCQlwcm9jZXNzX3RpbWVvdXRfZXZlbnQocywgbm93LnR2X3NlYyk7CisJCQl9CisKKwkJCWlmICh0aW1lb3V0ID4gcy0+ZXhwaXJlIC0gbm93LnR2X3NlYykKKwkJCQl0aW1lb3V0ID0gcy0+ZXhwaXJlIC0gbm93LnR2X3NlYzsKKwkJfQorCisJCWlmIChwZW5kaW5nID09IDAgfHwgKGJyaW5ndXBfZmlyc3QgJiYgZG9uZSkpCisJCQlicmVhazsKKworCQl0aW1lb3V0X21zID0gdGltZW91dCAqIDEwMDA7CisKKwkJZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgeworCQkJaW50IGRlbHRhX21zOworCisJCQlpZiAodGltZW91dF9tcyA8PSAwKQorCQkJCXRpbWVvdXRfbXMgPSAxMDA7CisKKwkJCW5yID0gcG9sbChmZHMsIE5SX0ZEUywgdGltZW91dF9tcyk7CisJCQlwcmV2ID0gbm93OworCQkJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCisJCQlpZiAoKGZkc1swXS5yZXZlbnRzICYgUE9MTFJETk9STSkpIHsKKwkJCQluciA9IGRvX3BrdF9yZWN2KHBrdF9mZCwgbm93LnR2X3NlYyk7CisJCQkJaWYgKG5yID09IDEpCisJCQkJCWJyZWFrOworCQkJCWVsc2UgaWYgKG5yID09IDApCisJCQkJCXBhY2tldF9kaXNjYXJkKCk7CisJCQl9CisKKwkJCWlmIChsb29wX3RpbWVvdXQgPj0gMCAmJgorCQkJICAgIG5vdy50dl9zZWMgLSBzdGFydCA+PSBsb29wX3RpbWVvdXQpIHsKKwkJCQlwcmludGYoIklQLUNvbmZpZzogbm8gcmVzcG9uc2UgYWZ0ZXIgJWQgIgorCQkJCSAgICAgICAic2VjcyAtIGdpdmluZyB1cFxuIiwgbG9vcF90aW1lb3V0KTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisKKwkJCWRlbHRhX21zID0gKG5vdy50dl9zZWMgLSBwcmV2LnR2X3NlYykgKiAxMDAwOworCQkJZGVsdGFfbXMgKz0gKG5vdy50dl91c2VjIC0gcHJldi50dl91c2VjKSAvIDEwMDA7CisKKwkJCURFQlVHKCgiRGVsdGE6ICVkIG1zXG4iLCBkZWx0YV9tcykpOworCisJCQl0aW1lb3V0X21zIC09IGRlbHRhX21zOworCQl9CisJfQorICAgICAgYmFpbDoKKwlwYWNrZXRfY2xvc2UoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9vbmVfZGV2KHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3RhdGUgKnN0YXRlOworCisJc3RhdGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGF0ZSkpOworCWlmICghc3RhdGUpCisJCXJldHVybiAtMTsKKworCXN0YXRlLT5kZXYgPSBkZXY7CisJc3RhdGUtPmV4cGlyZSA9IHRpbWUoTlVMTCk7CisJc3RhdGUtPnJldHJ5X3BlcmlvZCA9IDE7CisKKwkvKgorCSAqIFNlbGVjdCB0aGUgc3RhdGUgdGhhdCB3ZSBzdGFydCBmcm9tLgorCSAqLworCWlmIChkZXYtPmNhcHMgJiBDQVBfREhDUCAmJiBkZXYtPmlwX2FkZHIgPT0gSU5BRERSX0FOWSkgeworCQlzdGF0ZS0+cmVzdGFydF9zdGF0ZSA9IHN0YXRlLT5zdGF0ZSA9IERFVlNUX0RIQ1BESVNDOworCX0gZWxzZSBpZiAoZGV2LT5jYXBzICYgQ0FQX0RIQ1ApIHsKKwkJc3RhdGUtPnJlc3RhcnRfc3RhdGUgPSBzdGF0ZS0+c3RhdGUgPSBERVZTVF9ESENQUkVROworCX0gZWxzZSBpZiAoZGV2LT5jYXBzICYgQ0FQX0JPT1RQKSB7CisJCXN0YXRlLT5yZXN0YXJ0X3N0YXRlID0gc3RhdGUtPnN0YXRlID0gREVWU1RfQk9PVFA7CisJfQorCisJc3RhdGUtPm5leHQgPSBzbGlzdDsKKwlzbGlzdCA9IHN0YXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2FkZHIodWludDMyX3QgKiBhZGRyLCBjb25zdCBjaGFyICppcCkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpbjsKKwlpZiAoaW5ldF9hdG9uKGlwLCAmaW4pID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgcGFyc2UgSVAgYWRkcmVzcyAnJXMnXG4iLAorCQkJcHJvZ25hbWUsIGlwKTsKKwkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCX0KKwkqYWRkciA9IGluLnNfYWRkcjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwYXJzZV9wcm90byhjb25zdCBjaGFyICppcCkKK3sKKwl1bnNpZ25lZCBpbnQgY2FwcyA9IDA7CisKKwlpZiAoKmlwID09ICdcMCcgfHwgc3RyY21wKGlwLCAib24iKSA9PSAwIHx8IHN0cmNtcChpcCwgImFueSIpID09IDApCisJCWNhcHMgPSBDQVBfQk9PVFAgfCBDQVBfREhDUCB8IENBUF9SQVJQOworCWVsc2UgaWYgKHN0cmNtcChpcCwgImJvdGgiKSA9PSAwKQorCQljYXBzID0gQ0FQX0JPT1RQIHwgQ0FQX1JBUlA7CisJZWxzZSBpZiAoc3RyY21wKGlwLCAiZGhjcCIpID09IDApCisJCWNhcHMgPSBDQVBfQk9PVFAgfCBDQVBfREhDUDsKKwllbHNlIGlmIChzdHJjbXAoaXAsICJib290cCIpID09IDApCisJCWNhcHMgPSBDQVBfQk9PVFA7CisJZWxzZSBpZiAoc3RyY21wKGlwLCAicmFycCIpID09IDApCisJCWNhcHMgPSBDQVBfUkFSUDsKKwllbHNlIGlmIChzdHJjbXAoaXAsICJub25lIikgPT0gMCB8fCBzdHJjbXAoaXAsICJzdGF0aWMiKSA9PSAwCisJCSB8fCBzdHJjbXAoaXAsICJvZmYiKSA9PSAwKQorCQlnb3RvIGJhaWw7CisJZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgcHJvdG9jb2wgJyVzJ1xuIiwgcHJvZ25hbWUsIGlwKTsKKwkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCX0KKyAgICAgIGJhaWw6CisJcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2FsbF9kZXZpY2VzKHN0cnVjdCBuZXRkZXYgKnRlbXBsYXRlKTsKKworc3RhdGljIGludCBwYXJzZV9kZXZpY2Uoc3RydWN0IG5ldGRldiAqZGV2LCBjb25zdCBjaGFyICppcCkKK3sKKwljaGFyICpjcDsKKwlpbnQgaSwgb3B0OworCWludCBpc19pcCA9IDA7CisKKwlERUJVRygoIklQLUNvbmZpZzogcGFyc2VfZGV2aWNlOiBcIiVzXCJcbiIsIGlwKSk7CisKKwlpZiAoc3RybmNtcChpcCwgImlwPSIsIDMpID09IDApIHsKKwkJaXAgKz0gMzsKKwkJaXNfaXAgPSAxOworCX0gZWxzZSBpZiAoc3RybmNtcChpcCwgIm5mc2FkZHJzPSIsIDkpID09IDApIHsKKwkJaXAgKz0gOTsKKwkJaXNfaXAgPSAxOwkvKiBOb3Qgc3VyZSBhYm91dCB0aGlzLi4uPyAqLworCX0KKworCWlmICghc3RyY2hyKGlwLCAnOicpKSB7CisJCS8qIE9ubHkgb25lIG9wdGlvbiwgZS5nLiAiaXA9ZGhjcCIsIG9yIGl0J3MgYW4gaW50ZXJmYWNlIG5hbWUgKi8KKwkJaWYgKGlzX2lwKSB7CisJCQlkZXYtPmNhcHMgPSBwYXJzZV9wcm90byhpcCk7CisJCQlicmluZ3VwX2ZpcnN0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRldi0+bmFtZSA9IGlwOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gb3B0ID0gMDsgaXAgJiYgKmlwOyBpcCA9IGNwLCBvcHQrKykgeworCQkJaWYgKChjcCA9IHN0cmNocihpcCwgJzonKSkpIHsKKwkJCQkqY3ArKyA9ICdcMCc7CisJCQl9CisJCQlpZiAob3B0ID4gNikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHRvbyBtYW55IG9wdGlvbnMgZm9yICVzXG4iLAorCQkJCQlwcm9nbmFtZSwgZGV2LT5uYW1lKTsKKwkJCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJCQl9CisKKwkJCWlmICgqaXAgPT0gJ1wwJykKKwkJCQljb250aW51ZTsKKwkJCURFQlVHKCgiSVAtQ29uZmlnOiBvcHQgIyVkOiAnJXMnXG4iLCBvcHQsIGlwKSk7CisJCQlzd2l0Y2ggKG9wdCkgeworCQkJY2FzZSAwOgorCQkJCXBhcnNlX2FkZHIoJmRldi0+aXBfYWRkciwgaXApOworCQkJCWRldi0+Y2FwcyA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJcGFyc2VfYWRkcigmZGV2LT5pcF9zZXJ2ZXIsIGlwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwYXJzZV9hZGRyKCZkZXYtPmlwX2dhdGV3YXksIGlwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwYXJzZV9hZGRyKCZkZXYtPmlwX25ldG1hc2ssIGlwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlzdHJuY3B5KGRldi0+aG9zdG5hbWUsIGlwLCBTWVNfTk1MTiAtIDEpOworCQkJCWRldi0+aG9zdG5hbWVbU1lTX05NTE4gLSAxXSA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJZGV2LT5uYW1lID0gaXA7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJZGV2LT5jYXBzID0gcGFyc2VfcHJvdG8oaXApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGRldi0+bmFtZSA9PSBOVUxMIHx8CisJICAgIGRldi0+bmFtZVswXSA9PSAnXDAnIHx8IHN0cmNtcChkZXYtPm5hbWUsICJhbGwiKSA9PSAwKSB7CisJCWFkZF9hbGxfZGV2aWNlcyhkZXYpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGJyaW5ndXBfZGV2aWNlKHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlpZiAobmV0ZGV2X3VwKGRldikgPT0gMCkgeworCQlpZiAoZGV2LT5jYXBzKSB7CisJCQlhZGRfb25lX2RldihkZXYpOworCQl9IGVsc2UgeworCQkJY29tcGxldGVfZGV2aWNlKGRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJyaW5ndXBfb25lX2RldihzdHJ1Y3QgbmV0ZGV2ICp0ZW1wbGF0ZSwgc3RydWN0IG5ldGRldiAqZGV2KQoreworCWlmICh0ZW1wbGF0ZS0+aXBfYWRkciAhPSBJTkFERFJfTk9ORSkKKwkJZGV2LT5pcF9hZGRyID0gdGVtcGxhdGUtPmlwX2FkZHI7CisJaWYgKHRlbXBsYXRlLT5pcF9zZXJ2ZXIgIT0gSU5BRERSX05PTkUpCisJCWRldi0+aXBfc2VydmVyID0gdGVtcGxhdGUtPmlwX3NlcnZlcjsKKwlpZiAodGVtcGxhdGUtPmlwX2dhdGV3YXkgIT0gSU5BRERSX05PTkUpCisJCWRldi0+aXBfZ2F0ZXdheSA9IHRlbXBsYXRlLT5pcF9nYXRld2F5OworCWlmICh0ZW1wbGF0ZS0+aXBfbmV0bWFzayAhPSBJTkFERFJfTk9ORSkKKwkJZGV2LT5pcF9uZXRtYXNrID0gdGVtcGxhdGUtPmlwX25ldG1hc2s7CisJaWYgKHRlbXBsYXRlLT5pcF9uYW1lc2VydmVyWzBdICE9IElOQUREUl9OT05FKQorCQlkZXYtPmlwX25hbWVzZXJ2ZXJbMF0gPSB0ZW1wbGF0ZS0+aXBfbmFtZXNlcnZlclswXTsKKwlpZiAodGVtcGxhdGUtPmlwX25hbWVzZXJ2ZXJbMV0gIT0gSU5BRERSX05PTkUpCisJCWRldi0+aXBfbmFtZXNlcnZlclsxXSA9IHRlbXBsYXRlLT5pcF9uYW1lc2VydmVyWzFdOworCWlmICh0ZW1wbGF0ZS0+aG9zdG5hbWVbMF0gIT0gJ1wwJykKKwkJc3RyY3B5KGRldi0+aG9zdG5hbWUsIHRlbXBsYXRlLT5ob3N0bmFtZSk7CisJZGV2LT5jYXBzICY9IHRlbXBsYXRlLT5jYXBzOworCisJYnJpbmd1cF9kZXZpY2UoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRkZXYgKmFkZF9kZXZpY2UoY29uc3QgY2hhciAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0ZGV2ICpkZXY7CisJaW50IGk7CisKKwlkZXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRkZXYpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogb3V0IG9mIG1lbW9yeVxuIiwgcHJvZ25hbWUpOworCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJfQorCisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRkZXYpKTsKKwlkZXYtPmNhcHMgPSBkZWZhdWx0X2NhcHM7CisKKwlpZiAocGFyc2VfZGV2aWNlKGRldiwgaW5mbykgPT0gMCkKKwkJZ290byBiYWlsOworCisJaWYgKG5ldGRldl9pbml0X2lmKGRldikgPT0gLTEpCisJCWdvdG8gYmFpbDsKKworCWlmIChib290cF9pbml0X2lmKGRldikgPT0gLTEpCisJCWdvdG8gYmFpbDsKKworCXByaW50ZigiSVAtQ29uZmlnOiAlcyBoYXJkd2FyZSBhZGRyZXNzIiwgZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5od2xlbjsgaSsrKQorCQlwcmludGYoIiVjJTAyeCIsIGkgPT0gMCA/ICcgJyA6ICc6JywgZGV2LT5od2FkZHJbaV0pOworCXByaW50ZigiIG10dSAlZCVzJXNcbiIsIGRldi0+bXR1LAorCSAgICAgICBkZXYtPmNhcHMgJiBDQVBfREhDUCA/ICIgREhDUCIgOgorCSAgICAgICBkZXYtPmNhcHMgJiBDQVBfQk9PVFAgPyAiIEJPT1RQIiA6ICIiLAorCSAgICAgICBkZXYtPmNhcHMgJiBDQVBfUkFSUCA/ICIgUkFSUCIgOiAiIik7CisJcmV0dXJuIGRldjsKKyAgICAgIGJhaWw6CisJZnJlZShkZXYpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGFkZF9hbGxfZGV2aWNlcyhzdHJ1Y3QgbmV0ZGV2ICp0ZW1wbGF0ZSkKK3sKKwlESVIgKmQ7CisJc3RydWN0IGRpcmVudCAqZGU7CisJc3RydWN0IG5ldGRldiAqZGV2OworCWNoYXIgdFtQQVRIX01BWF0sIHBbMjU1XTsKKwlpbnQgaSwgZmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWQgPSBvcGVuZGlyKHN5c2ZzX2NsYXNzX25ldCk7CisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisJCS8qIFRoaXMgZXhjbHVkZXMgZGV2aWNlcyBiZWdpbm5pbmcgd2l0aCBkb3RzIG9yICJkdW1teSIsIGFzIHdlbGwgYXMgLiBvciAuLiAqLworCQlpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicgfHwgIXN0cmNtcChkZS0+ZF9uYW1lLCAiLi4iKSkKKwkJCWNvbnRpbnVlOworCQlpID0gc25wcmludGYodCwgUEFUSF9NQVggLSAxLCAiJXMvJXMvZmxhZ3MiLCBzeXNmc19jbGFzc19uZXQsCisJCQkgICAgIGRlLT5kX25hbWUpOworCQlpZiAoaSA8IDAgfHwgaSA+PSBQQVRIX01BWCAtIDEpCisJCQljb250aW51ZTsKKwkJdFtpXSA9ICdcMCc7CisJCWZkID0gb3Blbih0LCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApIHsKKwkJCXBlcnJvcih0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWkgPSByZWFkKGZkLCAmcCwgc2l6ZW9mKHApIC0gMSk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKGkgPCAwKSB7CisJCQlwZXJyb3IodCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwW2ldID0gJ1wwJzsKKwkJZmxhZ3MgPSBzdHJ0b3VsKHAsIE5VTEwsIDApOworCQkvKiBIZXVyaXN0aWMgZm9yIGlmIHRoaXMgaXMgYSByZWFzb25hYmxlIGJvb3QgaW50ZXJmYWNlLgorCQkgICBUaGlzIGlzIHRoZSBzYW1lCisJCSAgIGxvZ2ljIHRoZSBpbi1rZXJuZWwgaXBjb25maWcgdXNlcy4uLiAqLworCQlpZiAoIShmbGFncyAmIElGRl9MT09QQkFDSykgJiYKKwkJICAgIChmbGFncyAmIChJRkZfQlJPQURDQVNUIHwgSUZGX1BPSU5UT1BPSU5UKSkpIHsKKwkJCURFQlVHKCgiVHJ5aW5nIHRvIGJyaW5nIHVwICVzXG4iLCBkZS0+ZF9uYW1lKSk7CisKKwkJCWlmICghKGRldiA9IGFkZF9kZXZpY2UoZGUtPmRfbmFtZSkpKQorCQkJCWNvbnRpbnVlOworCQkJYnJpbmd1cF9vbmVfZGV2KHRlbXBsYXRlLCBkZXYpOworCQl9CisJfQorCWNsb3NlZGlyKGQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX2F1dG9jb25maWcodm9pZCkKK3sKKwlpbnQgbmRldiA9IDAsIG5hdXRvID0gMDsKKwlzdHJ1Y3Qgc3RhdGUgKnM7CisKKwlmb3IgKHMgPSBzbGlzdDsgczsgcyA9IHMtPm5leHQpIHsKKwkJbmRldisrOworCQlpZiAocy0+ZGV2LT5jYXBzKQorCQkJbmF1dG8rKzsKKwl9CisKKwlpZiAobmRldiA9PSAwKSB7CisJCWlmIChjb25maWd1cmVkID09IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vIGRldmljZXMgdG8gY29uZmlndXJlXG4iLAorCQkJCXByb2duYW1lKTsKKwkJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwkJfQorCX0KKworCXJldHVybiBuYXV0bzsKK30KKworc3RhdGljIHZvaWQgc2V0X3ZlbmRvcl9pZGVudGlmaWVyKGNvbnN0IGNoYXIgKmlkKQoreworCWludCBsZW4gPSBzdHJsZW4oaWQpOworCWlmIChsZW4gPj0gMjU1KSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIiVzOiBpbnZhbGlkIHZlbmRvciBjbGFzcyBpZGVudGlmaWVyOiAiCisJCQkiJXNcbiIsIHByb2duYW1lLCBpZCk7CisJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwl9CisJbWVtY3B5KHZlbmRvcl9jbGFzc19pZGVudGlmaWVyKzIsIGlkLCBsZW4pOworCXZlbmRvcl9jbGFzc19pZGVudGlmaWVyWzBdID0gNjA7CisJdmVuZG9yX2NsYXNzX2lkZW50aWZpZXJbMV0gPSBsZW47CisJdmVuZG9yX2NsYXNzX2lkZW50aWZpZXJfbGVuID0gbGVuKzI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWssIGFsaWFzKCJpcGNvbmZpZ19tYWluIikpKTsKKworaW50IGlwY29uZmlnX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2ICpkZXY7CisJaW50IGMsIHBvcnQ7CisJaW50IGVycjsKKworCS8qIElmIHByb2duYW1lIGlzIHNldCB3ZSdyZSBpbnZva2VkIGZyb20gYW5vdGhlciBwcm9ncmFtICovCisJaWYgKCFwcm9nbmFtZSkgeworCQlzdHJ1Y3QgdGltZXZhbCBub3c7CisJCXByb2duYW1lID0gYXJndlswXTsKKwkJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCQlzcmFuZDQ4KG5vdy50dl91c2VjIF4gKG5vdy50dl9zZWMgPDwgMjQpKTsKKwl9CisKKwlpZiAoKGVyciA9IHNldGptcChhYm9ydF9idWYpKSkKKwkJcmV0dXJuIGVycjsKKworCS8qIERlZmF1bHQgdmVuZG9yIGlkZW50aWZpZXIgKi8KKwlzZXRfdmVuZG9yX2lkZW50aWZpZXIoIkxpbnV4IGlwY29uZmlnIik7CisKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgImM6ZDppOm9ucDp0OiIpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnYyc6CisJCQlkZWZhdWx0X2NhcHMgPSBwYXJzZV9wcm90byhvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChwb3J0IDw9IDAgfHwgcG9ydCA+IFVTSFJUX01BWCkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiJXM6IGludmFsaWQgcG9ydCBudW1iZXIgJWRcbiIsCisJCQkJCXByb2duYW1lLCBwb3J0KTsKKwkJCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJCQl9CisJCQljZmdfbG9jYWxfcG9ydCA9IHBvcnQ7CisJCQljZmdfcmVtb3RlX3BvcnQgPSBjZmdfbG9jYWxfcG9ydCAtIDE7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlsb29wX3RpbWVvdXQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAobG9vcF90aW1lb3V0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiJXM6IGludmFsaWQgdGltZW91dCAlZFxuIiwKKwkJCQkJcHJvZ25hbWUsIGxvb3BfdGltZW91dCk7CisJCQkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJc2V0X3ZlbmRvcl9pZGVudGlmaWVyKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlicmluZ3VwX2ZpcnN0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCWRvX25vdF9jb25maWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZGV2ID0gYWRkX2RldmljZShvcHRhcmcpOworCQkJaWYgKGRldikKKwkJCQlicmluZ3VwX2RldmljZShkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBvcHRpb24gLSVjXG4iLAorCQkJCXByb2duYW1lLCBvcHRvcHQpOworCQkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlmb3IgKGMgPSBvcHRpbmQ7IGMgPCBhcmdjOyBjKyspIHsKKwkJZGV2ID0gYWRkX2RldmljZShhcmd2W2NdKTsKKwkJaWYgKGRldikKKwkJCWJyaW5ndXBfZGV2aWNlKGRldik7CisJfQorCisJaWYgKGNoZWNrX2F1dG9jb25maWcoKSkgeworCQlpZiAoY2ZnX2xvY2FsX3BvcnQgIT0gTE9DQUxfUE9SVCkgeworCQkJcHJpbnRmKCJJUC1Db25maWc6IGJpbmRpbmcgc291cmNlIHBvcnQgdG8gJWQsICIKKwkJCSAgICAgICAiZGVzdCB0byAlZFxuIiwgY2ZnX2xvY2FsX3BvcnQsIGNmZ19yZW1vdGVfcG9ydCk7CisJCX0KKwkJbG9vcCgpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL25ldGRldi5jIGIvdXNyL2tpbml0L2lwY29uZmlnL25ldGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTkyMGMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvbmV0ZGV2LmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBpb2N0bC1iYXNlZCBkZXZpY2UgY29uZmlndXJhdGlvbgorICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisKKyNpbmNsdWRlICJuZXRkZXYuaCIKKworc3RhdGljIGludCBjZmQgPSAtMTsKKworc3RhdGljIHZvaWQgY29weV9uYW1lKHN0cnVjdCBuZXRkZXYgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJc3RybmNweShpZnItPmlmcl9uYW1lLCBkZXYtPm5hbWUsIHNpemVvZihpZnItPmlmcl9uYW1lKSk7CisJaWZyLT5pZnJfbmFtZVtzaXplb2YoaWZyLT5pZnJfbmFtZSkgLSAxXSA9ICdcMCc7Cit9CisKK2ludCBuZXRkZXZfZ2V0ZmxhZ3Moc3RydWN0IG5ldGRldiAqZGV2LCBzaG9ydCAqZmxhZ3MpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWNvcHlfbmFtZShkZXYsICZpZnIpOworCisJaWYgKGlvY3RsKGNmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQlwZXJyb3IoIlNJT0NHSUZGTEFHUyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJKmZsYWdzID0gaWZyLmlmcl9mbGFnczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2lmX2FkZHIoc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQsIHVpbnQzMl90IGFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmci0+aWZyX2FkZHI7CisKKwlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKKworCXJldHVybiBpb2N0bChjZmQsIGNtZCwgaWZyKTsKK30KKworaW50IG5ldGRldl9zZXRhZGRyZXNzKHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJY29weV9uYW1lKGRldiwgJmlmcik7CisKKwlpZiAoZGV2LT5pcF9hZGRyICE9IElOQUREUl9BTlkgJiYKKwkgICAgbmV0ZGV2X3NpZl9hZGRyKCZpZnIsIFNJT0NTSUZBRERSLCBkZXYtPmlwX2FkZHIpID09IC0xKSB7CisJCXBlcnJvcigiU0lPQ1NJRkFERFIiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkZXYtPmlwX2Jyb2FkY2FzdCAhPSBJTkFERFJfQU5ZICYmCisJICAgIG5ldGRldl9zaWZfYWRkcigmaWZyLCBTSU9DU0lGQlJEQUREUiwgZGV2LT5pcF9icm9hZGNhc3QpID09IC0xKSB7CisJCXBlcnJvcigiU0lPQ1NJRkJSREFERFIiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkZXYtPmlwX25ldG1hc2sgIT0gSU5BRERSX0FOWSAmJgorCSAgICBuZXRkZXZfc2lmX2FkZHIoJmlmciwgU0lPQ1NJRk5FVE1BU0ssIGRldi0+aXBfbmV0bWFzaykgPT0gLTEpIHsKKwkJcGVycm9yKCJTSU9DU0lGTkVUTUFTSyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXRkZXZfc2V0ZGVmYXVsdHJvdXRlKHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3QgcnRlbnRyeSByOworCisJaWYgKGRldi0+aXBfZ2F0ZXdheSA9PSBJTkFERFJfQU5ZKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKKworCSgoc3RydWN0IHNvY2thZGRyX2luICopJnIucnRfZHN0KS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci5ydF9kc3QpLT5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCSgoc3RydWN0IHNvY2thZGRyX2luICopJnIucnRfZ2F0ZXdheSktPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCSgoc3RydWN0IHNvY2thZGRyX2luICopJnIucnRfZ2F0ZXdheSktPnNpbl9hZGRyLnNfYWRkciA9CisJICAgIGRldi0+aXBfZ2F0ZXdheTsKKwkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZyLnJ0X2dlbm1hc2spLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZyLnJ0X2dlbm1hc2spLT5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCXIucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfR0FURVdBWTsKKworCWlmIChpb2N0bChjZmQsIFNJT0NBRERSVCwgJnIpID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeworCQlwZXJyb3IoIlNJT0NBRERSVCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbmV0ZGV2X3NldG10dShzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWNvcHlfbmFtZShkZXYsICZpZnIpOworCWlmci5pZnJfbXR1ID0gZGV2LT5tdHU7CisKKwlyZXR1cm4gaW9jdGwoY2ZkLCBTSU9DU0lGTVRVLCAmaWZyKTsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2lmX2FkZHIoc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQsIHVpbnQzMl90ICogcHRyKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZnItPmlmcl9hZGRyOworCisJaWYgKGlvY3RsKGNmZCwgY21kLCBpZnIpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwkqcHRyID0gc2luLT5zaW5fYWRkci5zX2FkZHI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldGRldl91cChzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWNvcHlfbmFtZShkZXYsICZpZnIpOworCisJaWYgKGlvY3RsKGNmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQlwZXJyb3IoIlNJT0NHSUZGTEFHUyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWZyLmlmcl9mbGFncyB8PSBJRkZfVVA7CisKKwlpZiAoaW9jdGwoY2ZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCXBlcnJvcigiU0lPQ1NJRkZMQUdTIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXRkZXZfZG93bihzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWNvcHlfbmFtZShkZXYsICZpZnIpOworCisJaWYgKGlvY3RsKGNmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQlwZXJyb3IoIlNJT0NHSUZGTEFHUyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWZyLmlmcl9mbGFncyAmPSB+SUZGX1VQOworCisJaWYgKGlvY3RsKGNmZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQlwZXJyb3IoIlNJT0NTSUZGTEFHUyIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbmV0ZGV2X2luaXRfaWYoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlpZiAoY2ZkID09IC0xKQorCQljZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGNmZCA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImlwY29uZmlnOiAlczogc29ja2V0KEFGX0lORVQpOiAlc1xuIiwKKwkJCWRldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvcHlfbmFtZShkZXYsICZpZnIpOworCisJaWYgKGlvY3RsKGNmZCwgU0lPQ0dJRklOREVYLCAmaWZyKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImlwY29uZmlnOiAlczogU0lPQ0dJRklOREVYOiAlc1xuIiwKKwkJCWRldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRldi0+aWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKworCWlmIChpb2N0bChjZmQsIFNJT0NHSUZNVFUsICZpZnIpID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaXBjb25maWc6ICVzOiBTSU9DR0lGTVRVOiAlc1xuIiwKKwkJCWRldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRldi0+bXR1ID0gaWZyLmlmcl9tdHU7CisKKwlpZiAoaW9jdGwoY2ZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImlwY29uZmlnOiAlczogU0lPQ0dJRkhXQUREUjogJXNcbiIsCisJCQlkZXYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXYtPmh3dHlwZSA9IGlmci5pZnJfaHdhZGRyLnNhX2ZhbWlseTsKKwlkZXYtPmh3bGVuICA9IDA7CisKKwlzd2l0Y2ggKGRldi0+aHd0eXBlKSB7CisJY2FzZSBBUlBIUkRfRVRIRVI6CisJCWRldi0+aHdsZW4gPSA2OworCQlicmVhazsKKwljYXNlIEFSUEhSRF9FVUk2NDoKKwkJZGV2LT5od2xlbiA9IDg7CisJCWJyZWFrOworCWNhc2UgQVJQSFJEX0xPT1BCQUNLOgorCQlkZXYtPmh3bGVuID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweShkZXYtPmh3YWRkciwgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgZGV2LT5od2xlbik7CisJbWVtc2V0KGRldi0+aHdicmQsIDB4ZmYsIGRldi0+aHdsZW4pOworCisJLyoKKwkgKiBUcnkgdG8gZ2V0IHRoZSBjdXJyZW50IGludGVyZmFjZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiAoZGV2LT5pcF9hZGRyID09IElOQUREUl9OT05FICYmCisJICAgIG5ldGRldl9naWZfYWRkcigmaWZyLCBTSU9DR0lGQUREUiwgJmRldi0+aXBfYWRkcikgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpcGNvbmZpZzogJXM6IFNJT0NHSUZBRERSOiAlc1xuIiwKKwkJCWRldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZGV2LT5pcF9hZGRyID0gMDsKKwkJZGV2LT5pcF9icm9hZGNhc3QgPSAwOworCQlkZXYtPmlwX25ldG1hc2sgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGV2LT5pcF9icm9hZGNhc3QgPT0gSU5BRERSX05PTkUgJiYKKwkgICAgbmV0ZGV2X2dpZl9hZGRyKCZpZnIsIFNJT0NHSUZCUkRBRERSLCAmZGV2LT5pcF9icm9hZGNhc3QpID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaXBjb25maWc6ICVzOiBTSU9DR0lGQlJEQUREUjogJXNcbiIsCisJCQlkZXYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCWRldi0+aXBfYnJvYWRjYXN0ID0gMDsKKwl9CisKKwlpZiAoZGV2LT5pcF9uZXRtYXNrID09IElOQUREUl9OT05FICYmCisJICAgIG5ldGRldl9naWZfYWRkcigmaWZyLCBTSU9DR0lGTkVUTUFTSywgJmRldi0+aXBfbmV0bWFzaykgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpcGNvbmZpZzogJXM6IFNJT0NHSUZORVRNQVNLOiAlc1xuIiwKKwkJCWRldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZGV2LT5pcF9uZXRtYXNrID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9uZXRkZXYuaCBiL3Vzci9raW5pdC9pcGNvbmZpZy9uZXRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY2NDBhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2lwY29uZmlnL25ldGRldi5oCkBAIC0wLDAgKzEsODEgQEAKKyNpZm5kZWYgSVBDT05GSUdfTkVUREVWX0gKKyNkZWZpbmUgSVBDT05GSUdfTkVUREVWX0gKKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNkZWZpbmUgQlBMRU4JCTQwCisjZGVmaW5lIEZOTEVOCQkxMjgJCQkvKiBmcm9tIERIQ1AgIFJGQyAyMTMxICovCisKK3N0cnVjdCBuZXRkZXYgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIERldmljZSBuYW1lICAgICAgICAgICovCisJdW5zaWduZWQgaW50IGlmaW5kZXg7CS8qIGludGVyZmFjZSBpbmRleCAgICAgICovCisJdW5zaWduZWQgaW50IGh3dHlwZTsJLyogQVJQSFJEX3h4eCAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgaHdsZW47CS8qIEhXIGFkZHJlc3MgbGVuZ3RoICAgICovCisJdWludDhfdCBod2FkZHJbMTZdOwkvKiBIVyBhZGRyZXNzICAgICAgICAgICAqLworCXVpbnQ4X3QgaHdicmRbMTZdOwkvKiBCcm9hZGNhc3QgSFcgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBtdHU7CS8qIERldmljZSBtdHUgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IGNhcHM7CS8qIENhcGFiaWxpdGllcyAgICAgICAgICovCisJdGltZV90IG9wZW5fdGltZTsKKworCXN0cnVjdCB7CQkvKiBCT09UUC9ESENQIGluZm8gICAgICAqLworCQlpbnQgZmQ7CisJCXVpbnQzMl90IHhpZDsKKwkJdWludDMyX3QgZ2F0ZXdheTsgLyogQk9PVFAvREhDUCBnYXRld2F5ICAgKi8KKwl9IGJvb3RwOworCisJc3RydWN0IHsJCS8qIFJBUlAgaW5mb3JtYXRpb24gICAgICovCisJCWludCBmZDsKKwl9IHJhcnA7CisKKwl1aW50MzJfdCBpcF9hZGRyOwkvKiBteSBhZGRyZXNzICAgICAgICAgICAqLworCXVpbnQzMl90IGlwX2Jyb2FkY2FzdDsJLyogYnJvYWRjYXN0IGFkZHJlc3MgICAgKi8KKwl1aW50MzJfdCBpcF9zZXJ2ZXI7CS8qIHNlcnZlciBhZGRyZXNzICAgICAgICovCisJdWludDMyX3QgaXBfbmV0bWFzazsJLyogbXkgc3VibmV0IG1hc2sgICAgICAgKi8KKwl1aW50MzJfdCBpcF9nYXRld2F5OwkvKiBteSBnYXRld2F5ICAgICAgICAgICAqLworCXVpbnQzMl90IGlwX25hbWVzZXJ2ZXJbMl07CS8qIHR3byBuYW1lc2VydmVycyAgICAgICovCisJdWludDMyX3Qgc2VydmVyaWQ7CQkvKiBkaGNwIHNlcnZlcmlkICAgICAgICAqLworCWNoYXIgaG9zdG5hbWVbU1lTX05NTE5dOwkvKiBob3N0bmFtZSAgICAgICAgICAgICAqLworCWNoYXIgZG5zZG9tYWlubmFtZVtTWVNfTk1MTl07CS8qIGRucyBkb21haW4gbmFtZSAgICAgICovCisJY2hhciBuaXNkb21haW5uYW1lW1NZU19OTUxOXTsJLyogbmlzIGRvbWFpbiBuYW1lICAgICAgKi8KKwljaGFyIGJvb3RwYXRoW0JQTEVOXTsJLyogYm9vdCBwYXRoICAgICAgICAgICAgKi8KKwljaGFyIGZpbGVuYW1lW0ZOTEVOXTsgICAvKiBmaWxlbmFtZSAgICAgICAgICAgICAqLworCXN0cnVjdCBuZXRkZXYgKm5leHQ7CS8qIG5leHQgY29uZmlndXJlZCBpL2YgICovCit9OworCitleHRlcm4gc3RydWN0IG5ldGRldiAqaWZhY2VzOworCisvKgorICogRGV2aWNlIGNhcGFiaWxpdGllcworICovCisjZGVmaW5lIENBUF9CT09UUAkoMTw8MCkKKyNkZWZpbmUgQ0FQX0RIQ1AJKDE8PDEpCisjZGVmaW5lIENBUF9SQVJQCSgxPDwyKQorCisvKgorICogRGV2aWNlIHN0YXRlcworICovCisjZGVmaW5lIERFVlNUX1VQCTAKKyNkZWZpbmUgREVWU1RfQk9PVFAJMQorI2RlZmluZSBERVZTVF9ESENQRElTQwkyCisjZGVmaW5lIERFVlNUX0RIQ1BSRVEJMworI2RlZmluZSBERVZTVF9DT01QTEVURQk0CisjZGVmaW5lIERFVlNUX0VSUk9SCTUKKworaW50IG5ldGRldl9nZXRmbGFncyhzdHJ1Y3QgbmV0ZGV2ICpkZXYsIHNob3J0ICpmbGFncyk7CitpbnQgbmV0ZGV2X3NldGFkZHJlc3Moc3RydWN0IG5ldGRldiAqZGV2KTsKK2ludCBuZXRkZXZfc2V0ZGVmYXVsdHJvdXRlKHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgbmV0ZGV2X3VwKHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgbmV0ZGV2X2Rvd24oc3RydWN0IG5ldGRldiAqZGV2KTsKK2ludCBuZXRkZXZfaW5pdF9pZihzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworaW50IG5ldGRldl9zZXRtdHUoc3RydWN0IG5ldGRldiAqZGV2KTsKKworc3RhdGljIGlubGluZSBpbnQgbmV0ZGV2X3J1bm5pbmcoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXNob3J0IGZsYWdzOworCWludCByZXQgPSBuZXRkZXZfZ2V0ZmxhZ3MoZGV2LCAmZmxhZ3MpOworCisJcmV0dXJuIHJldCA/IDAgOiAhIShmbGFncyAmIElGRl9SVU5OSU5HKTsKK30KKworI2VuZGlmIC8qIElQQ09ORklHX05FVERFVl9IICovCmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvcGFja2V0LmMgYi91c3Iva2luaXQvaXBjb25maWcvcGFja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1NDMxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9wYWNrZXQuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIFBhY2tldCBzb2NrZXQgaGFuZGxpbmcgZ2x1ZS4KKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisKKyNpbmNsdWRlICJpcGNvbmZpZy5oIgorI2luY2x1ZGUgIm5ldGRldi5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorCitzdGF0aWMgaW50IHBrdF9mZCA9IC0xOworCit1aW50MTZfdCBjZmdfbG9jYWxfcG9ydCA9IExPQ0FMX1BPUlQ7Cit1aW50MTZfdCBjZmdfcmVtb3RlX3BvcnQgPSBSRU1PVEVfUE9SVDsKKworaW50IHBhY2tldF9vcGVuKHZvaWQpCit7CisJaW50IGZkLCBvbmUgPSAxOworCisJaWYgKHBrdF9mZCAhPSAtMSkKKwkJcmV0dXJuIHBrdF9mZDsKKworCS8qCisJICogR2V0IGEgUEFDS0VUIHNvY2tldCBmb3IgSVAgdHJhZmZpYy4KKwkgKi8KKwlmZCA9IHNvY2tldChBRl9QQUNLRVQsIFNPQ0tfREdSQU0sIGh0b25zKEVUSF9QX0lQKSk7CisJaWYgKGZkID09IC0xKSB7CisJCXBlcnJvcigic29ja2V0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gYnJvYWRjYXN0CisJICovCisJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwgJm9uZSwgc2l6ZW9mKG9uZSkpID09IC0xKSB7CisJCXBlcnJvcigiU09fQlJPQURDQVNUIik7CisJCWNsb3NlKGZkKTsKKwkJZmQgPSAtMTsKKwl9CisKKwlwa3RfZmQgPSBmZDsKKworCXJldHVybiBmZDsKK30KKwordm9pZCBwYWNrZXRfY2xvc2Uodm9pZCkKK3sKKwljbG9zZShwa3RfZmQpOworCXBrdF9mZCA9IC0xOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2NoZWNrc3VtKHVpbnQxNl90ICpoZHIsIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGNoa3N1bSA9IDA7CisKKwl3aGlsZSAobGVuKSB7CisJCWNoa3N1bSArPSAqaGRyKys7CisJCWNoa3N1bSArPSAqaGRyKys7CisJCWxlbi0tOworCX0KKwljaGtzdW0gPSAoY2hrc3VtICYgMHhmZmZmKSArIChjaGtzdW0gPj4gMTYpOworCWNoa3N1bSA9IChjaGtzdW0gJiAweGZmZmYpICsgKGNoa3N1bSA+PiAxNik7CisJcmV0dXJuICh+Y2hrc3VtKSAmIDB4ZmZmZjsKK30KKworc3RydWN0IGhlYWRlciB7CisJc3RydWN0IGlwaGRyIGlwOworCXN0cnVjdCB1ZHBoZHIgdWRwOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgaGVhZGVyIGlwdWRwX2hkcnMgPSB7CisJLmlwID0geworCSAgICAgICAuaWhsCQk9IDUsCisJICAgICAgIC52ZXJzaW9uCQk9IElQVkVSU0lPTiwKKwkgICAgICAgLmZyYWdfb2ZmCT0gX19jb25zdGFudF9odG9ucyhJUF9ERiksCisJICAgICAgIC50dGwJCT0gNjQsCisJICAgICAgIC5wcm90b2NvbAk9IElQUFJPVE9fVURQLAorCSAgICAgICAuc2FkZHIJCT0gSU5BRERSX0FOWSwKKwkgICAgICAgLmRhZGRyCQk9IElOQUREUl9CUk9BRENBU1QsCisJICAgICAgIH0sCisJLnVkcCA9IHsKKwkJLnNvdXJjZQkJPSBfX2NvbnN0YW50X2h0b25zKExPQ0FMX1BPUlQpLAorCQkuZGVzdAkJPSBfX2NvbnN0YW50X2h0b25zKFJFTU9URV9QT1JUKSwKKwkJLmxlbgkJPSAwLAorCQkuY2hlY2sJCT0gMCwKKwkJfSwKK307CisKKyNpZmRlZiBJUENfREVCVUcJCS8qIE9ubHkgdXNlZCBieSBERUJVRygoKSkgKi8KK3N0YXRpYyBjaGFyICpudG9hKHVpbnQzMl90IGFkZHIpCit7CisJc3RydWN0IGluX2FkZHIgaW4gPSB7IGFkZHIgfTsKKwlyZXR1cm4gaW5ldF9udG9hKGluKTsKK30KKyNlbmRpZgorCisvKgorICogU2VuZCBhIHBhY2tldC4gIFRoZSBvcHRpb25zIGFyZSBsaXN0ZWQgaW4gaW92WzEuLi5pb3ZfbGVuXS4KKyAqIGlvdlswXSBpcyByZXNlcnZlZCBmb3IgdGhlIGJvb3RwIHBhY2tldCBoZWFkZXIuCisgKi8KK2ludCBwYWNrZXRfc2VuZChzdHJ1Y3QgbmV0ZGV2ICpkZXYsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92X2xlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgc2xsOworCXN0cnVjdCBtc2doZHIgbXNnID0geworCQkubXNnX25hbWUJPSAmc2xsLAorCQkubXNnX25hbWVsZW4JPSBzaXplb2Yoc2xsKSwKKwkJLm1zZ19pb3YJPSBpb3YsCisJCS5tc2dfaW92bGVuCT0gaW92X2xlbiwKKwkJLm1zZ19jb250cm9sCT0gTlVMTCwKKwkJLm1zZ19jb250cm9sbGVuCT0gMCwKKwkJLm1zZ19mbGFncwk9IDAKKwl9OworCWludCBpLCBsZW4gPSAwOworCisJaWYgKGNmZ19sb2NhbF9wb3J0ICE9IExPQ0FMX1BPUlQpIHsKKwkJaXB1ZHBfaGRycy51ZHAuc291cmNlID0gaHRvbnMoY2ZnX2xvY2FsX3BvcnQpOworCQlpcHVkcF9oZHJzLnVkcC5kZXN0ID0gaHRvbnMoY2ZnX3JlbW90ZV9wb3J0KTsKKwl9CisKKwlERUJVRygoIlxuICAgdWRwIHNyYyAlZCBkc3QgJWQiLCBudG9ocyhpcHVkcF9oZHJzLnVkcC5zb3VyY2UpLAorCSAgICAgICBudG9ocyhpcHVkcF9oZHJzLnVkcC5kZXN0KSkpOworCisJREVCVUcoKCJcbiAgIGlwIHNyYyAlcyAiLCBudG9hKGlwdWRwX2hkcnMuaXAuc2FkZHIpKSk7CisJREVCVUcoKCJkc3QgJXMgIiwgbnRvYShpcHVkcF9oZHJzLmlwLmRhZGRyKSkpOworCisJLyoKKwkgKiBHbHVlIGluIHRoZSBpcCt1ZHAgaGVhZGVyIGlvdmVjCisJICovCisJaW92WzBdLmlvdl9iYXNlID0gJmlwdWRwX2hkcnM7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2Yoc3RydWN0IGhlYWRlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW92X2xlbjsgaSsrKQorCQlsZW4gKz0gaW92W2ldLmlvdl9sZW47CisKKwlzbGwuc2xsX2ZhbWlseQkgPSBBRl9QQUNLRVQ7CisJc2xsLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwlzbGwuc2xsX2lmaW5kZXgJID0gZGV2LT5pZmluZGV4OworCXNsbC5zbGxfaGF0eXBlCSA9IGRldi0+aHd0eXBlOworCXNsbC5zbGxfcGt0dHlwZQkgPSBQQUNLRVRfQlJPQURDQVNUOworCXNsbC5zbGxfaGFsZW4JID0gZGV2LT5od2xlbjsKKwltZW1jcHkoc2xsLnNsbF9hZGRyLCBkZXYtPmh3YnJkLCBkZXYtPmh3bGVuKTsKKworCWlwdWRwX2hkcnMuaXAudG90X2xlbiA9IGh0b25zKGxlbik7CisJaXB1ZHBfaGRycy5pcC5jaGVjayAgID0gMDsKKwlpcHVkcF9oZHJzLmlwLmNoZWNrICAgPSBpcF9jaGVja3N1bSgodWludDE2X3QgKikgJiBpcHVkcF9oZHJzLmlwLAorCQkJCQkgICAgaXB1ZHBfaGRycy5pcC5paGwpOworCisJaXB1ZHBfaGRycy51ZHAubGVuICAgID0gaHRvbnMobGVuIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCisJREVCVUcoKCJcbiAgIGJ5dGVzICVkXG4iLCBsZW4pKTsKKworCXJldHVybiBzZW5kbXNnKHBrdF9mZCwgJm1zZywgMCk7Cit9CisKK2ludCBwYWNrZXRfcGVlayhpbnQgKmlmaW5kZXgpCit7CisJc3RydWN0IHNvY2thZGRyX2xsIHNsbDsKKwlzdHJ1Y3QgaXBoZHIgaXBoOworCWludCByZXQsIHNsbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCk7CisKKwkvKgorCSAqIFBlZWsgYXQgdGhlIElQIGhlYWRlci4KKwkgKi8KKwlyZXQgPSByZWN2ZnJvbShwa3RfZmQsICZpcGgsIHNpemVvZihzdHJ1Y3QgaXBoZHIpLAorCQkgICAgICAgTVNHX1BFRUssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2xsLCAmc2xsZW4pOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmIChzbGwuc2xsX2ZhbWlseSAhPSBBRl9QQUNLRVQpCisJCWdvdG8gZGlzY2FyZF9wa3Q7CisKKwlpZiAoaXBoLmlobCA8IDUgfHwgaXBoLnZlcnNpb24gIT0gSVBWRVJTSU9OKQorCQlnb3RvIGRpc2NhcmRfcGt0OworCisJKmlmaW5kZXggPSBzbGwuc2xsX2lmaW5kZXg7CisKKwlyZXR1cm4gMDsKKworZGlzY2FyZF9wa3Q6CisJcGFja2V0X2Rpc2NhcmQoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwYWNrZXRfZGlzY2FyZCh2b2lkKQoreworCXN0cnVjdCBpcGhkciBpcGg7CisJc3RydWN0IHNvY2thZGRyX2xsIHNsbDsKKwlzb2NrbGVuX3Qgc2xsZW4gPSBzaXplb2Yoc2xsKTsKKworCXJlY3Zmcm9tKHBrdF9mZCwgJmlwaCwgc2l6ZW9mKGlwaCksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2xsLCAmc2xsZW4pOworfQorCisvKgorICogUmVjZWl2ZSBhIGJvb3RwIHBhY2tldC4gIFRoZSBvcHRpb25zIGFyZSBsaXN0ZWQgaW4gaW92WzEuLi5pb3ZfbGVuXS4KKyAqIGlvdlswXSBtdXN0IHBvaW50IHRvIHRoZSBib290cCBwYWNrZXQgaGVhZGVyLgorICovCitpbnQgcGFja2V0X3JlY3Yoc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZfbGVuKQoreworCXN0cnVjdCBpcGhkciAqaXAsIGlwaDsKKwlzdHJ1Y3QgdWRwaGRyICp1ZHA7CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCS5tc2dfbmFtZQk9IE5VTEwsCisJCS5tc2dfbmFtZWxlbgk9IDAsCisJCS5tc2dfaW92CT0gaW92LAorCQkubXNnX2lvdmxlbgk9IGlvdl9sZW4sCisJCS5tc2dfY29udHJvbAk9IE5VTEwsCisJCS5tc2dfY29udHJvbGxlbiA9IDAsCisJCS5tc2dfZmxhZ3MJPSAwCisJfTsKKwlpbnQgcmV0LCBpcGhsOworCisJcmV0ID0gcmVjdmZyb20ocGt0X2ZkLCAmaXBoLCBzaXplb2Yoc3RydWN0IGlwaGRyKSwKKwkJICAgICAgIE1TR19QRUVLLCBOVUxMLCBOVUxMKTsKKwlpZiAocmV0ID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaXBoLmlobCA8IDUgfHwgaXBoLnZlcnNpb24gIT0gSVBWRVJTSU9OKQorCQlnb3RvIGRpc2NhcmRfcGt0OworCisJaXBobCA9IGlwaC5paGwgKiA0OworCisJaXAgPSBtYWxsb2MoaXBobCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisJaWYgKCFpcCkKKwkJZ290byBkaXNjYXJkX3BrdDsKKworCXVkcCA9IChzdHJ1Y3QgdWRwaGRyICopKChjaGFyICopaXAgKyBpcGhsKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9IGlwOworCWlvdlswXS5pb3ZfbGVuID0gaXBobCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworCXJldCA9IHJlY3Ztc2cocGt0X2ZkLCAmbXNnLCAwKTsKKwlpZiAocmV0ID09IC0xKQorCQlnb3RvIGZyZWVfcGt0OworCisJREVCVUcoKCI8LSBieXRlcyAlZCAiLCByZXQpKTsKKworCWlmIChpcF9jaGVja3N1bSgodWludDE2X3QgKikgaXAsIGlwLT5paGwpICE9IDApCisJCWdvdG8gZnJlZV9wa3Q7CisKKwlERUJVRygoIlxuICAgaXAgc3JjICVzICIsIG50b2EoaXAtPnNhZGRyKSkpOworCURFQlVHKCgiZHN0ICVzICIsIG50b2EoaXAtPmRhZGRyKSkpOworCisJaWYgKG50b2hzKGlwLT50b3RfbGVuKSA+IHJldCB8fCBpcC0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFApCisJCWdvdG8gZnJlZV9wa3Q7CisKKwlyZXQgLT0gNCAqIGlwLT5paGw7CisKKwlERUJVRygoIlxuICAgdWRwIHNyYyAlZCBkc3QgJWQgIiwgbnRvaHModWRwLT5zb3VyY2UpLAorCSAgICAgICBudG9ocyh1ZHAtPmRlc3QpKSk7CisKKwlpZiAodWRwLT5zb3VyY2UgIT0gaHRvbnMoY2ZnX3JlbW90ZV9wb3J0KSB8fAorCSAgICB1ZHAtPmRlc3QgIT0gaHRvbnMoY2ZnX2xvY2FsX3BvcnQpKQorCQlnb3RvIGZyZWVfcGt0OworCisJaWYgKG50b2hzKHVkcC0+bGVuKSA+IHJldCkKKwkJZ290byBmcmVlX3BrdDsKKworCXJldCAtPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisKKwlmcmVlKGlwKTsKKworCXJldHVybiByZXQ7CisKK2ZyZWVfcGt0OgorCWZyZWUoaXApOworCXJldHVybiAwOworCitkaXNjYXJkX3BrdDoKKwlERUJVRygoImRpc2NhcmRlZFxuIikpOworCXBhY2tldF9kaXNjYXJkKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvcGFja2V0LmggYi91c3Iva2luaXQvaXBjb25maWcvcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NDViNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9wYWNrZXQuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIElQQ09ORklHX1BBQ0tFVF9ICisjZGVmaW5lIElQQ09ORklHX1BBQ0tFVF9ICisKK2ludCBwYWNrZXRfb3Blbih2b2lkKTsKK3ZvaWQgcGFja2V0X2Nsb3NlKHZvaWQpOworaW50IHBhY2tldF9zZW5kKHN0cnVjdCBuZXRkZXYgKmRldiwgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZfbGVuKTsKK2ludCBwYWNrZXRfcGVlayhpbnQgKmlmaW5kZXgpOwordm9pZCBwYWNrZXRfZGlzY2FyZCh2b2lkKTsKK2ludCBwYWNrZXRfcmVjdihzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdl9sZW4pOworCisjZW5kaWYgLyogSVBDT05GSUdfUEFDS0VUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9raW5pdC5jIGIvdXNyL2tpbml0L2tpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzMzcxOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9raW5pdC5jCkBAIC0wLDAgKzEsMzMzIEBACisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgImtpbml0LmgiCisjaW5jbHVkZSAiaXBjb25maWcuaCIKKyNpbmNsdWRlICJydW4taW5pdC5oIgorI2luY2x1ZGUgInJlc3VtZS5oIgorCitjb25zdCBjaGFyICpwcm9nbmFtZSA9ICJraW5pdCI7CitpbnQgbW50X3Byb2NmczsKK2ludCBtbnRfc3lzZnM7CisKKyNpZmRlZiBJTklfREVCVUcKK3ZvaWQgZHVtcF9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisKKwlwcmludGYoIiAgYXJnYyA9PSAlZFxuIiwgYXJnYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCXByaW50ZigiICBhcmd2WyVkXTogXCIlc1wiXG4iLCBpLCBhcmd2W2ldKTsKKwl9CisKKwlpZiAoYXJndlthcmdjXSAhPSBOVUxMKSB7CisJCXByaW50ZigiICBhcmd2WyVkXTogXCIlc1wiIChTSE9VTEQgQkUgTlVMTClcbiIsCisJCSAgICAgICBhcmdjLCBhcmd2W2FyZ2NdKTsKKwl9Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IGRvX2lwY29uZmlnKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGksIGEgPSAwOworCWNoYXIgKiphcmdzID0gYWxsb2NhKChhcmdjICsgMykgKiBzaXplb2YoY2hhciAqKSk7CisKKwlpZiAoIWFyZ3MpCisJCXJldHVybiAtMTsKKworCWFyZ3NbYSsrXSA9IChjaGFyICopIklQLUNvbmZpZyI7CisJYXJnc1thKytdID0gKGNoYXIgKikiLWkiOworCWFyZ3NbYSsrXSA9IChjaGFyICopIkxpbnV4IGtpbml0IjsKKworCURFQlVHKCgiUnVubmluZyBpcGNvbmZpZ1xuIikpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoc3RybmNtcChhcmd2W2ldLCAiaXA9IiwgMykgPT0gMCB8fAorCQkgICAgc3RybmNtcChhcmd2W2ldLCAibmZzYWRkcnM9IiwgOSkgPT0gMCkgeworCQkJYXJnc1thKytdID0gYXJndltpXTsKKwkJfQorCX0KKworCWlmIChhID4gMSkgeworCQlhcmdzW2FdID0gTlVMTDsKKwkJZHVtcF9hcmdzKGEsIGFyZ3MpOworCQlyZXR1cm4gaXBjb25maWdfbWFpbihhLCBhcmdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGxpdF9jbWRsaW5lKGludCBjbWRjbWF4LCBjaGFyICpjbWR2W10sIGNoYXIgKmFyZ3YwLAorCQkJIGNoYXIgKmNtZGxpbmVzW10sIGNoYXIgKmFyZ3NbXSkKK3sKKwlpbnQgd2FzX3NwYWNlOworCWNoYXIgYywgKnA7CisJaW50IHZtYXggPSBjbWRjbWF4OworCWludCB2ID0gMTsKKwlpbnQgc3BhY2U7CisKKwlpZiAoY21kdikKKwkJY21kdlswXSA9IGFyZ3YwOworCisJLyogRmlyc3QsIGFkZCB0aGUgcGFyc2FibGUgY29tbWFuZCBsaW5lcyAqLworCisJd2hpbGUgKCpjbWRsaW5lcykgeworCQlwID0gKmNtZGxpbmVzKys7CisJCXdhc19zcGFjZSA9IDE7CisJCXdoaWxlICh2IDwgdm1heCkgeworCQkJYyA9ICpwOworCQkJc3BhY2UgPSBpc3NwYWNlKGMpOworCQkJaWYgKChzcGFjZSB8fCAhYykgJiYgIXdhc19zcGFjZSkgeworCQkJCWlmIChjbWR2KQorCQkJCQkqcCA9ICdcMCc7CisJCQkJdisrOworCQkJfSBlbHNlIGlmICh3YXNfc3BhY2UpIHsKKwkJCQlpZiAoY21kdikKKwkJCQkJY21kdlt2XSA9IHA7CisJCQl9CisKKwkJCWlmICghYykKKwkJCQlicmVhazsKKworCQkJd2FzX3NwYWNlID0gc3BhY2U7CisJCQlwKys7CisJCX0KKwl9CisKKwkvKiBTZWNvbmQsIGFkZCB0aGUgZXhwbGljaXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLworCisJd2hpbGUgKCphcmdzICYmIHYgPCB2bWF4KSB7CisJCWlmIChjbWR2KQorCQkJY21kdlt2XSA9ICphcmdzOworCQl2Kys7CisJCWFyZ3MrKzsKKwl9CisKKwlpZiAoY21kdikKKwkJY21kdlt2XSA9IE5VTEw7CisKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGludCBtb3VudF9zeXNfZnMoY29uc3QgY2hhciAqY2hlY2ssIGNvbnN0IGNoYXIgKmZzbmFtZSwKKwkJCWNvbnN0IGNoYXIgKmZzdHlwZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KGNoZWNrLCAmc3QpID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJbWtkaXIoZnNuYW1lLCAwNTU1KTsKKworCWlmIChtb3VudCgibm9uZSIsIGZzbmFtZSwgZnN0eXBlLCAwLCBOVUxMKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjb3VsZCBub3QgbW91bnQgJXMgYXMgJXNcbiIsCisJCQlwcm9nbmFtZSwgZnNuYW1lLCBmc3R5cGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KHBhdGgsICZzdCkgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJcGVycm9yKCJzdGF0Iik7CisJCQlleGl0KDEpOworCQl9CisJCWlmIChta2RpcihwYXRoLCAwNzU1KSA9PSAtMSkgeworCQkJcGVycm9yKCJta2RpciIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0gZWxzZSBpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogJyVzJyBub3QgYSBkaXJlY3RvcnlcbiIsIHByb2duYW1lLCBwYXRoKTsKKwkJZXhpdCgxKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX2luaXQoY29uc3QgY2hhciAqcm9vdCwgY29uc3QgY2hhciAqdXNlcikKK3sKKwljb25zdCBjaGFyICppbml0X3BhdGhzW10gPSB7CisJCSIvc2Jpbi9pbml0IiwgIi9iaW4vaW5pdCIsICIvZXRjL2luaXQiLCAiL2Jpbi9zaCIsIE5VTEwKKwl9OworCWNvbnN0IGNoYXIgKipwOworCWNvbnN0IGNoYXIgKnBhdGg7CisKKwlpZiAoY2hkaXIocm9vdCkpIHsKKwkJcGVycm9yKCJjaGRpciIpOworCQlleGl0KDEpOworCX0KKworCWlmICh1c2VyKQorCQlERUJVRygoIkNoZWNraW5nIGZvciBpbml0OiAlc1xuIiwgdXNlcikpOworCisJaWYgKHVzZXIgJiYgdXNlclswXSA9PSAnLycgJiYgIWFjY2Vzcyh1c2VyKzEsIFhfT0spKSB7CisJCXBhdGggPSB1c2VyOworCX0gZWxzZSB7CisJCWZvciAocCA9IGluaXRfcGF0aHM7ICpwOyBwKyspIHsKKwkJCURFQlVHKCgiQ2hlY2tpbmcgZm9yIGluaXQ6ICVzXG4iLCAqcCkpOworCQkJaWYgKCFhY2Nlc3MoKnArMSwgWF9PSykpCisJCQkJYnJlYWs7CisJCX0KKwkJcGF0aCA9ICpwOworCX0KKwljaGRpcigiLyIpOworCXJldHVybiBwYXRoOworfQorCisvKiBUaGlzIGlzIHRoZSBhcmdjIGFuZCBhcmd2IHdlIHBhc3MgdG8gaW5pdCAqLworY29uc3QgY2hhciAqaW5pdF9wYXRoOworaW50IGluaXRfYXJnYzsKK2NoYXIgKippbml0X2FyZ3Y7CisKK2V4dGVybiBzc2l6ZV90IHJlYWRmaWxlKGNvbnN0IGNoYXIgKiwgY2hhciAqKik7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciAqKmNtZHYsICoqYXJnczsKKwljaGFyICpjbWRsaW5lc1szXTsKKwlpbnQgaTsKKwljb25zdCBjaGFyICplcnJtc2c7CisJaW50IHJldCA9IDA7CisJaW50IGNtZGM7CisJaW50IGZkOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwlzcmFuZDQ4KG5vdy50dl91c2VjIF4gKG5vdy50dl9zZWMgPDwgMjQpKTsKKworCS8qIERlZmF1bHQgcGFyYW1ldGVycyBmb3IgYW55dGhpbmcgaW5pdC1saWtlIHdlIGV4ZWN1dGUgKi8KKwlpbml0X2FyZ2MgPSBhcmdjOworCWluaXRfYXJndiA9IGFsbG9jYSgoYXJnYysxKSpzaXplb2YoY2hhciAqKSk7CisJbWVtY3B5KGluaXRfYXJndiwgYXJndiwgKGFyZ2MrMSkqc2l6ZW9mKGNoYXIgKikpOworCisJaWYgKChmZCA9IG9wZW4oIi9kZXYvY29uc29sZSIsIE9fUkRXUikpICE9IC0xKSB7CisJCWR1cDIoZmQsIFNURElOX0ZJTEVOTyk7CisJCWR1cDIoZmQsIFNURE9VVF9GSUxFTk8pOworCQlkdXAyKGZkLCBTVERFUlJfRklMRU5PKTsKKworCQlpZiAoZmQgPiBTVERFUlJfRklMRU5PKSB7CisJCQljbG9zZShmZCk7CisJCX0KKwl9CisKKwltbnRfcHJvY2ZzID0gbW91bnRfc3lzX2ZzKCIvcHJvYy9jbWRsaW5lIiwgIi9wcm9jIiwgInByb2MiKSA+PSAwOworCWlmICghbW50X3Byb2NmcykgeworCQlyZXQgPSAxOworCQlnb3RvIGJhaWw7CisJfQorCisJbW50X3N5c2ZzID0gbW91bnRfc3lzX2ZzKCIvc3lzL2J1cyIsICIvc3lzIiwgInN5c2ZzIikgPj0gMDsKKwlpZiAoIW1udF9zeXNmcykgeworCQlyZXQgPSAxOworCQlnb3RvIGJhaWw7CisJfQorCisJLyogQ29uc3RydWN0IHRoZSBlZmZlY3RpdmUga2VybmVsIGNvbW1hbmQgbGluZS4gIFRoZQorCSAgIGVmZmVjdGl2ZSBrZXJuZWwgY29tbWFuZCBsaW5lIGNvbnNpc3RzIG9mIC9hcmNoLmNtZCwgaWYKKwkgICBpdCBleGlzdHMsIC9wcm9jL2NtZGxpbmUsIHBsdXMgYW55IGFyZ3VtZW50cyBhZnRlciBhbiAtLQorCSAgIGFyZ3VtZW50IG9uIHRoZSBwcm9wZXIgY29tbWFuZCBsaW5lLCBpbiB0aGF0IG9yZGVyLiAqLworCisJcmV0ID0gcmVhZGZpbGUoIi9hcmNoLmNtZCIsICZjbWRsaW5lc1swXSk7CisJaWYgKHJldCA8IDApCisJCWNtZGxpbmVzWzBdID0gIiI7CisKKwlyZXQgPSByZWFkZmlsZSgiL3Byb2MvY21kbGluZSIsICZjbWRsaW5lc1sxXSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IHJlYWQgL3Byb2MvY21kbGluZVxuIiwgcHJvZ25hbWUpOworCQlyZXQgPSAxOworCQlnb3RvIGJhaWw7CisJfQorCisJY21kbGluZXNbMl0gPSBOVUxMOworCisJLyogRmluZCBhbiAtLSBhcmd1bWVudCwgYW5kIGlmIHNvIGFwcGVuZCB0byB0aGUgY29tbWFuZCBsaW5lICovCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwl9CisJYXJncyA9ICZhcmd2W2ldOwkvKiBQb2ludHMgZWl0aGVyIHRvIGZpcnN0IGFyZ3VtZW50IHBhc3QgLS0gb3IKKwkJCQkgICB0byB0aGUgZmluYWwgTlVMTCAqLworCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKwljbWRjID0gc3BsaXRfY21kbGluZShJTlRfTUFYLCBOVUxMLCBhcmd2WzBdLCBjbWRsaW5lcywgYXJncyk7CisKKwkvKiBBY3R1YWxseSBnZW5lcmF0ZSB0aGUgY21kbGluZSBhcnJheSAqLworCWNtZHYgPSAoY2hhciAqKilhbGxvY2EoKGNtZGMrMSkqc2l6ZW9mKGNoYXIgKikpOworCWlmIChzcGxpdF9jbWRsaW5lKGNtZGMsIGNtZHYsIGFyZ3ZbMF0sIGNtZGxpbmVzLCBhcmdzKSAhPSBjbWRjKSB7CisJCXJldCA9IDE7CisJCWdvdG8gYmFpbDsKKwl9CisKKwkvKiBEZWJ1Z2dpbmcuLi4gKi8KKwlkdW1wX2FyZ3MoY21kYywgY21kdik7CisKKwkvKiBSZXN1bWUgZnJvbSBzdXNwZW5kLXRvLWRpc2ssIGlmIGFwcHJvcHJpYXRlICovCisJLyogSWYgc3VjY2Vzc2Z1bCwgZG9lcyBub3QgcmV0dXJuICovCisJZG9fcmVzdW1lKGNtZGMsIGNtZHYpOworCisJLyogSW5pdGlhbGl6ZSBuZXR3b3JraW5nLCBpZiBhcHBsaWNhYmxlICovCisJZG9faXBjb25maWcoY21kYywgY21kdik7CisKKwljaGVja19wYXRoKCIvcm9vdCIpOworCWRvX21vdW50cyhjbWRjLCBjbWR2KTsKKworCWlmIChtbnRfcHJvY2ZzKSB7CisJCXVtb3VudDIoIi9wcm9jIiwgMCk7CisJCW1udF9wcm9jZnMgPSAwOworCX0KKworCWlmIChtbnRfc3lzZnMpIHsKKwkJdW1vdW50MigiL3N5cyIsIDApOworCQltbnRfc3lzZnMgPSAwOworCX0KKworCWluaXRfcGF0aCA9IGZpbmRfaW5pdCgiL3Jvb3QiLCBnZXRfYXJnKGNtZGMsIGNtZHYsICJpbml0PSIpKTsKKwlpZiAoIWluaXRfcGF0aCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbml0IG5vdCBmb3VuZCFcbiIsIHByb2duYW1lKTsKKwkJcmV0ID0gMjsKKwkJZ290byBiYWlsOworCX0KKworCWluaXRfYXJndlswXSA9IHN0cnJjaHIoaW5pdF9wYXRoLCAnLycpICsgMTsKKworCWVycm1zZyA9IHJ1bl9pbml0KCIvcm9vdCIsICIvZGV2L2NvbnNvbGUiLCBpbml0X3BhdGgsIGluaXRfYXJndik7CisKKwkvKiBJZiBydW5faW5pdCByZXR1cm5lZCwgc29tZXRoaW5nIHdlbnQgYmFkICovCisJZnByaW50ZihzdGRlcnIsICIlczogJXM6ICVzXG4iLCBwcm9nbmFtZSwgZXJybXNnLCBzdHJlcnJvcihlcnJubykpOworCXJldCA9IDI7CisJZ290byBiYWlsOworCitiYWlsOgorCWlmIChtbnRfcHJvY2ZzKQorCQl1bW91bnQyKCIvcHJvYyIsIDApOworCisJaWYgKG1udF9zeXNmcykKKwkJdW1vdW50MigiL3N5cyIsIDApOworCisJLyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgc29tZXRoaW5nIGJhZCBwcm9iYWJseSBoYXBwZW5lZCwgYW5kIHRoZSBrZXJuZWwKKwkgKiB3aWxsIG1vc3QgbGlrZWx5IHBhbmljLiAgRHJhaW4gY29uc29sZSBvdXRwdXQgc28gdGhlIHVzZXIgY2FuCisJICogZmlndXJlIG91dCB3aGF0IGhhcHBlbmVkLgorCSAqLworCXRjZHJhaW4oMik7CisJdGNkcmFpbigxKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQva2luaXQuaCBiL3Vzci9raW5pdC9raW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NWY5MjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQva2luaXQuaApAQCAtMCwwICsxLDcwIEBACisvKgorICoga2luaXQva2luaXQuaAorICovCisKKyNpZm5kZWYgS0lOSVRfSAorI2RlZmluZSBLSU5JVF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitpbnQgZG9fbW91bnRzKGludCBhcmdjLCBjaGFyICphcmd2W10pOworaW50IG1vdW50X25mc19yb290KGludCBhcmdjLCBjaGFyICphcmd2W10sIGludCBmbGFncyk7CitpbnQgcmFtZGlza19sb2FkKGludCBhcmdjLCBjaGFyICphcmd2W10sIGRldl90IHJvb3RfZGV2KTsKK3ZvaWQgbWRfcnVuKGludCBhcmdjLCBjaGFyICphcmd2W10pOworY29uc3QgY2hhciAqYmRldm5hbWUoZGV2X3QgZGV2KTsKKworZXh0ZXJuIGludCBtbnRfcHJvY2ZzOworZXh0ZXJuIGludCBtbnRfc3lzZnM7CisKK2V4dGVybiBpbnQgaW5pdF9hcmdjOworZXh0ZXJuIGNoYXIgKippbml0X2FyZ3Y7CitleHRlcm4gY29uc3QgY2hhciAqcHJvZ25hbWU7CisKK2NoYXIgKmdldF9hcmcoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZ2V0X2ZsYWcoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY29uc3QgY2hhciAqbmFtZSk7CisKK2ludCBnZXRpbnRmaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgKnZhbCk7CisKK3NzaXplX3QgcmVhZGZpbGUoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqKnBwdHIpOworc3NpemVfdCBmcmVhZGZpbGUoRklMRSAqZiwgY2hhciAqKnBwdHIpOworCisvKgorICogbWluKCkvbWF4KCkgbWFjcm9zIHRoYXQgYWxzbyBkbworICogc3RyaWN0IHR5cGUtY2hlY2tpbmcuLiBTZWUgdGhlCisgKiAidW5uZWNlc3NhcnkiIHBvaW50ZXIgY29tcGFyaXNvbi4KKyAqIEZyb20gdGhlIExpbnV4IGtlcm5lbC4KKyAqLworI2RlZmluZSBtaW4oeCx5KSAoeyBcCisgICAgICAgIHR5cGVvZih4KSBfeCA9ICh4KTsgICAgIFwKKyAgICAgICAgdHlwZW9mKHkpIF95ID0gKHkpOyAgICAgXAorICAgICAgICAodm9pZCkgKCZfeCA9PSAmX3kpOyAgICAgICAgICAgIFwKKyAgICAgICAgX3ggPCBfeSA/IF94IDogX3k7IH0pCisKKyNkZWZpbmUgbWF4KHgseSkgKHsgXAorICAgICAgICB0eXBlb2YoeCkgX3ggPSAoeCk7ICAgICBcCisgICAgICAgIHR5cGVvZih5KSBfeSA9ICh5KTsgICAgIFwKKyAgICAgICAgKHZvaWQpICgmX3ggPT0gJl95KTsgICAgICAgICAgICBcCisgICAgICAgIF94ID4gX3kgPyBfeCA6IF95OyB9KQorCisjZGVmaW5lIElOSV9ERUJVRworCisjdW5kZWYgREVCVUcKKyNpZmRlZiBJTklfREVCVUcKKyNkZWZpbmUgREVCVUcoeCkgcHJpbnRmIHgKKyNlbHNlCisjZGVmaW5lIERFQlVHKHgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgSU5JX0RFQlVHCit2b2lkIGR1bXBfYXJncyhpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJKHZvaWQpYXJnYzsKKwkodm9pZClhcmd2OworfQorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBLSU5JVF9IICovCmRpZmYgLS1naXQgYS91c3Iva2luaXQvbmFtZV90b19kZXYuYyBiL3Vzci9raW5pdC9uYW1lX3RvX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2JjMTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmFtZV90b19kZXYuYwpAQCAtMCwwICsxLDIwMiBAQAorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiZG9fbW91bnRzLmgiCisjaW5jbHVkZSAia2luaXQuaCIKKworI2RlZmluZSBCVUZfU1oJCTY1NTM2CisKKy8qIEZpbmQgZGV2X3QgZm9yIGUuZy4gImhkYSxOVUxMIiBvciAiaGRiLDIiICovCitzdGF0aWMgZGV2X3QgdHJ5X25hbWUoY2hhciAqbmFtZSwgaW50IHBhcnQpCit7CisJY2hhciBwYXRoW0JVRl9TWl07CisJY2hhciBidWZbQlVGX1NaXTsKKwlpbnQgcmFuZ2U7CisJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKKwlkZXZfdCByZXM7CisJY2hhciAqczsKKwlpbnQgbGVuOworCWludCBmZDsKKworCS8qIHJlYWQgZGV2aWNlIG51bWJlciBmcm9tIC9zeXMvYmxvY2svLi4uL2RldiAqLworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvYmxvY2svJXMvZGV2IiwgbmFtZSk7CisJZmQgPSBvcGVuKHBhdGgsIDAsIDApOworCWlmIChmZCA8IDApCisJCWdvdG8gZmFpbDsKKwlsZW4gPSByZWFkKGZkLCBidWYsIEJVRl9TWik7CisJY2xvc2UoZmQpOworCisJaWYgKGxlbiA8PSAwIHx8IGxlbiA9PSBCVUZfU1ogfHwgYnVmW2xlbiAtIDFdICE9ICdcbicpCisJCWdvdG8gZmFpbDsKKwlidWZbbGVuIC0gMV0gPSAnXDAnOworCW1ham9yID0gc3RydG91bChidWYsICZzLCAxMCk7CisJaWYgKCpzICE9ICc6JykKKwkJZ290byBmYWlsOworCW1pbm9yID0gc3RydG91bChzICsgMSwgJnMsIDEwKTsKKwlpZiAoKnMpCisJCWdvdG8gZmFpbDsKKwlyZXMgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisKKwkvKiBpZiBpdCdzIHRoZXJlIGFuZCB3ZSBhcmUgbm90IGxvb2tpbmcgZm9yIGEgcGFydGl0aW9uIC0gdGhhdCdzIGl0ICovCisJaWYgKCFwYXJ0KQorCQlyZXR1cm4gcmVzOworCisJLyogb3RoZXJ3aXNlIHJlYWQgcmFuZ2UgZnJvbSAuLi4vcmFuZ2UgKi8KKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIvc3lzL2Jsb2NrLyVzL3JhbmdlIiwgbmFtZSk7CisJZmQgPSBvcGVuKHBhdGgsIDAsIDApOworCWlmIChmZCA8IDApCisJCWdvdG8gZmFpbDsKKwlsZW4gPSByZWFkKGZkLCBidWYsIDMyKTsKKwljbG9zZShmZCk7CisJaWYgKGxlbiA8PSAwIHx8IGxlbiA9PSAzMiB8fCBidWZbbGVuIC0gMV0gIT0gJ1xuJykKKwkJZ290byBmYWlsOworCWJ1ZltsZW4gLSAxXSA9ICdcMCc7CisJcmFuZ2UgPSBzdHJ0b3VsKGJ1ZiwgJnMsIDEwKTsKKwlpZiAoKnMpCisJCWdvdG8gZmFpbDsKKworCS8qIGlmIHBhcnRpdGlvbiBpcyB3aXRoaW4gcmFuZ2UgLSB3ZSBnb3QgaXQgKi8KKwlpZiAocGFydCA8IHJhbmdlKSB7CisJCURFQlVHKCgia2luaXQ6IHRyeV9uYW1lICVzLCVkID0gJXNcbiIsIG5hbWUsIHBhcnQsCisJCSAgICAgICBiZGV2bmFtZShyZXMgKyBwYXJ0KSkpOworCQlyZXR1cm4gcmVzICsgcGFydDsKKwl9CisKKyAgICAgIGZhaWw6CisJcmV0dXJuIChkZXZfdCkgMDsKK30KKworLyoKKyAqCUNvbnZlcnQgYSBuYW1lIGludG8gZGV2aWNlIG51bWJlci4gIFdlIGFjY2VwdCB0aGUgZm9sbG93aW5nIHZhcmlhbnRzOgorICoKKyAqCTEpIGRldmljZSBudW1iZXIgaW4gaGV4YWRlY2ltYWwJcmVwcmVzZW50cyBpdHNlbGYKKyAqCTIpIGRldmljZSBudW1iZXIgaW4gbWFqb3I6bWlub3IgZGVjaW1hbCByZXByZXNlbnRzIGl0c2VsZgorICoJMykgL2Rldi9uZnMgcmVwcmVzZW50cyBSb290X05GUworICoJNCkgL2Rldi88ZGlza19uYW1lPiByZXByZXNlbnRzIHRoZSBkZXZpY2UgbnVtYmVyIG9mIGRpc2sKKyAqCTUpIC9kZXYvPGRpc2tfbmFtZT48ZGVjaW1hbD4gcmVwcmVzZW50cyB0aGUgZGV2aWNlIG51bWJlcgorICogICAgICAgICBvZiBwYXJ0aXRpb24gLSBkZXZpY2UgbnVtYmVyIG9mIGRpc2sgcGx1cyB0aGUgcGFydGl0aW9uIG51bWJlcgorICoJNikgL2Rldi88ZGlza19uYW1lPnA8ZGVjaW1hbD4gLSBzYW1lIGFzIHRoZSBhYm92ZSwgdGhhdCBmb3JtIGlzCisgKgkgICB1c2VkIHdoZW4gZGlzayBuYW1lIG9mIHBhcnRpdGlvbmVkIGRpc2sgZW5kcyBvbiBhIGRpZ2l0LgorICoJNykgYW4gYWN0dWFsIGJsb2NrIGRldmljZSBub2RlIGluIHRoZSBpbml0cmFtZnMgZmlsZXN5c3RlbQorICoKKyAqCUlmIG5hbWUgZG9lc24ndCBoYXZlIGZhbGwgaW50byB0aGUgY2F0ZWdvcmllcyBhYm92ZSwgd2UgcmV0dXJuIDAuCisgKglEcml2ZXJmcyBpcyB1c2VkIHRvIGNoZWNrIGlmIHNvbWV0aGluZyBpcyBhIGRpc2sgbmFtZSAtIGl0IGhhcworICoJYWxsIGtub3duIGRpc2tzIHVuZGVyIGJ1cy9ibG9jay9kZXZpY2VzLiAgSWYgdGhlIGRpc2sgbmFtZQorICoJY29udGFpbnMgc2xhc2hlcywgbmFtZSBvZiBkcml2ZXJmcyBub2RlIGhhcyB0aGVtIHJlcGxhY2VkIHdpdGgKKyAqCWRvdHMuICB0cnlfbmFtZSgpIGRvZXMgdGhlIGFjdHVhbCBjaGVja3MsIGFzc3VtaW5nIHRoYXQgZHJpdmVyZnMKKyAqCWlzIG1vdW50ZWQgb24gcm9vdGZzIC9zeXMuCisgKi8KKworc3RhdGljIGlubGluZSBkZXZfdCBuYW1lX3RvX2Rldl90X3JlYWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICpwOworCWRldl90IHJlcyA9IDA7CisJY2hhciAqczsKKwlpbnQgcGFydDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKmRldm5hbWU7CisJY2hhciAqY3B0ciwgKmUxLCAqZTI7CisJaW50IG1ham9yLCBtaW5vcjsKKworCisJaWYgKG5hbWVbMF0gPT0gJy8nKSB7CisJCWRldm5hbWUgPSBuYW1lOworCX0gZWxzZSB7CisJCWNoYXIgKmRuYW1lID0gYWxsb2NhKHN0cmxlbihuYW1lKSArIDYpOworCQlzcHJpbnRmKGRuYW1lLCAiL2Rldi8lcyIsIG5hbWUpOworCQlkZXZuYW1lID0gZG5hbWU7CisJfQorCisJaWYgKCFzdGF0KGRldm5hbWUsICZzdCkgJiYgU19JU0JMSyhzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIHN0LnN0X3JkZXY7CisKKwlpZiAoc3RybmNtcChuYW1lLCAiL2Rldi8iLCA1KSkgeworCQlpZiAoKGNwdHIgPSBzdHJjaHIoZGV2bmFtZSs1LCAnOicpKSAmJgorCQkgICAgY3B0clsxXSAhPSAnXDAnKSB7CisJCQkvKiBDb2xvbi1zZXBhcmF0ZWQgZGVjaW1hbCBkZXZpY2UgbnVtYmVyICovCisJCQkqY3B0ciA9ICdcMCc7CisJCQltYWpvciA9IHN0cnRvdWwoZGV2bmFtZSs1LCAmZTEsIDEwKTsKKwkJCW1pbm9yID0gc3RydG91bChjcHRyKzEsICZlMiwgMTApOworCQkJaWYgKCEqZTEgJiYgISplMikKKwkJCQlyZXR1cm4gbWFrZWRldihtYWpvciwgbWlub3IpOworCQkJKmNwdHIgPSAnOic7CisJCX0gZWxzZSB7CisJCQkvKiBIZXhhZGVjaW1hbCBkZXZpY2UgbnVtYmVyICovCisJCQlyZXMgPSAoZGV2X3QpIHN0cnRvdWwobmFtZSwgJnAsIDE2KTsKKwkJCWlmICghKnApCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZSB7CisJCW5hbWUgKz0gNTsKKwl9CisKKwlpZiAoIXN0cmNtcChuYW1lLCAibmZzIikpCisJCXJldHVybiBSb290X05GUzsKKworCWlmICghc3RyY21wKG5hbWUsICJyYW0iKSkgLyogL2Rldi9yYW0gLSBoaXN0b3JpYyBhbGlhcyBmb3IgL2Rldi9yYW0wICovCisJCXJldHVybiBSb290X1JBTTA7CisKKwlpZiAoIXN0cm5jbXAobmFtZSwgIm10ZCIsIDMpKQorCQlyZXR1cm4gUm9vdF9NVEQ7CisKKwlsZW4gPSBzdHJsZW4obmFtZSk7CisJcyA9IGFsbG9jYShsZW4gKyAxKTsKKwltZW1jcHkocywgbmFtZSwgbGVuICsgMSk7CisKKwlmb3IgKHAgPSBzOyAqcDsgcCsrKQorCQlpZiAoKnAgPT0gJy8nKQorCQkJKnAgPSAnISc7CisJcmVzID0gdHJ5X25hbWUocywgMCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCXdoaWxlIChwID4gcyAmJiBpc2RpZ2l0KHBbLTFdKSkKKwkJcC0tOworCWlmIChwID09IHMgfHwgISpwIHx8ICpwID09ICcwJykKKwkJZ290byBmYWlsOworCXBhcnQgPSBzdHJ0b3VsKHAsIE5VTEwsIDEwKTsKKwkqcCA9ICdcMCc7CisJcmVzID0gdHJ5X25hbWUocywgcGFydCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWlmIChwIDwgcyArIDIgfHwgIWlzZGlnaXQocFstMl0pIHx8IHBbLTFdICE9ICdwJykKKwkJZ290byBmYWlsOworCXBbLTFdID0gJ1wwJzsKKwlyZXMgPSB0cnlfbmFtZShzLCBwYXJ0KTsKKwlyZXR1cm4gcmVzOworCitmYWlsOgorCXJldHVybiAoZGV2X3QpIDA7Cit9CisKK2Rldl90IG5hbWVfdG9fZGV2X3QoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlkZXZfdCBkZXYgPSBuYW1lX3RvX2Rldl90X3JlYWwobmFtZSk7CisKKwlERUJVRygoImtpbml0OiBuYW1lX3RvX2Rldl90KCVzKSA9ICVzXG4iLCBuYW1lLCBiZGV2bmFtZShkZXYpKSk7CisJcmV0dXJuIGRldjsKK30KKworI2lmZGVmIFRFU1RfTkFNRVRPREVWCQkvKiBTdGFuZGFsb25lIHRlc3QgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisJCW5hbWVfdG9fZGV2X3QoYXJndltpXSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvbmZzbW91bnQvS2J1aWxkIGIvdXNyL2tpbml0L25mc21vdW50L0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjFlNmYzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L0tidWlsZApAQCAtMCwwICsxLDI3IEBACisjCisjIGtidWlsZCBmaWxlIGZvciBuZnNtb3VudAorIworCitzdGF0aWMteSA6PSBzdGF0aWMvbmZzbW91bnQKKyNGSVhNRSAtIGJ1aWxkIGlzIGJyb2tlbiBzdGF0aWMteSA6PSBkdW1teXBtYXAKK3NoYXJlZC15IDo9IHNoYXJlZC9uZnNtb3VudAorCitvYmpzIDo9IG1haW4ubyBtb3VudC5vIHBvcnRtYXAubyBkdW1teXBtYXAubyBzdW5ycGMubworCisjIENyZWF0ZSBidWlsdC1pbi5vIHdpdGggYWxsIC5vIGZpbGVzICh1c2VkIGJ5IGtpbml0KQorbGliLXkgOj0gJChvYmpzKQorCisjIC5vIGZpbGVzIHVzZWQgZm9yIGV4ZWN1dGFibGVzCitzdGF0aWMvbmZzbW91bnQteSA6PSAkKG9ianMpCitzaGFyZWQvbmZzbW91bnQteSA6PSAkKG9ianMpCisKKyMgZHVtbXlwbWFwIHVzZXMgYSBzaW5nbGUgLm8gZmlsZSAocmVuYW1lIHNyYyBmaWxlPykKK2R1bW15cG1hcC15IDo9IGR1bW15cG1hcF90ZXN0Lm8KKworIyBUT0RPIC0gZG8gd2Ugd2FudCBhIHN0cmlwcGVkIHZlcnNpb24KKyMgVE9ETyAtIGRvIHdlIHdhbnQgdGhlIHN0YXRpYy5nICsgc2hhcmVkLmcgZGlyZWN0b3JpZXM/CisKK2NsZWFuLWRpcnMgOj0gc3RhdGljIHNoYXJlZAorCisjIEluc3RhbGwgYmluYXJ5CitpbnN0YWxsLXkgOj0gJChzaGFyZWQteSkKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9SRUFETUUubG9ja2luZyBiL3Vzci9raW5pdC9uZnNtb3VudC9SRUFETUUubG9ja2luZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJlOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L1JFQURNRS5sb2NraW5nCkBAIC0wLDAgKzEsMjYgQEAKK0kgaGF2ZSBpbXBsZW1lbnRlZCBwb3J0bWFwIHNwb29maW5nIGluIGtsaWJjIG5mc21vdW50IChyZWxlYXNlZCBhcwora2xpYmMtMC4xNDQpIFRoaXMgaXMgYmFzaWNhbGx5IGEgdmVzdGlnaWFsIHBvcnRtYXAgZGFlbW9uIHdoaWNoIGdldHMKK2xhdW5jaGVkIGJlZm9yZSB0aGUgbW91bnQoKSBjYWxsIGFuZCB0aGVuIGp1c3QgcmVjb3JkcyBhbnkKK3RyYW5zYWN0aW9ucyBpdCBnZXRzIHRvIGEgZmlsZSBhbmQgc2VuZHMgYmFjayBhbiBhZmZpcm1hdGl2ZSByZXBseS4KKworVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSBpdCAodGhpcyBiZWxvbmdzIGluIGEgUkVBRE1FIGZpbGUsIGJ1dCBpdCdzCit0b28gbGF0ZSBhdCBuaWdodCByaWdodCBub3cpOgorCithKSBTZXQgYSBmaXhlZCBwb3J0bnVtYmVyIGluIC9wcm9jL3N5cy9uZnMvbmxtX3RjcHBvcnQgYW5kCisvcHJvYy9zeXMvbmZzL25sbV91ZHBwb3J0IGJlZm9yZSBjYWxsaW5nIG5mc21vdW50OyBvbmNlIHRoZSBwb3J0bWFwcGVyCitzdGFydHMgZmVlZCB0aGF0IGZpeGVkIHBvcnRudW1iZXIgdG8gcG1hcF9zZXQoOCkuICBJbiB0aGlzIGNhc2UgdGhlCitwbWFwX2ZpbGUgY2FuIGJlIC9kZXYvbnVsbC4KKworYikgQWxsb3cgdGhlIGtlcm5lbCB0byBiaW5kIHRvIGFueSBwb3J0IGFuZCB1c2UgdGhlIGZpbGUgcHJvZHVjZWQgYnkKK25mc3Jvb3QgdG8gZmVlZCB0byBwbWFwX3NldCAoaXQgc2hvdWxkIGJlIGRpcmVjdGx5IGNvbXBhdGlibGUpOyB0aGlzCittZWFucyB0aGUgZmlsZSBuZWVkcyB0byBiZSB0cmFuc2ZlcnJlZCB0byBhIHBsYWNlIHdoZXJlIHRoZSAicmVhbAorcm9vdCIgY2FuIGZpbmQgaXQgYmVmb3JlIHJ1bi1pbml0LgorCitJbiBlaXRoZXIgY2FzZSwgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IHRoZSByZWFsIHBvcnRtYXBwZXIgaXMgbGF1bmNoZWQKK2JlZm9yZSBhbnkgcHJvZ3JhbSBhY3R1YWxseSB0cmllcyB0byBjcmVhdGUgbG9ja3MhCisKK1RvIHVzZSBpdDoKKworCSMgV2UgbmVlZCB0aGUgbG9vcGJhY2sgZGV2aWNlIHRvIGJlIHVwIGJlZm9yZSB3ZSBkbyB0aGlzIQorCWlwY29uZmlnIDEyNy4wLjAuMTo6Ojo6bG86bm9uZQorCW5mc3Jvb3QgLXAgcG1hcF9maWxlIC1vIGxvY2sgc2VydmVyOi9wYXRobmFtZSAvcmVhbHBhdGgKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9kdW1teXBtYXAuYyBiL3Vzci9raW5pdC9uZnNtb3VudC9kdW1teXBtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWUyNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L2R1bW15cG1hcC5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogRW5vdWdoIHBvcnRtYXBwZXIgZnVuY3Rpb25hbGl0eSB0aGF0IG1vdW50IGRvZXNuJ3QgaGFuZyB0cnlpbmcKKyAqIHRvIHN0YXJ0IGxvY2tkLiAgRW5hYmxlcyBuZnNyb290IHdpdGggbG9ja2luZyBmdW5jdGlvbmFsaXR5LgorICoKKyAqIE5vdGU6IHRoZSBrZXJuZWwgd2lsbCBvbmx5IHNwZWFrIHRvIHRoZSBsb2NhbCBwb3J0bWFwcGVyCisgKiB1c2luZyBSUEMgb3ZlciBVRFAuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSAic3VucnBjLmgiCisKK2V4dGVybiBjb25zdCBjaGFyICpwcm9nbmFtZTsKKworc3RydWN0IHBvcnRtYXBfY2FsbCB7CisJc3RydWN0IHJwY19jYWxsIHJwYzsKKwl1aW50MzJfdCBwcm9ncmFtOworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgcHJvdG87CisJdWludDMyX3QgcG9ydDsKK307CisKK3N0cnVjdCBwb3J0bWFwX3JlcGx5IHsKKwlzdHJ1Y3QgcnBjX3JlcGx5IHJwYzsKKwl1aW50MzJfdCBwb3J0OworfTsKKworc3RhdGljIGludCBiaW5kX3BvcnRtYXAodm9pZCkKK3sKKwlpbnQgc29jayA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCisJaWYgKHNvY2sgPCAwKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mIHNpbik7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCgweDdmMDAwMDAxKTsJLyogMTI3LjAuMC4xICovCisJc2luLnNpbl9wb3J0ID0gaHRvbnMoUlBDX1BNQVBfUE9SVCk7CisJaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZiBzaW4pIDwgMCkgeworCQlpbnQgZXJyID0gZXJybm87CisJCWNsb3NlKHNvY2spOworCQllcnJubyA9IGVycjsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBzb2NrOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJvdG9uYW1lKHVpbnQzMl90IHByb3RvKQoreworCXN3aXRjaCAobnRvaGwocHJvdG8pKSB7CisJY2FzZSBJUFBST1RPX1RDUDoKKwkJcmV0dXJuICJ0Y3AiOworCWNhc2UgSVBQUk9UT19VRFA6CisJCXJldHVybiAidWRwIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfcG9ydG1hcChpbnQgc29jaywgRklMRSAqcG9ydG1hcF9maWxlKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IHBrdGxlbiwgYWRkcmxlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBwb3J0bWFwX2NhbGwgYzsKKwkJdW5zaWduZWQgY2hhciBiWzY1NTM2XTsJLyogTWF4IFVEUCBwYWNrZXQgc2l6ZSAqLworCX0gcGt0OworCXN0cnVjdCBwb3J0bWFwX3JlcGx5IHJwbHk7CisKKwlmb3IgKDs7KSB7CisJCWFkZHJsZW4gPSBzaXplb2Ygc2luOworCQlwa3RsZW4gPSByZWN2ZnJvbShzb2NrLCAmcGt0LmMucnBjLmhkci51ZHAsIHNpemVvZiBwa3QsIDAsCisJCQkJICAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgJmFkZHJsZW4pOworCisJCWlmIChwa3RsZW4gPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qICs0IHRvIHNraXAgdGhlIFRDUCBmcmFnbWVudCBoZWFkZXIgKi8KKwkJaWYgKHBrdGxlbiArIDQgPCBzaXplb2Yoc3RydWN0IHBvcnRtYXBfY2FsbCkpCisJCQljb250aW51ZTsJLyogQmFkIHBhY2tldCAqLworCisJCWlmIChwa3QuYy5ycGMuaGRyLnVkcC5tc2dfdHlwZSAhPSBodG9ubChSUENfQ0FMTCkpCisJCQljb250aW51ZTsJLyogQmFkIHBhY2tldCAqLworCisJCW1lbXNldCgmcnBseSwgMCwgc2l6ZW9mIHJwbHkpOworCisJCXJwbHkucnBjLmhkci51ZHAueGlkID0gcGt0LmMucnBjLmhkci51ZHAueGlkOworCQlycGx5LnJwYy5oZHIudWRwLm1zZ190eXBlID0gaHRvbmwoUlBDX1JFUExZKTsKKworCQlpZiAocGt0LmMucnBjLnJwY192ZXJzICE9IGh0b25sKDIpKSB7CisJCQlycGx5LnJwYy5yZXBseV9zdGF0ZSA9IGh0b25sKFJFUExZX0RFTklFRCk7CisJCQkvKiBzdGF0ZSA8LSBSUENfTUlTTUFUQ0ggPT0gMCAqLworCQl9IGVsc2UgaWYgKHBrdC5jLnJwYy5wcm9ncmFtICE9IGh0b25sKFBPUlRNQVBfUFJPR1JBTSkpIHsKKwkJCXJwbHkucnBjLnJlcGx5X3N0YXRlID0gaHRvbmwoUFJPR19VTkFWQUlMKTsKKwkJfSBlbHNlIGlmIChwa3QuYy5ycGMucHJvZ192ZXJzICE9IGh0b25sKDIpKSB7CisJCQlycGx5LnJwYy5yZXBseV9zdGF0ZSA9IGh0b25sKFBST0dfTUlTTUFUQ0gpOworCQl9IGVsc2UgaWYgKHBrdC5jLnJwYy5jcmVkX2xlbiAhPSAwIHx8IHBrdC5jLnJwYy52cmZfbGVuICE9IDApIHsKKwkJCS8qIENhbid0IGRlYWwgd2l0aCBjcmVkZW50aWFscyBkYXRhOyB0aGUga2VybmVsCisJCQkgICB3b24ndCBzZW5kIHRoZW0gKi8KKwkJCXJwbHkucnBjLnJlcGx5X3N0YXRlID0gaHRvbmwoU1lTVEVNX0VSUik7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKG50b2hsKHBrdC5jLnJwYy5wcm9jKSkgeworCQkJY2FzZSBQTUFQX1BST0NfTlVMTDoKKwkJCQlicmVhazsKKwkJCWNhc2UgUE1BUF9QUk9DX1NFVDoKKwkJCQlpZiAocGt0LmMucHJvdG8gPT0gaHRvbmwoSVBQUk9UT19UQ1ApIHx8CisJCQkJICAgIHBrdC5jLnByb3RvID09IGh0b25sKElQUFJPVE9fVURQKSkgeworCQkJCQlpZiAocG9ydG1hcF9maWxlKQorCQkJCQkJZnByaW50Zihwb3J0bWFwX2ZpbGUsCisJCQkJCQkJIiV1ICV1ICVzICV1XG4iLAorCQkJCQkJCW50b2hsKHBrdC5jLnByb2dyYW0pLAorCQkJCQkJCW50b2hsKHBrdC5jLnZlcnNpb24pLAorCQkJCQkJCXByb3RvbmFtZShwa3QuYy5wcm90byksCisJCQkJCQkJbnRvaGwocGt0LmMucG9ydCkpOworCQkJCQlycGx5LnBvcnQgPSBodG9ubCgxKTsJLyogVFJVRSA9IHN1Y2Nlc3MgKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBNQVBfUFJPQ19VTlNFVDoKKwkJCQlycGx5LnBvcnQgPSBodG9ubCgxKTsJLyogVFJVRSA9IHN1Y2Nlc3MgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgUE1BUF9QUk9DX0dFVFBPUlQ6CisJCQkJYnJlYWs7CisJCQljYXNlIFBNQVBfUFJPQ19EVU1QOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlycGx5LnJwYy5yZXBseV9zdGF0ZSA9IGh0b25sKFBST0NfVU5BVkFJTCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlzZW5kdG8oc29jaywgJnJwbHkucnBjLmhkci51ZHAsIHNpemVvZiBycGx5IC0gNCwgMCwKKwkJICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBhZGRybGVuKTsKKwl9Cit9CisKK3BpZF90IHN0YXJ0X2R1bW15X3BvcnRtYXAoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlGSUxFICpwb3J0bWFwX2ZpbGVwOworCWludCBzb2NrOworCXBpZF90IHNwb29mX3BvcnRtYXA7CisKKwlwb3J0bWFwX2ZpbGVwID0gZm9wZW4oZmlsZSwgInciKTsKKwlpZiAoIXBvcnRtYXBfZmlsZXApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IHdyaXRlIHBvcnRtYXAgZmlsZTogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzb2NrID0gYmluZF9wb3J0bWFwKCk7CisJaWYgKHNvY2sgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFQUREUklOVVNFKQorCQkJcmV0dXJuIDA7CS8qIEFzc3VtZSBub3QgbmVlZGVkICovCisJCWVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogcG9ydG1hcCBzcG9vZmluZyBmYWlsZWRcbiIsCisJCQkJcHJvZ25hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJc3Bvb2ZfcG9ydG1hcCA9IGZvcmsoKTsKKwlpZiAoc3Bvb2ZfcG9ydG1hcCA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgZm9ya1xuIiwgcHJvZ25hbWUpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChzcG9vZl9wb3J0bWFwID09IDApIHsKKwkJLyogQ2hpbGQgcHJvY2VzcyAqLworCQlkdW1teV9wb3J0bWFwKHNvY2ssIHBvcnRtYXBfZmlsZXApOworCQlfZXhpdCgyNTUpOwkvKiBFcnJvciAqLworCX0gZWxzZSB7CisJCS8qIFBhcmVudCBwcm9jZXNzICovCisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gc3Bvb2ZfcG9ydG1hcDsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvbmZzbW91bnQvZHVtbXlwbWFwLmggYi91c3Iva2luaXQvbmZzbW91bnQvZHVtbXlwbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NTBiZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9uZnNtb3VudC9kdW1teXBtYXAuaApAQCAtMCwwICsxLDExIEBACisvKgorICogRnVuY3Rpb25zIGZvciB0aGUgcG9ydG1hcCBzcG9vZmVyCisgKi8KKworI2lmbmRlZiBORlNNT1VOVF9EVU1NWVBPUlRNQVBfSAorI2RlZmluZSBORlNNT1VOVF9EVU1NWVBPUlRNQVBfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CitwaWRfdCBzdGFydF9kdW1teV9wb3J0bWFwKGNvbnN0IGNoYXIgKmZpbGUpOworCisjZW5kaWYgLyogTkZTTU9VTlRfRFVNTVlQT1JUTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9kdW1teXBtYXBfdGVzdC5jIGIvdXNyL2tpbml0L25mc21vdW50L2R1bW15cG1hcF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxYTE0MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9uZnNtb3VudC9kdW1teXBtYXBfdGVzdC5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBURVNUCisjaW5jbHVkZSAiZHVtbXlwbWFwLmMiCmRpZmYgLS1naXQgYS91c3Iva2luaXQvbmZzbW91bnQvbWFpbi5jIGIvdXNyL2tpbml0L25mc21vdW50L21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTJlZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L21haW4uYwpAQCAtMCwwICsxLDI1OSBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CS8qIEZvciBfS0xJQkNfTk9fTU1VICovCisKKyNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKworI2luY2x1ZGUgIm5mc21vdW50LmgiCisjaW5jbHVkZSAic3VucnBjLmgiCisjaW5jbHVkZSAiZHVtbXlwbWFwLmgiCisKK2NvbnN0IGNoYXIgKnByb2duYW1lOworc3RhdGljIGptcF9idWYgYWJvcnRfYnVmOworCitzdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIG1vdW50X2RhdGEgPSB7CisJLnZlcnNpb24JPSBORlNfTU9VTlRfVkVSU0lPTiwKKwkuZmxhZ3MJCT0gTkZTX01PVU5UX05PTkxNIHwgTkZTX01PVU5UX1ZFUjMgfCBORlNfTU9VTlRfVENQLAorCS5yc2l6ZQkJPSAwLAkvKiBTZXJ2ZXIncyBjaG9pY2UgKi8KKwkud3NpemUJCT0gMCwJLyogU2VydmVyJ3MgY2hvaWNlICovCisJLnRpbWVvCQk9IDcsCisJLnJldHJhbnMJPSAzLAorCS5hY3JlZ21pbgk9IDMsCisJLmFjcmVnbWF4CT0gNjAsCisJLmFjZGlybWluCT0gMzAsCisJLmFjZGlybWF4CT0gNjAsCisJLm5hbWxlbgkJPSBOQU1FX01BWCwKK307CisKK2ludCBuZnNfcG9ydDsKKworc3RhdGljIHN0cnVjdCBpbnRfb3B0cyB7CisJY2hhciAqbmFtZTsKKwlpbnQgKnZhbDsKK30gaW50X29wdHNbXSA9IHsKKwl7InBvcnQiLAkmbmZzX3BvcnR9LAorCXsicnNpemUiLAkmbW91bnRfZGF0YS5yc2l6ZX0sCisJeyJ3c2l6ZSIsCSZtb3VudF9kYXRhLndzaXplfSwKKwl7InRpbWVvIiwJJm1vdW50X2RhdGEudGltZW99LAorCXsicmV0cmFucyIsCSZtb3VudF9kYXRhLnJldHJhbnN9LAorCXsiYWNyZWdtaW4iLAkmbW91bnRfZGF0YS5hY3JlZ21pbn0sCisJeyJhY3JlZ21heCIsCSZtb3VudF9kYXRhLmFjcmVnbWF4fSwKKwl7ImFjZGlybWluIiwJJm1vdW50X2RhdGEuYWNkaXJtaW59LAorCXsiYWNkaXJtYXgiLAkmbW91bnRfZGF0YS5hY2Rpcm1heH0sCisJe05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGJvb2xfb3B0cyB7CisJY2hhciAqbmFtZTsKKwlpbnQgYW5kX21hc2s7CisJaW50IG9yX21hc2s7Cit9IGJvb2xfb3B0c1tdID0geworCXsic29mdCIsIH5ORlNfTU9VTlRfU09GVCwgTkZTX01PVU5UX1NPRlR9LAorCXsiaGFyZCIsIH5ORlNfTU9VTlRfU09GVCwgMH0sCisJeyJpbnRyIiwgfk5GU19NT1VOVF9JTlRSLCBORlNfTU9VTlRfSU5UUn0sCisJeyJub2ludHIiLCB+TkZTX01PVU5UX0lOVFIsIDB9LAorCXsicG9zaXgiLCB+TkZTX01PVU5UX1BPU0lYLCBORlNfTU9VTlRfUE9TSVh9LAorCXsibm9wb3NpeCIsIH5ORlNfTU9VTlRfUE9TSVgsIDB9LAorCXsiY3RvIiwgfk5GU19NT1VOVF9OT0NUTywgMH0sCisJeyJub2N0byIsIH5ORlNfTU9VTlRfTk9DVE8sIE5GU19NT1VOVF9OT0NUT30sCisJeyJhYyIsIH5ORlNfTU9VTlRfTk9BQywgMH0sCisJeyJub2FjIiwgfk5GU19NT1VOVF9OT0FDLCBORlNfTU9VTlRfTk9BQ30sCisJeyJsb2NrIiwgfk5GU19NT1VOVF9OT05MTSwgMH0sCisJeyJub2xvY2siLCB+TkZTX01PVU5UX05PTkxNLCBORlNfTU9VTlRfTk9OTE19LAorCXsidjIiLCB+TkZTX01PVU5UX1ZFUjMsIDB9LAorCXsidjMiLCB+TkZTX01PVU5UX1ZFUjMsIE5GU19NT1VOVF9WRVIzfSwKKwl7InVkcCIsIH5ORlNfTU9VTlRfVENQLCAwfSwKKwl7InRjcCIsIH5ORlNfTU9VTlRfVENQLCBORlNfTU9VTlRfVENQfSwKKwl7ImJyb2tlbl9zdWlkIiwgfk5GU19NT1VOVF9CUk9LRU5fU1VJRCwgTkZTX01PVU5UX0JST0tFTl9TVUlEfSwKKwl7InJvIiwgfk5GU19NT1VOVF9LTElCQ19ST05MWSwgTkZTX01PVU5UX0tMSUJDX1JPTkxZfSwKKwl7InJ3Iiwgfk5GU19NT1VOVF9LTElCQ19ST05MWSwgMH0sCisJe05VTEwsIDAsIDB9Cit9OworCitzdGF0aWMgaW50IHBhcnNlX2ludChjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKmN0eCkKK3sKKwljaGFyICplbmQ7CisJaW50IHJldDsKKworCXJldCA9IChpbnQpc3RydG91bCh2YWwsICZlbmQsIDApOworCWlmICgqdmFsID09ICdcMCcgfHwgKmVuZCAhPSAnXDAnKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgdmFsdWUgZm9yICVzXG4iLCB2YWwsIGN0eCk7CisJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcGFyc2Vfb3B0cyhjaGFyICpvcHRzKQoreworCWNoYXIgKmNwLCAqdmFsOworCisJd2hpbGUgKChjcCA9IHN0cnNlcCgmb3B0cywgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoKmNwID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJaWYgKCh2YWwgPSBzdHJjaHIoY3AsICc9JykpICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBpbnRfb3B0cyAqb3B0cyA9IGludF9vcHRzOworCQkJKnZhbCsrID0gJ1wwJzsKKwkJCXdoaWxlIChvcHRzLT5uYW1lICYmIHN0cmNtcChvcHRzLT5uYW1lLCBjcCkgIT0gMCkKKwkJCQlvcHRzKys7CisJCQlpZiAob3B0cy0+bmFtZSkKKwkJCQkqKG9wdHMtPnZhbCkgPSBwYXJzZV9pbnQodmFsLCBvcHRzLT5uYW1lKTsKKwkJCWVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBvcHRpb24gJyVzJ1xuIiwKKwkJCQkJcHJvZ25hbWUsIGNwKTsKKwkJCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYm9vbF9vcHRzICpvcHRzID0gYm9vbF9vcHRzOworCQkJd2hpbGUgKG9wdHMtPm5hbWUgJiYgc3RyY21wKG9wdHMtPm5hbWUsIGNwKSAhPSAwKQorCQkJCW9wdHMrKzsKKwkJCWlmIChvcHRzLT5uYW1lKSB7CisJCQkJbW91bnRfZGF0YS5mbGFncyAmPSBvcHRzLT5hbmRfbWFzazsKKwkJCQltb3VudF9kYXRhLmZsYWdzIHw9IG9wdHMtPm9yX21hc2s7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBvcHRpb24gJyVzJ1xuIiwKKwkJCQkJcHJvZ25hbWUsIGNwKTsKKwkJCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1aW50MzJfdCBwYXJzZV9hZGRyKGNvbnN0IGNoYXIgKmlwKQoreworCXN0cnVjdCBpbl9hZGRyIGluOworCWlmIChpbmV0X2F0b24oaXAsICZpbikgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBwYXJzZSBJUCBhZGRyZXNzICclcydcbiIsCisJCQlwcm9nbmFtZSwgaXApOworCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJfQorCXJldHVybiBpbi5zX2FkZHI7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KHBhdGgsICZzdCkgPT0gLTEpIHsKKwkJcGVycm9yKCJzdGF0Iik7CisJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwl9IGVsc2UgaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICclcycgbm90IGEgZGlyZWN0b3J5XG4iLCBwcm9nbmFtZSwgcGF0aCk7CisJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWssIGFsaWFzKCJuZnNtb3VudF9tYWluIikpKTsKKworaW50IG5mc21vdW50X21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1aW50MzJfdCBzZXJ2ZXI7CisJY2hhciAqcmVtX25hbWU7CisJY2hhciAqcmVtX3BhdGg7CisJY2hhciAqaG9zdG5hbWU7CisJY2hhciAqcGF0aDsKKwlpbnQgYzsKKwljb25zdCBjaGFyICpwb3J0bWFwX2ZpbGU7CisJcGlkX3Qgc3Bvb2ZfcG9ydG1hcDsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBzZXRqbXAoYWJvcnRfYnVmKSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBTZXQgdGhlc2UgaGVyZSB0byBhdm9pZCBsb25nam1wIHdhcm5pbmcgKi8KKwlwb3J0bWFwX2ZpbGUgPSBOVUxMOworCXNwb29mX3BvcnRtYXAgPSAwOworCXNlcnZlciA9IDA7CisKKwkvKiBJZiBwcm9nbmFtZSBpcyBzZXQgd2UncmUgaW52b2tlZCBmcm9tIGFub3RoZXIgcHJvZ3JhbSAqLworCWlmICghcHJvZ25hbWUpIHsKKwkJc3RydWN0IHRpbWV2YWwgbm93OworCQlwcm9nbmFtZSA9IGFyZ3ZbMF07CisJCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwkJc3JhbmQ0OChub3cudHZfdXNlYyBeIChub3cudHZfc2VjIDw8IDI0KSk7CisJfQorCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJvOnA6IikpICE9IEVPRikgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnbyc6CisJCQlwYXJzZV9vcHRzKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwb3J0bWFwX2ZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG9wdGlvbiAtJWNcbiIsCisJCQkJcHJvZ25hbWUsIG9wdG9wdCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChvcHRpbmQgPT0gYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBuZWVkIGEgcGF0aFxuIiwgcHJvZ25hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlob3N0bmFtZSA9IHJlbV9wYXRoID0gYXJndltvcHRpbmRdOworCisJaWYgKChyZW1fbmFtZSA9IHN0cmR1cChyZW1fcGF0aCkpID09IE5VTEwpIHsKKwkJcGVycm9yKCJzdHJkdXAiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKChyZW1fcGF0aCA9IHN0cmNocihyZW1fcGF0aCwgJzonKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBuZWVkIGEgc2VydmVyXG4iLCBwcm9nbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCSpyZW1fcGF0aCsrID0gJ1wwJzsKKworCWlmICgqcmVtX3BhdGggIT0gJy8nKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5lZWQgYSBwYXRoXG4iLCBwcm9nbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXNlcnZlciA9IHBhcnNlX2FkZHIoaG9zdG5hbWUpOworCisJaWYgKG9wdGluZCA8PSBhcmdjIC0gMikKKwkJcGF0aCA9IGFyZ3Zbb3B0aW5kICsgMV07CisJZWxzZQorCQlwYXRoID0gIi9uZnNfcm9vdCI7CisKKwljaGVja19wYXRoKHBhdGgpOworCisjaWYhIF9LTElCQ19OT19NTVUKKwkvKiBOb3RlOiB1Q2xpbnV4IGNhbid0IGZvcmsoKSwgc28gdGhlIHNwb29mIHBvcnRtYXBwZXIgaXMgbm90CisJICAgYXZhaWxhYmxlIG9uIHVDbGludXguICovCisJaWYgKHBvcnRtYXBfZmlsZSkKKwkJc3Bvb2ZfcG9ydG1hcCA9IHN0YXJ0X2R1bW15X3BvcnRtYXAocG9ydG1hcF9maWxlKTsKKworCWlmIChzcG9vZl9wb3J0bWFwID09IC0xKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCisJaWYgKG5mc19tb3VudChyZW1fbmFtZSwgaG9zdG5hbWUsIHNlcnZlciwgcmVtX3BhdGgsIHBhdGgsCisJCSAgICAgICZtb3VudF9kYXRhKSAhPSAwKQorCQlyZXR1cm4gMTsKKworCS8qIElmIHdlIHNldCB1cCB0aGUgc3Bvb2ZlciwgdGVhciBpdCBkb3duIG5vdyAqLworCWlmIChzcG9vZl9wb3J0bWFwKSB7CisJCWtpbGwoU0lHVEVSTSwgc3Bvb2ZfcG9ydG1hcCk7CisJCXdoaWxlICh3YWl0cGlkKHNwb29mX3BvcnRtYXAsIE5VTEwsIDApID09IC0xICYmCisJCSAgICAgICBlcnJubyA9PSBFSU5UUikKKwkJICA7CisJfQorCisJZnJlZShyZW1fbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9tb3VudC5jIGIvdXNyL2tpbml0L25mc21vdW50L21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2ZjZjZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9uZnNtb3VudC9tb3VudC5jCkBAIC0wLDAgKzEsMzU3IEBACisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJuZnNtb3VudC5oIgorI2luY2x1ZGUgInN1bnJwYy5oIgorCitzdGF0aWMgdWludDMyX3QgbW91bnRfcG9ydDsKKworc3RydWN0IG1vdW50X2NhbGwgeworCXN0cnVjdCBycGNfY2FsbCBycGM7CisJdWludDMyX3QgcGF0aF9sZW47CisJY2hhciBwYXRoWzBdOworfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHRoZSBORlMgdjMgb24tdGhlLXdpcmUgZmlsZSBoYW5kbGUsCisgKiBhcyBkZWZpbmVkIGluIHJmYzE4MTMuCisgKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgc3RydWN0dXJlIHVzZWQgYnkgdGhlIGtlcm5lbCwKKyAqIGRlZmluZWQgaW4gPGxpbnV4L25maDMuaD46IHJmYyBoYXMgYSBsb25nIGluIG5ldHdvcmsgb3JkZXIsCisgKiBrZXJuZWwgaGFzIGEgc2hvcnQgaW4gbmF0aXZlIG9yZGVyLgorICogQm90aCBrZXJuZWwgYW5kIHJmYyB1c2UgdGhlIG5hbWUgbmZzX2ZoOyBrZXJuZWwgbmFtZSBpcworICogdmlzaWJsZSB0byB1c2VyIGFwcHMgaW4gc29tZSB2ZXJzaW9ucyBvZiBsaWJjLgorICogVXNlIGRpZmZlcmVudCBuYW1lIHRvIGF2b2lkIGNsYXNoZXMuCisgKi8KKyNkZWZpbmUgTkZTX01BWEZIU0laRV9XSVJFIDY0CitzdHJ1Y3QgbmZzX2ZoX3dpcmUgeworCXVpbnQzMl90IHNpemU7CisJY2hhciBkYXRhW05GU19NQVhGSFNJWkVfV0lSRV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1vdW50X3JlcGx5IHsKKwlzdHJ1Y3QgcnBjX3JlcGx5IHJlcGx5OworCXVpbnQzMl90IHN0YXR1czsKKwlzdHJ1Y3QgbmZzX2ZoX3dpcmUgZmg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBNTlRfUkVQTFlfTUlOU0laRSAoc2l6ZW9mKHN0cnVjdCBycGNfcmVwbHkpICsgc2l6ZW9mKHVpbnQzMl90KSkKKworc3RhdGljIGludCBnZXRfcG9ydHModWludDMyX3Qgc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEpCit7CisJdWludDMyX3QgbmZzX3ZlciwgbW91bnRfdmVyOworCXVpbnQzMl90IHByb3RvOworCisJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKwkJbmZzX3ZlciA9IE5GUzNfVkVSU0lPTjsKKwkJbW91bnRfdmVyID0gTkZTX01OVDNfVkVSU0lPTjsKKwl9IGVsc2UgeworCQluZnNfdmVyID0gTkZTMl9WRVJTSU9OOworCQltb3VudF92ZXIgPSBORlNfTU5UX1ZFUlNJT047CisJfQorCisJcHJvdG8gPSAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CisKKwlpZiAobmZzX3BvcnQgPT0gMCkgeworCQluZnNfcG9ydCA9IHBvcnRtYXAoc2VydmVyLCBORlNfUFJPR1JBTSwgbmZzX3ZlciwgcHJvdG8pOworCQlpZiAobmZzX3BvcnQgPT0gMCkgeworCQkJaWYgKHByb3RvID09IElQUFJPVE9fVENQKSB7CisJCQkJc3RydWN0IGluX2FkZHIgYWRkciA9IHsgc2VydmVyIH07CisJCQkJZnByaW50ZihzdGRlcnIsICJORlMgb3ZlciBUQ1Agbm90ICIKKwkJCQkJImF2YWlsYWJsZSBmcm9tICVzXG4iLCBpbmV0X250b2EoYWRkcikpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW5mc19wb3J0ID0gTkZTX1BPUlQ7CisJCX0KKwl9CisKKwlpZiAobW91bnRfcG9ydCA9PSAwKSB7CisJCW1vdW50X3BvcnQgPSBwb3J0bWFwKHNlcnZlciwgTkZTX01OVF9QUk9HUkFNLCBtb3VudF92ZXIsIHByb3RvKTsKKwkJaWYgKG1vdW50X3BvcnQgPT0gMCkKKwkJCW1vdW50X3BvcnQgPSBNT1VOVF9QT1JUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGFkX2xlbihpbnQgbGVuKQoreworCXJldHVybiAobGVuICsgMykgJiB+MzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcGFyYW1zKHVpbnQzMl90IHNlcnZlciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpwYXRoLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSkKK3sKKwkodm9pZClzZXJ2ZXI7CisJKHZvaWQpcGF0aDsKKwkodm9pZClkYXRhOworCisjaWZkZWYgTkZTX0RFQlVHCisJc3RydWN0IGluX2FkZHIgYWRkciA9IHsgc2VydmVyIH07CisKKwlwcmludGYoIk5GUyBwYXJhbXM6XG4iKTsKKwlwcmludGYoIiAgc2VydmVyID0gJXMsIHBhdGggPSBcIiVzXCIsICIsIGluZXRfbnRvYShhZGRyKSwgcGF0aCk7CisJcHJpbnRmKCJ2ZXJzaW9uID0gJWQsIHByb3RvID0gJXNcbiIsCisJICAgICAgIGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMgPyAzIDogMiwKKwkgICAgICAgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPyAidGNwIiA6ICJ1ZHAiKTsKKwlwcmludGYoIiAgbW91bnRfcG9ydCA9ICVkLCBuZnNfcG9ydCA9ICVkLCBmbGFncyA9ICUwOHhcbiIsCisJICAgICAgIG1vdW50X3BvcnQsIG5mc19wb3J0LCBkYXRhLT5mbGFncyk7CisJcHJpbnRmKCIgIHJzaXplID0gJWQsIHdzaXplID0gJWQsIHRpbWVvID0gJWQsIHJldHJhbnMgPSAlZFxuIiwKKwkgICAgICAgZGF0YS0+cnNpemUsIGRhdGEtPndzaXplLCBkYXRhLT50aW1lbywgZGF0YS0+cmV0cmFucyk7CisJcHJpbnRmKCIgIGFjcmVnIChtaW4sIG1heCkgPSAoJWQsICVkKSwgYWNkaXIgKG1pbiwgbWF4KSA9ICglZCwgJWQpXG4iLAorCSAgICAgICBkYXRhLT5hY3JlZ21pbiwgZGF0YS0+YWNyZWdtYXgsIGRhdGEtPmFjZGlybWluLCBkYXRhLT5hY2Rpcm1heCk7CisJcHJpbnRmKCIgIHNvZnQgPSAlZCwgaW50ciA9ICVkLCBwb3NpeCA9ICVkLCBub2N0byA9ICVkLCBub2FjID0gJWRcbiIsCisJICAgICAgIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9TT0ZUKSAhPSAwLAorCSAgICAgICAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikgIT0gMCwKKwkgICAgICAgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1BPU0lYKSAhPSAwLAorCSAgICAgICAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9DVE8pICE9IDAsCisJICAgICAgIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9OT0FDKSAhPSAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9maChjb25zdCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCSh2b2lkKWRhdGE7CisJKHZvaWQpbGVuOworCisjaWZkZWYgTkZTX0RFQlVHCisJaW50IGkgPSAwOworCWludCBtYXggPSBsZW4gLSAobGVuICUgOCk7CisKKwlwcmludGYoIlJvb3QgZmlsZSBoYW5kbGU6ICVkIGJ5dGVzXG4iLCBORlMyX0ZIU0laRSk7CisKKwl3aGlsZSAoaSA8IG1heCkgeworCQlpbnQgajsKKworCQlwcmludGYoIiAgJTRkOiAgIiwgaSk7CisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCXByaW50ZigiJTAyeCAlMDJ4ICUwMnggJTAyeCAgIiwKKwkJCSAgICAgICBkYXRhW2ldICYgMHhmZiwgZGF0YVtpICsgMV0gJiAweGZmLAorCQkJICAgICAgIGRhdGFbaSArIDJdICYgMHhmZiwgZGF0YVtpICsgM10gJiAweGZmKTsKKwkJfQorCQlpICs9IGo7CisJCXByaW50ZigiXG4iKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBtb3VudF9yZXBseSBtbnRfcmVwbHk7CisKK3N0YXRpYyBpbnQgbW91bnRfY2FsbCh1aW50MzJfdCBwcm9jLCB1aW50MzJfdCB2ZXJzaW9uLAorCQkgICAgICBjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgY2xpZW50ICpjbG50KQoreworCXN0cnVjdCBtb3VudF9jYWxsICptbnRfY2FsbCA9IE5VTEw7CisJc2l6ZV90IHBhdGhfbGVuLCBjYWxsX2xlbjsKKwlzdHJ1Y3QgcnBjIHJwYzsKKwlpbnQgcmV0ID0gMDsKKworCXBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCWNhbGxfbGVuID0gc2l6ZW9mKCptbnRfY2FsbCkgKyBwYWRfbGVuKHBhdGhfbGVuKTsKKworCWlmICgobW50X2NhbGwgPSBtYWxsb2MoY2FsbF9sZW4pKSA9PSBOVUxMKSB7CisJCXBlcnJvcigibWFsbG9jIik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwltZW1zZXQobW50X2NhbGwsIDAsIHNpemVvZigqbW50X2NhbGwpKTsKKworCW1udF9jYWxsLT5ycGMucHJvZ3JhbSA9IGh0b25sKE5GU19NTlRfUFJPR1JBTSk7CisJbW50X2NhbGwtPnJwYy5wcm9nX3ZlcnMgPSBodG9ubCh2ZXJzaW9uKTsKKwltbnRfY2FsbC0+cnBjLnByb2MgPSBodG9ubChwcm9jKTsKKwltbnRfY2FsbC0+cGF0aF9sZW4gPSBodG9ubChwYXRoX2xlbik7CisJbWVtY3B5KG1udF9jYWxsLT5wYXRoLCBwYXRoLCBwYXRoX2xlbik7CisKKwlycGMuY2FsbCA9IChzdHJ1Y3QgcnBjX2NhbGwgKiltbnRfY2FsbDsKKwlycGMuY2FsbF9sZW4gPSBjYWxsX2xlbjsKKwlycGMucmVwbHkgPSAoc3RydWN0IHJwY19yZXBseSAqKSZtbnRfcmVwbHk7CisJcnBjLnJlcGx5X2xlbiA9IHNpemVvZihtbnRfcmVwbHkpOworCisJaWYgKHJwY19jYWxsKGNsbnQsICZycGMpIDwgMCkKKwkJZ290byBiYWlsOworCisJaWYgKHByb2MgIT0gTU5UUFJPQ19NTlQpIHsKKwkJZ290byBkb25lOworCX0KKworCWlmIChycGMucmVwbHlfbGVuIDwgTU5UX1JFUExZX01JTlNJWkUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbmNvbXBsZXRlIHJlcGx5OiAlenUgPCAlenVcbiIsCisJCQlycGMucmVwbHlfbGVuLCBNTlRfUkVQTFlfTUlOU0laRSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAobW50X3JlcGx5LnN0YXR1cyAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAibW91bnQgY2FsbCBmYWlsZWQ6ICVkXG4iLAorCQkJbnRvaGwobW50X3JlcGx5LnN0YXR1cykpOworCQlnb3RvIGJhaWw7CisJfQorCisJZ290byBkb25lOworCitiYWlsOgorCXJldCA9IC0xOworCitkb25lOgorCWlmIChtbnRfY2FsbCkgeworCQlmcmVlKG1udF9jYWxsKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vdW50X3YyKGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgICBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEsIHN0cnVjdCBjbGllbnQgKmNsbnQpCit7CisJaW50IHJldCA9IG1vdW50X2NhbGwoTU5UUFJPQ19NTlQsIE5GU19NTlRfVkVSU0lPTiwgcGF0aCwgY2xudCk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJZHVtcF9maCgoY29uc3QgY2hhciAqKSZtbnRfcmVwbHkuZmgsIE5GUzJfRkhTSVpFKTsKKworCQlkYXRhLT5yb290LnNpemUgPSBORlNfRkhTSVpFOworCQltZW1jcHkoZGF0YS0+cm9vdC5kYXRhLCAmbW50X3JlcGx5LmZoLCBORlNfRkhTSVpFKTsKKwkJbWVtY3B5KGRhdGEtPm9sZF9yb290LmRhdGEsICZtbnRfcmVwbHkuZmgsIE5GU19GSFNJWkUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVtb3VudF92Mihjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgY2xpZW50ICpjbG50KQoreworCXJldHVybiBtb3VudF9jYWxsKE1OVFBST0NfVU1OVCwgTkZTX01OVF9WRVJTSU9OLCBwYXRoLCBjbG50KTsKK30KKworc3RhdGljIGludCBtb3VudF92Myhjb25zdCBjaGFyICpwYXRoLAorCQkgICAgc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhLCBzdHJ1Y3QgY2xpZW50ICpjbG50KQoreworCWludCByZXQgPSBtb3VudF9jYWxsKE1OVFBST0NfTU5ULCBORlNfTU5UM19WRVJTSU9OLCBwYXRoLCBjbG50KTsKKworCWlmIChyZXQgPT0gMCkgeworCQlzaXplX3QgZmhzaXplID0gbnRvaGwobW50X3JlcGx5LmZoLnNpemUpOworCisJCWR1bXBfZmgoKGNvbnN0IGNoYXIgKikmbW50X3JlcGx5LmZoLmRhdGEsIGZoc2l6ZSk7CisKKwkJbWVtc2V0KGRhdGEtPm9sZF9yb290LmRhdGEsIDAsIE5GU19GSFNJWkUpOworCQltZW1zZXQoJmRhdGEtPnJvb3QsIDAsIHNpemVvZihkYXRhLT5yb290KSk7CisJCWRhdGEtPnJvb3Quc2l6ZSA9IGZoc2l6ZTsKKwkJbWVtY3B5KCZkYXRhLT5yb290LmRhdGEsIG1udF9yZXBseS5maC5kYXRhLCBmaHNpemUpOworCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCB1bW91bnRfdjMoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGNsaWVudCAqY2xudCkKK3sKKwlyZXR1cm4gbW91bnRfY2FsbChNTlRQUk9DX1VNTlQsIE5GU19NTlQzX1ZFUlNJT04sIHBhdGgsIGNsbnQpOworfQorCitpbnQgbmZzX21vdW50KGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkgICAgICB1aW50MzJfdCBzZXJ2ZXIsIGNvbnN0IGNoYXIgKnJlbV9wYXRoLCBjb25zdCBjaGFyICpwYXRoLAorCSAgICAgIHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2xpZW50ICpjbG50ID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwljaGFyIG1vdW50ZWQgPSAwOworCWludCBzb2NrID0gLTE7CisJaW50IHJldCA9IDA7CisJaW50IG1vdW50ZmxhZ3M7CisKKwlpZiAoZ2V0X3BvcnRzKHNlcnZlciwgZGF0YSkgIT0gMCkgeworCQlnb3RvIGJhaWw7CisJfQorCisJZHVtcF9wYXJhbXMoc2VydmVyLCByZW1fcGF0aCwgZGF0YSk7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVENQKSB7CisJCWNsbnQgPSB0Y3BfY2xpZW50KHNlcnZlciwgbW91bnRfcG9ydCwgQ0xJX1JFU1ZQT1JUKTsKKwl9IGVsc2UgeworCQljbG50ID0gdWRwX2NsaWVudChzZXJ2ZXIsIG1vdW50X3BvcnQsIENMSV9SRVNWUE9SVCk7CisJfQorCisJaWYgKGNsbnQgPT0gTlVMTCkgeworCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKwkJcmV0ID0gbW91bnRfdjMocmVtX3BhdGgsIGRhdGEsIGNsbnQpOworCX0gZWxzZSB7CisJCXJldCA9IG1vdW50X3YyKHJlbV9wYXRoLCBkYXRhLCBjbG50KTsKKwl9CisKKwlpZiAocmV0ID09IC0xKSB7CisJCWdvdG8gYmFpbDsKKwl9CisJbW91bnRlZCA9IDE7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVENQKSB7CisJCXNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwl9IGVsc2UgeworCQlzb2NrID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwl9CisKKwlpZiAoc29jayA9PSAtMSkgeworCQlwZXJyb3IoInNvY2tldCIpOworCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKGJpbmRyZXN2cG9ydChzb2NrLCAwKSA9PSAtMSkgeworCQlwZXJyb3IoImJpbmRyZXN2cG9ydCIpOworCQlnb3RvIGJhaWw7CisJfQorCisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IHNlcnZlcjsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMobmZzX3BvcnQpOworCW1lbWNweSgmZGF0YS0+YWRkciwgJmFkZHIsIHNpemVvZihkYXRhLT5hZGRyKSk7CisKKwlzdHJuY3B5KGRhdGEtPmhvc3RuYW1lLCBob3N0bmFtZSwgc2l6ZW9mKGRhdGEtPmhvc3RuYW1lKSk7CisKKwlkYXRhLT5mZCA9IHNvY2s7CisKKwltb3VudGZsYWdzID0gKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0tMSUJDX1JPTkxZKSA/IE1TX1JET05MWSA6IDA7CisJZGF0YS0+ZmxhZ3MgPSBkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9GTEFHTUFTSzsKKwlyZXQgPSBtb3VudChwYXRobmFtZSwgcGF0aCwgIm5mcyIsIG1vdW50ZmxhZ3MsIGRhdGEpOworCisJaWYgKHJldCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRU5PREVWKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm1vdW50OiB0aGUga2VybmVsIGxhY2tzIE5GUyB2JWQgIgorCQkJCSJzdXBwb3J0XG4iLAorCQkJCShkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSA/IDMgOiAyKTsKKwkJfSBlbHNlIHsKKwkJCXBlcnJvcigibW91bnQiKTsKKwkJfQorCQlnb3RvIGJhaWw7CisJfQorCisJREVCVUcoKCJNb3VudGVkICVzIG9uICVzXG4iLCBwYXRobmFtZSwgcGF0aCkpOworCisJZ290byBkb25lOworCisgICAgICBiYWlsOgorCWlmIChtb3VudGVkKSB7CisJCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7CisJCQl1bW91bnRfdjMocGF0aCwgY2xudCk7CisJCX0gZWxzZSB7CisJCQl1bW91bnRfdjIocGF0aCwgY2xudCk7CisJCX0KKwl9CisKKwlyZXQgPSAtMTsKKworICAgICAgZG9uZToKKwlpZiAoY2xudCkgeworCQljbGllbnRfZnJlZShjbG50KTsKKwl9CisKKwlpZiAoc29jayAhPSAtMSkgeworCQljbG9zZShzb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc21vdW50L25mc21vdW50LmggYi91c3Iva2luaXQvbmZzbW91bnQvbmZzbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE3YzEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L25mc21vdW50LmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBORlNNT1VOVF9ORlNNT1VOVF9ICisjZGVmaW5lIE5GU01PVU5UX05GU01PVU5UX0gKKworI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgorCitleHRlcm4gaW50IG5mc19wb3J0OworCitleHRlcm4gaW50IG5mc21vdW50X21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CitpbnQgbmZzX21vdW50KGNvbnN0IGNoYXIgKnJlbV9uYW1lLCBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkgICAgICB1aW50MzJfdCBzZXJ2ZXIsIGNvbnN0IGNoYXIgKnJlbV9wYXRoLAorCSAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSk7CisKK2VudW0gbmZzX3Byb3RvIHsKKwl2MiA9IDIsCisJdjMsCit9OworCisvKiBtYXNrZWQgd2l0aCBORlNfTU9VTlRfRkxBR01BU0sgYmVmb3JlIG1vdW50KCkgY2FsbCAqLworI2RlZmluZSBORlNfTU9VTlRfS0xJQkNfUk9OTFkJMHgwMDAxMDAwMFUKKy8qCisgKiBOb3RlIGZvciBnY2MgMy4yLjI6CisgKgorICogSWYgeW91J3JlIHR1cm5pbmcgb24gZGVidWdnaW5nLCBtYWtlIHN1cmUgeW91IGdldCByaWQgb2YgLU9zIGZyb20KKyAqIHRoZSBnY2MgY29tbWFuZCBsaW5lLCBvciBlbHNlIGlwY29uZmlnIHdpbGwgZmFpbCB0byBsaW5rLgorICovCisjZGVmaW5lIE5GU19ERUJVRworCisjdW5kZWYgREVCVUcKKyNpZmRlZiBORlNfREVCVUcKKyNkZWZpbmUgREVCVUcoeCkgcHJpbnRmIHgKKyNlbHNlCisjZGVmaW5lIERFQlVHKHgpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBORlNNT1VOVF9ORlNNT1VOVF9IICovCmRpZmYgLS1naXQgYS91c3Iva2luaXQvbmZzbW91bnQvcG9ydG1hcC5jIGIvdXNyL2tpbml0L25mc21vdW50L3BvcnRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjExMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L3BvcnRtYXAuYwpAQCAtMCwwICsxLDczIEBACisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogX19jb25zdGFudF9odG9uKiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJuZnNtb3VudC5oIgorI2luY2x1ZGUgInN1bnJwYy5oIgorCitzdHJ1Y3QgcG9ydG1hcF9jYWxsIHsKKwlzdHJ1Y3QgcnBjX2NhbGwgcnBjOworCXVpbnQzMl90IHByb2dyYW07CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBwcm90bzsKKwl1aW50MzJfdCBwb3J0OworfTsKKworc3RydWN0IHBvcnRtYXBfcmVwbHkgeworCXN0cnVjdCBycGNfcmVwbHkgcnBjOworCXVpbnQzMl90IHBvcnQ7Cit9OworCitzdGF0aWMgc3RydWN0IHBvcnRtYXBfY2FsbCBjYWxsID0geworCS5ycGMgPSB7CisJCS5wcm9ncmFtCT0gX19jb25zdGFudF9odG9ubChSUENfUE1BUF9QUk9HUkFNKSwKKwkJLnByb2dfdmVycwk9IF9fY29uc3RhbnRfaHRvbmwoUlBDX1BNQVBfVkVSU0lPTiksCisJCS5wcm9jCQk9IF9fY29uc3RhbnRfaHRvbmwoUE1BUF9QUk9DX0dFVFBPUlQpLAorCX0KK307CisKK3VpbnQzMl90IHBvcnRtYXAodWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCBwcm9ncmFtLCB1aW50MzJfdCB2ZXJzaW9uLCB1aW50MzJfdCBwcm90bykKK3sKKwlzdHJ1Y3QgcG9ydG1hcF9yZXBseSByZXBseTsKKwlzdHJ1Y3QgY2xpZW50ICpjbG50OworCXN0cnVjdCBycGMgcnBjOworCXVpbnQzMl90IHBvcnQgPSAwOworCisJaWYgKChjbG50ID0gdGNwX2NsaWVudChzZXJ2ZXIsIFJQQ19QTUFQX1BPUlQsIDApKSA9PSBOVUxMKSB7CisJCWlmICgoY2xudCA9IHVkcF9jbGllbnQoc2VydmVyLCBSUENfUE1BUF9QT1JULCAwKSkgPT0gTlVMTCkgeworCQkJZ290byBiYWlsOworCQl9CisJfQorCisJY2FsbC5wcm9ncmFtID0gaHRvbmwocHJvZ3JhbSk7CisJY2FsbC52ZXJzaW9uID0gaHRvbmwodmVyc2lvbik7CisJY2FsbC5wcm90byA9IGh0b25sKHByb3RvKTsKKworCXJwYy5jYWxsID0gKHN0cnVjdCBycGNfY2FsbCAqKSZjYWxsOworCXJwYy5jYWxsX2xlbiA9IHNpemVvZihjYWxsKTsKKwlycGMucmVwbHkgPSAoc3RydWN0IHJwY19yZXBseSAqKSZyZXBseTsKKwlycGMucmVwbHlfbGVuID0gc2l6ZW9mKHJlcGx5KTsKKworCWlmIChycGNfY2FsbChjbG50LCAmcnBjKSA8IDApCisJCWdvdG8gYmFpbDsKKworCWlmIChycGMucmVwbHlfbGVuIDwgc2l6ZW9mKHJlcGx5KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImluY29tcGxldGUgcmVwbHk6ICV6dSA8ICV6dVxuIiwKKwkJCXJwYy5yZXBseV9sZW4sIHNpemVvZihyZXBseSkpOworCQlnb3RvIGJhaWw7CisJfQorCisJcG9ydCA9IG50b2hsKHJlcGx5LnBvcnQpOworCitiYWlsOgorCURFQlVHKCgiUG9ydCBmb3IgJWQvJWRbJXNdOiAlZFxuIiwgcHJvZ3JhbSwgdmVyc2lvbiwKKwkgICAgICAgcHJvdG8gPT0gSVBQUk9UT19UQ1AgPyAidGNwIiA6ICJ1ZHAiLCBwb3J0KSk7CisKKwlpZiAoY2xudCkgeworCQljbGllbnRfZnJlZShjbG50KTsKKwl9CisKKwlyZXR1cm4gcG9ydDsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9zdW5ycGMuYyBiL3Vzci9raW5pdC9uZnNtb3VudC9zdW5ycGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTVkNDEyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L3N1bnJwYy5jCkBAIC0wLDAgKzEsMjUzIEBACisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibmZzbW91bnQuaCIKKyNpbmNsdWRlICJzdW5ycGMuaCIKKworLyoKKyAqIFRoZSBtYWdpYyBvZmZzZXQgaXMgbmVlZGVkIGhlcmUgYmVjYXVzZSBSUEMgb3ZlciBUQ1AgaW5jbHVkZXMgYQorICogZmllbGQgdGhhdCBSUEMgb3ZlciBVRFAgZG9lc24ndC4gIEx1dnZlcmx5LgorICovCitzdGF0aWMgaW50IHJwY19kb19yZXBseShzdHJ1Y3QgY2xpZW50ICpjbG50LCBzdHJ1Y3QgcnBjICpycGMsIHNpemVfdCBvZmYpCit7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gcmVhZChjbG50LT5zb2NrLAorCQkJKChjaGFyICopcnBjLT5yZXBseSkgKyBvZmYsCisJCQlycGMtPnJlcGx5X2xlbiAtIG9mZikpID09IC0xKSB7CisJCXBlcnJvcigicmVhZCIpOworCQlnb3RvIGJhaWw7CisJfSBlbHNlIGlmIChyZXQgPCBzaXplb2Yoc3RydWN0IHJwY19yZXBseSkgLSBvZmYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJzaG9ydCByZWFkOiAlZCA8ICV6dVxuIiwgcmV0LAorCQkJc2l6ZW9mKHN0cnVjdCBycGNfcmVwbHkpIC0gb2ZmKTsKKwkJZ290byBiYWlsOworCX0KKwlycGMtPnJlcGx5X2xlbiA9IHJldCArIG9mZjsKKworCWlmICgoIW9mZiAmJiAhKG50b2hsKHJwYy0+cmVwbHktPmhkci5mcmFnX2hkcikgJiBMQVNUX0ZSQUcpKSB8fAorCSAgICBycGMtPnJlcGx5LT5oZHIudWRwLnhpZCAhPSBycGMtPmNhbGwtPmhkci51ZHAueGlkIHx8CisJICAgIHJwYy0+cmVwbHktPmhkci51ZHAubXNnX3R5cGUgIT0gaHRvbmwoUlBDX1JFUExZKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImJhZCByZXBseVxuIik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAobnRvaGwocnBjLT5yZXBseS0+c3RhdGUpICE9IFJFUExZX09LKSB7CisJCWZwcmludGYoc3RkZXJyLCAicnBjIGZhaWxlZDogJWRcbiIsIG50b2hsKHJwYy0+cmVwbHktPnN0YXRlKSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlyZXQgPSAwOworCWdvdG8gZG9uZTsKKworYmFpbDoKKwlyZXQgPSAtMTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcnBjX2hlYWRlcihzdHJ1Y3QgY2xpZW50ICpjbG50LCBzdHJ1Y3QgcnBjICpycGMpCit7CisJKHZvaWQpY2xudDsKKworCXJwYy0+Y2FsbC0+aGRyLmZyYWdfaGRyID0gaHRvbmwoTEFTVF9GUkFHIHwgcnBjLT5jYWxsX2xlbik7CisJcnBjLT5jYWxsLT5oZHIudWRwLnhpZCA9IGxyYW5kNDgoKTsKKwlycGMtPmNhbGwtPmhkci51ZHAubXNnX3R5cGUgPSBodG9ubChSUENfQ0FMTCk7CisJcnBjLT5jYWxsLT5ycGNfdmVycyA9IGh0b25sKDIpOworfQorCitzdGF0aWMgaW50IHJwY19jYWxsX3RjcChzdHJ1Y3QgY2xpZW50ICpjbG50LCBzdHJ1Y3QgcnBjICpycGMpCit7CisJaW50IHJldDsKKworCXJwY19oZWFkZXIoY2xudCwgcnBjKTsKKworCWlmICgocmV0ID0gd3JpdGUoY2xudC0+c29jaywgcnBjLT5jYWxsLCBycGMtPmNhbGxfbGVuKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJ3cml0ZSIpOworCQlnb3RvIGJhaWw7CisJfSBlbHNlIGlmIChyZXQgPCBycGMtPmNhbGxfbGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAic2hvcnQgd3JpdGU6ICVkIDwgJXp1XG4iLCByZXQsIHJwYy0+Y2FsbF9sZW4pOworCQlnb3RvIGJhaWw7CisJfQorCisJcmV0ID0gcnBjX2RvX3JlcGx5KGNsbnQsIHJwYywgMCk7CisJZ290byBkb25lOworCisgICAgICBiYWlsOgorCXJldCA9IC0xOworCisgICAgICBkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnBjX2NhbGxfdWRwKHN0cnVjdCBjbGllbnQgKmNsbnQsIHN0cnVjdCBycGMgKnJwYykKK3sKKyNkZWZpbmUgTlJfRkRTIDEKKyNkZWZpbmUgVElNRU9VVF9NUyAzMDAwCisjZGVmaW5lIE1BWF9UUklFUyAxMDAKKyNkZWZpbmUgVURQX0hEUl9PRkYgKHNpemVvZihzdHJ1Y3QgcnBjX2hlYWRlcikgLSBzaXplb2Yoc3RydWN0IHJwY191ZHBfaGVhZGVyKSkKKwlzdHJ1Y3QgcG9sbGZkIGZkc1tOUl9GRFNdOworCWludCByZXQgPSAtMTsKKwlpbnQgaTsKKworCXJwY19oZWFkZXIoY2xudCwgcnBjKTsKKworCWZkc1swXS5mZCA9IGNsbnQtPnNvY2s7CisJZmRzWzBdLmV2ZW50cyA9IFBPTExSRE5PUk07CisKKwlycGMtPmNhbGxfbGVuIC09IFVEUF9IRFJfT0ZGOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UUklFUzsgaSsrKSB7CisJCWludCB0aW1lb3V0X21zID0gVElNRU9VVF9NUyArIChscmFuZDQ4KCkgJSAoVElNRU9VVF9NUyAvIDIpKTsKKwkJaWYgKChyZXQgPSB3cml0ZShjbG50LT5zb2NrLAorCQkJCSAoKGNoYXIgKilycGMtPmNhbGwpICsgVURQX0hEUl9PRkYsCisJCQkJIHJwYy0+Y2FsbF9sZW4pKSA9PSAtMSkgeworCQkJcGVycm9yKCJ3cml0ZSIpOworCQkJZ290byBiYWlsOworCQl9IGVsc2UgaWYgKHJldCA8IHJwYy0+Y2FsbF9sZW4pIHsKKwkJCWZwcmludGYoc3RkZXJyLCAic2hvcnQgd3JpdGU6ICVkIDwgJXp1XG4iLCByZXQsCisJCQkJcnBjLT5jYWxsX2xlbik7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJZm9yICg7IGkgPCBNQVhfVFJJRVM7IGkrKykgeworCQkJaWYgKChyZXQgPSBwb2xsKGZkcywgTlJfRkRTLCB0aW1lb3V0X21zKSkgPT0gLTEpIHsKKwkJCQlwZXJyb3IoInBvbGwiKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlERUJVRygoIlRpbWVvdXQgIyVkXG4iLCBpICsgMSkpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKChyZXQgPSBycGNfZG9fcmVwbHkoY2xudCwgcnBjLCBVRFBfSERSX09GRikpID09IDApIHsKKwkJCQlnb3RvIGRvbmU7CisJCQl9IGVsc2UgeworCQkJCURFQlVHKCgiRmFpbGVkIG9uIHRyeSAjJWQgLSByZXRyeWluZ1xuIiwKKwkJCQkgICAgICAgaSArIDEpKTsKKwkJCX0KKwkJfQorCX0KKworICAgICAgYmFpbDoKKwlyZXQgPSAtMTsKKworICAgICAgZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgY2xpZW50ICp0Y3BfY2xpZW50KHVpbnQzMl90IHNlcnZlciwgdWludDE2X3QgcG9ydCwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGNsaWVudCAqY2xudCA9IG1hbGxvYyhzaXplb2YoKmNsbnQpKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgc29jazsKKworCWlmIChjbG50ID09IE5VTEwpIHsKKwkJcGVycm9yKCJtYWxsb2MiKTsKKwkJZ290byBiYWlsOworCX0KKworCW1lbXNldChjbG50LCAwLCBzaXplb2YoY2xudCkpOworCisJaWYgKChzb2NrID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkpID09IC0xKSB7CisJCXBlcnJvcigic29ja2V0Iik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoKGZsYWdzICYgQ0xJX1JFU1ZQT1JUKSAmJiBiaW5kcmVzdnBvcnQoc29jaywgMCkgPT0gLTEpIHsKKwkJcGVycm9yKCJiaW5kcmVzdnBvcnQiKTsKKwkJZ290byBiYWlsOworCX0KKworCWNsbnQtPnNvY2sgPSBzb2NrOworCWNsbnQtPmNhbGxfc3R1YiA9IHJwY19jYWxsX3RjcDsKKworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gc2VydmVyOworCisJaWYgKGNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IC0xKSB7CisJCXBlcnJvcigiY29ubmVjdCIpOworCQlnb3RvIGJhaWw7CisJfQorCisJZ290byBkb25lOworICAgICAgYmFpbDoKKwlpZiAoY2xudCkgeworCQlmcmVlKGNsbnQpOworCQljbG50ID0gTlVMTDsKKwl9CisgICAgICBkb25lOgorCXJldHVybiBjbG50OworfQorCitzdHJ1Y3QgY2xpZW50ICp1ZHBfY2xpZW50KHVpbnQzMl90IHNlcnZlciwgdWludDE2X3QgcG9ydCwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGNsaWVudCAqY2xudCA9IG1hbGxvYyhzaXplb2YoKmNsbnQpKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgc29jazsKKworCWlmIChjbG50ID09IE5VTEwpIHsKKwkJcGVycm9yKCJtYWxsb2MiKTsKKwkJZ290byBiYWlsOworCX0KKworCW1lbXNldChjbG50LCAwLCBzaXplb2YoY2xudCkpOworCisJaWYgKChzb2NrID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJzb2NrZXQiKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmICgoZmxhZ3MgJiBDTElfUkVTVlBPUlQpICYmIGJpbmRyZXN2cG9ydChzb2NrLCAwKSA9PSAtMSkgeworCQlwZXJyb3IoImJpbmRyZXN2cG9ydCIpOworCQlnb3RvIGJhaWw7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIG1lOworCisJCW1lLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQltZS5zaW5fcG9ydCA9IDA7CisJCW1lLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKwkJaWYgKDAgJiYgYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJm1lLCBzaXplb2YobWUpKSA9PSAtMSkgeworCQkJcGVycm9yKCJiaW5kIik7CisJCQlnb3RvIGJhaWw7CisJCX0KKwl9CisKKwljbG50LT5zb2NrID0gc29jazsKKwljbG50LT5jYWxsX3N0dWIgPSBycGNfY2FsbF91ZHA7CisKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IHNlcnZlcjsKKworCWlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA9PSAtMSkgeworCQlwZXJyb3IoImNvbm5lY3QiKTsKKwkJZ290byBiYWlsOworCX0KKworCWdvdG8gZG9uZTsKKyAgICAgIGJhaWw6CisJaWYgKGNsbnQpIHsKKwkJZnJlZShjbG50KTsKKwkJY2xudCA9IE5VTEw7CisJfQorICAgICAgZG9uZToKKwlyZXR1cm4gY2xudDsKK30KKwordm9pZCBjbGllbnRfZnJlZShzdHJ1Y3QgY2xpZW50ICpjKQoreworCWlmIChjLT5zb2NrICE9IC0xKQorCQljbG9zZShjLT5zb2NrKTsKKwlmcmVlKGMpOworfQorCitpbnQgcnBjX2NhbGwoc3RydWN0IGNsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnBjICpycGMpCit7CisJcmV0dXJuIGNsaWVudC0+Y2FsbF9zdHViKGNsaWVudCwgcnBjKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9zdW5ycGMuaCBiL3Vzci9raW5pdC9uZnNtb3VudC9zdW5ycGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQ2YzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L3N1bnJwYy5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBvcGVuLWNvZGVkIFN1blJQQyBzdHJ1Y3R1cmVzCisgKi8KKyNpZm5kZWYgTkZTTU9VTlRfU1VOUlBDX0gKKyNkZWZpbmUgTkZTTU9VTlRfU1VOUlBDX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNkZWZpbmUgU1VOUlBDX1BPUlQJMTExCisjZGVmaW5lIE1PVU5UX1BPUlQJNjI3CisKKyNkZWZpbmUgUlBDX0NBTEwJMAorI2RlZmluZSBSUENfUkVQTFkJMQorCisjZGVmaW5lIFBPUlRNQVBfUFJPR1JBTQkxMDAwMDAKKyNkZWZpbmUgTkxNX1BST0dSQU0JMTAwMDIxCisKKyNkZWZpbmUgUlBDX1BNQVBfUFJPR1JBTQkxMDAwMDAKKyNkZWZpbmUgUlBDX1BNQVBfVkVSU0lPTgkyCisjZGVmaW5lIFJQQ19QTUFQX1BPUlQJCTExMQorCisjZGVmaW5lIFBNQVBfUFJPQ19OVUxMCQkwCisjZGVmaW5lIFBNQVBfUFJPQ19TRVQJCTEKKyNkZWZpbmUgUE1BUF9QUk9DX1VOU0VUCQkyCisjZGVmaW5lIFBNQVBfUFJPQ19HRVRQT1JUCTMKKyNkZWZpbmUgUE1BUF9QUk9DX0RVTVAJCTQKKworI2RlZmluZSBMQVNUX0ZSQUcJMHg4MDAwMDAwMAorCisjZGVmaW5lIFJFUExZX09LCTAKKyNkZWZpbmUgUkVQTFlfREVOSUVEICAgIDEKKworI2RlZmluZSBTVUNDRVNTCQkwCisjZGVmaW5lIFBST0dfVU5BVkFJTAkxCisjZGVmaW5lIFBST0dfTUlTTUFUQ0gJMgorI2RlZmluZSBQUk9DX1VOQVZBSUwJMworI2RlZmluZSBHQVJCQUdFX0FSR1MJNAorI2RlZmluZSBTWVNURU1fRVJSCTUKKworc3RydWN0IHJwY191ZHBfaGVhZGVyIHsKKwl1aW50MzJfdCB4aWQ7CisJdWludDMyX3QgbXNnX3R5cGU7Cit9OworCitzdHJ1Y3QgcnBjX2hlYWRlciB7CisJdWludDMyX3QgZnJhZ19oZHI7CisJc3RydWN0IHJwY191ZHBfaGVhZGVyIHVkcDsKK307CisKK3N0cnVjdCBycGNfY2FsbCB7CisJc3RydWN0IHJwY19oZWFkZXIgaGRyOworCXVpbnQzMl90IHJwY192ZXJzOworCisJdWludDMyX3QgcHJvZ3JhbTsKKwl1aW50MzJfdCBwcm9nX3ZlcnM7CisJdWludDMyX3QgcHJvYzsKKwl1aW50MzJfdCBjcmVkX2ZsYXZvcjsKKworCXVpbnQzMl90IGNyZWRfbGVuOworCXVpbnQzMl90IHZyZl9mbGF2b3I7CisJdWludDMyX3QgdnJmX2xlbjsKK307CisKK3N0cnVjdCBycGNfcmVwbHkgeworCXN0cnVjdCBycGNfaGVhZGVyIGhkcjsKKwl1aW50MzJfdCByZXBseV9zdGF0ZTsKKwl1aW50MzJfdCB2cmZfZmxhdm9yOworCXVpbnQzMl90IHZyZl9sZW47CisJdWludDMyX3Qgc3RhdGU7Cit9OworCitzdHJ1Y3QgcnBjIHsKKwlzdHJ1Y3QgcnBjX2NhbGwgKmNhbGw7CisJc2l6ZV90IGNhbGxfbGVuOworCXN0cnVjdCBycGNfcmVwbHkgKnJlcGx5OworCXNpemVfdCByZXBseV9sZW47Cit9OworCitzdHJ1Y3QgY2xpZW50OworCit0eXBlZGVmIGludCAoKmNhbGxfc3R1YikgKHN0cnVjdCBjbGllbnQgKiwgc3RydWN0IHJwYyAqKTsKKworc3RydWN0IGNsaWVudCB7CisJaW50IHNvY2s7CisJY2FsbF9zdHViIGNhbGxfc3R1YjsKK307CisKKyNkZWZpbmUgQ0xJX1JFU1ZQT1JUCTAwMDAwMDAxCisKK3N0cnVjdCBjbGllbnQgKnRjcF9jbGllbnQodWludDMyX3Qgc2VydmVyLCB1aW50MTZfdCBwb3J0LCB1aW50MzJfdCBmbGFncyk7CitzdHJ1Y3QgY2xpZW50ICp1ZHBfY2xpZW50KHVpbnQzMl90IHNlcnZlciwgdWludDE2X3QgcG9ydCwgdWludDMyX3QgZmxhZ3MpOwordm9pZCBjbGllbnRfZnJlZShzdHJ1Y3QgY2xpZW50ICpjbGllbnQpOworCitpbnQgcnBjX2NhbGwoc3RydWN0IGNsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnBjICpycGMpOworCit1aW50MzJfdCBwb3J0bWFwKHVpbnQzMl90IHNlcnZlciwgdWludDMyX3QgcHJvZ3JhbSwgdWludDMyX3QgdmVyc2lvbiwgdWludDMyX3QgcHJvdG8pOworCisjZW5kaWYgLyogTkZTTU9VTlRfU1VOUlBDX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNyb290LmMgYi91c3Iva2luaXQvbmZzcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzBmZDUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzcm9vdC5jCkBAIC0wLDAgKzEsMTEzIEBACisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiaXBjb25maWcuaCIKKyNpbmNsdWRlICJraW5pdC5oIgorI2luY2x1ZGUgIm5ldGRldi5oIgorI2luY2x1ZGUgIm5mc21vdW50LmgiCisKK3N0YXRpYyBjaGFyICpzdWJfY2xpZW50KF9fdTMyIGNsaWVudCwgY2hhciAqcGF0aCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyID0geyBjbGllbnQgfTsKKwljaGFyIGJ1ZltsZW5dOworCisJaWYgKHN0cnN0cihwYXRoLCAiJXMiKSAhPSBOVUxMKSB7CisJCWlmIChjbGllbnQgPT0gSU5BRERSX05PTkUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiUm9vdC1ORlM6IG5vIGNsaWVudCBhZGRyZXNzXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlzbnByaW50ZihidWYsIGxlbiwgcGF0aCwgaW5ldF9udG9hKGFkZHIpKTsKKwkJc3RyY3B5KHBhdGgsIGJ1Zik7CisJfQorCisJcmV0dXJuIHBhdGg7Cit9CisKKyNkZWZpbmUgTkZTX0FSR0MgNgorI2RlZmluZSBNT1VOVF9QT0lOVCAiL3Jvb3QiCisKK2ludCBtb3VudF9uZnNfcm9vdChpbnQgYXJnYywgY2hhciAqYXJndltdLCBpbnQgZmxhZ3MpCit7CisJKHZvaWQpZmxhZ3M7CQkvKiBGSVhNRSAtIGRvbid0IGlnbm9yZSB0aGlzICovCisKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyID0geyBJTkFERFJfTk9ORSB9OworCV9fdTMyIGNsaWVudCA9IElOQUREUl9OT05FOworCWNvbnN0IGludCBsZW4gPSAxMDI0OworCXN0cnVjdCBuZXRkZXYgKmRldjsKKwljaGFyICptdHB0ID0gTU9VTlRfUE9JTlQ7CisJY2hhciAqcGF0aCA9IE5VTEw7CisJY2hhciAqZGV2X2Jvb3RwYXRoID0gTlVMTDsKKwljaGFyIHJvb3RbbGVuXTsKKwljaGFyICp4LCAqb3B0czsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYSA9IDE7CisJY2hhciAqbmZzX2FyZ3ZbTkZTX0FSR0MgKyAxXSA9IHsgIk5GUy1Nb3VudCIgfTsKKworCWZvciAoZGV2ID0gaWZhY2VzOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgeworCQlpZiAoZGV2LT5pcF9zZXJ2ZXIgIT0gSU5BRERSX05PTkUgJiYKKwkJICAgIGRldi0+aXBfc2VydmVyICE9IElOQUREUl9BTlkpIHsKKwkJCWFkZHIuc19hZGRyID0gZGV2LT5pcF9zZXJ2ZXI7CisJCQljbGllbnQgPSBkZXYtPmlwX2FkZHI7CisJCQlkZXZfYm9vdHBhdGggPSBkZXYtPmJvb3RwYXRoOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRldi0+aXBfYWRkciAhPSBJTkFERFJfTk9ORSAmJiBkZXYtPmlwX2FkZHIgIT0gSU5BRERSX0FOWSkgeworCQkJY2xpZW50ID0gZGV2LT5pcF9hZGRyOworCQl9CisJfQorCisJLyoKKwkgKiBpZiB0aGUgIm5mc3Jvb3QiIG9wdGlvbiBpcyBzZXQgdGhlbiBpdCBvdmVycmlkZXMKKwkgKiBib290cGF0aCBzdXBwbGllZCBieSB0aGUgYm9vdCBzZXJ2ZXIuCisJICovCisJaWYgKChwYXRoID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAibmZzcm9vdD0iKSkgPT0gTlVMTCkgeworCQlpZiAoKHBhdGggPSBkZXZfYm9vdHBhdGgpID09IE5VTEwgfHwgcGF0aFswXSA9PSAnXDAnKQorCQkJLyogbm8gcGF0aCAtIHNldCBhIGRlZmF1bHQgKi8KKwkJCXBhdGggPSAoY2hhciAqKSIvdGZ0cGJvb3QvJXMiOworCX0gZWxzZSBpZiAoZGV2X2Jvb3RwYXRoICYmIGRldl9ib290cGF0aFswXSAhPSAnXDAnKQorCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJuZnNyb290PSVzIG92ZXJyaWRlcyBib290IHNlcnZlciBib290cGF0aCAlc1xuIiwKKwkJCXBhdGgsIGRldl9ib290cGF0aCk7CisKKwlpZiAoKG9wdHMgPSBzdHJjaHIocGF0aCwgJywnKSkgIT0gTlVMTCkgeworCQkqb3B0cysrID0gJ1wwJzsKKwkJbmZzX2FyZ3ZbYSsrXSA9IChjaGFyICopIi1vIjsKKwkJbmZzX2FyZ3ZbYSsrXSA9IG9wdHM7CisJfQorCisJaWYgKCh4ID0gc3RyY2hyKHBhdGgsICc6JykpID09IE5VTEwpIHsKKwkJaWYgKGFkZHIuc19hZGRyID09IElOQUREUl9OT05FKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlJvb3QtTkZTOiBubyBzZXJ2ZXIgZGVmaW5lZFxuIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJc25wcmludGYocm9vdCwgbGVuLCAiJXM6JXMiLCBpbmV0X250b2EoYWRkciksIHBhdGgpOworCX0gZWxzZSB7CisJCXN0cmNweShyb290LCBwYXRoKTsKKwl9CisKKwluZnNfYXJndlthKytdID0gc3ViX2NsaWVudChjbGllbnQsIHJvb3QsIGxlbik7CisKKwlERUJVRygoIk5GUy1Sb290OiBtb3VudGluZyAlcyBvbiAlcyB3aXRoIG9wdGlvbnMgXCIlc1wiXG4iLAorCSAgICAgICBuZnNfYXJndlthLTFdLCBtdHB0LCBvcHRzID8gb3B0cyA6ICIiKSk7CisKKwluZnNfYXJndlthKytdID0gbXRwdDsKKwluZnNfYXJndlthXSA9IE5VTEw7CisJYXNzZXJ0KGEgPD0gTkZTX0FSR0MpOworCisJZHVtcF9hcmdzKGEsIG5mc19hcmd2KTsKKworCWlmICgocmV0ID0gbmZzbW91bnRfbWFpbihhLCBuZnNfYXJndikpICE9IDApIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKyAgICAgIGRvbmU6CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9yYW1kaXNrX2xvYWQuYyBiL3Vzci9raW5pdC9yYW1kaXNrX2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJlMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3JhbWRpc2tfbG9hZC5jCkBAIC0wLDAgKzEsMjcxIEBACisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkLmg+CisKKyNpbmNsdWRlICJraW5pdC5oIgorI2luY2x1ZGUgImRvX21vdW50cy5oIgorI2luY2x1ZGUgImZzdHlwZS5oIgorI2luY2x1ZGUgInpsaWIuaCIKKworI2RlZmluZSBCVUZfU1oJCTY1NTM2CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2tleSh2b2lkKQoreworCS8qIFdhaXQgdW50aWwgdGhlIHVzZXIgcHJlc3NlcyBFbnRlciAqLworCXdoaWxlIChnZXRjaGFyKCkgIT0gJ1xuJykKKwkJOworfQorCitzdGF0aWMgaW50IGNoYW5nZV9kaXNrKGNvbnN0IGNoYXIgKmRldnBhdGgsIGludCByZmQsIGludCBkaXNrKQoreworCS8qIFRyeSB0byBlamVjdCBhbmQvb3IgcXVpZXNjZSB0aGUgZGV2aWNlICovCisJc3luYygpOworCWlmIChpb2N0bChyZmQsIEZERUpFQ1QsIDApKSB7CisJCWlmIChlcnJubyA9PSBFTk9UVFkpIHsKKwkJCS8qIE5vdCBhIGZsb3BweSAqLworCQkJaW9jdGwocmZkLCBDRFJPTUVKRUNULCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vbi1lamVjdGFibGUgZmxvcHB5ICovCisJCQlpb2N0bChyZmQsIEZEUkVTRVQsIEZEX1JFU0VUX0lGX05FRURFRCk7CisJCX0KKwl9CisJY2xvc2UocmZkKTsKKworCWZwcmludGYoc3RkZXJyLAorCQkiXG5QbGVhc2UgaW5zZXJ0IGRpc2sgJWQgZm9yIHJhbWRpc2sgYW5kIHByZXNzIEVudGVyLi4uIiwgZGlzayk7CisJd2FpdF9mb3Jfa2V5KCk7CisKKwlyZXR1cm4gb3BlbihkZXZwYXRoLCBPX1JET05MWSk7Cit9CisKKy8qIEFsc28gdXNlZCBpbiBpbml0cmQuYyAqLworaW50IGxvYWRfcmFtZGlza19jb21wcmVzc2VkKGNvbnN0IGNoYXIgKmRldnBhdGgsIEZJTEUgKiB3ZmQsCisJCQkgICAgb2ZmX3QgcmFtZGlza19zdGFydCkKK3sKKwlpbnQgcmZkID0gLTE7CisJdW5zaWduZWQgbG9uZyBsb25nIHJhbWRpc2tfc2l6ZSwgcmFtZGlza19sZWZ0OworCWludCBkaXNrID0gMTsKKwlzc2l6ZV90IGJ5dGVzOworCWludCBydjsKKwl1bnNpZ25lZCBjaGFyIGluX2J1ZltCVUZfU1pdLCBvdXRfYnVmW0JVRl9TWl07CisJel9zdHJlYW0genM7CisKKwl6cy56YWxsb2MgPSBaX05VTEw7CS8qIFVzZSBtYWxsb2MoKSAqLworCXpzLnpmcmVlID0gWl9OVUxMOwkvKiBVc2UgZnJlZSgpICovCisJenMubmV4dF9pbiA9IFpfTlVMTDsJLyogTm8gZGF0YSByZWFkIHlldCAqLworCXpzLmF2YWlsX2luID0gMDsKKwl6cy5uZXh0X291dCA9IG91dF9idWY7CisJenMuYXZhaWxfb3V0ID0gQlVGX1NaOworCisJaWYgKGluZmxhdGVJbml0MigmenMsIDMyICsgMTUpICE9IFpfT0spCisJCWdvdG8gZXJyMTsKKworCXJmZCA9IG9wZW4oZGV2cGF0aCwgT19SRE9OTFkpOworCWlmIChyZmQgPCAwKQorCQlnb3RvIGVycjI7CisKKwkvKiBTZXQgdG8gdGhlIHNpemUgb2YgdGhlIG1lZGl1bSwgb3IgImluZmluaXRlIiAqLworCWlmIChpb2N0bChyZmQsIEJMS0dFVFNJWkU2NCwgJnJhbWRpc2tfc2l6ZSkpCisJCXJhbWRpc2tfc2l6ZSA9IH4wVUxMOworCisJZG8geworCQkvKiBQdXJnZSB0aGUgb3V0cHV0IHByZWZlcmVudGlhbGx5IG92ZXIgcmVhZGluZyBuZXcKKwkJICAgaW5wdXQsIHNvIHdlIGRvbid0IGVuZCB1cCBvdmVycnVubmluZyB0aGUgaW5wdXQgYnkKKwkJICAgYWNjaWRlbnQgYW5kIGRlbWFuZGluZyBhIG5ldyBkaXNrIHdoaWNoIGRvZXNuJ3QKKwkJICAgZXhpc3QuLi4gKi8KKwkJaWYgKHpzLmF2YWlsX291dCA9PSAwKSB7CisJCQlfZndyaXRlKG91dF9idWYsIEJVRl9TWiwgd2ZkKTsKKwkJCXpzLm5leHRfb3V0ID0gb3V0X2J1ZjsKKwkJCXpzLmF2YWlsX291dCA9IEJVRl9TWjsKKwkJfSBlbHNlIGlmICh6cy5hdmFpbF9pbiA9PSAwKSB7CisJCQlpZiAocmFtZGlza19zdGFydCA+PSByYW1kaXNrX3NpemUpIHsKKwkJCQlyZmQgPSBjaGFuZ2VfZGlzayhkZXZwYXRoLCByZmQsICsrZGlzayk7CisJCQkJaWYgKHJmZCA8IDApCisJCQkJCWdvdG8gZXJyMjsKKworCQkJCWlmIChpb2N0bChyZmQsIEJMS0dFVFNJWkU2NCwgJnJhbWRpc2tfc2l6ZSkpCisJCQkJCXJhbWRpc2tfc2l6ZSA9IH4wVUxMOworCQkJCXJhbWRpc2tfc3RhcnQgPSAwOworCQkJCURFQlVHKCgiTmV3IHNpemUgPSAlbGx1XG4iLCByYW1kaXNrX3NpemUpKTsKKwkJCX0KKwkJCWRvIHsKKwkJCQlyYW1kaXNrX2xlZnQgPSByYW1kaXNrX3NpemUgLSByYW1kaXNrX3N0YXJ0OworCQkJCWJ5dGVzID0gbWluKHJhbWRpc2tfbGVmdCwKKwkJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpQlVGX1NaKTsKKwkJCQlieXRlcyA9IHByZWFkKHJmZCwgaW5fYnVmLCBieXRlcywKKwkJCQkJICAgICAgcmFtZGlza19zdGFydCk7CisJCQl9IHdoaWxlIChieXRlcyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisJCQlpZiAoYnl0ZXMgPD0gMCkKKwkJCQlnb3RvIGVycjI7CisJCQlyYW1kaXNrX3N0YXJ0ICs9IGJ5dGVzOworCQkJenMubmV4dF9pbiA9IGluX2J1ZjsKKwkJCXpzLmF2YWlsX2luID0gYnl0ZXM7CisKKwkJCS8qIFByaW50IGRvdHMgaWYgd2UncmUgcmVhZGluZyBmcm9tIGEgcmVhbCBibG9jayBkZXZpY2UgKi8KKwkJCWlmIChyYW1kaXNrX3NpemUgIT0gfjBVTEwpCisJCQkJcHV0YygnLicsIHN0ZGVycik7CisJCX0KKwkJcnYgPSBpbmZsYXRlKCZ6cywgWl9TWU5DX0ZMVVNIKTsKKwl9IHdoaWxlIChydiA9PSBaX09LIHx8IHJ2ID09IFpfQlVGX0VSUk9SKTsKKworCURFQlVHKCgia2luaXQ6IGluZmxhdGUgcmV0dXJuZWQgJWRcbiIsIHJ2KSk7CisKKwlpZiAocnYgIT0gWl9TVFJFQU1fRU5EKQorCQlnb3RvIGVycjI7CisKKwkvKiBXcml0ZSB0aGUgbGFzdCAqLworCV9md3JpdGUob3V0X2J1ZiwgQlVGX1NaIC0genMuYXZhaWxfb3V0LCB3ZmQpOworCURFQlVHKCgia2luaXQ6IHdyaXRpbmcgJWQgYnl0ZXNcbiIsIEJVRl9TWiAtIHpzLmF2YWlsX291dCkpOworCisJaW5mbGF0ZUVuZCgmenMpOworCXJldHVybiAwOworCitlcnIyOgorCWluZmxhdGVFbmQoJnpzKTsKK2VycjE6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Citsb2FkX3JhbWRpc2tfcmF3KGNvbnN0IGNoYXIgKmRldnBhdGgsIEZJTEUgKiB3ZmQsIG9mZl90IHJhbWRpc2tfc3RhcnQsCisJCSB1bnNpZ25lZCBsb25nIGxvbmcgZnNzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByYW1kaXNrX3NpemUsIHJhbWRpc2tfbGVmdDsKKwlpbnQgZGlzayA9IDE7CisJc3NpemVfdCBieXRlczsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltCVUZfU1pdOworCWludCByZmQ7CisKKwlyZmQgPSBvcGVuKGRldnBhdGgsIE9fUkRPTkxZKTsKKwlpZiAocmZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyogU2V0IHRvIHRoZSBzaXplIG9mIHRoZSBtZWRpdW0sIG9yICJpbmZpbml0ZSIgKi8KKwlpZiAoaW9jdGwocmZkLCBCTEtHRVRTSVpFNjQsICZyYW1kaXNrX3NpemUpKQorCQlyYW1kaXNrX3NpemUgPSB+MFVMTDsKKworCURFQlVHKCgic3RhcnQ6ICVsbHUgIHNpemU6ICVsbHUgIGZzc2l6ZTogJWxsdVxuIiwKKwkgICAgICAgcmFtZGlza19zdGFydCwgcmFtZGlza19zaXplLCBmc3NpemUpKTsKKworCXdoaWxlIChmc3NpemUpIHsKKworCQlpZiAocmFtZGlza19zdGFydCA+PSByYW1kaXNrX3NpemUpIHsKKwkJCXJmZCA9IGNoYW5nZV9kaXNrKGRldnBhdGgsIHJmZCwgKytkaXNrKTsKKwkJCWlmIChyZmQgPCAwKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKGlvY3RsKHJmZCwgQkxLR0VUU0laRTY0LCAmcmFtZGlza19zaXplKSkKKwkJCQlyYW1kaXNrX3NpemUgPSB+MFVMTDsKKwkJCXJhbWRpc2tfc3RhcnQgPSAwOworCQl9CisKKwkJZG8geworCQkJcmFtZGlza19sZWZ0ID0KKwkJCSAgICBtaW4ocmFtZGlza19zaXplIC0gcmFtZGlza19zdGFydCwgZnNzaXplKTsKKwkJCWJ5dGVzID0gbWluKHJhbWRpc2tfbGVmdCwgKHVuc2lnbmVkIGxvbmcgbG9uZylCVUZfU1opOworCQkJYnl0ZXMgPSBwcmVhZChyZmQsIGJ1ZiwgYnl0ZXMsIHJhbWRpc2tfc3RhcnQpOworCQl9IHdoaWxlIChieXRlcyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisJCWlmIChieXRlcyA8PSAwKQorCQkJYnJlYWs7CisJCV9md3JpdGUoYnVmLCBieXRlcywgd2ZkKTsKKworCQlyYW1kaXNrX3N0YXJ0ICs9IGJ5dGVzOworCQlmc3NpemUgLT0gYnl0ZXM7CisKKwkJLyogUHJpbnQgZG90cyBpZiB3ZSdyZSByZWFkaW5nIGZyb20gYSByZWFsIGJsb2NrIGRldmljZSAqLworCQlpZiAocmFtZGlza19zaXplICE9IH4wVUxMKQorCQkJcHV0YygnLicsIHN0ZGVycik7CisJfQorCisJcmV0dXJuICEhZnNzaXplOworfQorCitpbnQgcmFtZGlza19sb2FkKGludCBhcmdjLCBjaGFyICphcmd2W10sIGRldl90IHJvb3RfZGV2KQoreworCWNvbnN0IGNoYXIgKmFyZ19wcm9tcHRfcmFtZGlzayA9IGdldF9hcmcoYXJnYywgYXJndiwgInByb21wdF9yYW1kaXNrPSIpOworCWNvbnN0IGNoYXIgKmFyZ19yYW1kaXNrX2Jsb2Nrc2l6ZSA9CisJICAgIGdldF9hcmcoYXJnYywgYXJndiwgInJhbWRpc2tfYmxvY2tzaXplPSIpOworCWNvbnN0IGNoYXIgKmFyZ19yYW1kaXNrX3N0YXJ0ID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAicmFtZGlza19zdGFydD0iKTsKKwljb25zdCBjaGFyICphcmdfcmFtZGlza19kZXZpY2UgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyYW1kaXNrX2RldmljZT0iKTsKKworCWludCBwcm9tcHRfcmFtZGlzayA9IGFyZ19wcm9tcHRfcmFtZGlzayA/IGF0b2koYXJnX3Byb21wdF9yYW1kaXNrKSA6IDA7CisJaW50IHJhbWRpc2tfYmxvY2tzaXplID0KKwkgICAgYXJnX3JhbWRpc2tfYmxvY2tzaXplID8gYXRvaShhcmdfcmFtZGlza19ibG9ja3NpemUpIDogNTEyOworCW9mZl90IHJhbWRpc2tfc3RhcnQgPQorCSAgICBhcmdfcmFtZGlza19zdGFydAorCSAgICA/IHN0cnRvdW1heChhcmdfcmFtZGlza19zdGFydCwgTlVMTCwgMTApICogcmFtZGlza19ibG9ja3NpemUgOiAwOworCWNvbnN0IGNoYXIgKnJhbWRpc2tfZGV2aWNlID0KKwkgICAgYXJnX3JhbWRpc2tfZGV2aWNlID8gYXJnX3JhbWRpc2tfZGV2aWNlIDogIi9kZXYvZmQwIjsKKworCWRldl90IHJhbWRpc2tfZGV2OworCWludCByZmQ7CisJRklMRSAqd2ZkOworCWNvbnN0IGNoYXIgKmZzdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZnNzaXplOworCWludCBpc19nemlwID0gMDsKKwlpbnQgZXJyOworCisJaWYgKHByb21wdF9yYW1kaXNrKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlBsZWFzZSBpbnNlcnQgZGlzayBmb3IgcmFtZGlzayBhbmQgcHJlc3MgRW50ZXIuLi4iKTsKKwkJd2FpdF9mb3Jfa2V5KCk7CisJfQorCisJcmFtZGlza19kZXYgPSBuYW1lX3RvX2Rldl90KHJhbWRpc2tfZGV2aWNlKTsKKwlpZiAoIXJhbWRpc2tfZGV2KSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkZhaWx1cmUgbG9hZGluZyByYW1kaXNrOiB1bmtub3duIGRldmljZTogJXNcbiIsCisJCQlyYW1kaXNrX2RldmljZSk7CisJCXJldHVybiAwOworCX0KKworCWNyZWF0ZV9kZXYoIi9kZXYvcmRkZXYiLCByYW1kaXNrX2Rldik7CisJY3JlYXRlX2RldigiL2Rldi9yYW0wIiwgUm9vdF9SQU0wKTsKKwlyZmQgPSBvcGVuKCIvZGV2L3JkZGV2IiwgT19SRE9OTFkpOworCXdmZCA9IGZvcGVuKCIvZGV2L3JhbTAiLCAidyIpOworCisJaWYgKHJmZCA8IDAgfHwgIXdmZCkgeworCQlwZXJyb3IoIkNvdWxkIG5vdCBvcGVuIHJhbWRpc2sgZGV2aWNlIik7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGZpbGVzeXN0ZW0gdHlwZSAqLworCWlmIChpZGVudGlmeV9mcyhyZmQsICZmc3R5cGUsICZmc3NpemUsIHJhbWRpc2tfc3RhcnQpIHx8CisJICAgIChmc3NpemUgPT0gMCAmJiAhKGlzX2d6aXAgPSAhc3RyY21wKGZzdHlwZSwgImd6aXAiKSkpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkZhaWx1cmUgbG9hZGluZyByYW1kaXNrOiB1bmtub3duIGZpbGVzeXN0ZW0gdHlwZVxuIik7CisJCXJldHVybiAwOworCX0KKworCURFQlVHKCgia2luaXQ6IHJhbWRpc2sgaXMgJXMsIHNpemUgJWxsdVxuIiwgZnN0eXBlLCBmc3NpemUpKTsKKworCWZwcmludGYoc3RkZXJyLCAiTG9hZGluZyByYW1kaXNrICglcykgLi4uIiwgaXNfZ3ppcCA/ICJnemlwIiA6ICJyYXciKTsKKworCWNsb3NlKHJmZCk7CisKKwlpZiAoaXNfZ3ppcCkKKwkJZXJyID0gbG9hZF9yYW1kaXNrX2NvbXByZXNzZWQoIi9kZXYvcmRkZXYiLCB3ZmQsIHJhbWRpc2tfc3RhcnQpOworCWVsc2UKKwkJZXJyID0gbG9hZF9yYW1kaXNrX3JhdygiL2Rldi9yZGRldiIsIHdmZCwKKwkJCQkgICAgICAgcmFtZGlza19zdGFydCwgZnNzaXplKTsKKworCWZjbG9zZSh3ZmQpOworCisJcHV0YygnXG4nLCBzdGRlcnIpOworCisJaWYgKGVycikgeworCQlwZXJyb3IoIkZhaWx1cmUgbG9hZGluZyByYW1kaXNrIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L3JlYWRmaWxlLmMgYi91c3Iva2luaXQvcmVhZGZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY4NTRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3JlYWRmaWxlLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIFJlYWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiBhIGZpbGUgaW50byBtYWxsb2MnZCBzdG9yYWdlLiAgVGhpcworICogaXMgbW9zdGx5IHVzZWZ1bCBmb3IgdGhpbmdzIGxpa2UgL3Byb2MgZmlsZXMgd2hlcmUgd2UgY2FuJ3QganVzdAorICogZnN0YXQoKSB0byBnZXQgdGhlIGxlbmd0aCBhbmQgdGhlbiBtbWFwKCkuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGVycm9yLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworc3NpemVfdCBmcmVhZGZpbGUoRklMRSAqZiwgY2hhciAqKnBwKQoreworCXNpemVfdCBiczsJCS8qIERlY2VudCBzdGFydGluZyBwb2ludC4uLiAqLworCXNpemVfdCBiZjsJCS8qIEJ5dGVzIGZyZWUgKi8KKwlzaXplX3QgYnUgPSAwOwkJLyogQnl0ZXMgdXNlZCAqLworCWNoYXIgKmJ1ZmZlciwgKm5iOworCXNpemVfdCBydjsKKwlpbnQgb2xkX2Vycm5vID0gZXJybm87CisKKwlicyA9IEJVRlNJWjsJCS8qIEEgZ3Vlc3MgYXMgZ29vZCBhcyBhbnkgKi8KKwliZiA9IGJzOworCWJ1ZmZlciA9IG1hbGxvYyhicyk7CisKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC0xOworCisJZm9yICg7OykgeworCQllcnJubyA9IDA7CisKKwkJd2hpbGUgKGJmICYmIChydiA9IF9mcmVhZChidWZmZXIgKyBidSwgYmYsIGYpKSkgeworCQkJYnUgKz0gcnY7CisJCQliZiAtPSBydjsKKwkJfQorCisJCWlmIChlcnJubyAmJiBlcnJubyAhPSBFSU5UUiAmJiBlcnJubyAhPSBFQUdBSU4pIHsKKwkJCS8qIGVycm9yICovCisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoYmYpIHsKKwkJCS8qIEhpdCBFT0YsIG5vIGVycm9yICovCisKKwkJCS8qIFRyeSB0byBmcmVlIHN1cGVyZmx1b3VzIG1lbW9yeSAqLworCQkJaWYgKChuYiA9IHJlYWxsb2MoYnVmZmVyLCBidSArIDEpKSkKKwkJCQlidWZmZXIgPSBuYjsKKworCQkJLyogTnVsbC10ZXJtaW5hdGUgcmVzdWx0IGZvciBnb29kIG1lYXN1cmUgKi8KKwkJCWJ1ZmZlcltidV0gPSAnXDAnOworCisJCQkqcHAgPSBidWZmZXI7CisJCQllcnJubyA9IG9sZF9lcnJubzsKKwkJCXJldHVybiBidTsKKwkJfQorCisJCS8qIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICovCisJCWJmICs9IGJzOworCQlicyArPSBiczsKKwkJaWYgKCEobmIgPSByZWFsbG9jKGJ1ZmZlciwgYnMpKSkgeworCQkJLyogb3V0IG9mIG1lbW9yeSBlcnJvciAqLworCQkJZnJlZShidWZmZXIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJ1ZmZlciA9IG5iOworCX0KK30KKworc3NpemVfdCByZWFkZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKnBwKQoreworCUZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKwlzc2l6ZV90IHJ2OworCisJaWYgKCFmKQorCQlyZXR1cm4gLTE7CisKKwlydiA9IGZyZWFkZmlsZShmLCBwcCk7CisKKwlmY2xvc2UoZik7CisKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvcmVzdW1lL0tidWlsZCBiL3Vzci9raW5pdC9yZXN1bWUvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDE5NWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcmVzdW1lL0tidWlsZApAQCAtMCwwICsxLDMwIEBACisjCisjIEtidWlsZCBmaWxlIGZvciByZXN1bWUKKyMKKworc3RhdGljLXkgOj0gc3RhdGljL3Jlc3VtZQorc2hhcmVkLXkgOj0gc2hhcmVkL3Jlc3VtZQorCisjIGNvbW1vbiAubyBmaWxlcworb2JqcyA6PSByZXN1bWUubyByZXN1bWVsaWIubworCisjIFRPRE8gLSBkbyB3ZSB3YW50IGEgc3RyaXBwZWQgdmVyc2lvbgorIyBUT0RPIC0gZG8gd2Ugd2FudCB0aGUgc3RhdGljLmcgKyBzaGFyZWQuZyBkaXJlY3Rvcmllcz8KKworIyBDcmVhdGUgbGliLmEgd2l0aCBhbGwgb2JqZWN0IGZpbGVzICh1c2VkIGJ5IGtpbml0KQorbGliLXkgOj0gJChvYmpzKQorCisjIEFkZGl0aW9uYWwgaW5jbHVkZSBwYXRocyBmaWxlcworS0xJQkNDRkxBR1MgKz0gLUkkKHNyY3RyZWUpLyQoc3JjKS8uLgorCisjIC5vIGZpbGVzIHVzZWQgdG8gYnVpbHQgZXhlY3V0YWJsZXMKK3N0YXRpYy9yZXN1bWUteSAgIDo9ICQob2JqcykKK3N0YXRpYy9yZXN1bWUtbGliIDo9IC4uL2xpYi5hCitzaGFyZWQvcmVzdW1lLXkgICA6PSAkKG9ianMpCitzaGFyZWQvcmVzdW1lLWxpYiA6PSAuLi9saWIuYQorCisjIENsZWFuaW5nCitjbGVhbi1kaXJzIDo9IHN0YXRpYyBzaGFyZWQKKworIyBpbnN0YWxsIGJpbmFyeQoraW5zdGFsbC15IDo9ICQoc2hhcmVkLXkpCmRpZmYgLS1naXQgYS91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZS5jIGIvdXNyL2tpbml0L3Jlc3VtZS9yZXN1bWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDA5OWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3Jlc3VtZS9yZXN1bWUuYwpAQCAtMCwwICsxLDI1IEBACisvKgorICogSGFuZGxlIHJlc3VtZSBmcm9tIHN1c3BlbmQtdG8tZGlzaworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAicmVzdW1lLmgiCisKK2NoYXIgKnByb2duYW1lOworCitzdGF0aWMgX19ub3JldHVybiB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIC9kZXYvPHJlc3VtZWRldmljZT4gW29mZnNldF1cbiIsIHByb2duYW1lKTsKKwlleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdLCBjaGFyICplbnZwW10pCit7CisJcHJvZ25hbWUgPSBhcmd2WzBdOworCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykKKwkJdXNhZ2UoKTsKKworCXJldHVybiByZXN1bWUoYXJndlsxXSwgKGFyZ2MgPiAyKSA/IHN0cnRvdWxsKGFyZ3ZbMl0sIE5VTEwsIDApIDogMFVMTCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZS5oIGIvdXNyL2tpbml0L3Jlc3VtZS9yZXN1bWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI5MjlmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3Jlc3VtZS9yZXN1bWUuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgUkVTVU1FX0gKKyNkZWZpbmUgUkVTVU1FX0gKKworaW50IGRvX3Jlc3VtZShpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK2ludCByZXN1bWUoY29uc3QgY2hhciAqcmVzdW1lX2ZpbGUsIHVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bWVfb2Zmc2V0KTsKKworI2VuZGlmIC8qIFJFU1VNRV9IICovCmRpZmYgLS1naXQgYS91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZWxpYi5jIGIvdXNyL2tpbml0L3Jlc3VtZS9yZXN1bWVsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmVmOTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3Jlc3VtZS9yZXN1bWVsaWIuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogSGFuZGxlIHJlc3VtZSBmcm9tIHN1c3BlbmQtdG8tZGlzaworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKworI2luY2x1ZGUgImtpbml0LmgiCisjaW5jbHVkZSAiZG9fbW91bnRzLmgiCisjaW5jbHVkZSAicmVzdW1lLmgiCisKKyNpZm5kZWYgQ09ORklHX1BNX1NURF9QQVJUSVRJT04KKyMgZGVmaW5lIENPTkZJR19QTV9TVERfUEFSVElUSU9OICIiCisjZW5kaWYKKworaW50IGRvX3Jlc3VtZShpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNvbnN0IGNoYXIgKnJlc3VtZV9maWxlID0gQ09ORklHX1BNX1NURF9QQVJUSVRJT047CisJY29uc3QgY2hhciAqcmVzdW1lX2FyZzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdW1lX29mZnNldDsKKworCXJlc3VtZV9hcmcgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyZXN1bWU9Iik7CisJcmVzdW1lX2ZpbGUgPSByZXN1bWVfYXJnID8gcmVzdW1lX2FyZyA6IHJlc3VtZV9maWxlOworCS8qIE5vIHJlc3VtZSBkZXZpY2Ugc3BlY2lmaWVkICovCisJaWYgKCFyZXN1bWVfZmlsZVswXSkKKwkJcmV0dXJuIDA7CisKKwlyZXN1bWVfYXJnID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAicmVzdW1lX29mZnNldD0iKTsKKwlyZXN1bWVfb2Zmc2V0ID0gcmVzdW1lX2FyZyA/IHN0cnRvdWxsKHJlc3VtZV9hcmcsIE5VTEwsIDApIDogMFVMTDsKKworCS8qIEZpeDogd2UgZWl0aGVyIHNob3VsZCBjb25zaWRlciByZXZlcnRpbmcgdGhlIGRldmljZSBiYWNrIHRvCisJICAgb3JkaW5hcnkgc3dhcCwgb3IgKGJldHRlcikgcHV0IHRoYXQgY29kZSBpbnRvIHN3YXBvbiAqLworCS8qIE5vcmVzdW1lIHJlcXVlc3RlZCAqLworCWlmIChnZXRfZmxhZyhhcmdjLCBhcmd2LCAibm9yZXN1bWUiKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHJlc3VtZShyZXN1bWVfZmlsZSwgcmVzdW1lX29mZnNldCk7Cit9CisKK2ludCByZXN1bWUoY29uc3QgY2hhciAqcmVzdW1lX2ZpbGUsIHVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bWVfb2Zmc2V0KQoreworCWRldl90IHJlc3VtZV9kZXZpY2U7CisJaW50IHBvd2VyZmQgPSAtMTsKKwljaGFyIGRldmljZV9zdHJpbmdbNjRdOworCWludCBsZW47CisKKwlyZXN1bWVfZGV2aWNlID0gbmFtZV90b19kZXZfdChyZXN1bWVfZmlsZSk7CisKKwlpZiAobWFqb3IocmVzdW1lX2RldmljZSkgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcmVzdW1lIGRldmljZTogJXNcbiIsIHJlc3VtZV9maWxlKTsKKwkJZ290byBmYWlsdXJlOworCX0KKworCWlmICgocG93ZXJmZCA9IG9wZW4oIi9zeXMvcG93ZXIvcmVzdW1lIiwgT19XUk9OTFkpKSA8IDApCisJCWdvdG8gZmFpbF9yOworCisJbGVuID0gc25wcmludGYoZGV2aWNlX3N0cmluZywgc2l6ZW9mIGRldmljZV9zdHJpbmcsCisJCSAgICAgICAiJXU6JXU6JWxsdSIsCisJCSAgICAgICBtYWpvcihyZXN1bWVfZGV2aWNlKSwgbWlub3IocmVzdW1lX2RldmljZSksCisJCSAgICAgICByZXN1bWVfb2Zmc2V0KTsKKworCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCWlmIChsZW4gPj0gc2l6ZW9mIGRldmljZV9zdHJpbmcpCisJCWdvdG8gZmFpbF9yOworCisJREVCVUcoKCJraW5pdDogdHJ5aW5nIHRvIHJlc3VtZSBmcm9tICVzXG4iLCByZXN1bWVfZmlsZSkpOworCisJaWYgKHdyaXRlKHBvd2VyZmQsIGRldmljZV9zdHJpbmcsIGxlbikgIT0gbGVuKQorCQlnb3RvIGZhaWxfcjsKKworCS8qIE9rYXksIHdoYXQgYXJlIHdlIHN0aWxsIGRvaW5nIGFsaXZlLi4uICovCitmYWlsdXJlOgorCWlmIChwb3dlcmZkID49IDApCisJCWNsb3NlKHBvd2VyZmQpOworCWZwcmludGYoc3RkZXJyLCAia2luaXQ6IE5vIHJlc3VtZSBpbWFnZSwgZG9pbmcgbm9ybWFsIGJvb3QuLi5cbiIpOworCXJldHVybiAtMTsKKworZmFpbF9yOgorCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHdyaXRlIC9zeXMvcG93ZXIvcmVzdW1lICIKKwkJCSIobm8gc29mdHdhcmUgc3VzcGVuZCBrZXJuZWwgc3VwcG9ydD8pXG4iKTsKKwlnb3RvIGZhaWx1cmU7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvcnVuLWluaXQvS2J1aWxkIGIvdXNyL2tpbml0L3J1bi1pbml0L0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWE5ZDBiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3J1bi1pbml0L0tidWlsZApAQCAtMCwwICsxLDI1IEBACisjCisjIEtidWlsZCBmaWxlIGZvciBydW4taW5pdAorIworCitzdGF0aWMteSA6PSBzdGF0aWMvcnVuLWluaXQKK3NoYXJlZC15IDo9IHNoYXJlZC9ydW4taW5pdAorCisjIGNvbW1vbiAubyBmaWxlcworb2JqcyA6PSBydW4taW5pdC5vIHJ1bmluaXRsaWIubworCisjIFRPRE8gLSBkbyB3ZSB3YW50IGEgc3RyaXBwZWQgdmVyc2lvbgorIyBUT0RPIC0gZG8gd2Ugd2FudCB0aGUgc3RhdGljLmcgKyBzaGFyZWQuZyBkaXJlY3Rvcmllcz8KKworIyBDcmVhdGUgYnVpbHQtaW4ubyB3aXRoIGFsbCBvYmplY3QgZmlsZXMgKHVzZWQgYnkga2luaXQpCitsaWIteSA6PSAkKG9ianMpCisKKyMgLm8gZmlsZXMgdXNlZCB0byBidWlsdCBleGVjdXRhYmxlcworc3RhdGljL3J1bi1pbml0LXkgOj0gJChvYmpzKQorc2hhcmVkL3J1bi1pbml0LXkgOj0gJChvYmpzKQorCisjIENsZWFuaW5nCitjbGVhbi1kaXJzIDo9IHN0YXRpYyBzaGFyZWQKKworIyBpbnN0YWxsIGJpbmFyeQoraW5zdGFsbC15IDo9ICQoc2hhcmVkLXkpCmRpZmYgLS1naXQgYS91c3Iva2luaXQvcnVuLWluaXQvcnVuLWluaXQuYyBiL3Vzci9raW5pdC9ydW4taW5pdC9ydW4taW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTUwZGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcnVuLWluaXQvcnVuLWluaXQuYwpAQCAtMCwwICsxLDkzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA2IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVXNhZ2U6IGV4ZWMgcnVuLWluaXQgWy1jIC9kZXYvY29uc29sZV0gL3JlYWwtcm9vdCAvc2Jpbi9pbml0ICIkQCIKKyAqCisgKiBUaGlzIHByb2dyYW0gc2hvdWxkIGJlIGNhbGxlZCBhcyB0aGUgbGFzdCB0aGluZyBpbiBhIHNoZWxsIHNjcmlwdAorICogYWN0aW5nIGFzIC9pbml0IGluIGFuIGluaXRyYW1mczsgaXQgZG9lcyB0aGUgZm9sbG93aW5nOgorICoKKyAqIC0gRGVsZXRlIGFsbCBmaWxlcyBpbiB0aGUgaW5pdHJhbWZzOworICogLSBSZW1vdW50cyAvcmVhbC1yb290IG9udG8gdGhlIHJvb3QgZmlsZXN5c3RlbTsKKyAqIC0gQ2hyb290czsKKyAqIC0gT3BlbnMgL2Rldi9jb25zb2xlOworICogLSBTcGF3bnMgdGhlIHNwZWNpZmllZCBpbml0IHByb2dyYW0gKHdpdGggYXJndW1lbnRzLikKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInJ1bi1pbml0LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9ncmFtOworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKSB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLAorCQkiVXNhZ2U6IGV4ZWMgJXMgWy1jIGNvbnNvbGVkZXZdIC9yZWFsLXJvb3QgL3NiaW4vaW5pdCBbYXJnc11cbiIsCisJCXByb2dyYW0pOworCWV4aXQoMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJLyogQ29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIGRlZmF1bHRzICovCisJY29uc3QgY2hhciAqY29uc29sZSA9ICIvZGV2L2NvbnNvbGUiOworCWNvbnN0IGNoYXIgKnJlYWxyb290OworCWNvbnN0IGNoYXIgKmluaXQ7CisJY29uc3QgY2hhciAqZXJyb3I7CisJY2hhciAqKmluaXRhcmdzOworCisJLyogVmFyaWFibGVzLi4uICovCisJaW50IG87CisKKwkvKiBQYXJzZSB0aGUgY29tbWFuZCBsaW5lICovCisJcHJvZ3JhbSA9IGFyZ3ZbMF07CisKKwl3aGlsZSAoKG8gPSBnZXRvcHQoYXJnYywgYXJndiwgImM6IikpICE9IC0xKSB7CisJCWlmIChvID09ICdjJykgeworCQkJY29uc29sZSA9IG9wdGFyZzsKKwkJfSBlbHNlIHsKKwkJCXVzYWdlKCk7CisJCX0KKwl9CisKKwlpZiAoYXJnYyAtIG9wdGluZCA8IDIpCisJCXVzYWdlKCk7CisKKwlyZWFscm9vdCA9IGFyZ3Zbb3B0aW5kXTsKKwlpbml0ID0gYXJndltvcHRpbmQgKyAxXTsKKwlpbml0YXJncyA9IGFyZ3YgKyBvcHRpbmQgKyAxOworCisJZXJyb3IgPSBydW5faW5pdChyZWFscm9vdCwgY29uc29sZSwgaW5pdCwgaW5pdGFyZ3MpOworCisJLyogSWYgcnVuX2luaXQgcmV0dXJucywgc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHByb2dyYW0sIGVycm9yLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L3J1bi1pbml0L3J1bi1pbml0LmggYi91c3Iva2luaXQvcnVuLWluaXQvcnVuLWluaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUzMjhlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3J1bi1pbml0L3J1bi1pbml0LmgKQEAgLTAsMCArMSwzNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBSVU5fSU5JVF9ICisjZGVmaW5lIFJVTl9JTklUX0gKKworY29uc3QgY2hhciAqcnVuX2luaXQoY29uc3QgY2hhciAqcmVhbHJvb3QsIGNvbnN0IGNoYXIgKmNvbnNvbGUsCisJCSAgICAgY29uc3QgY2hhciAqaW5pdCwgY2hhciAqKmluaXRhcmdzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvcnVuLWluaXQvcnVuaW5pdGxpYi5jIGIvdXNyL2tpbml0L3J1bi1pbml0L3J1bmluaXRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjM2MzdlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3J1bi1pbml0L3J1bmluaXRsaWIuYwpAQCAtMCwwICsxLDIxNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJ1bl9pbml0KGNvbnNvbGVkZXYsIHJlYWxyb290LCBpbml0LCBpbml0YXJncykKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXMgdGhlIGxhc3QgdGhpbmcgaW4ga2luaXQsCisgKiBmcm9tIGluaXRyYW1mcywgaXQgZG9lcyB0aGUgZm9sbG93aW5nOgorICoKKyAqIC0gRGVsZXRlIGFsbCBmaWxlcyBpbiB0aGUgaW5pdHJhbWZzOworICogLSBSZW1vdW50cyAvcmVhbC1yb290IG9udG8gdGhlIHJvb3QgZmlsZXN5c3RlbTsKKyAqIC0gQ2hyb290czsKKyAqIC0gT3BlbnMgL2Rldi9jb25zb2xlOworICogLSBTcGF3bnMgdGhlIHNwZWNpZmllZCBpbml0IHByb2dyYW0gKHdpdGggYXJndW1lbnRzLikKKyAqCisgKiBPbiBmYWlsdXJlLCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAqLworCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisjaW5jbHVkZSAicnVuLWluaXQuaCIKKworLyogTWFrZSBpdCBwb3NzaWJsZSB0byBjb21waWxlIG9uIGdsaWJjIGJ5IGluY2x1ZGluZyBjb25zdGFudHMgdGhhdCB0aGUKKyAgIGFsd2F5cy1iZWhpbmQgc2hpcHBlZCBnbGliYyBoZWFkZXJzIG1heSBub3QgaW5jbHVkZS4gIENsYXNzaWMgZXhhbXBsZQorICAgb24gd2h5IHRoZSBsYWNrIG9mIEFCSSBoZWFkZXJzIHNjcmV3IHVzIHVwLiAqLworI2lmbmRlZiBUTVBGU19NQUdJQworIyBkZWZpbmUgVE1QRlNfTUFHSUMJMHgwMTAyMTk5NAorI2VuZGlmCisjaWZuZGVmIFJBTUZTX01BR0lDCisjIGRlZmluZSBSQU1GU19NQUdJQwkweDg1ODQ1OGY2CisjZW5kaWYKKyNpZm5kZWYgTVNfTU9WRQorIyBkZWZpbmUgTVNfTU9WRQk4MTkyCisjZW5kaWYKKworc3RhdGljIGludCBudWtlKGNvbnN0IGNoYXIgKndoYXQpOworCitzdGF0aWMgaW50IG51a2VfZGlyZW50KGludCBsZW4sIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbmFtZSwgZGV2X3QgbWUpCit7CisJaW50IGJ5dGVzID0gbGVuICsgc3RybGVuKG5hbWUpICsgMjsKKwljaGFyIHBhdGhbYnl0ZXNdOworCWludCB4bGVuOworCXN0cnVjdCBzdGF0IHN0OworCisJeGxlbiA9IHNucHJpbnRmKHBhdGgsIGJ5dGVzLCAiJXMvJXMiLCBkaXIsIG5hbWUpOworCWFzc2VydCh4bGVuIDwgYnl0ZXMpOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkpCisJCXJldHVybiBFTk9FTlQ7CS8qIFJldHVybiAwIHNpbmNlIGFscmVhZHkgZ29uZT8gKi8KKworCWlmIChzdC5zdF9kZXYgIT0gbWUpCisJCXJldHVybiAwOwkvKiBETyBOT1QgcmVjdXJzZSBkb3duIG1vdW50IHBvaW50cyEhISEhICovCisKKwlyZXR1cm4gbnVrZShwYXRoKTsKK30KKworLyogV2lwZSB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnksIGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYgKi8KK3N0YXRpYyBpbnQgbnVrZV9kaXIoY29uc3QgY2hhciAqd2hhdCkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHdoYXQpOworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmQ7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAobHN0YXQod2hhdCwgJnN0KSkKKwkJcmV0dXJuIGVycm5vOworCisJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gRU5PVERJUjsKKworCWlmICghKGRpciA9IG9wZW5kaXIod2hhdCkpKSB7CisJCS8qIEVBQ0NFUyBtZWFucyB3ZSBjYW4ndCByZWFkIGl0LiAgTWlnaHQgYmUgZW1wdHkgYW5kIHJlbW92YWJsZTsKKwkJICAgaWYgbm90LCB0aGUgcm1kaXIoKSBpbiBudWtlKCkgd2lsbCB0cmlnZ2VyIGFuIGVycm9yLiAqLworCQlyZXR1cm4gKGVycm5vID09IEVBQ0NFUykgPyAwIDogZXJybm87CisJfQorCisJd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSkgeworCQkvKiBTa2lwIC4gYW5kIC4uICovCisJCWlmIChkLT5kX25hbWVbMF0gPT0gJy4nICYmCisJCSAgICAoZC0+ZF9uYW1lWzFdID09ICdcMCcgfHwKKwkJICAgICAoZC0+ZF9uYW1lWzFdID09ICcuJyAmJiBkLT5kX25hbWVbMl0gPT0gJ1wwJykpKQorCQkJY29udGludWU7CisKKwkJZXJyID0gbnVrZV9kaXJlbnQobGVuLCB3aGF0LCBkLT5kX25hbWUsIHN0LnN0X2Rldik7CisJCWlmIChlcnIpIHsKKwkJCWNsb3NlZGlyKGRpcik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJY2xvc2VkaXIoZGlyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG51a2UoY29uc3QgY2hhciAqd2hhdCkKK3sKKwlpbnQgcnY7CisJaW50IGVyciA9IDA7CisKKwlydiA9IHVubGluayh3aGF0KTsKKwlpZiAocnYgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFSVNESVIpIHsKKwkJCS8qIEl0J3MgYSBkaXJlY3RvcnkuICovCisJCQllcnIgPSBudWtlX2Rpcih3aGF0KTsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IHJtZGlyKHdoYXQpID8gZXJybm8gOiBlcnI7CisJCX0gZWxzZSB7CisJCQllcnIgPSBlcnJubzsKKwkJfQorCX0KKworCWlmIChlcnIpIHsKKwkJZXJybm8gPSBlcnI7CisJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCitjb25zdCBjaGFyICpydW5faW5pdChjb25zdCBjaGFyICpyZWFscm9vdCwgY29uc3QgY2hhciAqY29uc29sZSwKKwkJICAgICBjb25zdCBjaGFyICppbml0LCBjaGFyICoqaW5pdGFyZ3MpCit7CisJc3RydWN0IHN0YXQgcnN0LCBjc3QsIGlzdDsKKwlzdHJ1Y3Qgc3RhdGZzIHNmczsKKwlpbnQgY29uZmQ7CisKKwkvKiBGaXJzdCwgY2hhbmdlIHRvIHRoZSBuZXcgcm9vdCBkaXJlY3RvcnkgKi8KKwlpZiAoY2hkaXIocmVhbHJvb3QpKQorCQlyZXR1cm4gImNoZGlyIHRvIG5ldyByb290IjsKKworCS8qIFRoaXMgaXMgYSBwb3RlbnRpYWxseSBoaWdobHkgZGVzdHJ1Y3RpdmUgcHJvZ3JhbS4gIFRha2Ugc29tZQorCSAgIGV4dHJhIHByZWNhdXRpb25zLiAqLworCisJLyogTWFrZSBzdXJlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbQorCSAgIGFzIHRoZSByb290IGRpcmVjdG9yeSAqLworCWlmIChzdGF0KCIvIiwgJnJzdCkgfHwgc3RhdCgiLiIsICZjc3QpKQorCQlyZXR1cm4gInN0YXQiOworCisJaWYgKHJzdC5zdF9kZXYgPT0gY3N0LnN0X2RldikKKwkJcmV0dXJuICJjdXJyZW50IGRpcmVjdG9yeSBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtIGFzIHRoZSByb290IjsKKworCS8qIFRoZSBpbml0cmFtZnMgc2hvdWxkIGhhdmUgL2luaXQgKi8KKwlpZiAoc3RhdCgiL2luaXQiLCAmaXN0KSB8fCAhU19JU1JFRyhpc3Quc3RfbW9kZSkpCisJCXJldHVybiAiY2FuJ3QgZmluZCAvaW5pdCBvbiBpbml0cmFtZnMiOworCisJLyogTWFrZSBzdXJlIHdlJ3JlIG9uIGEgcmFtZnMgKi8KKwlpZiAoc3RhdGZzKCIvIiwgJnNmcykpCisJCXJldHVybiAic3RhdGZzIC8iOworCWlmIChzZnMuZl90eXBlICE9IFJBTUZTX01BR0lDICYmIHNmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMpCisJCXJldHVybiAicm9vdGZzIG5vdCBhIHJhbWZzIG9yIHRtcGZzIjsKKworCS8qIE9rYXksIEkgdGhpbmsgd2Ugc2hvdWxkIGJlIHNhZmUuLi4gKi8KKworCS8qIERlbGV0ZSByb290ZnMgY29udGVudHMgKi8KKwlpZiAobnVrZV9kaXIoIi8iKSkKKwkJcmV0dXJuICJudWtpbmcgaW5pdHJhbWZzIGNvbnRlbnRzIjsKKworCS8qIE92ZXJtb3VudCB0aGUgcm9vdCAqLworCWlmIChtb3VudCgiLiIsICIvIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkpCisJCXJldHVybiAib3Zlcm1vdW50aW5nIHJvb3QiOworCisJLyogY2hyb290LCBjaGRpciAqLworCWlmIChjaHJvb3QoIi4iKSB8fCBjaGRpcigiLyIpKQorCQlyZXR1cm4gImNocm9vdCI7CisKKwkvKiBPcGVuIC9kZXYvY29uc29sZSAqLworCWlmICgoY29uZmQgPSBvcGVuKGNvbnNvbGUsIE9fUkRXUikpIDwgMCkKKwkJcmV0dXJuICJvcGVuaW5nIGNvbnNvbGUiOworCWR1cDIoY29uZmQsIDApOworCWR1cDIoY29uZmQsIDEpOworCWR1cDIoY29uZmQsIDIpOworCWNsb3NlKGNvbmZkKTsKKworCS8qIFNwYXduIGluaXQgKi8KKwlleGVjdihpbml0LCBpbml0YXJncyk7CisJcmV0dXJuIGluaXQ7CQkvKiBGYWlsZWQgdG8gc3Bhd24gaW5pdCAqLworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L3hwaW8uYyBiL3Vzci9raW5pdC94cGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3M2Y3YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC94cGlvLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExvb3BpbmcgdmVyc2lvbnMgb2YgcHJlYWQoKSBhbmQgcHdyaXRlKCkKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworc3NpemVfdCB4cHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KQoreworCXNzaXplX3QgY3RyID0gMDsKKwlzc2l6ZV90IHJ2ID0gMDsKKwljaGFyICpicCA9IGJ1ZjsKKworCXdoaWxlIChjb3VudCkgeworCQlydiA9IHByZWFkKGZkLCBicCwgY291bnQsIG9mZnNldCk7CisKKwkJaWYgKHJ2ID09IDAgfHwgKHJ2ID09IC0xICYmIGVycm5vICE9IEVJTlRSKSkKKwkJCWJyZWFrOworCisJCWJwCSs9IHJ2OworCQljb3VudAktPSBydjsKKwkJb2Zmc2V0CSs9IHJ2OworCQljdHIJKz0gcnY7CisJfQorCisJcmV0dXJuIGN0ciA/IGN0ciA6IHJ2OworfQorCitzc2l6ZV90IHhwd3JpdGUoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KQoreworCXNzaXplX3QgY3RyID0gMDsKKwlzc2l6ZV90IHJ2ID0gMDsKKwljaGFyICpicCA9IGJ1ZjsKKworCXdoaWxlIChjb3VudCkgeworCQlydiA9IHB3cml0ZShmZCwgYnAsIGNvdW50LCBvZmZzZXQpOworCisJCWlmIChydiA9PSAwIHx8IChydiA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikpCisJCQlicmVhazsKKworCQlicAkrPSBydjsKKwkJY291bnQJLT0gcnY7CisJCW9mZnNldAkrPSBydjsKKwkJY3RyCSs9IHJ2OworCX0KKworCXJldHVybiBjdHIgPyBjdHIgOiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC94cGlvLmggYi91c3Iva2luaXQveHBpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTZhMzIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQveHBpby5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBraW5pdC94cGlvLmgKKyAqLworCisjaWZuZGVmIEtJTklUX1hQSU9fSAorI2RlZmluZSBLSU5JVF9YUElPX0gKKworc3NpemVfdCB4cHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KTsKK3NzaXplX3QgeHB3cml0ZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpOworCisjZW5kaWYJCQkJLyogS0lOSVRfWFBJT19IICovCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvQ0FWRUFUUyBiL3Vzci9rbGliYy9DQVZFQVRTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjliOWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvQ0FWRUFUUwpAQCAtMCwwICsxLDYwIEBACisJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICBQbGVhc2Ugbm90ZSB0aGUgZm9sbG93aW5nIGNhdmVhdHMgdG8gdXNpbmcga2xpYmM6CisJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29wdGltaXphdGlvbjoKKy0tLS0tLS0tLS0tLS0KKworQ29tcGlsaW5nIHdpdGggLU8wIGlzIG5vdCBzdXBwb3J0ZWQuICBJdCBtYXkgb3IgbWF5IG5vdCB3b3JrOyBwbGVhc2UKK3VzZSAtTzEgaWYgeW91IHdhbnQgdG8gZG8gbWF4aW1pemUgZGVidWdnYWJpbGl0eS4KKworQ29tcGlsaW5nIHdpdGggLU8wIGlzIG1vcmUgbGlrZWx5IHRvIHdvcmsgb24gZ2NjIDMuCisKKworc2V0am1wKCkvbG9uZ2ptcCgpOgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpICpkbyBub3QqIHNhdmUgc2lnbmFsIHN0YXRlLiAgc2lnc2V0am1wKCkgYW5kCitzaWdsb25nam1wKCkgKmRvKiBzYXZlIHRoZSBzaWduYWwgbWFzayAtLSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZgordGhlIGV4dHJhIGFyZ3VtZW50LgorCitUaGUgc3RhbmRhcmRzIGFjdHVhbGx5IHN0YXRlIHRoYXQgaWYgeW91IHBhc3MgbG9uZ2ptcCgpIGEgZmluYWwgdmFsdWUKK29mIHplcm8gdGhlIGxpYnJhcnkgc2hvdWxkIGNoYW5nZSB0aGF0IHRvIGEgMSEgIFByZXN1bWFibHkgdGhlIHJlYXNvbgoraXMgc28gcGVvcGxlIHdobyB3cml0ZSBicm9rZW4gY29kZSBjYW4gZ2V0IGF3YXkgd2l0aCB3cml0aW5nCitsb25nam1wKGJ1Zik7IG9yIHNvbWV0aGluZyBlcXVhbGx5IGJhZC4gIElmIHlvdSBwYXNzIGxvbmdqbXAoKSBhIGZpbmFsCit2YWx1ZSBvZiAwIHlvdSBnZXQgd2hhdCB5b3UgZGVzZXJ2ZSAtLSBzZXRqbXAoKSB3aWxsIGhhcHBpbHkgcmV0dXJuIDAuCisKKworc3RkaW86CistLS0tLS0KKworT25seSBhIHNtYWxsIHN1YnNldCBvZiB0aGUgc3RkaW8gZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZC4gIFRob3NlCit0aGF0IGFyZSBpbXBsZW1lbnRlZCBkbyBub3QgYnVmZmVyLCBhbHRob3VnaCB0aGV5ICpkbyogdHJhcCBFSU5UUiBvcgorc2hvcnQgcmVhZC93cml0ZXMgYW5kIGl0ZXJhdGUuCisKK19mcmVhZCgpIGFuZCBfZndyaXRlKCksIHdoaWNoIHRha2Ugb25seSBvbmUgc2l6ZSBhcmd1bWVudCAobGlrZQorcmVhZC93cml0ZSksIGJ1dCBkbyBoYW5kbGUgRUlOVFIvc2hvcnQgcmV0dXJuIGFyZSBhbHNvIGF2YWlsYWJsZS4KKworCituYW1lc3BhY2VzOgorLS0tLS0tLS0tLS0KKwora2xpYmMgZnJlcXVlbnRseSBpbmNsdWRlcyBoZWFkZXJzIGluIG90aGVyIGhlYWRlcnMgaW4gYSB3YXkgdGhhdAorZXhwb3NlcyBtb3JlIHN5bWJvbHMgdGhhbiBQT1NJWCBzYXlzIHRoZXkgc2hvdWxkLiAgIkxpdmUgd2l0aCBpdC4iCisKKwordGhlYWRpbmc6CistLS0tLS0tLS0KKwora2xpYmMgaXMgbm90IHRocmVhZC1zYWZlLiAgQ29uc2VxdWVudGx5LCBjbG9uZSgpIG9yIGFueSBvZiB0aGUKK3B0aHJlYWRzIGZ1bmN0aW9ucyBhcmUgbm90IGluY2x1ZGVkLgorCisKK2JzZF9zaWduYWwgdnMgc3lzdl9zaWduYWw6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBpcyBubyBzaWduYWwoKSBjYWxsLCBiZWNhdXNlIHlvdSBuZXZlciBrbm93IGlmIHlvdSB3YW50CitMaW51eC9TeXNWIHNlbWFudGljcyAoU0FfUkVTRVRIQU5EKSBvciBHTlUvQlNEIHNlbWFudGljcyAoU0FfUkVTVEFSVCkuCitUaGUgYmVzdCwgaW4gKmFueSogY2lyY3Vtc3RhbmNlcywgaXMgdG8gbmV2ZXIgdXNlIHNpZ25hbCgpIGFuZCBpbnN0ZWFkCit1c2Ugc2lnYWN0aW9uKCksIGJ1dCBpbiBvcmRlciB0byBzaW1wbGlmeSBwb3J0aW5nIHlvdSBjYW4gdXNlIGVpdGhlcgorc3lzdl9zaWduYWwoKSBvciBic2Rfc2lnbmFsKCksIGRlcGVuZGluZyBvbiB3aGF0IHlvdSBhY3R1YWxseSB3YW50LgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL0tidWlsZCBiL3Vzci9rbGliYy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3MjExNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9LYnVpbGQKQEAgLTAsMCArMSwxNzkgQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIGtsaWJjCisjCisKKyMgVGVsbCB0aGF0IHdlIGFyZSBidWlsZGluZyBrbGliYworZXhwb3J0IGtsaWJjLWJ1aWxkIDo9IHkKKwora2xpYi15IDo9IHZzbnByaW50Zi5vIHNucHJpbnRmLm8gdnNwcmludGYubyBzcHJpbnRmLm8gXAorCSAgYXNwcmludGYubyB2YXNwcmludGYubyBcCisJICB2c3NjYW5mLm8gc3NjYW5mLm8gY3R5cGVzLm8gXAorCSAgc3RybnRvdW1heC5vIHN0cm50b2ltYXgubyBcCisJICBhdG9pLm8gYXRvbC5vIGF0b2xsLm8gXAorCSAgc3RydG9sLm8gc3RydG9sbC5vIHN0cnRvdWwubyBzdHJ0b3VsbC5vIFwKKwkgIHN0cnRvaW1heC5vIHN0cnRvdW1heC5vIFwKKwkgIGdsb2JhbHMubyBleGl0Lm8gYXRleGl0Lm8gb25leGl0Lm8gXAorCSAgZXhlY2wubyBleGVjbGUubyBleGVjdi5vIGV4ZWN2cGUubyBleGVjdnAubyBleGVjbHAubyBleGVjbHBlLm8gXAorCSAgZm9yay5vIHZmb3JrLm8gd2FpdC5vIHdhaXQzLm8gd2FpdHBpZC5vIHN5c3RlbS5vIFwKKwkgIHNldHBncnAubyBnZXRwZ3JwLm8gZGFlbW9uLm8gXAorCSAgcHJpbnRmLm8gdnByaW50Zi5vIGZwcmludGYubyB2ZnByaW50Zi5vIHBlcnJvci5vIFwKKwkgIHN0YXRmcy5vIGZzdGF0ZnMubyB1bW91bnQubyBcCisJICBjcmVhdC5vIG9wZW4ubyBvcGVuYXQubyBvcGVuX2Nsb2V4ZWMubyBcCisJICBmb3Blbi5vIGZyZWFkLm8gZnJlYWQyLm8gZmdldGMubyBmZ2V0cy5vIFwKKwkgIGZ3cml0ZS5vIGZ3cml0ZTIubyBmcHV0Yy5vIGZwdXRzLm8gcHV0cy5vIHB1dGNoYXIubyBcCisJICBzbGVlcC5vIHVzbGVlcC5vIHN0cnRvdGltZXNwZWMubyBzdHJ0b3RpbWV2YWwubyBcCisJICByYWlzZS5vIGFib3J0Lm8gYXNzZXJ0Lm8gYWxhcm0ubyBwYXVzZS5vIFwKKwkgIF9fc2lnbmFsLm8gc3lzdl9zaWduYWwubyBic2Rfc2lnbmFsLm8gc2lnbGlzdC5vIHNpZ2FiYnJldi5vIFwKKwkgIHNpZ2xvbmdqbXAubyBcCisJICBzaWdhY3Rpb24ubyBzaWdwZW5kaW5nLm8gc2lncHJvY21hc2subyBzaWdzdXNwZW5kLm8gXAorCSAgcHNlbGVjdC5vIHBwb2xsLm8gXAorCSAgYnJrLm8gc2Jyay5vIG1hbGxvYy5vIHJlYWxsb2MubyBjYWxsb2MubyBcCisJICBtbWFwLm8gc2htX29wZW4ubyBzaG1fdW5saW5rLm8gXAorCSAgbWVtY3B5Lm8gbWVtY21wLm8gbWVtc2V0Lm8gbWVtY2NweS5vIG1lbW1lbS5vIG1lbXN3YXAubyBcCisJICBtZW1tb3ZlLm8gbWVtY2hyLm8gbWVtcmNoci5vIFwKKwkgIHN0cmNhc2VjbXAubyBzdHJuY2FzZWNtcC5vIHN0cm5kdXAubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vIFwKKwkgIHN0cmNhdC5vIHN0cmNoci5vIHN0cmNtcC5vIHN0cmNweS5vIHN0cmR1cC5vIHN0cmxlbi5vIHN0cm5sZW4ubyBcCisJICBzdHJuY2F0Lm8gc3RybGNweS5vIHN0cmxjYXQubyBcCisJICBzdHJzdHIubyBzdHJuY21wLm8gc3RybmNweS5vIHN0cnJjaHIubyBcCisJICBzdHJ4c3BuLm8gc3Ryc3BuLm8gc3RyY3Nwbi5vIHN0cnBicmsubyBzdHJzZXAubyBzdHJ0b2subyBcCisJICBmbm1hdGNoLm8gXAorCSAgZ2V0aG9zdG5hbWUubyBnZXRkb21haW5uYW1lLm8gZ2V0Y3dkLm8gXAorCSAgc2V0ZXVpZC5vIHNldGVnaWQubyBcCisJICBnZXRlbnYubyBzZXRlbnYubyBwdXRlbnYubyBfX3B1dF9lbnYubyB1bnNldGVudi5vIFwKKwkgIGNsZWFyZW52Lm8gbnVsbGVudi5vIFwKKwkgIGdldG9wdC5vIGdldG9wdF9sb25nLm8gcmVhZGRpci5vIHJlbW92ZS5vIFwKKwkgIHN5c2xvZy5vIGNsb3NlbG9nLm8gcHR5Lm8gZ2V0cHQubyBpc2F0dHkubyByZWJvb3QubyBcCisJICB0aW1lLm8gdXRpbWUubyBsbHNlZWsubyBuaWNlLm8gZ2V0cHJpb3JpdHkubyBcCisJICBxc29ydC5vIGJzZWFyY2gubyBcCisJICBscmFuZDQ4Lm8ganJhbmQ0OC5vIG1yYW5kNDgubyBucmFuZDQ4Lm8gc3JhbmQ0OC5vIHNlZWQ0OC5vIFwKKwkgIGluZXQvaW5ldF9udG9hLm8gaW5ldC9pbmV0X2F0b24ubyBpbmV0L2luZXRfYWRkci5vIFwKKwkgIGluZXQvaW5ldF9udG9wLm8gaW5ldC9pbmV0X3B0b24ubyBpbmV0L2JpbmRyZXN2cG9ydC5vIFwKKwkgIHNlbmQubyByZWN2Lm8gXAorCSAgY3R5cGUvaXNhbG51bS5vIGN0eXBlL2lzYWxwaGEubyBjdHlwZS9pc2FzY2lpLm8gXAorCSAgY3R5cGUvaXNibGFuay5vIGN0eXBlL2lzY250cmwubyBjdHlwZS9pc2RpZ2l0Lm8gXAorCSAgY3R5cGUvaXNncmFwaC5vIGN0eXBlL2lzbG93ZXIubyBjdHlwZS9pc3ByaW50Lm8gXAorCSAgY3R5cGUvaXNwdW5jdC5vIGN0eXBlL2lzc3BhY2UubyBjdHlwZS9pc3VwcGVyLm8gXAorCSAgY3R5cGUvaXN4ZGlnaXQubyBjdHlwZS90b2xvd2VyLm8gY3R5cGUvdG91cHBlci5vIFwKKwkgIHVzZXJkYi9nZXRncmdpZC5vIHVzZXJkYi9nZXRncm5hbS5vIHVzZXJkYi9nZXRwd25hbS5vIFwKKwkgIHVzZXJkYi9nZXRwd3VpZC5vIHVzZXJkYi9yb290X2dyb3VwLm8gdXNlcmRiL3Jvb3RfdXNlci5vCisKK2tsaWItJChDT05GSUdfS0xJQkNfRVJSTElTVCkgKz0gZXJybGlzdC5vCisKK2lmZXEgKCQoQ09ORklHX0tMSUJDX0VSUkxJU1QpLHkpCitLTElCQ0NGTEFHU19zdHJlcnJvci5vICs9IC1EV0lUSF9FUlJMSVNUCitlbmRpZgorCitrbGliLSQoQ09ORklHX0tMSUJDX1pMSUIpICs9IHpsaWIvCisjIGFyY2ggc3BlY2lmaWMgLm8gZmlsZXMKK2tsaWIteSArPSBhcmNoLyQoS0xJQkNBUkNIRElSKS8KKworIyMjIyMKKyMgU2hhcmVkIGRlZmluaXRpb25zCitMSUJDICAgICA6PSBsaWJjLmEKK1NPTElCICAgIDo9IGxpYmMuc28KK1NPSEFTSCAgIDo9IGtsaWJjLnNvCitDUlQwICAgICA6PSBhcmNoLyQoS0xJQkNBUkNIRElSKS9jcnQwLm8KK0lOVEVSUF9PIDo9IGludGVycC5vCisKK2Fsd2F5cyAgIDo9ICQoTElCQykgJChTT0xJQikgJChTT0hBU0gpICQoSU5URVJQX08pCitMSUJDICAgICA6PSAkKGNhbGwgb2JqZWN0aWZ5LCQoTElCQykpCitTT0xJQiAgICA6PSAkKGNhbGwgb2JqZWN0aWZ5LCQoU09MSUIpKQorU09IQVNIICAgOj0gJChjYWxsIG9iamVjdGlmeSwkKFNPSEFTSCkpCitDUlQwICAgICA6PSAkKGNhbGwgb2JqZWN0aWZ5LCQoQ1JUMCkpCitJTlRFUlBfTyA6PSAkKGNhbGwgb2JqZWN0aWZ5LCQoSU5URVJQX08pKQorCitTT0xJQkhBU0ggPSAkKHNoZWxsIGNhdCAkKFNPTElCKS5oYXNoKQorCisjIEdlbmVyYXRlIHN5c2NhbGwgc3R1YnMKK2tsaWIteSArPSBzeXNjYWxscy8KKyMgR2VuZXJhdGUgc29ja2V0IGNhbGxzIHN0dWJzCitrbGliLXkgKz0gc29ja2V0Y2FsbHMvCisKKyMjIyMjCisjIFJlYWRhYmxlIGVycm9ybWVzc2FnZXMgZXh0cmFjdGVkIGZyb20gc3JjLi4KK3RhcmdldHMgKz0gZXJybGlzdC5jCitxdWlldF9jbWRfZXJybGlzdCA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9lcnJsaXN0ID0gJChQRVJMKSAkPCAkKEtMSUJDQ1BQRkxBR1MpIC1lcnJsaXN0ID4gJEAgfHwgcm0gLWYgJEAKKworJChvYmopL2Vycmxpc3QuYzogJChzcmN0cmVlKS8kKHNyYykvbWFrZWVycmxpc3QucGwKKwkkKGNhbGwgY21kLGVycmxpc3QpCisKKworIyBhbGwgLm8gZmlsZXMgZm9yIGFsbCBkaXJzCitrbGliLW8tZmlsZXMgPSAkKHNoZWxsIGNhdCAkKG9iaikva2xpYi5saXN0IFwKKwkJJChhZGRzdWZmaXggL2tsaWIubGlzdCwgJChrbGliLWRpcnMpKSkKKyMjIyMjIworIyBCdWlsZCBzdGF0aWMgbGlicmFyeTogbGliYy5hCit0YXJnZXRzICs9IGxpYmMuYSBfX3N0YXRpY19pbml0Lm8KK3F1aWV0X2NtZF9saWJjID0gS0xJQkNBUiAkQAorICAgICAgY21kX2xpYmMgPSBybSAtZiAkQDsJCQkJCQlcCisgICAgICAgICAgICAgICAgICQoS0xJQkNBUikgY3EgJEAJCQkJCVwKKwkJICQoY2FsbCBvYmplY3RpZnksX19zdGF0aWNfaW5pdC5vKSAkKGtsaWItby1maWxlcyk7CVwKKyAgICAgICAgICAgICAgICAgJChLTElCQ1JBTkxJQikgJEAKKworJChMSUJDKTogJChjYWxsIG9iamVjdGlmeSxfX3N0YXRpY19pbml0Lm8pICQob2JqKS9rbGliLmxpc3QgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsaWJjKQorCisjIyMjIyMKKyMgQnVpbGQgc2hhcmVkIGxpYnJhcnkKK3RhcmdldHMgKz0gbGliYy5zbyBfX3NoYXJlZF9pbml0Lm8KKworcXVpZXRfY21kX2xpYmNzbyA9IEtMSUJDTEQgJEAKKyAgICAgIGNtZF9saWJjc28gPSAkKEtMSUJDTEQpICQoS0xJQkNMREZMQUdTKSAkKEtMSUJDU0hBUkVERkxBR1MpIC1vICRAIFwKKwkJCS0tc3RhcnQtZ3JvdXAJCQkJCVwKKwkJCQkkKENSVDApCQkJCQlcCisJCQkJJChjYWxsIG9iamVjdGlmeSxfX3NoYXJlZF9pbml0Lm8pCVwKKwkJCQkkKGtsaWItby1maWxlcykJCQkJXAorCQkJCSQoS0xJQkNMSUJHQ0MpCQkJCVwKKwkJCS0tZW5kLWdyb3VwCisKKyQoU09MSUIpOiAkKGNhbGwgb2JqZWN0aWZ5LF9fc2hhcmVkX2luaXQubykgJChvYmopL2tsaWIubGlzdCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpYmNzbykKKworCisjIyMjIworIyBCdWlsZCBzaGExIGhhc2ggdmFsdWVzCit0YXJnZXRzICAgICArPSBrbGliYy5zbyBsaWJjLnNvLmhhc2gKK2hvc3Rwcm9ncy15IDo9IHNoYTFoYXNoCitjbGVhbi1maWxlcyArPSBrbGliYy0/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8uc28KKworcXVpZXRfY21kX3NvbGliaGFzaCA9IEhBU0ggICAgJEAKKyAgICAgIGNtZF9zb2xpYmhhc2ggPSAkKEtMSUJDTk0pICQ8IHwgZWdyZXAgJ15bMC05YS1mQS1GXSsgW0FEUlRXXSAnIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgfCAkKG9iaikvc2hhMWhhc2ggPiAkQAorJChTT0xJQikuaGFzaDogJChTT0xJQikgJChvYmopL3NoYTFoYXNoIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsc29saWJoYXNoKQorCitxdWlldF9jbWRfc29oYXNoID0gR0VOICAgICAkQAorICAgICAgY21kX3NvaGFzaCA9IGNhdCAkPCA+ICRAOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDU1RSSVApICQoS0xJQkNTVFJJUEZMQUdTKSAkQDsgICAgICAgICAgICAgICAgIFwKKwkJICAgICBjaG1vZCBhK3ggJEA7CQkJCQkgIFwKKyAgICAgICAgICAgICAgICAgICAgIHJtIC1mICQob2JqKS9rbGliYy0/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8uc287ICAgXAorICAgICAgICAgICAgICAgICAgICAgbG4gLWYgJEAgJChvYmopL2tsaWJjLSQoU09MSUJIQVNIKS5zbworJChTT0hBU0gpOiAkKFNPTElCKSAkKFNPTElCKS5oYXNoCisJJChjYWxsIGNtZCxzb2hhc2gpCisKKworIyMjIyMKKyMgYnVpbGQgaW50ZXJwLm8KK3RhcmdldHMgKz0gaW50ZXJwLm8KKworcXVpZXRfY21kX2ludGVycCA9IEJVSUxEICAgJEAKKyAgICAgIGNtZF9pbnRlcnAgPSAkKEtMSUJDQ0MpICQoa2xpYmNjZmxhZ3MpIC1EX19BU1NFTUJMWV9fICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1ETElCRElSPVwiJChTSExJQkRJUilcIiAgICAgICAgIFwKKwkJCSAgICAgLURTT0hBU0g9XCIkKFNPTElCSEFTSClcIiBcCisJCQkgICAgIC1jIC1vICRAICQ8CisKKyQoSU5URVJQX08pOiAkKG9iaikvaW50ZXJwLlMgJChTT0xJQikuaGFzaAorCSQoY2FsbCBpZl9jaGFuZ2VkLGludGVycCkKKworIyMjIyMKKyMgSW5zdGFsbCBrbGliYworaW5zdGFsbC1ydWxlOgorCUBlY2hvICIgIElOU1RBTEwga2xpYmMgdG8gJChJTlNUQUxMUk9PVCkkKElOU1RBTExESVIpLyQoS0xJQkNDUk9TUylsaWIiCisJJChRKSQoZm9yZWFjaCBmLCAkKExJQkMpICQoU09MSUIpICQoQ1JUMCkgJChJTlRFUlBfTyksIFwKKwkgICQoc2hlbGwgJChpbnN0YWxsLWRhdGEpICQoZikgXAorCSAgICAgICAgICAkKElOU1RBTExST09UKSQoSU5TVEFMTERJUikvJChLTElCQ0NST1NTKWxpYikpCisJJChRKSQoaW5zdGFsbC1saWIpICQob2JqKS9rbGliYy0kKFNPTElCSEFTSCkuc28gXAorCSAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExST09UKSQoSU5TVEFMTERJUikvJChLTElCQ0NST1NTKWxpYgorCSQoUSkkKGluc3RhbGwtbGliKSAkKG9iaikva2xpYmMtJChTT0xJQkhBU0gpLnNvIFwKKwkgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMUk9PVCkkKFNITElCRElSKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL0xJQ0VOU0UgYi91c3Iva2xpYmMvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTZkN2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL0xJQ0VOU0UKQEAgLTAsMCArMSw3MyBAQAorVGhpcyBsaWNlbnNlIGFwcGxpZXMgdG8gYWxsIGZpbGVzIGluIGRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzLAordW5sZXNzIG90aGVyd2lzZSBub3RlZCBpbiBpbmRpdmlkdWFsIGZpbGVzLgorCisKK1NvbWUgZmlsZXMgYXJlIGRlcml2ZWQgZnJvbSBmaWxlcyBkZXJpdmVkIGZyb20gdGhlIGluY2x1ZGUvIGRpcmVjdG9yeQorb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcyByZWxlYXNlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwkJCQktLS0tLQorCitTb21lIGZpbGVzIGFyZSBkZXJpdmVkIGZyb20gZmlsZXMgY29weXJpZ2h0ZWQgYnkgdGhlIFJlZ2VudHMgb2YgVGhlCitVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIGFuZCBhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2xpY2Vuc2U6CisKK05vdGU6IFRoZSBhZHZlcnRpc2luZyBjbGF1c2UgaW4gdGhlIGxpY2Vuc2UgYXBwZWFyaW5nIG9uIEJTRCBVbml4CitmaWxlcyB3YXMgb2ZmaWNpYWxseSByZXNjaW5kZWQgYnkgdGhlIERpcmVjdG9yIG9mIHRoZSBPZmZpY2Ugb2YKK1RlY2hub2xvZ3kgTGljZW5zaW5nIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgb24gSnVseSAyMgorMTk5OS4gSGUgc3RhdGVzIHRoYXQgY2xhdXNlIDMgaXMgImhlcmVieSBkZWxldGVkIGluIGl0cyBlbnRpcmV0eS4iCisKKyAqIENvcHlyaWdodCAoYykKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisKKwkJCQktLS0tLQorCitGb3IgYWxsIHJlbWFpbmluZyBmaWxlcywgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFwcGxpZXM6CisKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIEFueSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvUkVBRE1FIGIvdXNyL2tsaWJjL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGMyY2UyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL1JFQURNRQpAQCAtMCwwICsxLDgwIEBACitUaGlzIGlzIGtsaWJjLCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGEgbWluaW1hbGlzdGljIGxpYmMgc3Vic2V0IGZvcgordXNlIHdpdGggaW5pdHJhbWZzLiAgSXQgaXMgZGVsaWJlcmF0ZWx5IHdyaXR0ZW4gZm9yIHNtYWxsIHNpemUsCittaW5pbWFsIGVudGFnbGVtZW50LCBhbmQgcG9ydGFiaWxpdHksIG5vdCBzcGVlZC4gIEl0IGlzIGRlZmluaXRlbHkgYQord29yayBpbiBwcm9ncmVzcywgYW5kIGEgbG90IG9mIHRoaW5ncyBhcmUgc3RpbGwgbWlzc2luZy4KKworCitUaGUgYnVpbGQgcHJvY2VkdXJlIGlzIG5vdCB2ZXJ5IHBvbGlzaGVkIHlldCwgYnV0IGl0IHNob3VsZCB3b3JrIGxpa2UKK3RoaXM6CisKK2EpIEluIHRoZSBzb3VyY2Ugcm9vdCBkaXJlY3RvcnkgKHRoZSBkaXJlY3RvcnkgYWJvdmUgdGhlIG9uZSBpbiB3aGljaAorICAgdGhpcyBmaWxlIGlzIGZvdW5kKSBjcmVhdGUgYSBzeW1saW5rIGNhbGxlZCAibGludXgiIHBvaW50aW5nIHRvIGEKKyAgIHJlYXNvbmFibHkgcmVjZW50IExpbnV4IGtlcm5lbCB0cmVlICgyLjQgb3IgMi42IHNob3VsZCBiZSBPSy4pCisgICBUaGlzIHRyZWUgbXVzdCBoYXZlIHRoZSBpbmNsdWRlL2FzbSBzeW1saW5rIHNldCB1cCBmb3IgdGhlCisgICBhcmNoaXRlY3R1cmUgeW91J3JlIGNvbXBpbGluZyBmb3IsIGFuZCBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgKKyAgIG11c3QgZXhpc3QuICBUaGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBzdXJlIG9mIGFsbCBvZiB0aGVzZSBpcyB0byBkbworICAgYSAibWFrZSBjb25maWciIG9yIGFueSBvZiBpdHMgdmFyaWFudHMgb24gdGhlIGtlcm5lbCB0cmVlIGlzCisgICBxdWVzdGlvbiwgZm9sbG93ZWQgYnkgYSAibWFrZSBkZXAiICgyLjQpIG9yICJtYWtlIHByZXBhcmUiICgyLjYpLgorCitiKSBJZiB5b3UncmUgY3Jvc3MtY29tcGlsaW5nLCB5b3UgbmVlZCB0byBzZXQgS0xJQkNBUkNIIHRvIHRoZQorICAgYXBwcm9wcmlhdGUgYXJjaGl0ZWN0dXJlLCBhbmQgc2V0IENST1NTX0NPTVBJTEUgdG8geW91ciB0b29sY2hhaW4KKyAgIHByZWZpeC4KKworICAgSU1QT1JUQU5UOiBpZiB5b3UncmUgb24gYSA2NC1iaXQgbWFjaGluZSB3aXRoIGEgMzItYml0IHVzZXJsYW5kCisgICAoaWE2NCwgbWlwczY0LCBwcGM2NCBzcGFyYzY0LCBzMzkweCBvciB4ODZfNjQpLCBhbmQgeW91IHdhbnQgdG8KKyAgIGJ1aWxkIHRoZSAzMi1iaXQgdmVyc2lvbjogeW91IG5lZWQgdG8gc2V0IEtMSUJDQVJDSCB0byB0aGUgMzItYml0CisgICBhcmNoaXRlY3R1cmUgYXMgd2VsbCBhcyBzZXQgdXAgdGhlIGxpbnV4L2luY2x1ZGUvYXNtIHN5bWxpbmsgdG8KKyAgIHBvaW50IHRvIHRoZSAzMi1iaXQgYXJjaGl0ZWN0dXJlLiAgQnVpbGRpbmcgdGhlIDMyLWJpdCBhcmNoaXRlY3R1cmUKKyAgIHVzdWFsbHkgKGJ1dCBub3QgYWx3YXlzKSBwcm9kdWNlcyBzbWFsbGVyIGJpbmFyaWVzLCBhbmQgaXMgbGlrZWx5CisgICB0byBiZSBiZXR0ZXIgdGVzdGVkLgorCisgICBJZiB5b3UgYXJlIG9uIEFSTSwgYW5kIHdhbnQgdG8gYnVpbGQgYSB0aHVtYiB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisgICAodGhpcyBpcyBzdXBwb3J0ZWQpLCBjaGFuZ2UgT1BURkxBR1MgaW4gYXJjaC9hcm0vTUNPTkZJRyB0byBidWlsZAorICAgdGh1bWIgY29kZS4KKworICAgVGhlIGZvbGxvd2luZyBpcyB0aGUgbGFzdCBrbm93biBzdGF0dXMgb2YgdmFyaW91cyBhcmNoaXRlY3R1cmVzOgorCisgICBhbHBoYToJIFdvcmtpbmcKKyAgIGFybS10aHVtYjoJIFVudGVzdGVkCisgICBhcm06CQkgV29ya2luZworICAgYXJtMjY6CSBOb3QgeWV0IHBvcnRlZAorICAgY3JpczoJIFdvcmtpbmcKKyAgIGg4MzAwOgkgTm90IHlldCBwb3J0ZWQKKyAgIGkzODY6CSBXb3JraW5nCisgICBpYTY0OgkgV29ya2luZworICAgbTMycjoJIFVudGVzdGVkCisgICBtNjhrOgkgVW50ZXN0ZWQKKyAgIG02OGtub21tdToJIE5vdCB5ZXQgcG9ydGVkCisgICBtaXBzOgkgV29ya2luZworICAgbWlwczY0OgkgTm90IHlldCBwb3J0ZWQKKyAgIHBhcmlzYzoJIFdvcmtpbmcKKyAgIHBhcmlzYzY0OgkgTm90IHlldCBwb3J0ZWQKKyAgIHBwYzoJCSBXb3JraW5nCisgICBwcGM2NDoJIFdvcmtpbmcKKyAgIHMzOTA6CSBXb3JraW5nIHN0YXRpYywgc2hhcmVkIHVudGVzdGVkCisgICBzMzkweDoJIFdvcmtpbmcKKyAgIHNoOgkJIFVudGVzdGVkCisgICBzaDY0OgkgTm90IHlldCBwb3J0ZWQKKyAgIHNwYXJjOgkgV29ya2luZworICAgc3BhcmM2NDoJIFVudGVzdGVkCisgICB2ODUwOgkgTm90IHlldCBwb3J0ZWQKKyAgIHg4Ni02NDoJIFdvcmtpbmcKKyAgIHh0ZW5zYToJIE5vdCB5ZXQgcG9ydGVkCisKKyAgIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcmVxdWlyZXMgcmVjZW50IGJpbnV0aWxzIG9uIG1hbnkKKyAgIGFyY2hpdGVjdHVyZXMuCisKKyAgIE5vdGUgdGhhdCBldmVuIHRoZSAid29ya2luZyIgb25lcyBsaWtlbHkgaGF2ZSBidWdzLiAgUGxlYXNlIHJlcG9ydAorICAgdGhlbSBpZiB5b3UgcnVuIGludG8gdGhlbS4KKworYykgVHlwZSAibWFrZSIgYW5kIHByYXkuLi4KKworZCkgVHJ5IHRoZSB0ZXN0IHByb2dyYW1zIGluIHRoZSB0ZXN0cy8gZGlyZWN0b3J5LiAgVGhleSBzaG91bGQgcnVuLi4uCisKK0NvbnRhY3QgdGhlIGtsaWJjIG1haWxpbmcgbGlzdDoKKworCWh0dHA6Ly93d3cuenl0b3IuY29tL21haWxtYW4vbGlzdGluZm8va2xpYmMKKworLi4uIGZvciBtb3JlIGluZm8uCisKKwktaHBhCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvU09DS0VUQ0FMTFMuZGVmIGIvdXNyL2tsaWJjL1NPQ0tFVENBTExTLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ0NzhmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL1NPQ0tFVENBTExTLmRlZgpAQCAtMCwwICsxLDIxIEBACisvKiAtKi0gYyAtKi0KKyAqCisgKiBUaGVzZSBhcmUgY2FsbHMgdGhhdCBhcmUgaW52b2tlZCB2aWEgdGhlIHNvY2tldGNhbGwgbWVjaGFuaXNtCisgKiBOb3RlIHRoYXQgb24gbW9zdCBhcmNoaXRlY3R1cmVzIHRoaXMgaXMgc2ltcGx5ICNpbmNsdWRlZCBpbnRvCisgKiBTWVNDQUxMUy5kZWYuCisgKi8KKzw/PiBpbnQgc29ja2V0KGludCwgaW50LCBpbnQpOworPD8+IGludCBiaW5kKGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7Cis8Pz4gaW50IGNvbm5lY3QoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90KTsKKzw/PiBpbnQgbGlzdGVuKGludCwgaW50KTsKKzw/PiBpbnQgYWNjZXB0KGludCwgc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCAqKTsKKzw/PiBpbnQgZ2V0c29ja25hbWUoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICopOworPD8+IGludCBnZXRwZWVybmFtZShpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QgKik7Cis8Pz4gaW50IHNvY2tldHBhaXIoaW50LCBpbnQsIGludCwgaW50ICopOworPD8+IGludCBzZW5kdG8oaW50LCBjb25zdCB2b2lkICosIHNpemVfdCwgaW50LCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90KTsKKzw/PiBpbnQgcmVjdmZyb20oaW50LCB2b2lkICosIHNpemVfdCwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICopOworPD8+IGludCBzaHV0ZG93bihpbnQsIGludCk7Cis8Pz4gaW50IHNldHNvY2tvcHQoaW50LCBpbnQsIGludCwgY29uc3Qgdm9pZCAqLCBzb2NrbGVuX3QpOworPD8+IGludCBnZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIHZvaWQgKiwgc29ja2xlbl90ICopOworPD8+IGludCBzZW5kbXNnKGludCwgY29uc3Qgc3RydWN0IG1zZ2hkciAqLCB1bnNpZ25lZCBpbnQpOworPD8+IGludCByZWN2bXNnKGludCwgc3RydWN0IG1zZ2hkciAqLCB1bnNpZ25lZCBpbnQpOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL1NZU0NBTExTLmRlZiBiL3Vzci9rbGliYy9TWVNDQUxMUy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyZDUyNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9TWVNDQUxMUy5kZWYKQEAgLTAsMCArMSwyNjIgQEAKKy8qIC0qLSBjIC0qLQorICoKKyAqIFRoaXMgaXMgYSBsaXN0IG9mIHN5c3RlbSBjYWxscyB3ZSBpbnZva2UgImRpcmVjdGx5Ii4gIFRoZXNlCisgKiBhcmUgZ2VuZXJhdGVkIGludG8gc3lzY2FsbCBzdHVicyBpbiB0aGVpciBvd24gZmlsZXMsIHNvIHRoZQorICogbGlua2VyIGNhbiBkbyBpdHMgam9iIHByb3Blcmx5LgorICoKKyAqIFRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGEgbGluZSBpczoKKyAqIFs8Wz9dWyFdYXJjaCwuLi4+XSB0eXBlIFtzeXNuYW1lLC4uLl1bQHN5c3R5cGVdWzo6ZnVuY25hbWVdKGFyZ3MpOworICoKKyAqID8gbWVhbnMgb25seSBpbnN0YW50aWF0ZSB0aGlzIHN5c3RlbSBjYWxsIGlmIHByZXNlbnQgaW4gYXNtL3VuaXN0ZC5oCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzaXplLmg+CisKKy8qCisgKiBQcm9jZXNzLXJlbGF0ZWQgc3lzY2FsbHMKKyAqLwordm9pZCBfZXhpdCxleGl0OjpfZXhpdChpbnQpOworPD8haWE2ND4gcGlkX3QgY2xvbmU6Ol9fY2xvbmUodW5zaWduZWQgbG9uZywgdm9pZCAqKTsKKzw/aWE2ND4gcGlkX3QgY2xvbmU6Ol9fY2xvbmUyKHVuc2lnbmVkIGxvbmcsIHZvaWQgKiwgdm9pZCAqKTsKKyMgaWYgISBfS0xJQkNfTk9fTU1VCis8IXNwYXJjLHNwYXJjNjQsaWE2ND4gcGlkX3QgZm9yaygpOworPHNwYXJjLHNwYXJjNjQ+IHBpZF90IGZvcmtAZm9ya2lzaCgpOworI2VuZGlmCisjaWYgX0tMSUJDX1JFQUxfVkZPUksKKy8qCisgKiBBIGxvdCBvZiBhcmNoaXRlY3R1cmVzIG5lZWQgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHZmb3JrCisgKiBzdHVicywgZHVlIHRvIHRoZSBuby1zdGFjayByZXF1aXJlbWVudC4gIFRoZXNlIGFyZSB0aGUKKyAqIGFyY2hpdGVjdHVyZXMgd2hpY2ggZG8gbm90LgorICovCis8YWxwaGEsbTMycixwcGMscHBjNjQsc2gsczM5MCxzMzkweD4gcGlkX3QgdmZvcmsoKTsKKzxzcGFyYyxzcGFyYzY0PiBwaWRfdCB2Zm9ya0Bmb3JraXNoKCk7CisjZW5kaWYKKzwhYWxwaGE+IHBpZF90IGdldHBpZCgpOworPGFscGhhPiBwaWRfdCBnZXR4cGlkQGR1YWwwOjpnZXRwaWQoKTsKK2ludCBzZXRwZ2lkKHBpZF90LCBwaWRfdCk7CitwaWRfdCBnZXRwZ2lkKHBpZF90KTsKKzwhYWxwaGE+IHBpZF90IGdldHBwaWQoKTsKKzxhbHBoYT4gcGlkX3QgZ2V0eHBpZEBkdWFsMTo6Z2V0cHBpZCgpOworcGlkX3Qgc2V0c2lkKCk7CitwaWRfdCBnZXRzaWQocGlkX3QpOworcGlkX3Qgd2FpdDQocGlkX3QsIGludCAqLCBpbnQsIHN0cnVjdCBydXNhZ2UgKik7CitpbnQgZXhlY3ZlKGNvbnN0IGNoYXIgKiwgY2hhciAqIGNvbnN0ICosIGNoYXIgKiBjb25zdCAqKTsKKzw/PiBpbnQgbmljZShpbnQpOworPGFscGhhLGlhNjQ+IGludCBnZXRwcmlvcml0eShpbnQsIGludCk7Cis8IWFscGhhLGlhNjQ+IGludCBnZXRwcmlvcml0eTo6X19nZXRwcmlvcml0eShpbnQsIGludCk7CitpbnQgc2V0cHJpb3JpdHkoaW50LCBpbnQsIGludCk7CitpbnQgc2NoZWRfc2V0c2NoZWR1bGVyKHBpZF90LCBpbnQsIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKK2ludCBzY2hlZF95aWVsZCgpOworPGkzODY+IGludCBwcmN0bEB2YXJhZGljKGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Cis8IWkzODY+IGludCBwcmN0bChpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworCisvKgorICogVXNlciBhbmQgZ3JvdXAgSURzCisgKi8KK2ludCBzZXR1aWQzMixzZXR1aWQ6OnNldHVpZCh1aWRfdCk7CitpbnQgc2V0Z2lkMzIsc2V0Z2lkOjpzZXRnaWQoZ2lkX3QpOworPCFhbHBoYT4gdWlkX3QgZ2V0dWlkMzIsZ2V0dWlkOjpnZXR1aWQoKTsKKzxhbHBoYT4gIHVpZF90IGdldHh1aWRAZHVhbDA6OmdldHVpZCgpOworPCFhbHBoYT4gZ2lkX3QgZ2V0Z2lkMzIsZ2V0Z2lkOjpnZXRnaWQoKTsKKzxhbHBoYT4gZ2lkX3QgZ2V0eGdpZEBkdWFsMDo6Z2V0Z2lkKCk7Cis8IWFscGhhPiB1aWRfdCBnZXRldWlkMzIsZ2V0ZXVpZDo6Z2V0ZXVpZCgpOworPGFscGhhPiB1aWRfdCBnZXR4dWlkQGR1YWwxOjpnZXRldWlkKCk7Cis8IWFscGhhPiBnaWRfdCBnZXRlZ2lkMzIsZ2V0ZWdpZDo6Z2V0ZWdpZCgpOworPGFscGhhPiBnaWRfdCBnZXR4Z2lkQGR1YWwxOjpnZXRlZ2lkKCk7CitpbnQgZ2V0Z3JvdXBzMzIsZ2V0Z3JvdXBzOjpnZXRncm91cHMoaW50LCBnaWRfdCAqKTsKK2ludCBzZXRncm91cHMzMixzZXRncm91cHM6OnNldGdyb3VwcyhzaXplX3QsIGNvbnN0IGdpZF90ICopOworaW50IHNldHJldWlkMzIsc2V0cmV1aWQ6OnNldHJldWlkKHVpZF90LCB1aWRfdCk7CitpbnQgc2V0cmVnaWQzMixzZXRyZWdpZDo6c2V0cmVnaWQoZ2lkX3QsIGdpZF90KTsKK2ludCBzZXRmc3VpZDMyLHNldGZzdWlkOjpzZXRmc3VpZCh1aWRfdCk7CitpbnQgc2V0ZnNnaWQzMixzZXRmc2dpZDo6c2V0ZnNnaWQoZ2lkX3QpOworaW50IHNldHJlc3VpZDMyLHNldHJlc3VpZDo6c2V0cmVzdWlkKGludCwgdWlkX3QsIHVpZF90LCB1aWRfdCk7CisKKy8qCisgKiBGaWxlc3lzdGVtLXJlbGF0ZWQgc3lzdGVtIGNhbGxzCisgKi8KK2ludCBtb3VudChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBjb25zdCB2b2lkICopOworPCFhbHBoYSxpYTY0PiBpbnQgdW1vdW50Mihjb25zdCBjaGFyICosIGludCk7Cis8YWxwaGEsaWE2ND4gaW50IHVtb3VudDo6dW1vdW50Mihjb25zdCBjaGFyICosIGludCk7Cis8Pz4gaW50IHBpdm90X3Jvb3QoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworaW50IHN5bmMoKTsKKyNpZmRlZiBfX05SX3N0YXRmczY0CitpbnQgc3RhdGZzNjQ6Ol9fc3RhdGZzNjQoY29uc3QgY2hhciAqLCBzaXplX3QsIHN0cnVjdCBzdGF0ZnMgKik7CisjZWxzZQoraW50IHN0YXRmcyhjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ZnMgKik7CisjZW5kaWYKKyNpZmRlZiBfX05SX2ZzdGF0ZnM2NAoraW50IGZzdGF0ZnM2NDo6X19mc3RhdGZzNjQoaW50LCBzaXplX3QsIHN0cnVjdCBzdGF0ZnMgKik7CisjZWxzZQoraW50IGZzdGF0ZnMoaW50LCBzdHJ1Y3Qgc3RhdGZzICopOworI2VuZGlmCitpbnQgc3dhcG9uKGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBzd2Fwb2ZmKGNvbnN0IGNoYXIgKik7CisKKy8qCisgKiBJbm9kZS1yZWxhdGVkIHN5c3RlbSBjYWxscworICovCitpbnQgYWNjZXNzKGNvbnN0IGNoYXIgKiwgaW50KTsKKzw/PiBpbnQgZmFjY2Vzc2F0KGludCwgY29uc3QgY2hhciAqLCBpbnQpOworaW50IGxpbmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworPD8+IGludCBsaW5rYXQoaW50LCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKTsKK2ludCB1bmxpbmsoY29uc3QgY2hhciAqKTsKKzw/PiBpbnQgdW5saW5rYXQoaW50LCBjb25zdCBjaGFyICopOworaW50IGNoZGlyKGNvbnN0IGNoYXIgKik7CitpbnQgZmNoZGlyKGludCk7CitpbnQgcmVuYW1lKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKzw/PiBpbnQgcmVuYW1lYXQoaW50LCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKTsKK2ludCBta25vZChjb25zdCBjaGFyICosIG1vZGVfdCwgZGV2X3QpOworPD8+IGludCBta25vZGF0KGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIG1vZGVfdCwgZGV2X3QpOworaW50IGNobW9kKGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKK2ludCBmY2htb2QoaW50LCBtb2RlX3QpOworPD8+IGludCBmY2htb2RhdChpbnQsIGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKK2ludCBta2Rpcihjb25zdCBjaGFyICosIG1vZGVfdCk7Cis8Pz4gaW50IG1rZGlyYXQoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKK2ludCBybWRpcihjb25zdCBjaGFyICopOworPCFhbHBoYSxpYTY0LG1pcHMsbWlwczY0LHNwYXJjLHNwYXJjNjQ+IGludCBwaXBlKGludCAqKTsKK21vZGVfdCB1bWFzayhtb2RlX3QpOworaW50IGNocm9vdChjb25zdCBjaGFyICopOworaW50IHN5bWxpbmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworPD8+IGludCBzeW1saW5rYXQoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitpbnQgcmVhZGxpbmsoY29uc3QgY2hhciAqLCBjaGFyICosIHNpemVfdCk7Cis8Pz4gaW50IHJlYWRsaW5rYXQoaW50LCBjb25zdCBjaGFyICosIGNoYXIgKiwgaW50KTsKKzwhcHBjNjQ+IGludCBzdGF0NjQsc3RhdDo6c3RhdChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopOworPCFwcGM2ND4gaW50IGxzdGF0NjQsbHN0YXQ6OmxzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7Cis8IXBwYzY0PiBpbnQgZnN0YXQ2NCxmc3RhdDo6ZnN0YXQoaW50LCBzdHJ1Y3Qgc3RhdCAqKTsKKzxwcGM2ND4gaW50IHN0YXQ6OnN0YXQoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKKzxwcGM2ND4gaW50IGxzdGF0Ojpsc3RhdChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopOworPHBwYzY0PiBpbnQgZnN0YXQ6OmZzdGF0KGludCwgc3RydWN0IHN0YXQgKik7CisvKiBYWFg6IElzIHRoaXMgcmlnaHQ/ISAqLworPD8+IGludCBmc3RhdGF0NjQsbmV3c3RhdGF0LGZzdGF0YXQ6OmZzdGF0YXQoaW50LCBjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICosIGludCk7CitpbnQgZ2V0ZGVudHM2NCxnZXRkZW50czo6Z2V0ZGVudHModW5zaWduZWQgaW50LCBzdHJ1Y3QgZGlyZW50ICosIHVuc2lnbmVkIGludCk7CitpbnQgY2hvd24zMixjaG93bjo6Y2hvd24oY29uc3QgY2hhciAqLCB1aWRfdCwgZ2lkX3QpOworaW50IGZjaG93bjMyLGZjaG93bjo6ZmNob3duKGludCwgdWlkX3QsIGdpZF90KTsKKzw/PiBpbnQgZmNob3duYXQoaW50LCBjb25zdCBjaGFyICosIHVpZF90LCBnaWRfdCwgaW50KTsKK2ludCBsY2hvd24zMixsY2hvd246OmxjaG93bihjb25zdCBjaGFyICosIHVpZF90LCBnaWRfdCk7CitpbnQgZ2V0Y3dkOjpfX2dldGN3ZChjaGFyICosIHNpemVfdCk7Cis8Pz4gaW50IHV0aW1lKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHV0aW1idWYgKik7Cis8Pz4gaW50IHV0aW1lcyhjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCB0aW1ldmFsICopOworPD8+IGludCBmdXRpbWVzYXQoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCB0aW1ldmFsICopOworPD8+IGludCBpbm90aWZ5X2luaXQoKTsKKzw/PiBpbnQgaW5vdGlmeV9hZGRfd2F0Y2goaW50LCBjb25zdCBjaGFyICosIF9fdTMyKTsKKzw/PiBpbnQgaW5vdGlmeV9ybV93YXRjaChpbnQsIF9fdTMyKTsKKworLyoKKyAqIEkvTyBvcGVyYXRpb25zCisgKi8KKzwhaTM4Niw2ND4gaW50IG9wZW46Ol9fb3Blbihjb25zdCBjaGFyICosIGludCwgbW9kZV90KTsKKzw/IWkzODYsNjQ+IGludCBvcGVuYXQ6Ol9fb3BlbmF0KGludCwgY29uc3QgY2hhciAqLCBpbnQsIG1vZGVfdCk7Cis8NjQ+IGludCBvcGVuKGNvbnN0IGNoYXIgKiwgaW50LCBtb2RlX3QpOworc3NpemVfdCByZWFkKGludCwgdm9pZCAqLCBzaXplX3QpOworc3NpemVfdCB3cml0ZShpbnQsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK2ludCBjbG9zZShpbnQpOworPDY0PiBvZmZfdCBsc2VlayhpbnQsIG9mZl90LCBpbnQpOworPDMyPiBpbnQgX2xsc2Vlazo6X19sbHNlZWsoaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBvZmZfdCAqLCBpbnQpOworaW50IGR1cChpbnQpOworaW50IGR1cDIoaW50LCBpbnQpOworPGkzODY+IGludCBmY250bDY0QHZhcmFkaWM6OmZjbnRsKGludCwgaW50LCB1bnNpZ25lZCBsb25nKTsKKzxwcGM2ND4gaW50IGZjbnRsKGludCwgaW50LCB1bnNpZ25lZCBsb25nKTsKKzwhaTM4NixwcGM2ND4gaW50IGZjbnRsNjQsZmNudGw6OmZjbnRsKGludCwgaW50LCB1bnNpZ25lZCBsb25nKTsKK2ludCBpb2N0bChpbnQsIGludCwgdm9pZCAqKTsKK2ludCBmbG9jayhpbnQsIGludCk7CitpbnQgX25ld3NlbGVjdCxzZWxlY3Q6OnNlbGVjdChpbnQsIGZkX3NldCAqLCBmZF9zZXQgKiwgZmRfc2V0ICosIHN0cnVjdCB0aW1ldmFsICopOworI2lmIGRlZmluZWQoX19OUl9wc2VsZWN0KSAmJiAhX0tMSUJDX1VTRV9SVF9TSUcKK2ludCBwc2VsZWN0KGludCwgZmRfc2V0ICosIGZkX3NldCAqLCBmZF9zZXQgKiwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHNpZ3NldF90ICopOworI2VsaWYgZGVmaW5lZChfX05SX3BzZWxlY3Q3KQoraW50IHBzZWxlY3Q3OjpfX3BzZWxlY3Q3KGludCwgZmRfc2V0ICosIGZkX3NldCAqLCBmZF9zZXQgKiwgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHNpZ3NldF90ICosIHNpemVfdCk7CisjZWxpZiBkZWZpbmVkKF9fTlJfcHNlbGVjdDYpCitpbnQgcHNlbGVjdDY6Ol9fcHNlbGVjdDYoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICosIGZkX3NldCAqLCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc3RydWN0IF9fcHNlbGVjdDYgKik7CisjZW5kaWYKK2ludCBwb2xsKHN0cnVjdCBwb2xsZmQgKiwgbmZkc190LCBsb25nKTsKKzw/PiBpbnQgcHBvbGw6Ol9fcHBvbGwoc3RydWN0IHBvbGxmZCAqLCBuZmRzX3QsIHN0cnVjdCB0aW1lc3BlYyAqLCBjb25zdCBzaWdzZXRfdCAqLCBzaXplX3QpOworaW50IGZzeW5jKGludCk7CitpbnQgZmRhdGFzeW5jLGZzeW5jOjpmZGF0YXN5bmMoaW50KTsKK2ludCByZWFkdihpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpOworaW50IHdyaXRldihpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpOworaW50IGZ0cnVuY2F0ZTY0LGZ0cnVuY2F0ZTo6ZnRydW5jYXRlKGludCwgb2ZmX3QpOworc3NpemVfdCBwcmVhZDY0LHByZWFkOjpwcmVhZChpbnQsIHZvaWQgKiwgc2l6ZV90LCBvZmZfdCk7Citzc2l6ZV90IHB3cml0ZTY0LHB3cml0ZTo6cHdyaXRlKGludCwgdm9pZCAqLCBzaXplX3QsIG9mZl90KTsKK2ludCBzeW5jX2ZpbGVfcmFuZ2UsZmRhdGFzeW5jLGZzeW5jOjpzeW5jX2ZpbGVfcmFuZ2UoaW50LCBvZmZfdCwgb2ZmX3QsIHVuc2lnbmVkIGludCk7Cis8Pz4gaW50IHNwbGljZShpbnQsIG9mZl90ICosIGludCwgb2ZmX3QgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworPD8+IGludCB0ZWUoaW50LCBpbnQsIHNpemVfdCwgdW5zaWduZWQgaW50KTsKK3NzaXplX3Qgc2VuZGZpbGU2NCxzZW5kZmlsZTo6c2VuZGZpbGUoaW50LCBpbnQsIG9mZl90ICosIHNpemVfdCwgb2ZmX3QpOworCisvKgorICogU2lnbmFsIG9wZXJhdGlvbnMKKyAqCisgKiBXZSByZWFsbHkgc2hvdWxkIGdldCByaWQgb2YgdGhlIG5vbi1ydF8qIG9mIHRoZXNlLCBidXQgdGhhdCB0YWtlcworICogc2FuaXRpemluZyA8c2lnbmFsLmg+IGZvciBhbGwgYXJjaGl0ZWN0dXJlcywgc2lnaC4gIFNlZSA8a2xpYmMvY29uZmlnLmg+LgorICovCisjaWYgX0tMSUJDX1VTRV9SVF9TSUcKKzwhc3BhcmMsc3BhcmM2ND4gaW50IHJ0X3NpZ2FjdGlvbjo6X19ydF9zaWdhY3Rpb24oaW50LCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICosIHN0cnVjdCBzaWdhY3Rpb24gKiwgc2l6ZV90KTsKKzxzcGFyYyxzcGFyYzY0PiBpbnQgcnRfc2lnYWN0aW9uOjpfX3J0X3NpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiwgc3RydWN0IHNpZ2FjdGlvbiAqLCB2b2lkICosIHNpemVfdCk7CitpbnQgcnRfc2lnc3VzcGVuZDo6X19ydF9zaWdzdXNwZW5kKGNvbnN0IHNpZ3NldF90ICosIHNpemVfdCk7CitpbnQgcnRfc2lncGVuZGluZzo6X19ydF9zaWdwZW5kaW5nKHNpZ3NldF90ICosIHNpemVfdCk7CitpbnQgcnRfc2lncHJvY21hc2s6Ol9fcnRfc2lncHJvY21hc2soaW50LCBjb25zdCBzaWdzZXRfdCAqLCBzaWdzZXRfdCAqLCBzaXplX3QpOworPHNwYXJjNjQ+IHZvaWQgcnRfc2lncmV0dXJuOjpfX3NpZ3JldHVybigpOworI2Vsc2UKK2ludCBzaWdhY3Rpb246Ol9fc2lnYWN0aW9uKGludCwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqLCBzdHJ1Y3Qgc2lnYWN0aW9uICopOworaW50IHNpZ3N1c3BlbmQoY29uc3Qgc2lnc2V0X3QgKik7CitpbnQgc2lncGVuZGluZyhzaWdzZXRfdCAqKTsKK2ludCBzaWdwcm9jbWFzayhpbnQsIGNvbnN0IHNpZ3NldF90ICosIHNpZ3NldF90ICopOworI2VuZGlmCitpbnQga2lsbChwaWRfdCwgaW50KTsKKzw/PiB1bnNpZ25lZCBpbnQgYWxhcm0odW5zaWduZWQgaW50KTsKK2ludCBnZXRpdGltZXIoaW50LCBzdHJ1Y3QgaXRpbWVydmFsICopOworaW50IHNldGl0aW1lcihpbnQsIGNvbnN0IHN0cnVjdCBpdGltZXJ2YWwgKiwgc3RydWN0IGl0aW1lcnZhbCAqKTsKKworLyoKKyAqIFRpbWUtcmVsYXRlZCBzeXN0ZW0gY2FsbHMKKyAqLworPD8+IHRpbWVfdCB0aW1lKHRpbWVfdCAqKTsKK2Nsb2NrX3QgdGltZXMoc3RydWN0IHRtcyAqKTsKK2ludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV6b25lICopOworaW50IHNldHRpbWVvZmRheShjb25zdCBzdHJ1Y3QgdGltZXZhbCAqLCBjb25zdCBzdHJ1Y3QgdGltZXpvbmUgKik7CitpbnQgbmFub3NsZWVwKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLCBzdHJ1Y3QgdGltZXNwZWMgKik7Cis8Pz4gaW50IHBhdXNlKCk7CisKKy8qCisgKiBNZW1vcnkKKyAqLworPD8+IHZvaWQgKiBicms6Ol9fYnJrKHZvaWQgKik7CitpbnQgbXVubWFwKHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQgKiBtcmVtYXAodm9pZCAqLCBzaXplX3QsIHNpemVfdCwgdW5zaWduZWQgbG9uZyk7CitpbnQgbXN5bmMoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CitpbnQgbXByb3RlY3QoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisjIGlmIF9LTElCQ19VU0VfTU1BUDIKKzwhczM5MD4gdm9pZCAqIG1tYXAyOjpfX21tYXAyKHZvaWQgKiwgc2l6ZV90LCBpbnQsIGludCwgaW50LCBsb25nKTsKKyMgZWxzZQorPCFzMzkweD4gdm9pZCAqIG1tYXAodm9pZCAqLCBzaXplX3QsIGludCwgaW50LCBpbnQsIGxvbmcpOworaW50IG1sb2NrYWxsKGludCk7CitpbnQgbXVubG9ja2FsbCgpOworaW50IG1sb2NrKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK2ludCBtdW5sb2NrKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKyNlbmRpZgorCisvKgorICogU3lzdGVtIHN0dWZmCisgKi8KK2ludCB1bmFtZShzdHJ1Y3QgdXRzbmFtZSAqKTsKK2ludCBzZXRkb21haW5uYW1lKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK2ludCBzZXRob3N0bmFtZShjb25zdCBjaGFyICosIHNpemVfdCk7Citsb25nIGluaXRfbW9kdWxlKHZvaWQgKiwgdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqKTsKK2xvbmcgZGVsZXRlX21vZHVsZShjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCk7CitpbnQgcmVib290OjpfX3JlYm9vdChpbnQsIGludCwgaW50LCB2b2lkICopOworaW50IHN5c2xvZzo6a2xvZ2N0bChpbnQsIGNoYXIgKiwgaW50KTsKK2ludCBzeXNpbmZvKHN0cnVjdCBzeXNpbmZvICopOworCisvKgorICogTG93LWxldmVsIEkvTyAoZ2VuZXJhbGx5IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyk7CisgKi8KKzxpMzg2LHg4Nl82ND4gaW50IGlvcGwoaW50KTsKKzxpMzg2LHg4Nl82ND4gaW50IGlvcGVybSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpOworPGkzODY+IGludCB2bTg2KHN0cnVjdCB2bTg2X3N0cnVjdCAqKTsKKworLyoKKyAqIE1vc3QgYXJjaGl0ZWN0dXJlcyBoYXZlIHRoZSBzb2NrZXQgaW50ZXJmYWNlcyB1c2luZyByZWd1bGFyCisgKiBzeXN0ZW0gY2FsbHMuCisgKi8KKzw/IWkzODY+IGxvbmcgc29ja2V0Y2FsbDo6X19zb2NrZXRjYWxsKGludCwgY29uc3QgdW5zaWduZWQgbG9uZyAqKTsKKyNpbmNsdWRlICJTT0NLRVRDQUxMUy5kZWYiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvX19wdXRfZW52LmMgYi91c3Iva2xpYmMvX19wdXRfZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkNDE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9fX3B1dF9lbnYuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogX19wdXRfZW52LmMgLSBjb21tb24gY29kZSBmb3IgcHV0ZW52KCkgYW5kIHNldGVudigpCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZW52LmgiCisKK3N0YXRpYyBzaXplX3QgX19lbnZpcm9uX3NpemU7CitzdGF0aWMgY2hhciAqKl9fZW52aXJvbl9hbGxvYzsKKworLyogc3RyIHNob3VsZCBiZSBhIGR1cGxpY2F0ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgc3RyaW5nOworICAgbGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlIGtleSBpbmNsdWRpbmcgdGhlID0gc2lnbiAqLworCitpbnQgX19wdXRfZW52KGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IG92ZXJ3cml0ZSkKK3sKKwlzdGF0aWMgY2hhciAqY29uc3QgbnVsbF9lbnZpcm9uID0geyBOVUxMIH07CisJY2hhciAqKnAsICpxOworCWNoYXIgKipuZXdlbnY7CisJc2l6ZV90IG47CisKKwlpZiAoIWVudmlyb24pCisJCWVudmlyb24gPSAoY2hhciAqKiludWxsX2Vudmlyb247CisKKwluID0gMTsJCQkvKiBJbmNsdWRlIHNwYWNlIGZvciBmaW5hbCBOVUxMICovCisJZm9yIChwID0gZW52aXJvbjsgKHEgPSAqcCk7IHArKykgeworCQluKys7CisJCWlmICghc3RybmNtcChxLCBzdHIsIGxlbikpIHsKKwkJCWlmICghb3ZlcndyaXRlKQorCQkJCWZyZWUoc3RyKTsKKwkJCWVsc2UKKwkJCQkqcCA9IHN0cjsJLyogUG9zc2libGUgbWVtb3J5IGxlYWsuLi4gKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKF9fZW52aXJvbl9hbGxvYyAmJiBlbnZpcm9uICE9IF9fZW52aXJvbl9hbGxvYykgeworCQlmcmVlKF9fZW52aXJvbl9hbGxvYyk7CisJCV9fZW52aXJvbl9hbGxvYyA9IE5VTEw7CisJfQorCisJLyogTmVlZCB0byBleHRlbmQgdGhlIGVudmlyb25tZW50ICovCisJaWYgKG4gPCBfX2Vudmlyb25fc2l6ZSkgeworCQlwWzFdID0gTlVMTDsKKwkJKnAgPSBzdHI7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChfX2Vudmlyb25fYWxsb2MpIHsKKwkJCW5ld2VudiA9CisJCQkgICAgcmVhbGxvYyhfX2Vudmlyb25fYWxsb2MsCisJCQkJICAgIChfX2Vudmlyb25fc2l6ZSA8PCAxKSAqIHNpemVvZihjaGFyICopKTsKKwkJCWlmICghbmV3ZW52KQorCQkJCXJldHVybiAtMTsKKworCQkJX19lbnZpcm9uX3NpemUgPDw9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBNYWtlIGEgcmVhc29uYWJsZSBndWVzcyBob3cgbXVjaCBtb3JlIHNwYWNlCisJCQkgICB3ZSBuZWVkICovCisJCQlzaXplX3QgbmV3c2l6ZSA9IG4gKyAzMjsKKwkJCW5ld2VudiA9IG1hbGxvYyhuZXdzaXplICogc2l6ZW9mKGNoYXIgKikpOworCQkJaWYgKCFuZXdlbnYpCisJCQkJcmV0dXJuIC0xOworCisJCQltZW1jcHkobmV3ZW52LCBlbnZpcm9uLCBuICogc2l6ZW9mKGNoYXIgKikpOworCQkJX19lbnZpcm9uX3NpemUgPSBuZXdzaXplOworCQl9CisJCW5ld2VudltuLTFdID0gc3RyOwkvKiBPbGQgTlVMTCBwb3NpdGlvbiAqLworCQluZXdlbnZbbl0gICA9IE5VTEw7CisJCWVudmlyb24JPSBuZXdlbnY7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL19fc2hhcmVkX2luaXQuYyBiL3Vzci9rbGliYy9fX3NoYXJlZF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyYTNkYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9fX3NoYXJlZF9pbml0LmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFNIQVJFRCAxCisjaW5jbHVkZSAibGliY19pbml0LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvX19zaWduYWwuYyBiL3Vzci9rbGliYy9fX3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzRiOGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvX19zaWduYWwuYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogX19zaWduYWwuYworICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworX19zaWdoYW5kbGVyX3QgX19zaWduYWwoaW50IHNpZ251bSwgX19zaWdoYW5kbGVyX3QgaGFuZGxlciwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwlzYS5zYV9oYW5kbGVyID0gaGFuZGxlcjsKKwlzYS5zYV9mbGFncyA9IGZsYWdzOworCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKworCWlmIChzaWdhY3Rpb24oc2lnbnVtLCAmc2EsICZzYSkpIHsKKwkJcmV0dXJuIChfX3NpZ2hhbmRsZXJfdCkgU0lHX0VSUjsKKwl9IGVsc2UgeworCQlyZXR1cm4gKF9fc2lnaGFuZGxlcl90KSBzYS5zYV9oYW5kbGVyOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9fX3N0YXRpY19pbml0LmMgYi91c3Iva2xpYmMvX19zdGF0aWNfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTllZWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvX19zdGF0aWNfaW5pdC5jCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBTSEFSRUQgMAorI2luY2x1ZGUgImxpYmNfaW5pdC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2Fib3J0LmMgYi91c3Iva2xpYmMvYWJvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI5YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2Fib3J0LmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGFib3J0LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3ZvaWQgYWJvcnQodm9pZCkKK3sKKwlzaWdzZXRfdCBzZXQ7CisKKwlzaWdlbXB0eXNldCgmc2V0KTsKKwlzaWdhZGRzZXQoJnNldCwgU0lHQUJSVCk7CisJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzZXQsIE5VTEwpOworCXJhaXNlKFNJR0FCUlQpOworCV9leGl0KDI1NSk7CQkvKiByYWlzZSgpIHNob3VsZCBoYXZlIGtpbGxlZCB1cyAqLworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FsYXJtLmMgYi91c3Iva2xpYmMvYWxhcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ3NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FsYXJtLmMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIGFsYXJtLmMKKyAqLworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWZuZGVmIF9fTlJfYWxhcm0KKworLyogRW11bGF0ZSBhbGFybSgpIHZpYSBzZXRpdGltZXIoKSAqLworCit1bnNpZ25lZCBpbnQgYWxhcm0odW5zaWduZWQgaW50IHNlY29uZHMpCit7CisJc3RydWN0IGl0aW1lcnZhbCBpdjsKKworCWl2Lml0X2ludGVydmFsLnR2X3NlYyA9IGl2Lml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworCWl2Lml0X3ZhbHVlLnR2X3NlYyA9IHNlY29uZHM7CisJaXYuaXRfdmFsdWUudHZfdXNlYyA9IDA7CisKKwlzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZpdiwgJml2KTsKKworCXJldHVybiBpdi5pdF92YWx1ZS50dl9zZWMgKyAoaXYuaXRfdmFsdWUudHZfdXNlYyA/IDEgOiAwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9SRUFETUUgYi91c3Iva2xpYmMvYXJjaC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyYjlkMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL1JFQURNRQpAQCAtMCwwICsxLDgxIEBACitUbyBwb3J0IGtsaWJjIHRvIGEgbmV3IGFyY2hpdGVjdHVyZSwgeW91IG5lZWQ6CisKK2EpIEEgZGlyZWN0b3J5IHN0cnVjdHVyZQorCitFYWNoIGFyY2h0ZWN0dXJlIGhhcyBhIGtsaWJjL2FyY2gvIGRpcmVjdG9yeSwgd2hpY2ggc2hvdWxkIGluY2x1ZGUgYW4KK01DT05GSUcgYW5kIGEgTWFrZWZpbGUuaW5jIGZpbGUsIGFuZCBhbiBpbmNsdWRlL2FyY2gvIGRpcmVjdG9yeSwgd2hpY2gKK2luY2x1ZGVzIHNvbWUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGhlYWRlciBmaWxlcywgaW5jbHVkaW5nCitrbGliYy9hcmNoY29uZmlnLmguCisKKworYikgQXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAgIChpbmNsdWRlL2FyY2gvKi9rbGliYy9zeXNjb25maWcuaCkKKworVGhpcyBmaWxlIGNhbiBzZXQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZnJvbQoraW5jbHVkZS9rbGliYy9zeXNjb25maWcuaC4KKworCitjKSBTdGFydHVwIGNvZGUKKyAgIChrbGliYy9hcmNoLyovY3J0MC5TKQorCitUaGUgY3J0MC5TIGFzc2VtYmx5IHJvdXRpbmUgdHlwaWNhbGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBmb2xsb3dpbmcKK3BzZXVkby1DIGNvZGUuICBJbiBhZGRpdGlvbiwgZWFjaCBhcmNoaXRlY3R1cmUgbmVlZHMgYW55IHN1cHBvcnQKK3JvdXRpbmVzIHRoYXQgZ2NjLWdlbmVyYXRlZCBjb2RlIGV4cGVjdHMgdG8gZmluZCBpbiB0aGUgc3lzdGVtIGxpYnJhcnkKKy0tIEFscGhhLCBmb3IgZXhhbXBsZSwgbmVlZHMgZGl2aWRlIHN1YnJvdXRpbmVzLgorCitUaGUgImdldGVudnRlc3QiIHRlc3QgcHJvZ3JhbSBpcyBhIHZlcnkgZ29vZCB0ZXN0IGZvciBwcm9wZXIgY3J0MC5TCitmdW5jdGlvbmFsaXR5LgorCisKK2V4dGVybiBfX25vcmV0dXJuIF9fbGliY19pbml0KHZvaWQgKiwgdm9pZCAqKTsKKworX19ub3JldHVybiBfc3RhcnQodm9pZCkKK3sKKyAgdm9pZCAqZWxmX2RhdGEgICA9IGdldF9lbGZfZGF0YV9hZGRyZXNzKCk7IC8qIFVzdWFsbHkgdGhlIHN0YWNrIGFkZHJlc3MgKi8KKyAgdm9pZCAqYXRleGl0X3B0ciA9IGdldF9hdGV4aXRfcHRyKCk7ICAgICAgIC8qIFVzdWFsbHkgaW4gYSByZWdpc3RlciAqLworCisgIC8qIFNvbWUgYXJjaGl0ZWN0dXJlcyBuZWVkIHRoaXMgZm9yIGRlYnVnZ2luZyB0byB3b3JrICovCisgIHNldHVwX251bGxfc3RhY2tfZnJhbWVfaWZfbmVjZXNzYXJ5KCk7CisKKyAgX19saWJjX2luaXQoZWxmX2RhdGEsIGF0ZXhpdF9wdHIpOworfQorCisKK2QpIEEgc2V0ZW52IGltcGxlbWVudGF0aW9uCisgICAoa2xpYmMvYXJjaC8qL3NldGptcC5TLCBpbmNsdWRlL2FyY2gvKmtsaWJjL2FyY2hzZXRqbXAuaCkKKworT24gbW9zdCAoYnV0IG5vdCBhbGwhKSBhcmNoaXRlY3R1cmVzLCB0aGlzIGVudGFpbHMgY3JlYXRpbmcgYSBzZXRqbXAKK2J1ZmZlciBiaWcgZW5vdWdoIHRvIGhvbGQgYWxsIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMsIHBsdXMgdGhlIHN0YWNrCitwb2ludGVyIGFuZCB0aGUgcmV0dXJuIGFkZHJlc3MuICBJbiBzZXRqbXAuUyB5b3UgaGF2ZToKKworKiBBICJzZXRqbXAiIGZ1bmN0aW9uIHRoYXQgd3JpdGVzIG91dCB0aGUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycywgdGhlCisgIHN0YWNrIHBvaW50ZXIgYW5kIHRoZSByZXR1cm4gYWRkcmVzcyB0byB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhlCisgIGZpcnN0IGFyZ3VtZW50LCBhbmQgdGhlbiByZXR1cm5zIHplcm8gbm9ybWFsbHkuCisKKyAgT24gc29tZSBhcmNoaXRlY3R1cmVzIHlvdSBuZWVkIHRvIHRha2Ugc29tZSBraW5kIG9mIGFjdGlvbiB0byBtYWtlCisgIHN1cmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGFjayBpcyBhY3R1YWxseSBtYW5pZmVzdCBpbiBtZW1vcnkgYW5kCisgIG5vdCBjYWNoZWQgaW4gdGhlIENQVS4gIEluIHNvbWUgY2FzZXMgKGUuZy4gb24gU1BBUkMpIHRoaXMgd2lsbAorICBhdXRvbWF0aWNhbGx5IHNwaWxsIHRoZSByZWdpc3RlcnMgb250byB0aGUgc3RhY2s7IHRoZW4gdGhleSBkb24ndAorICBuZWVkIHRvIGJlIHNwaWxsZWQgaW50byB0aGUgam1wX2J1Zi4KKworKiBBICJsb25nam1wIiBmdW5jdGlvbiB0aGF0IHJlYWQgYmFjayB0aGVzZSBzYW1lIHJlZ2lzdGVycyBmcm9tIHRoZQorICBqbXBfYnVmIHBvaW50ZWQgdG8gYnkgdGhlIGZpcnN0IGFyZ3VtZW50LCBhbmQgcmV0dXJucyB0aGUgc2Vjb25kCisgIGFyZ3VtZW50ICp0byB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGptcF9idWYqLgorCisgIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB5b3UgbmVlZCB0byB0YWtlIHNvbWUga2luZCBvZiBhY3Rpb24gdG8gZmx1c2gKKyAgYW55IGNhY2hlZCBzdGFjayBkYXRhIG9yIHJldHVybiBzdGFjay4KKworCitlKSBBbnkgc3VwcG9ydCBmdW5jdGlvbnMgbmVlZGVkIGJ5IGdjYywgKnVubGVzcyogdGhleSBhcmUgaW4gbGliZ2NjCisgICphbmQqIGxpYmdjYyBpcyB1c2FibGUgZm9yIGtsaWJjIG9uIHlvdXIgcGFydGljdWxhciBwbGF0Zm9ybS4gIElmCisgIGxpYmdjYyBpc24ndCB1c2FibGUgZm9yIGtsaWJjIChvbiBNSVBTLCBmb3IgZXhhbXBsZSwgbGliZ2NjIGlzCisgIGNvbXBpbGVkIGluIGEgd2F5IHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBrbGliYykgdGhlcmUgYXJlCisgIHJlYXNvbmFibHkgZ29vZCBjbG9uZXMgb2YgbW9zdCBvZiB0aGUgbGliZ2NjIGZ1bmN0aW9ucyBpbiB0aGUgbGliZ2NjCisgIGRpcmVjdG9yeS4gIFRvIHVzZSB0aGVtLCBhZGQgdGhlbSB0byBBUkNIT0JKUyBpbgorICBrbGliYy9hcmNoLyovTWFrZWZpbGUuaW5jLgorCisKK2YpIEEgbGluayBsb2NhdGlvbiBmb3IgdGhlIHNoYXJlZCBrbGliYy4gIFRoaXMgc2hvdWxkIGJlIHNwZWNpZmllZCBpbgorICBTSEFSRURGTEFHUyBpbiBrbGliYy9hcmNoLyovTUNPTkZJRy4KKworICBUaGlzIGlzIG5vdCBhcHBsaWNhYmxlIHRvIG5vLU1NVSBhcmNoaXRlY3R1cmVzLgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzMwZjMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9LYnVpbGQKQEAgLTAsMCArMSw1MiBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvYWxwaGEvTWFrZWZpbGUuaW5jCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCitrbGliLXkgOj0gcGlwZS5vIHNldGptcC5vIHN5c2NhbGwubyBzeXNkdWFsLm8KKworIyBTcGVjaWFsIENGTEFHUyBmb3IgdGhlIGRpdmlkZSBjb2RlCitESVZDRkxBR1MgPSAkKEtMSUJDUkVRRkxBR1MpICQoS0xJQkNBUkNIUkVRRkxBR1MpIFwKKwktTzMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZjYWxsLXNhdmVkLTEgLWZjYWxsLXNhdmVkLTIgXAorCS1mY2FsbC1zYXZlZC0zIC1mY2FsbC1zYXZlZC00IC1mY2FsbC1zYXZlZC01IC1mY2FsbC1zYXZlZC02IFwKKwktZmNhbGwtc2F2ZWQtNyAtZmNhbGwtc2F2ZWQtOCAtZmZpeGVkLTE1IC1mY2FsbC1zYXZlZC0xNiBcCisJLWZjYWxsLXNhdmVkLTE3IC1mY2FsbC1zYXZlZC0xOCAtZmNhbGwtc2F2ZWQtMTkgLWZjYWxsLXNhdmVkLTIwIFwKKwktZmNhbGwtc2F2ZWQtMjEgLWZjYWxsLXNhdmVkLTIyIC1mZml4ZWQtMjMgLWZjYWxsLXNhdmVkLTI0IFwKKwktZmZpeGVkLTI1IC1mZml4ZWQtMjcKKworZGl2LW9ianMgOj0gX19kaXZxdS5vIF9fcmVtcXUubyBfX2RpdnEubyBfX3JlbXEubworZGl2LW9ianMgKz0gX19kaXZsdS5vIF9fcmVtbHUubyBfX2RpdmwubyBfX3JlbWwubwora2xpYi15ICs9ICQoZGl2LW9ianMpCisKK3F1aWV0X2NtZF9yZWdzd2FwID0gUkVHU1dBUCAkQAorICAgICAgY21kX3JlZ3N3YXAgPSBzZWQgLWUgJ3MvXCQkMFxiLyQkMjcvZycgIC1lICdzL1wkJDI0XGIvJCQ5OS9nJyBcCisgICAgICAgICAgICAgICAgICAgICAgICAtZSAncy9cJCQxNlxiLyQkMjQvZycgLWUgJ3MvXCQkMTdcYi8kJDI1L2cnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzL1wkJDI2XGIvJCQyMy9nJyAtZSAncy9cJCQ5OVxiLyQkMTYvZycgPCAkPCA+ICRACisKKyMgVXNlIHN0YXRpYyBwYXR0ZXJuIHJ1bGUgdG8gYXZvaWQgdXNpbmcgYSB0ZW1wb3JhcnkgZmlsZQorJChhZGRwcmVmaXggJChvYmopLywkKGRpdi1vYmpzOi5vPS5TKSk6ICQob2JqKS8lLlM6ICQob2JqKS8lLnNzCisJJChjYWxsIGlmX2NoYW5nZWQscmVnc3dhcCkKKworcXVpZXRfY21kX2dlbnNzID0gRElWLUNDICAkQAorICAgICAgY21kX2dlbnNzID0gJChDQykgJChESVZDRkxBR1MpICQoRklMRV9DRkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1ETkFNRT0kKGJhc2VuYW1lICQobm90ZGlyICRAKSkgLVMgLW8gJEAgJDwKKworJChvYmopLyUuc3M6ICQob2JqKS9kaXZpZGUuYworCSQoY2FsbCBpZl9jaGFuZ2VkLGdlbnNzKQorCiskKG9iaikvX19kaXZxdS5zczogRklMRV9DRkxBR1MgOj0gLURTSUdORUQ9MCAtRFJFTT0wIC1EQklUUz02NAorJChvYmopL19fcmVtcXUuc3M6IEZJTEVfQ0ZMQUdTIDo9IC1EU0lHTkVEPTAgLURSRU09MSAtREJJVFM9NjQKKyQob2JqKS9fX2RpdnEuc3M6ICBGSUxFX0NGTEFHUyA6PSAtRFNJR05FRD0xIC1EUkVNPTAgLURCSVRTPTY0CiskKG9iaikvX19yZW1xLnNzOiAgRklMRV9DRkxBR1MgOj0gLURTSUdORUQ9MSAtRFJFTT0xIC1EQklUUz02NAorJChvYmopL19fZGl2bHUuc3M6IEZJTEVfQ0ZMQUdTIDo9IC1EU0lHTkVEPTAgLURSRU09MCAtREJJVFM9MzIKKyQob2JqKS9fX3JlbWx1LnNzOiBGSUxFX0NGTEFHUyA6PSAtRFNJR05FRD0wIC1EUkVNPTEgLURCSVRTPTMyCiskKG9iaikvX19kaXZsLnNzOiAgRklMRV9DRkxBR1MgOj0gLURTSUdORUQ9MSAtRFJFTT0wIC1EQklUUz0zMgorJChvYmopL19fcmVtbC5zczogIEZJTEVfQ0ZMQUdTIDo9IC1EU0lHTkVEPTEgLURSRU09MSAtREJJVFM9MzIKKwordGFyZ2V0cyAgICAgKz0gJChkaXYtb2Jqczoubz0uUykgJChkaXYtb2Jqczoubz0uc3MpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hbHBoYS9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RjNjFhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvTUNPTkZJRwpAQCAtMCwwICsxLDE2IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9hbHBoYS9NQ09ORklHCisjCisjIEJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCisjCisKK0tMSUJDT1BURkxBR1MgKz0gLU9zCitLTElCQ0JJVFNJWkUgID0gNjQKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgNyBHQiAtIG5vcm1hbCBiaW5hcmllcyBzdGFydCBhdCA0LjUgR0IsIGFuZCB0aGUgc3RhY2sgaXMgYmVsb3cKKyMgdGhlIGJpbmFyeS4KK0tMSUJDU0hBUkVERkxBR1MJPSAtVHRleHQgMHgxYzAwMDAyMDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FscGhhL1JFQURNRS1nY2MgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9SRUFETUUtZ2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMDA1MmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9SRUFETUUtZ2NjCkBAIC0wLDAgKzEsMjIgQEAKKyAgIFRoZSBjdXJyZW50IEFscGhhIGNoaXBzIGRvbid0IHByb3ZpZGUgaGFyZHdhcmUgZm9yIGludGVnZXIKKyAgIGRpdmlzaW9uLiAgVGhlIEMgY29tcGlsZXIgZXhwZWN0cyB0aGUgZnVuY3Rpb25zCisKKyAgICAgICAgX19kaXZxdTogNjQtYml0IHVuc2lnbmVkIGxvbmcgZGl2aWRlCisgICAgICAgIF9fcmVtcXU6IDY0LWJpdCB1bnNpZ25lZCBsb25nIHJlbWFpbmRlcgorICAgICAgICBfX2RpdnEvX19yZW1xOiAgIHNpZ25lZCA2NC1iaXQKKyAgICAgICAgX19kaXZsdS9fX3JlbWx1OiB1bnNpZ25lZCAzMi1iaXQKKyAgICAgICAgX19kaXZsL19fcmVtbDogICBzaWduZWQgMzItYml0CisKKyAgIFRoZXNlIGFyZSBub3Qgbm9ybWFsIEMgZnVuY3Rpb25zOiBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgY2FsbGluZworICAgc2VxdWVuY2UsIHRoZXNlIGV4cGVjdCB0aGVpciBhcmd1bWVudHMgaW4gcmVnaXN0ZXJzIHQxMCBhbmQgdDExLCBhbmQKKyAgIHJldHVybiB0aGUgcmVzdWx0IGluIHQxMiAoYWthIHB2KS4gIFJlZ2lzdGVyIEFUIG1heSBiZSBjbG9iYmVyZWQKKyAgIChhc3NlbWJseSB0ZW1wb3JhcnkpLCBhbnl0aGluZyBlbHNlIG11c3QgYmUgc2F2ZWQuCisKKyAgIEZ1cnRoZXJtb3JlLCB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgaW4gdDkgaW5zdGVhZCBvZiByYS4KKworICAgTm9ybWFsIGZ1bmN0aW9uCURpdmlkZSBmdW5jdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tCisgICB2MCAoJDApCQl0MTIvcHYgKCQyNykKKyAgIGEwICgkMTYpCQl0MTAgKCQyNCkKKyAgIGExICgkMTcpCQl0MTEgKCQyNSkKKyAgIHJhICgkMjYpCQl0OSAoJDIzKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmJhYmIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9jcnQwLlMKQEAgLTAsMCArMSwyMiBAQAorIworIyBhcmNoL2FscGhhL2NydDAuUworIworCisJLnRleHQKKwkudHlwZQlfc3RhcnQsQGZ1bmN0aW9uCisJLmVudAlfc3RhcnQsIDAKKwkuZ2xvYmwJX3N0YXJ0Citfc3RhcnQ6CisJLmZyYW1lICAkMzAsIDAsICQyNiwgMAorCW1vdgkkMzEsICQxNQorCWJyCSQyOSwgMWYKKzE6CWxkZ3AJJDI5LCAwKCQyOSkKKwkucHJvbG9ndWUgMAorCisJbGRhCSQxNiwgMCgkMzApCQkjIEVMRiBkYXRhIHN0cnVjdHVyZQorCWxkYQkkMTcsIDAoJDApCQkjIGF0ZXhpdCBwb2ludGVyCisKKwlqc3IJJDI2LCBfX2xpYmNfaW5pdAorCisJLnNpemUJX3N0YXJ0LC4tX3N0YXJ0CisJLmVuZAlfc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FscGhhL2RpdmlkZS5jIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvZGl2aWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0MjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL2RpdmlkZS5jCkBAIC0wLDAgKzEsNTkgQEAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhc20vZ2VudHJhcC5oPgorI2luY2x1ZGUgPGFzbS9wYWwuaD4KKworI2lmIEJJVFMgPT0gNjQKK3R5cGVkZWYgdWludDY0X3QgdWludDsKK3R5cGVkZWYgaW50NjRfdCBzaW50OworI2Vsc2UKK3R5cGVkZWYgdWludDMyX3QgdWludDsKK3R5cGVkZWYgaW50MzJfdCBzaW50OworI2VuZGlmCisKKyNpZmRlZiBTSUdORUQKK3R5cGVkZWYgc2ludCB4aW50OworI2Vsc2UKK3R5cGVkZWYgdWludCB4aW50OworI2VuZGlmCisKK3hpbnQgTkFNRSh1aW50IG51bSwgdWludCBkZW4pCit7CisJdWludCBxdW90ID0gMCwgcWJpdCA9IDE7CisJaW50IG1pbnVzID0gMDsKKwl4aW50IHY7CisKKwlpZiAoZGVuID09IDApIHsKKwkJLyogVGhpcyBpcyByZWFsbHkgJDE2LCBidXQgJDE2IGFuZCAkMjQgYXJlIGV4Y2hhbmdlZCBieSBhIHNjcmlwdCAqLworCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGNhdXNlIGFzbSgiJDI0IikgPSBHRU5fSU5URElWOworCQlhc20gdm9sYXRpbGUgKCJjYWxsX3BhbCAlMCI6OiJpIiAoUEFMX2dlbnRyYXApLCAiciIoY2F1c2UpKTsKKwkJcmV0dXJuIDA7CS8qIElmIHRyYXAgcmV0dXJucy4uLiAqLworCX0KKyNpZiBTSUdORUQKKwlpZiAoKHNpbnQpIChudW0gXiBkZW4pIDwgMCkKKwkJbWludXMgPSAxOworCWlmICgoc2ludCkgbnVtIDwgMCkKKwkJbnVtID0gLW51bTsKKwlpZiAoKHNpbnQpIGRlbiA8IDApCisJCWRlbiA9IC1kZW47CisjZW5kaWYKKworCS8qIExlZnQtanVzdGlmeSBkZW5vbWluYXRvciBhbmQgY291bnQgc2hpZnQgKi8KKwl3aGlsZSAoKHNpbnQpIGRlbiA+PSAwKSB7CisJCWRlbiA8PD0gMTsKKwkJcWJpdCA8PD0gMTsKKwl9CisKKwl3aGlsZSAocWJpdCkgeworCQlpZiAoZGVuIDw9IG51bSkgeworCQkJbnVtIC09IGRlbjsKKwkJCXF1b3QgKz0gcWJpdDsKKwkJfQorCQlkZW4gPj49IDE7CisJCXFiaXQgPj49IDE7CisJfQorCisJdiA9ICh4aW50KSAoUkVNID8gbnVtIDogcXVvdCk7CisJaWYgKG1pbnVzKQorCQl2ID0gLXY7CisJcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hbHBoYS9waXBlLlMgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9waXBlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3MjQxMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL3BpcGUuUwpAQCAtMCwwICsxLDM4IEBACisjCisjIGFyY2gvYWxwaGEvcGlwZS5TCisjCisKKyMKKyMgcGlwZSgpIG9uIGFscGhhIHJldHVybnMgYm90aCBmaWxlIGRlc2NyaXB0b3JzIGluIHJlZ2lzdGVycyAtLQorIyAkMCAodjApIGFuZCAkMjAgKGE0KSByZXNwZWN0aXZlbHkuICBUaGlzIGlzIHVubGlrZSBhbnkgb3RoZXIgc3lzdGVtIGNhbGwsCisjIGFzIGZhciBhcyBJIGNhbiB0ZWxsLgorIworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKKwkudGV4dAorCS5hbGlnbgkzCisJLnR5cGUJcGlwZSwgQGZ1bmN0aW9uCisJLmVudAlwaXBlLCAwCisJLmdsb2JsCXBpcGUKK3BpcGU6CisJLmZyYW1lCXNwLDAscmEsMAorCWxkYQl2MCwgX19OUl9waXBlCisJY2FsbHN5cworCWJlcQlhMywgMWYKKwlicglwdiwgMmYJCQkjIHB2IDwtIHBjCisyOgorCWxkZ3AJZ3AsIDAocHYpCisJbGRhCWExLCBlcnJubworCWxkYQl2MCwgLTEoemVybykKKwlzdGwJYTMsIDAoYTEpCisJcmV0CXplcm8sKHJhKSwxCisxOgorCXN0bAl2MCwgMChhMCkKKwlsZGEJdjAsIDAKKwlzdGwJYTQsIDQoYTApCisJcmV0CXplcm8sKHJhKSwxCisKKwkuc2l6ZQlwaXBlLC4tcGlwZQorCS5lbmQJcGlwZQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYwNGJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvc2V0am1wLlMKQEAgLTAsMCArMSw3NSBAQAorIworIyBzZXRqbXAuUworIworCisjCisjIFRoZSBqbXBfYnVmIGxvb2tzIGxpa2U6CisjCisjCXMwLi41CisjCWZwCisjCXJhCisjCWdwCisjCXNwCisjCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCisJLnRleHQKKwkuYWxpZ24JMworCS50eXBlCXNldGptcCxAZnVuY3Rpb24KKwkuZW50CXNldGptcCwgMAorCS5nbG9ibAlzZXRqbXAKK3NldGptcDoKKwlsZGEJdjAsICAgMCh6ZXJvKQorCXN0cQlzMCwgICAwKGEwKQorCXN0cQlzMSwgICA4KGEwKQorCXN0cQlzMiwgIDE2KGEwKQorCXN0cQlzMywgIDI0KGEwKQorCXN0cQlzNCwgIDMyKGEwKQorCXN0cQlzNSwgIDQwKGEwKQorCXN0cQlmcCwgIDQ4KGEwKQorCXN0cQlyYSwgIDU2KGEwKQorCXN0cQlncCwgIDY0KGEwKQorCXN0cQlzcCwgIDcyKGEwKQorCXN0dAkkZjIsICA4MChhMCkKKwlzdHQJJGYzLCAgODgoYTApCisJc3R0CSRmNCwgIDk2KGEwKQorCXN0dAkkZjUsIDEwNChhMCkKKwlzdHQJJGY2LCAxMTIoYTApCisJc3R0CSRmNywgMTIwKGEwKQorCXN0dAkkZjgsIDEyOChhMCkKKwlzdHQJJGY5LCAxMzYoYTApCisJcmV0CXplcm8sKHJhKSwxCisKKwkuc2l6ZSBzZXRqbXAsLi1zZXRqbXAKKwkuZW5kIHNldGptcAorCisJLnR5cGUJbG9uZ2ptcCxAZnVuY3Rpb24KKwkuZW50CWxvbmdqbXAsIDAKKwkuZ2xvYmwJbG9uZ2ptcAorbG9uZ2ptcDoKKwltb3YJYTEsIHYwCisJbGRxCXMwLCAgIDAoYTApCisJbGRxCXMxLCAgIDgoYTApCisJbGRxCXMyLCAgMTYoYTApCisJbGRxCXMzLCAgMjQoYTApCisJbGRxCXM0LCAgMzIoYTApCisJbGRxCXM1LCAgNDAoYTApCisJbGRxCWZwLCAgNDgoYTApCisJbGRxCXJhLCAgNTYoYTApCisJbGRxCWdwLCAgNjQoYTApCisJbGRxCXNwLCAgNzIoYTApCisJbGR0CSRmMiwgIDgwKGEwKQorCWxkdAkkZjMsICA4OChhMCkKKwlsZHQJJGY0LCAgOTYoYTApCisJbGR0CSRmNSwgMTA0KGEwKQorCWxkdAkkZjYsIDExMihhMCkKKwlsZHQJJGY3LCAxMjAoYTApCisJbGR0CSRmOCwgMTI4KGEwKQorCWxkdAkkZjksIDEzNihhMCkKKwkvKiBXZSdyZSBib3VuZCB0byBnZXQgYSBtaXNwcmVkaWN0IGhlcmUsIGJ1dCBhdCBsZWFzdCBnaXZlIHVzCisJICAgYSBjaGFuY2UgdG8gZ2V0IHRoZSByZXR1cm4gc3RhY2sgYmFjayBpbiBzeW5jLi4uICovCisJcmV0CXplcm8sKHJhKSwxCisKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcAorCS5lbmQgbG9uZ2ptcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjllZjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNjYWxsLlMKQEAgLTAsMCArMSwyNiBAQAorIworIyBhcmNoL2FscGhhL3N5c2NhbGwuUworIworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworCS50ZXh0CisJLmFsaWduCTMKKwkudHlwZQlfX3N5c2NhbGxfY29tbW9uLEBmdW5jdGlvbgorCS5lbnQJX19zeXNjYWxsX2NvbW1vbiwgMAorCS5nbG9ibAlfX3N5c2NhbGxfY29tbW9uCitfX3N5c2NhbGxfY29tbW9uOgorCS5mcmFtZQlzcCwwLHJhLDAKKwljYWxsc3lzCisJYmVxCWEzLCAxZgorCWJyCXB2LCAyZgkJCSMgcHYgPC0gcGMKKzI6CisJbGRncAlncCwgMChwdikKKwlsZGEJYTEsIGVycm5vCisJc3RsCXYwLCAwKGExKQorCWxkYQl2MCwgLTEoemVybykKKzE6CisJcmV0CXplcm8sKHJhKSwxCisKKwkuc2l6ZQlfX3N5c2NhbGxfY29tbW9uLC4tX19zeXNjYWxsX2NvbW1vbgorCS5lbmQJX19zeXNjYWxsX2NvbW1vbgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvc3lzZHVhbC5TIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvc3lzZHVhbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTllMzcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNkdWFsLlMKQEAgLTAsMCArMSwzMyBAQAorIworIyBhcmNoL2FscGhhL3N5c2R1YWwuUworIworCisjCisjIFNvbWUgc3lzdGVtIGNhbGxzIGhhdmUgYW4gYWx0ZXJuYXRlIHJldHVybiB2YWx1ZSBpbiByMjAgKGE0KS4KKyMgVGhpcyBzeXN0ZW0gY2FsbCBzdHViIGlzIGZvciBzeXN0ZW0gY2FsbHMgd2hlcmUgdGhhdCBpcworIyB0aGUgInJlYWwiIHJldHVybiB2YWx1ZS4KKyMKKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKKwkudGV4dAorCS5hbGlnbgkzCisJLnR5cGUJX19zeXNjYWxsX2R1YWwxLEBmdW5jdGlvbgorCS5lbnQJX19zeXNjYWxsX2R1YWwxLCAwCisJLmdsb2JsCV9fc3lzY2FsbF9kdWFsMQorX19zeXNjYWxsX2R1YWwxOgorCS5mcmFtZQlzcCwwLHJhLDAKKwljYWxsc3lzCisJbW92CXYwLCBhNAorCWJlcQlhMywgMWYKKwlicglwdiwgMmYJCQkjIHB2IDwtIHBjCisyOgorCWxkZ3AJZ3AsIDAocHYpCisJbGRhCWExLCBlcnJubworCWxkYQl2MCwgLTEoemVybykKKwlzdGwJYTMsIDAoYTEpCisxOgorCXJldAl6ZXJvLChyYSksMQorCisJLnNpemUJX19zeXNjYWxsX2R1YWwxLC4tX19zeXNjYWxsX2R1YWwxCisJLmVuZAlfX3N5c2NhbGxfZHVhbDEKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FscGhhL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Yjk3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMzcgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvYWxwaGEvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworIyBPbiBBbHBoYSwgbW9zdCBzeXN0ZW0gY2FsbHMgZm9sbG93IHRoZSBzdGFuZGFyZCBjb252ZW50aW9uLCB3aXRoIHRoZQorIyBzeXN0ZW0gY2FsbCBudW1iZXIgaW4gcjAgKHYwKSwgcmV0dXJuIGFuIGVycm9yIHZhbHVlIGluIHIxOSAoYTMpIGFzCisjIHdlbGwgYXMgdGhlIHJldHVybiB2YWx1ZSBpbiByMCAodjApLgorIworIyBBIGZldyBzeXN0ZW0gY2FsbHMgYXJlIGR1YWwtcmV0dXJuIHdpdGggdGhlIHNlY29uZCByZXR1cm4gdmFsdWUgaW4KKyMgcjIwIChhNCkuCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgJHN0eXBlID0gJHN0eXBlIHx8ICdjb21tb24nOworICAgICRzdHlwZSA9ICdjb21tb24nIGlmICggJHN0eXBlIGVxICdkdWFsMCcgKTsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8bWFjaGluZS9hc20uaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50ZXh0XG4iOworICAgIHByaW50IE9VVCAiXHQudHlwZSAke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZW50XHQke2ZuYW1lfSwgMFxuIjsgIyBXaGF0IGlzIHRoaXM/CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCBPVVQgIlx0bGRhXHR2MCwgX19OUl8ke3NuYW1lfSh6ZXJvKVxuIjsKKyAgICBwcmludCBPVVQgIlx0YnIgX19zeXNjYWxsXyR7c3R5cGV9XG4iOworICAgIHByaW50IE9VVCAiXHQuc2l6ZVx0JHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0LmVuZFx0JHtmbmFtZX1cbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FybS9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9hcm0vS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDZiNmIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vS2J1aWxkCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIGFybQorIworCitrbGliLXkgOj0gc2V0am1wLm8gc3lzY2FsbC5vIHZmb3JrLm8gYWVhYmlfbm9uc2Vuc2UubworCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdm1vZHNpNC5vIC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fbW9kZGkzLm8gICAgIC4uLy4uL2xpYmdjYy9fX3VkaXZkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3Vtb2RkaTMubyAgICAuLi8uLi9saWJnY2MvX191ZGl2bW9kZGk0Lm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19jbHpzaTIubworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FybS9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvYXJtL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4YmEwMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FybS9NQ09ORklHCkBAIC0wLDAgKzEsMzUgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL2FybS9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworQ1BVX0FSQ0ggOj0gYXJtdjQKK0NQVV9UVU5FIDo9IHN0cm9uZ2FybQorCitLTElCQ09QVEZMQUdTICs9IC1PcyAtbWFyY2g9JChDUFVfQVJDSCkgLW10dW5lPSQoQ1BVX1RVTkUpCitLTElCQ0JJVFNJWkUgID0gMzIKK0tMSUJDUkVRRkxBR1MgKz0gLWZuby1leGNlcHRpb25zCitLTElCQ1NUUklQRkxBR1MgKz0gLVIgLkFSTS5leGlkeAorCitpZmVxICgkKENPTkZJR19LTElCQ19USFVNQikseSkKK0NQVV9BUkNIIDo9ICQoQ1BVX0FSQ0gpdAorS0xJQkNSRVFGTEFHUyArPSAtbXRodW1iCitLTElCQ0xERkxBR1MgICs9IC0tdGh1bWItZW50cnkgX3N0YXJ0CitLTElCQ0VNQUlOICAgICA9IC0tdGh1bWItZW50cnkgX3N0YXJ0CitLTElCQ1JFUUZMQUdTICs9IC1tYWJpPWFhcGNzLWxpbnV4CitLTElCQ1NIQVJFREZMQUdTID0gLVR0ZXh0IDB4MzgwMjAwCitlbHNlCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorS0xJQkNTSEFSRURGTEFHUyA9IC1UdGV4dCAweDAxODAwMjAwCitpZmVxICgkKENPTkZJR19BRUFCSSkseSkKK0tMSUJDUkVRRkxBR1MgKz0gLW1hYmk9YWFwY3MtbGludXggLW1uby10aHVtYi1pbnRlcndvcmsKK2Vsc2UKK0tMSUJDUkVRRkxBR1MgKz0gLW1hYmk9YXBjcy1nbnUgLW1uby10aHVtYi1pbnRlcndvcmsKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYXJtL19fbXVsZGkzLmMgYi91c3Iva2xpYmMvYXJjaC9hcm0vX19tdWxkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRlYjJiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYXJtL19fbXVsZGkzLmMKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1aW50NjRfdCBfX211bGRpMyh1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworCXVpbnQzMl90IGFsID0gKHVpbnQzMl90KWE7CisJdWludDMyX3QgYWggPSAodWludDMyX3QpKGEgPj4gMzIpOworCXVpbnQzMl90IGJsID0gKHVpbnQzMl90KWI7CisJdWludDMyX3QgYmggPSAodWludDMyX3QpKGIgPj4gMzIpOworCXVpbnQ2NF90IHY7CisKKwl2ID0gKHVpbnQ2NF90KWFsICogYmw7CisJdiArPSAodWludDY0X3QpKGFsKmJoK2FoKmJsKSA8PCAzMjsKKworCXJldHVybiB2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYXJtL2FlYWJpX25vbnNlbnNlLlMgYi91c3Iva2xpYmMvYXJjaC9hcm0vYWVhYmlfbm9uc2Vuc2UuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjllYjExCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYXJtL2FlYWJpX25vbnNlbnNlLlMKQEAgLTAsMCArMSw5IEBACisJLnRleHQKKwkuZ2xvYmwJX19hZWFiaV91bndpbmRfY3BwX3ByMAorX19hZWFiaV91bndpbmRfY3BwX3ByMDoKKwkuZ2xvYmwJX19hZWFiaV91bndpbmRfY3BwX3ByMQorX19hZWFiaV91bndpbmRfY3BwX3ByMToKKwkuZ2xvYmwJX19hZWFiaV91bndpbmRfY3BwX3ByMgorX19hZWFiaV91bndpbmRfY3BwX3ByMjoKKwkuZ2xvYmwJX19hZWFiaV91bndpbmRfY3BwX3ByMworX19hZWFiaV91bndpbmRfY3BwX3ByMzoKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FybS9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9hcm0vY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODFmOGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vY3J0MC5TCkBAIC0wLDAgKzEsMjMgQEAKKyMKKyMgYXJjaC9hcm0vY3J0MC5TCisjCisjIHZvaWQgX3N0YXJ0KHZvaWQpCisjIHsKKyMgICAgX19saWJjX2luaXQoZWxmX3N0cnVjdHVyZSwgYXRleGl0X3B0cik7CisjIH0KKyMKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLnR5cGUgX3N0YXJ0LCNmdW5jdGlvbgorCS5nbG9ibCBfc3RhcnQKKworI2lmZGVmIF9fdGh1bWJfXworCS50aHVtYl9mdW5jCisjZW5kaWYKKworX3N0YXJ0Ogltb3YJcjAsIHNwCisJbW92CXIxLCAjMAorCWJsCV9fbGliY19pbml0CisKKwkuc2l6ZSBfc3RhcnQsLi1fc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FybS9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL2FybS9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjMyNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYXJtL3NldGptcC5TCkBAIC0wLDAgKzEsMTAyIEBACisjCisjIGFyY2gvYXJtL3NldGptcC5TCisjCisjIHNldGptcC9sb25nam1wIGZvciB0aGUgQVJNIGFyY2hpdGVjdHVyZQorIworCisjaWZuZGVmCV9fdGh1bWJfXworCisjCisjICJQdXJlIEFSTSIgdmVyc2lvbgorIworIyBUaGUgam1wX2J1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZywgaW4gb3JkZXI6CisjCQlyNAorIwkJcjUKKyMJCXI2CisjCQlyNworIwkJcjgKKyMJCXI5CisjCQlyMTAKKyMJCWZwCisjCQlzcAorIwkJbHIKKyMKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLmdsb2JsIHNldGptcAorCS50eXBlIHNldGptcCwgI2Z1bmN0aW9uCitzZXRqbXA6CisJc3RtaWEJcjAsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIGZwLCBzcCwgbHJ9CisJbW92CXIwLCAjMAorCW1vdglwYywgbHIKKwkuc2l6ZSBzZXRqbXAsLi1zZXRqbXAKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCAjZnVuY3Rpb24KK2xvbmdqbXA6CisJbGRtaWEJcjAsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIGZwLCBzcCwgbHJ9CisJbW92CXIwLCByMQorCW1vdglwYywgbHIKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcAorCisjZWxzZSAvKiBfX3RodW1iX18gKi8KKworIworIyBUaHVtYiB2ZXJzaW9uCisjCisjIFRoZSBqbXBfYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyMJCWxyCisjCQlyNAorIwkJcjUKKyMJCXI2CisjCQlyNworIwkJcjgKKyMJCXI5CisjCQlyMTAKKyMJCWZwCisjCQlzcAorIworCisJLnRleHQKKwkuYmFsaWduIDQKKwkuZ2xvYmwgc2V0am1wCisJLnR5cGUgc2V0am1wLCAjZnVuY3Rpb24KKwkudGh1bWJfZnVuYworc2V0am1wOgorCW1vdglyMywgbHIKKwlzdG1pYQlyMCEsIHtyMywgcjQsIHI1LCByNiwgcjd9CisJbW92CXIzLCByOAorCW1vdglyNCwgcjkKKwltb3YJcjUsIHIxMAorCW1vdglyNiwgZnAKKwltb3YJcjcsIHNwCisJc3RtaWEJcjAhLCB7cjMsIHI0LCByNSwgcjYsIHI3fQorCW1vdglyMCwgIzAKKwltb3YJcGMsIGxyCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5iYWxpZ24gNAorCS5nbG9ibCBsb25nam1wCisJLnR5cGUgbG9uZ2ptcCwgI2Z1bmN0aW9uCisJLnRodW1iX2Z1bmMKK2xvbmdqbXA6CisJbW92CXIyLCByMAorCWFkZAlyMCwgIzUqNAorCWxkbWlhCXIwISwge3IzLCByNCwgcjUsIHI2LCByN30KKwltb3YJcjgsIHIzCisJbW92CXI5LCByNAorCW1vdglyMTAsIHI1CisJbW92CWZwLCByNgorCW1vdglzcCwgcjcKKwlsZG1pYQlyMiEsIHtyMywgcjQsIHI1LCByNiwgcjd9CisJbW92CXIwLCByMQorCWJuZQkxZgorCW1vdglyMCwgIzEKKzE6CW1vdglwYywgcjMKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcAorCisjZW5kaWYgLyogX190aHVtYl9fICovCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hcm0vc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvYXJtL3N5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWIwNGUyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYXJtL3N5c2NhbGwuUwpAQCAtMCwwICsxLDY1IEBACisvKgorICogYXJjaC9hcm0vc3lzY2FsbC5TCisgKgorICogU3lzdGVtIGNhbGwgY29tbW9uIGhhbmRsaW5nCisgKi8KKworCS50eXBlCV9fc3lzY2FsbF9jb21tb24sI2Z1bmN0aW9uCisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KKyNpZm5kZWYgX190aHVtYl9fCisJLyogQVJNIHZlcnNpb24gLSB0aGlzIGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2ksIHVubGVzcworCSAgIHdlIGFyZSBjb21waWxlZCBpbiBFQUJJIG1vZGUgKi8KKworCS5iYWxpZ24JNAorX19zeXNjYWxsX2NvbW1vbjoKKyNpZmRlZiBfX0FSTV9FQUJJX18KKwlsZHIJcjQsIFtzcCwjMTZdCisJbGRyCXI1LCBbc3AsIzIwXQorCWxkcglyNywgW2xyXQorCXN3aQkwCisjZW5kaWYKKyAgICAgICAgY21uICAgICByMCwgIzQwOTYKKyAgICAgICAgcnNiY3MJcjIsIHIwLCAjMAorICAgICAgICBsZHJjcwlyMywgMWYKKyAgICAgICAgbXZuY3MJcjAsICMwCisgICAgICAgIHN0cmNzCXIyLCBbcjNdCisjaWZkZWYgX19BUk1fRUFCSV9fCisJbGRtZmQJc3AhLHtyNCxyNSxyNyxwY30KKyNlbHNlCisJbGRtZmQJc3AhLHtyNCxyNSxwY30KKyNlbmRpZgorCisJLmJhbGlnbiA0CisxOgorCS53b3JkCWVycm5vCisKKyNlbHNlCisJLyogVGh1bWIgdmVyc2lvbiAtIG11c3Qgc3RpbGwgbG9hZCByNCBhbmQgcjUgYW5kIHJ1biBzd2kgKi8KKworCS50aHVtYl9mdW5jCisJLmJhbGlnbgkyCitfX3N5c2NhbGxfY29tbW9uOgorCW1vdglyNywgbHIKKwlsZHIJcjQsIFtzcCwjMTZdCisJc3ViCXI3LCAjMQkJLyogUmVtb3ZlIHRoZSBUaHVtYiBiaXQgKi8KKwlsZHIJcjUsIFtzcCwjMjBdCisJbGRyaAlyNywgW3I3XQorCXN3aQkwCisJbGRyCXIxLCAyZgorCWNtcAlyMCwgcjEKKwliY2MJMWYKKwlsZHIJcjEsIDNmCisJbmVnCXIyLCByMAorCW1vdglyMCwgIzEKKwlzdHIJcjIsIFtyMV0KKwluZWcJcjAsIHIwCisxOgorCXBvcAl7cjQscjUscjcscGN9CisKKwkuYmFsaWduCTQKKzI6CisJLndvcmQJLTQwOTUKKzM6CisJLndvcmQJZXJybm8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hcm0vc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL2FybS9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWFjZTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vc3lzc3R1Yi5waApAQCAtMCwwICsxLDU4IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL2FybS9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgIE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgIE9VVCAiI2luY2x1ZGUgPGtsaWJjL2FzbW1hY3Jvcy5oPlxuIjsKKworICAgIHByaW50ICBPVVQgIgkudGV4dFxuIjsKKyAgICBwcmludCAgT1VUICIJLnR5cGUJJHtmbmFtZX0sICNmdW5jdGlvblxuIjsKKyAgICBwcmludCAgT1VUICIJLmdsb2JsCSR7Zm5hbWV9XG4iOworCisgICAgcHJpbnQgIE9VVCAiI2lmbmRlZiBfX3RodW1iX19cbiI7CisKKyAgICBwcmludCAgT1VUICIjaWZuZGVmIF9fQVJNX0VBQklfX1xuIjsKKworICAgICMgQVJNIHZlcnNpb24gZmlyc3QKKyAgICBwcmludCAgT1VUICIJLmJhbGlnbgk0XG4iOworICAgIHByaW50ICBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCAgT1VUICIJc3RtZmQJc3AhLHtyNCxyNSxscn1cbiI7CisgICAgcHJpbnQgIE9VVCAiCWxkcglyNCxbc3AsIzEyXVxuIjsKKyAgICBwcmludCAgT1VUICIJbGRyCXI1LFtzcCwjMTZdXG4iOworICAgIHByaW50ICBPVVQgIglzd2kJIyBfX05SXyR7c25hbWV9XG4iOworICAgIHByaW50ICBPVVQgIgliCV9fc3lzY2FsbF9jb21tb25cbiI7CisKKyAgICBwcmludCAgT1VUICIjZWxzZSAvKiBfX0FSTV9FQUJJX18gKi9cbiI7CisKKyAgICAjIEFSTSBFQUJJIHZlcnNpb24KKyAgICBwcmludCAgb3V0ICIJLmJhbGlnbgk0XG4iOworICAgIHByaW50ICBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCAgT1VUICIJc3RtZmQJc3AhLHtyNCxyNSxyNyxscn1cbiI7CisgICAgcHJpbnQgIE9VVCAiCWJsCV9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgIE9VVCAiCS53b3JkCV9fTlJfJHtzbmFtZX1cbiI7CisKKyAgICBwcmludCAgT1VUICIjZW5kaWYgLyogX19BUk1fRUFCSV9fICovXG4iOworICAgIHByaW50ICBPVVQgIiNlbHNlIC8qIF9fdGh1bWJfXyAqL1xuIjsKKworICAgICMgVGh1bWIgdmVyc2lvbgorICAgIHByaW50ICBPVVQgIgkuYmFsaWduCThcbiI7CisgICAgcHJpbnQgIE9VVCAiCS50aHVtYl9mdW5jXG4iOworICAgIHByaW50ICBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCAgT1VUICIJcHVzaAl7cjQscjUscjcsbHJ9XG4iOworICAgIHByaW50ICBPVVQgIglibAlfX3N5c2NhbGxfY29tbW9uXG4iOworICAgIHByaW50ICBPVVQgIgkuc2hvcnQJX19OUl8ke3NuYW1lfVxuIjsKKworICAgIHByaW50ICBPVVQgIiNlbmRpZiAvKiBfX3RodW1iX18qL1xuIjsKKworICAgIHByaW50ICBPVVQgIgkuc2l6ZQlfX3N5c2NhbGwke2l9LC4tX19zeXNjYWxsJHtpfVxuIjsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FybS92Zm9yay5TIGIvdXNyL2tsaWJjL2FyY2gvYXJtL3Zmb3JrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZDlmNzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vdmZvcmsuUwpAQCAtMCwwICsxLDYwIEBACisvKgorICogYXJjaC9hcm0vdmZvcmsuUworICoKKyAqIHZmb3JrIC0gbmFzdHkgc3lzdGVtIGNhbGwgd2hpY2ggbXVzdCBub3QgdXNlIHRoZSBzdGFjay4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnR5cGUJdmZvcmssI2Z1bmN0aW9uCisJLmdsb2JsCXZmb3JrCisjaWZuZGVmIF9fdGh1bWJfXworCisJLmJhbGlnbgk0Cit2Zm9yazoKKyNpZmRlZglfX0FSTV9FQUJJX18KKwltb3YJcjMsIHI3CisJbW92CXI3LCAjIF9fTlJfdmZvcmsKKwlzd2kJMAorCW1vdglyNywgcjMKKyNlbHNlCisJc3dpCSMgX19OUl92Zm9yaworI2VuZGlmCisgICAgICAgIGNtbiAgICAgcjAsICM0MDk2CisgICAgICAgIHJzYmNzCXIyLCByMCwgIzAKKyAgICAgICAgbGRyY3MJcjMsIDFmCisgICAgICAgIG12bmNzCXIwLCAjMAorICAgICAgICBzdHJjcwlyMiwgW3IzXQorCW1vdglwYywgbHIKKworCS5iYWxpZ24gNAorMToKKwkud29yZAllcnJubworCisjZWxzZQorCisJLnRodW1iX2Z1bmMKKwkuYmFsaWduCTIKK3Zmb3JrOgorCW1vdglyMywgcjcKKwltb3YJcjcsICMgX19OUl92Zm9yaworCXN3aQkwCisJbW92CXI3LCByMworCWxkcglyMSwgMmYKKwljbXAJcjAsIHIxCisJYmNjCTFmCisJbGRyCXIxLCAzZgorCW5lZwlyMiwgcjAKKwltb3YJcjAsICMxCisJc3RyCXIyLCBbcjFdCisJbmVnCXIwLCByMAorMToKKwltb3YJcGMsIGxyCisKKwkuYmFsaWduCTQKKzI6CisJLndvcmQJLTQwOTUKKzM6CisJLndvcmQJZXJybm8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9jcmlzL0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL2NyaXMvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2VlZWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL0tidWlsZApAQCAtMCwwICsxLDI4IEBACisjCisjIGtsaWJjIGZpbGVzIGZvcmEgY3JpcworIworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KKwora2xpYi15ICs9IF9fbmVnZGkyLm8gc2V0am1wLm8gc3lzY2FsbC5vIHZmb3JrLm8KKwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vICAgICAuLi8uLi9saWJnY2MvX19tb2RkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZkaTMubyAgICAuLi8uLi9saWJnY2MvX191bW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2bW9kZGk0Lm8KKworIyBEaXZpZGUgc3VwcG9ydAora2xpYi15IDo9IF9fVW1vZC5vIF9fVWRpdi5vIF9fTW9kLm8gX19EaXYubworCitxdWlldF9jbWRfY2MtZGl2ID0gRElWLUNDICAkQAorICAgICAgY21kX2NjLWRpdiA9ICQoS0xJQkNDKSAkKGtsaWJjY2ZsYWdzKSAtYyAtbyAkQCAkPAorCisKKyQob2JqKS9fX1Vtb2QubzogJChzcmMpL2RpdmlkZS5jCitLTElCQ0NGTEFHU19fX1Vtb2QubyA6PSAtRFNJR05FRD0wIC1EUkVNPTEgLURCSVRTPTMyIC1ETkFNRT1fX1Vtb2QKKyQob2JqKS9fX1VkaXYubzogJChzcmMpL2RpdmlkZS5jCitLTElCQ0NGTEFHU19fX1VkaXYubyA6PSAtRFNJR05FRD0wIC1EUkVNPTAgLURCSVRTPTMyIC1ETkFNRT1fX1VkaXYKKyQob2JqKS9fX01vZC5vOiAkKHNyYykvZGl2aWRlLmMKK0tMSUJDQ0ZMQUdTX19fTW9kLm8gIDo9IC1EU0lHTkVEPTEgLURSRU09MSAtREJJVFM9MzIgLUROQU1FPV9fTW9kCiskKG9iaikvX19EaXYubzogJChzcmMpL2RpdmlkZS5jCitLTElCQ0NGTEFHU19fX0Rpdi5vICA6PSAtRFNJR05FRD0xIC1EUkVNPTAgLURCSVRTPTMyIC1ETkFNRT1fX0RpdgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvY3Jpcy9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmZlNzMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL01DT05GSUcKQEAgLTAsMCArMSwyNiBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvY3Jpcy9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNPUFRGTEFHUyArPSAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIKK0tMSUJDQklUU0laRSAgPSAzMgorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyAyMjQgTUIgLSBub3JtYWwgYmluYXJpZXMgc3RhcnQgYXQgMAorIyAobGliPylnY2Mgb24gY3JpcyBzZWVtcyB0byBpbnNpc3Qgb24gcHJvZHVjaW5nIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucworS0xJQkNTSEFSRURGTEFHUyAgICAgPSAtLXNlY3Rpb24tc3RhcnQgLmluaXQ9MHgwZTAwMDEwMAorCisjIFRoZSBDUklTIGNvbXBpbGVyIG5lZWRzIGFuIC1pcHJlZml4IHRvIGZpbmQgbGliZ2NjIGluY2x1ZGVzIHdoZW4KKyMgbm9zdGRpbmMgaXMgdXNlZC4gSXQgYWxzbyBuZWVkcyAtbWxpbnV4IHRvIGNvbXBpbGUgbGludXggYXBwbGljYXRpb25zLgorSU5DTFVERV9QUkVGSVggID0gJChzaGVsbCAkKENDKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSB8IHNlZCAtZSBzL2xpYmdjYy5hLy8pCitLTElCQ0FSQ0hSRVFGTEFHUyA9IC1pcHJlZml4ICQoSU5DTFVERV9QUkVGSVgpIC1tbGludXgKKworIyBTcGVjaWFsIGZsYWdzIG5lZWRlZCBmb3IgbGlua2luZworS0xJQkNMREZMQUdTIAkrPSAtbWNyaXNsaW51eApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvY3Jpcy9fX25lZ2RpMi5TIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9fX25lZ2RpMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjY2E5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL19fbmVnZGkyLlMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIGFyY2gvY3Jpcy9fX25lZ2RpMi5jCisgKi8KKworLyoKKyAqIEluIDIncyBjb21wbGVtZW50IGFyaXRobWV0cmljLCAteCA9PSAofnggKyAxKSwgc28KKyAqIC17aCxsfSA9ICh+e2gsbH0gKyB7MCwxKQorICogLXtoLGx9ID0ge35oLH5sfSArIHswLDF9CisgKiAte2gsbH0gPSB7fmggKyBjeSwgfmwgKyAxfQorICogLi4uIHdoZXJlIGN5ID0gKGwgPT0gMCkKKyAqIC17aCxsfSA9IHt+aCArIGN5LCAtbH0KKyAqLworCisJLnRleHQKKwkuYmFsaWduIDQKKwkudHlwZQlfX25lZ2RpMixAZnVuY3Rpb24KKwkuZ2xvYmwJX19uZWdkaTIKK19fbmVnZGkyOgorCW5lZy5kCSRyMTAsJHIxMAorCXNlcQkkcjEyCisJbm90CSRyMTEKKwlyZXQKKwkgIGFkZC5kCSRyMTIsJHIxMQorCisJLnNpemUgX19uZWdkaTIsIC4tX19uZWdkaTIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2NyaXMvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjYjliNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvY3J0MC5TCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgYXJjaC9jcmlzL2NydDAuUworIworIyBEb2VzIGFyY2gtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gYW5kIGludm9rZXMgX19saWJjX2luaXQKKyMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorIworIyBTZWUgX19zdGF0aWNfaW5pdC5jIG9yIF9fc2hhcmVkX2luaXQuYyBmb3IgdGhlIGV4cGVjdGVkCisjIGFyZ3VtZW50cy4KKyMKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLnR5cGUJX3N0YXJ0LEBmdW5jdGlvbgorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwkvKiBTYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBFTEYgYXJndW1lbnQgYXJyYXkgKi8KKwltb3ZlLmQJJHNwLCRyMTAJLyogQWRkcmVzcyBvZiBFTEYgYXJndW1lbnRzICovCisKKwkvKiBhdGV4aXQoKSBmdW5jdGlvbiAoYXNzdW1lIG51bGwpICovCisJbW92ZXEJMCwkcjExCisKKwkvKiBTZXQgdXAgYSBkdW1teSBzdGFjayBmcmFtZSB0byBrZWVwIGdjYyBmcm9tIGdldHRpbmcgY29uZnVzZWQgKi8KKwlwdXNoCSRyMTEKKwlwdXNoCSRyMTEKKwlqdW1wCV9fbGliY19pbml0CisKKwkuc2l6ZSBfc3RhcnQsIC4tX3N0YXJ0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9jcmlzL2RpdmlkZS5jIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9kaXZpZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDRhYjIzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9kaXZpZGUuYwpAQCAtMCwwICsxLDk5IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZiBCSVRTID09IDY0Cit0eXBlZGVmIHVpbnQ2NF90IHVudW07Cit0eXBlZGVmIGludDY0X3Qgc251bTsKKyNlbHNlCit0eXBlZGVmIHVpbnQzMl90IHVudW07Cit0eXBlZGVmIGludDMyX3Qgc251bTsKKyNlbmRpZgorCisjaWZkZWYgU0lHTkVECit0eXBlZGVmIHNudW0geG51bTsKKyNlbHNlCit0eXBlZGVmIHVudW0geG51bTsKKyNlbmRpZgorCisjaWZkZWYgX19jcmlzX18KK3N0YXRpYyBpbmxpbmUgdW51bSBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKWRzdGVwKHVudW0gcnMsIHVudW0gcmQpCit7CisJYXNtKCJkc3RlcCAlMSwlMCI6ICIrciIocmQpOiJyIihycykpOworCXJldHVybiByZDsKK30KKworc3RhdGljIGlubGluZSB1bnVtIF9fYXR0cmlidXRlX18gKChjb25zdCkpbHoodW51bSBycykKK3sKKwl1bnVtIHJkOworCWFzbSgibHogJTEsJTAiOiAiPXIiKHJkKToiciIocnMpKTsKKwlyZXR1cm4gcmQ7Cit9CisKKyNlbHNlCisvKiBGb3IgdGVzdGluZyAqLworc3RhdGljIGlubGluZSB1bnVtIF9fYXR0cmlidXRlX18gKChjb25zdCkpZHN0ZXAodW51bSBycywgdW51bSByZCkKK3sKKwlyZCA8PD0gMTsKKwlpZiAocmQgPj0gcnMpCisJCXJkIC09IHJzOworCisJcmV0dXJuIHJkOworfQorCitzdGF0aWMgaW5saW5lIHVudW0gX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSlseih1bnVtIHJzKQoreworCXVudW0gcmQgPSAwOworCXdoaWxlIChycyA+PSAweDdmZmZmZmZmKSB7CisJCXJkKys7CisJCXJzIDw8PSAxOworCX0KKwlyZXR1cm4gcmQ7Cit9CisKKyNlbmRpZgorCit4bnVtIE5BTUUodW51bSBudW0sIHVudW0gZGVuKQoreworCXVudW0gcXVvdCA9IDAsIHFiaXQgPSAxOworCWludCBtaW51cyA9IDA7CisJeG51bSB2OworCisJaWYgKGRlbiA9PSAwKSB7CisJCXJhaXNlKFNJR0ZQRSk7CisJCXJldHVybiAwOwkvKiBJZiBzaWduYWwgaWdub3JlZC4uLiAqLworCX0KKworCWlmIChkZW4gPT0gMSkKKwkJcmV0dXJuICh4bnVtKSAoUkVNID8gMCA6IG51bSk7CisKKyNpZiBTSUdORUQKKwlpZiAoKHNudW0pIChudW0gXiBkZW4pIDwgMCkKKwkJbWludXMgPSAxOworCWlmICgoc251bSkgbnVtIDwgMCkKKwkJbnVtID0gLW51bTsKKwlpZiAoKHNudW0pIGRlbiA8IDApCisJCWRlbiA9IC1kZW47CisjZW5kaWYKKworCWRlbi0tOworCisJLyogTGVmdC1qdXN0aWZ5IGRlbm9taW5hdG9yIGFuZCBjb3VudCBzaGlmdCAqLworCXdoaWxlICgoc251bSkgZGVuID49IDApIHsKKwkJZGVuIDw8PSAxOworCQlxYml0IDw8PSAxOworCX0KKworCXdoaWxlIChxYml0KSB7CisJCWlmIChkZW4gPD0gbnVtKSB7CisJCQludW0gLT0gZGVuOworCQkJcXVvdCArPSBxYml0OworCQl9CisJCWRlbiA+Pj0gMTsKKwkJcWJpdCA+Pj0gMTsKKwl9CisKKwl2ID0gKHhudW0pIChSRU0gPyBudW0gOiBxdW90KTsKKwlpZiAobWludXMpCisJCXYgPSAtdjsKKwlyZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2NyaXMvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9jcmlzL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDFiODIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL3NldGptcC5TCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgYXJjaC9jcmlzL3NldGptcC5TCisjCisjIHNldGptcC9sb25nam1wIGZvciB0aGUgY3JpcyBhcmNoaXRlY3R1cmUKKyMKKworIworIyBUaGUgam1wX2J1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZywgaW4gb3JkZXI6CisjCSRyOC4uJHIwCShpbiB0aGF0IG9yZGVyKQorIwkkc3AJKCRyMTQpCisjCXJldHVybiBhZGRyZXNzCisjCisKKwkudGV4dAorCS5iYWxpZ24gNAorCS5nbG9ibAlzZXRqbXAKKwkudHlwZQlzZXRqbXAsIEBmdW5jdGlvbgorc2V0am1wOgorCW1vdmVtCSRyOCxbJHIxMCtdCQkvKiBTYXZlICRyOC4uJHIwIGF0ICRyMTAuLi4gKi8KKwltb3ZlLmQJJHNwLFskcjEwK10KKwltb3ZlCSRzcnAsWyRyMTBdCisJcmV0CisJICBtb3ZlcQkwLCRyMTAKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnRleHQKKwkuYmFsaWduIDQKKwkuZ2xvYmwJbG9uZ2ptcAorCS50eXBlCWxvbmdqbXAsIEBmdW5jdGlvbgorbG9uZ2ptcDoKKwltb3ZlbQlbJHIxMCtdLCRyOAkJLyogTG9hZCAkcjguLiRyMCBmcm9tICRyMTAuLi4gKi8KKwltb3ZlLmQJWyRyMTArXSwkc3AKKwlqdW1wCVskcjEwXQorCW1vdmUuZCAkcjExLCRyMTAKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9jcmlzL3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTQ5NWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL3N5c2NhbGwuUwpAQCAtMCwwICsxLDMwIEBACisvKgorICogYXJjaC9jcmlzL3N5c2NhbGwuUworICoKKyAqIE9uIGNyaXMsIHI5IGNvbnRhaW5zIHRoZSBzeXNjYWxsIG51bWJlciAoc2V0IGJ5IGdlbmVyYXRlZCBzdHViKTsKKyAqIHIxMC4ucjEzIGNvbnRhaW4gYXJndW1lbnRzIDAtMyBwZXIgdGhlIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbiwKKyAqIGFuZCBhcmd1bWVudHMgNC01IGFyZSBwYXNzZWQgaW4gJG1vZiBhbmQgJHNycDsgaG93ZXZlciwgd2UgaGF2ZQorICogdG8gc2F2ZSAkc3JwIGFyb3VuZCB0aGUgc3lzdGVtIGNhbGwuCisgKi8KKworCS5zZWN0aW9uICIudGV4dCIsImF4IgorCS5iYWxpZ24JNAorCS5nbG9ibAlfX3N5c2NhbGxfY29tbW9uCisJLnR5cGUJX19zeXNjYWxsX2NvbW1vbixAZnVuY3Rpb24KK19fc3lzY2FsbF9jb21tb246CisJcHVzaAkkc3JwCisJbW92ZQlbJHNwKzRdLCRtb2YKKwltb3ZlCVskc3ArOF0sJHNycAorCWJyZWFrCTEzCisKKwljbXBzLncJLTQwOTYsJHIxMAorCWJsbwkxZgorCW5lZy5kCSRyMTAsJHIxMQorCW1vdmUuZAkkcjExLFtlcnJub10KKwltb3ZlcQktMSwkcjEwCisxOgorCXBvcAkkc3JwCisJcmV0CisJbm9wCisKKwkuc2l6ZQlfX3N5c2NhbGxfY29tbW9uLC4tX19zeXNjYWxsX2NvbW1vbgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvY3Jpcy9zeXNzdHViLnBoIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmFkNzMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL3N5c3N0dWIucGgKQEAgLTAsMCArMSwyOSBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9jcmlzL3N5c3N0dWIucGgKKyMKKyMgU2NyaXB0IHRvIGdlbmVyYXRlIHN5c3RlbSBjYWxsIHN0dWJzCisjCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnRleHRcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlXHQke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmxcdCR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHQuYmFsaWduXHQ0XG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiI2lmIF9fTlJfJHtzbmFtZX0gPD0gMzFcbiI7CisgICAgcHJpbnQgT1VUICJcdCAgbW92ZXFcdF9fTlJfJHtzbmFtZX0sIFwkcjlcbiI7CisgICAgcHJpbnQgT1VUICIjZWxzZVxuIjsKKyAgICBwcmludCBPVVQgIlx0ICBtb3ZlLmRcdF9fTlJfJHtzbmFtZX0sIFwkcjlcbiI7CisgICAgcHJpbnQgT1VUICIjZW5kaWZcbiI7CisgICAgcHJpbnQgT1VUICJcdGp1bXBcdF9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5zaXplICR7Zm5hbWV9LC4tJHtmbmFtZX1cbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2NyaXMvdmZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvdmZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2RiMzZjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy92Zm9yay5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBhcmNoL2NyaXMvdmZvcmsuUworICoKKyAqIE9uIGNyaXMsIHI5IGNvbnRhaW5zIHRoZSBzeXNjYWxsIG51bWJlciAoc2V0IGJ5IGdlbmVyYXRlZCBzdHViKTsKKyAqIHIxMC4ucjEzIGNvbnRhaW4gYXJndW1lbnRzIDAtMyBwZXIgdGhlIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbi4KKyAqIFRoZSByZXR1cm4gYWRkcmVzcyBpcyBpbiAkc3JwOyBzbyB3ZSBqdXN0IG5lZWQgdG8gYXZvaWQgdGhlIHN0YWNrCisgKiB1c2FnZSBvZiB0aGUgbm9ybWFsIHN5c2NhbGwgc3R1YnMuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworCS5zZWN0aW9uICIudGV4dCIsImF4IgorCS5iYWxpZ24JNAorCS5nbG9ibAl2Zm9yaworCS50eXBlCXZmb3JrLEBmdW5jdGlvbgordmZvcms6CisJbW92ZS5kCV9fTlJfdmZvcmssICRyOQorCWJyZWFrCTEzCisKKwljbXBzLncJLTQwOTYsJHIxMAorCWJsbwkxZgorCW5lZy5kCSRyMTAsJHIxMQorCW1vdmUuZAkkcjExLFtlcnJub10KKwltb3ZlcQktMSwkcjEwCisxOgorCXJldAorCW5vcAorCisJLnNpemUJdmZvcmssLi12Zm9yawpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9pMzg2L0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM3YjNjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9LYnVpbGQKQEAgLTAsMCArMSwxNyBAQAorIworIyBrbGliYyAubyBmaWxlcyBmb3IgaTM4NgorIworCitrbGliLXkgOj0gc29ja2V0Y2FsbC5vIHNldGptcC5vIHN5c2NhbGwubyB2YXJzeXNjYWxsLm8KK2tsaWIteSArPSBvcGVuLm8gb3BlbmF0Lm8gdmZvcmsubwora2xpYi15ICs9IGxpYmdjYy9fX2FzaGxkaTMubyBsaWJnY2MvX19hc2hyZGkzLm8gbGliZ2NjL19fbHNocmRpMy5vCitrbGliLXkgKz0gbGliZ2NjL19fbXVsZGkzLm8gIGxpYmdjYy9fX25lZ2RpMi5vCisKK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19kaXZkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX21vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdmRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdm1vZGRpNC5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTEyYTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L01DT05GSUcKQEAgLTAsMCArMSwzMyBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvaTM4Ni9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworIyBFbmFibGUgdGhpcyB0byBjb21waWxlIHdpdGggcmVnaXN0ZXIgcGFyYW1ldGVyczsgb25seSBzYWZlIGZvcgorIyBnY2MgPj0gMworCitpZmVxICgkKENPTkZJR19SRUdQQVJNKSx5KQorUkVHUEFSTV9PUFQgOj0gLW1yZWdwYXJtPTMgLURfUkVHUEFSTT0zCitlbmRpZgorCitnY2NfYWxpZ25fb3B0aW9uICA6PSAkKGNhbGwgY2Mtb3B0aW9uLCBcCisJCS1mYWxpZ24tZnVuY3Rpb25zPTAgLWZhbGlnbi1qdW1wcz0wIC1mYWxpZ24tbG9vcHM9MCwgXAorCQktbWFsaWduLWZ1bmN0aW9ucz0wIC1tYWxpZ24tanVtcHM9MCAtbWFsaWduLWxvb3BzPTApCitnY2NfbTMyX29wdGlvbiAgOj0gJChjYWxsIGNjLW9wdGlvbiwgLW0zMiwgKQorCitLTElCQ09QVEZMQUdTICAgICArPSAtbWFyY2g9aTM4NiAtT3MgLWcgLWZvbWl0LWZyYW1lLXBvaW50ZXIgJChnY2NfYWxpZ25fb3B0aW9uKQorS0xJQkNMREZMQUdTICAgICAgPSAtbSBlbGZfaTM4NgorS0xJQkNSRVFGTEFHUwkgICs9ICQoUkVHUEFSTV9PUFQpCitLTElCQ0FSQ0hSRVFGTEFHUyArPSAkKGdjY19tMzJfb3B0aW9uKQorCitLTElCQ0JJVFNJWkUgID0gMzIKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgOTYgTUIgLSBub3JtYWwgYmluYXJpZXMgc3RhcnQgYXQgMTI4IE1CCitLTElCQ1NIQVJFREZMQUdTCT0gLVR0ZXh0IDB4MDYwMDAyMDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NjM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvY3J0MC5TCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgYXJjaC9pMzg2L2NydDAuUworIworIyBEb2VzIGFyY2gtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gYW5kIGludm9rZXMgX19saWJjX2luaXQKKyMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorIworIyBTZWUgX19zdGF0aWNfaW5pdC5jIG9yIF9fc2hhcmVkX2luaXQuYyBmb3IgdGhlIGV4cGVjdGVkCisjIGFyZ3VtZW50cy4KKyMKKworCS50ZXh0CisJLmFsaWduIDQKKwkudHlwZSBfc3RhcnQsQGZ1bmN0aW9uCisJLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCSMgU2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgRUxGIGFyZ3VtZW50IGFycmF5CisJbW92bCAlZXNwLCVlYXgJCSMgQWRkcmVzcyBvZiBFTEYgYXJndW1lbnRzCisJIyBTZXQgdXAgYSBmYXV4IHN0YWNrIGZyYW1lIGZvciB0aGUgYmVuZWZpdCBvZiBnZGIKKwl4b3JsICVlYnAsJWVicAorCXB1c2ggJWVicAkJIyBLZWVwIGdkYiBmcm9tIGdldHRpbmcgY29uZnVzZWQKKwlwdXNoICVlYnAJCSMgS2VlcCBnZGIgZnJvbSBnZXR0aW5nIGNvbmZ1c2VkCisJIyBQdXNoIHRoZSBhcmd1bWVudHMgYW5kIGNhbGxlZCBfX2xpYmNfaW5pdCgpCisjaWZuZGVmIF9SRUdQQVJNCisJcHVzaCAlZWR4CQkjIGF0ZXhpdCgpIGZ1bmN0aW9uCisJcHVzaCAlZWF4CQkjIEVMRiBhcnJheQorI2VuZGlmCisJY2FsbCBfX2xpYmNfaW5pdAorCSMgSWYgX19saWJjX2luaXQgcmV0dXJucywgcHJvYmxlbS4uLgorCWhsdAorCisJLnNpemUgX3N0YXJ0LCAuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19hc2hsZGkzLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2FzaGxkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQ0MTQyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19hc2hsZGkzLlMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19hc2hsZGkzLlMKKyAqCisgKiA2NC1iaXQgc2hsCisgKi8KKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIF9fYXNobGRpMworCS50eXBlIF9fYXNobGRpMyxAZnVuY3Rpb24KK19fYXNobGRpMzoKKyNpZm5kZWYgX1JFR1BBUk0KKwltb3ZsICA0KCVlc3ApLCVlYXgKKwltb3ZsICA4KCVlc3ApLCVlZHgKKwltb3ZiICAxMiglZXNwKSwlY2wKKyNlbmRpZgorCWNtcGIgICQzMiwlY2wKKwlqYWUgICAxZgorCisJc2hsZGwgJWNsLCVlYXgsJWVkeAorCXNobCAgICVjbCwlZWF4CisJcmV0CisKKzE6CisJeG9ybCAgJWVkeCwlZWR4CisJc2hsICAgJWNsLCVlYXgKKwl4Y2hnbCAlZWR4LCVlYXgKKwlyZXQKKworCS5zaXplIF9fYXNobGRpMywuLV9fYXNobGRpMwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19hc2hyZGkzLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2FzaHJkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY2ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19hc2hyZGkzLlMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19hc2hyZGkzLlMKKyAqCisgKiA2NC1iaXQgc2FyCisgKi8KKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIF9fYXNocmRpMworCS50eXBlIF9fYXNocmRpMyxAZnVuY3Rpb24KK19fYXNocmRpMzoKKyNpZm5kZWYgX1JFR1BBUk0KKwltb3ZsICA0KCVlc3ApLCVlYXgKKwltb3ZsICA4KCVlc3ApLCVlZHgKKwltb3ZiICAxMiglZXNwKSwlY2wKKyNlbmRpZgorCWNtcGIgICQzMiwlY2wKKwlqYWUgICAxZgorCisJc2hyZGwgJWNsLCVlZHgsJWVheAorCXNhcmwgICVjbCwlZWR4CisJcmV0CisKKzE6CisJc2FybCAgJWNsLCVlZHgKKwltb3ZsICAlZWR4LCVlYXgKKwljZHEKKwlyZXQKKworCS5zaXplIF9fYXNocmRpMywuLV9fYXNocmRpMwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19sc2hyZGkzLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2xzaHJkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTYzYzUyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19sc2hyZGkzLlMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19sc2hyZGkzLlMKKyAqCisgKiA2NC1iaXQgc2hyCisgKi8KKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIF9fbHNocmRpMworCS50eXBlIF9fbHNocmRpMyxAZnVuY3Rpb24KK19fbHNocmRpMzoKKyNpZm5kZWYgX1JFR1BBUk0KKwltb3ZsICA0KCVlc3ApLCVlYXgKKwltb3ZsICA4KCVlc3ApLCVlZHgKKwltb3ZiICAxMiglZXNwKSwlY2wKKyNlbmRpZgorCWNtcGIgICQzMiwlY2wKKwlqYWUgICAxZgorCisJc2hyZGwgJWNsLCVlZHgsJWVheAorCXNocmwgICVjbCwlZWR4CisJcmV0CisKKzE6CisJc2hybCAgJWNsLCVlZHgKKwl4b3JsICAlZWF4LCVlYXgKKwl4Y2hnbCAlZWR4LCVlYXgKKwlyZXQKKworCS5zaXplIF9fbHNocmRpMywuLV9fbHNocmRpMwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19tdWxkaTMuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fbXVsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyYzdjYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fbXVsZGkzLlMKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19tdWxkaTMuUworICoKKyAqIDY0KjY0ID0gNjQgYml0IHVuc2lnbmVkIG11bHRpcGxpY2F0aW9uCisgKi8KKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19tdWxkaTMKKwkudHlwZSBfX211bGRpMyxAZnVuY3Rpb24KK19fbXVsZGkzOgorCXB1c2ggICVlc2kKKyNpZm5kZWYgX1JFR1BBUk0KKwltb3ZsICA4KCVlc3ApLCVlYXgKKwltb3ZsICAlZWF4LCVlc2kKKwltb3ZsICAxNiglZXNwKSwlZWN4CisJbXVsbCAgJWVjeAorCWltdWxsIDEyKCVlc3ApLCVlY3gKKwlpbXVsbCAyMCglZXNwKSwlZXNpCisJYWRkbCAgJWVjeCwlZWR4CisJYWRkbCAgJWVzaSwlZWR4CisjZWxzZQorCW1vdmwgICVlYXgsJWVzaQorCXB1c2ggICVlZHgKKwltdWxsICAlZWN4CisJaW11bGwgOCglZXNwKSwlZXNpCisJYWRkbCAgJWVzaSwlZWR4CisJcG9wICAgJWVzaQorCWltdWxsICVlc2ksJWVjeAorCWFkZGwgICVlY3gsJWVkeAorI2VuZGlmCisJcG9wICAgJWVzaQorCXJldAorCS5zaXplIF9fbXVsZGkzLC4tX19tdWxkaTMKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fbmVnZGkyLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX25lZ2RpMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2FkOTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX25lZ2RpMi5TCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBhcmNoL2kzODYvbGliZ2NjL19fbmVnZGkyLlMKKyAqCisgKiA2NC1iaXQgbmVnYXRpb24KKyAqLworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBfX25lZ2RpMgorCS50eXBlIF9fbmVnZGkyLEBmdW5jdGlvbgorX19uZWdkaTI6CisjaWZuZGVmIF9SRUdQQVJNCisJbW92bCA0KCVlc3ApLCVlYXgKKwltb3ZsIDgoJWVzcCksJWVkeAorI2VuZGlmCisJbmVnbCAlZWR4CisJbmVnbCAlZWF4CisJc2JibCAkMCwlZWR4CisJcmV0CisKKwkuc2l6ZSBfX25lZ2RpMiwuLV9fbmVnZGkyCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L29wZW4uUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvb3Blbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDEzNmMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L29wZW4uUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L29wZW4uUworICoKKyAqIEhhbmRsZSB0aGUgb3BlbigpIHN5c3RlbSBjYWxsIC0gb2RkYmFsbCBkdWUgdG8gdGhlIHZhcmFkaWMKKyAqIHByb3RvdHlwZSwgd2hpY2ggZm9yY2VzIHRoZSB1c2Ugb2YgdGhlIGNkZWNsIGNhbGxpbmcgY29udmVudGlvbiwKKyAqIGFuZCB0aGUgbmVlZCBmb3IgT19MQVJHRUZJTEUuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworLyogPGFzbS9mY250bC5oPiwgZGVzcGl0ZSB0aGUgbmFtZSwgaXNuJ3QgYXNzZW1ibHktc2FmZSAqLworI2RlZmluZSBPX0xBUkdFRklMRSAgICAgMDEwMDAwMAorCisJLmdsb2JsCW9wZW4KKwkudHlwZQlvcGVuLEBmdW5jdGlvbgorCitvcGVuOgorI2lmZGVmIF9SRUdQQVJNCisJbW92bAk0KCVlc3ApLCVlYXgKKwltb3ZsCTgoJWVzcCksJWVkeAorCW1vdmwJMTIoJWVzcCksJWVjeAorCW9ybAkkT19MQVJHRUZJTEUsJWVkeAorI2Vsc2UKKwlvcmwJJE9fTEFSR0VGSUxFLDgoJWVzcCkKKyNlbmRpZgorCXB1c2hsCSRfX05SX29wZW4KKwlqbXAJX19zeXNjYWxsX2NvbW1vbgorCisJLnNpemUJb3BlbiwuLW9wZW4KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvb3BlbmF0LlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L29wZW5hdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmRmZTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L29wZW5hdC5TCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBhcmNoL2kzODYvb3BlbmF0LlMKKyAqCisgKiBIYW5kbGUgdGhlIG9wZW5hdCgpIHN5c3RlbSBjYWxsIC0gb2RkYmFsbCBkdWUgdG8gdGhlIHZhcmFkaWMKKyAqIHByb3RvdHlwZSwgd2hpY2ggZm9yY2VzIHRoZSB1c2Ugb2YgdGhlIGNkZWNsIGNhbGxpbmcgY29udmVudGlvbiwKKyAqIGFuZCB0aGUgbmVlZCBmb3IgT19MQVJHRUZJTEUuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworLyogPGFzbS9mY250bC5oPiwgZGVzcGl0ZSB0aGUgbmFtZSwgaXNuJ3QgYXNzZW1ibHktc2FmZSAqLworI2RlZmluZSBPX0xBUkdFRklMRSAgICAgMDEwMDAwMAorCisjaWZkZWYgX19OUl9vcGVuYXQJCS8qIERvbid0IGJ1aWxkIGlmIGtlcm5lbCBoZWFkZXJzIHRvbyBvbGQgKi8KKworCS5nbG9ibAlvcGVuYXQKKwkudHlwZQlvcGVuYXQsQGZ1bmN0aW9uCisKK29wZW5hdDoKKwlvcmwJJE9fTEFSR0VGSUxFLDEyKCVlc3ApCisJcHVzaGwJJF9fTlJfb3BlbmF0CisJam1wCV9fc3lzY2FsbF92YXJhZGljCisKKwkuc2l6ZQlvcGVuYXQsLi1vcGVuYXQKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY2NzkyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9zZXRqbXAuUwpAQCAtMCwwICsxLDU4IEBACisjCisjIGFyY2gvaTM4Ni9zZXRqbXAuUworIworIyBzZXRqbXAvbG9uZ2ptcCBmb3IgdGhlIGkzODYgYXJjaGl0ZWN0dXJlCisjCisKKyMKKyMgVGhlIGptcF9idWYgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyOgorIwklZWJ4CisjCSVlc3AKKyMJJWVicAorIwklZXNpCisjCSVlZGkKKyMJPHJldHVybiBhZGRyZXNzPgorIworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBzZXRqbXAKKwkudHlwZSBzZXRqbXAsIEBmdW5jdGlvbgorc2V0am1wOgorI2lmZGVmIF9SRUdQQVJNCisJbW92bCAlZWF4LCVlZHgKKyNlbHNlCisJbW92bCA0KCVlc3ApLCVlZHgKKyNlbmRpZgorCXBvcGwgJWVjeAkJCSMgUmV0dXJuIGFkZHJlc3MsIGFuZCBhZGp1c3QgdGhlIHN0YWNrCisJeG9ybCAlZWF4LCVlYXgJCQkjIFJldHVybiB2YWx1ZQorCW1vdmwgJWVieCwoJWVkeCkKKwltb3ZsICVlc3AsNCglZWR4KQkJIyBQb3N0LXJldHVybiAlZXNwIQorCXB1c2hsICVlY3gJCQkjIE1ha2UgdGhlIGNhbGwvcmV0dXJuIHN0YWNrIGhhcHB5CisJbW92bCAlZWJwLDgoJWVkeCkKKwltb3ZsICVlc2ksMTIoJWVkeCkKKwltb3ZsICVlZGksMTYoJWVkeCkKKwltb3ZsICVlY3gsMjAoJWVkeCkJCSMgUmV0dXJuIGFkZHJlc3MKKwlyZXQKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBsb25nam1wCisJLnR5cGUgbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorI2lmZGVmIF9SRUdQQVJNCisJeGNoZ2wgJWVheCwlZWR4CisjZWxzZQorCW1vdmwgNCglZXNwKSwlZWR4CQkjIGptcF9wdHIgYWRkcmVzcworCW1vdmwgOCglZXNwKSwlZWF4CQkjIFJldHVybiB2YWx1ZQorI2VuZGlmCisJbW92bCAoJWVkeCksJWVieAorCW1vdmwgNCglZWR4KSwlZXNwCisJbW92bCA4KCVlZHgpLCVlYnAKKwltb3ZsIDEyKCVlZHgpLCVlc2kKKwltb3ZsIDE2KCVlZHgpLCVlZGkKKwlqbXAgKjIwKCVlZHgpCisKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9zb2NrZXRjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L3NvY2tldGNhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDBjYzAyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9zb2NrZXRjYWxsLlMKQEAgLTAsMCArMSw1NSBAQAorIworIyBzb2NrZXRjYWxsLlMKKyMKKyMgU29ja2V0Y2FsbHMgdXNlIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbjoKKyMgJWVheCA9IF9fTlJfc29ja2V0Y2FsbAorIyAlZWJ4ID0gc29ja2V0Y2FsbCBudW1iZXIKKyMgJWVjeCA9IHBvaW50ZXIgdG8gYXJndW1lbnRzICh1cCB0byA2KQorIworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaWZkZWYgX19pMzg2X18KKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19zb2NrZXRjYWxsX2NvbW1vbgorCS50eXBlIF9fc29ja2V0Y2FsbF9jb21tb24sIEBmdW5jdGlvbgorCitfX3NvY2tldGNhbGxfY29tbW9uOgorCXhjaGdsCSVlYngsKCVlc3ApCSMgVGhlIHN0dWIgcGFzc2VzIHRoZSBzb2NrZXRjYWxsICMgb24gc3RhY2sKKworI2lmZGVmCV9SRUdQQVJNCisJcHVzaGwJMTYoJWVzcCkJIyBBcmcgNgorCXB1c2hsCTE2KCVlc3ApCSMgQXJnIDUKKwlwdXNobAkxNiglZXNwKQkjIEFyZyA0CisJcHVzaGwJJWVjeAorCXB1c2hsCSVlZHgKKwlwdXNobAklZWF4CisJbW92bAklZXNwLCVlY3gKKyNlbHNlCisJbGVhbAk4KCVlc3ApLCVlY3gJIyBBcmd1bWVudHMgYWxyZWFkeSBjb250aWd1b3VzIG9uLXN0YWNrCisjZW5kaWYKKworCW1vdmwJJF9fTlJfc29ja2V0Y2FsbCwlZWF4CisJaW50CSQweDgwCisKKyNpZmRlZglfUkVHUEFSTQorCWFkZGwJJDYqNCwgJWVzcAorI2VuZGlmCisKKwljbXBsCSQtNDA5NSwlZWF4CSMgRXJyb3IgcmV0dXJuPworCisJcG9wbAklZWJ4CisKKwlqYgkxZgorCisJbmVnbAklZWF4CisJbW92bAklZWF4LGVycm5vCisJb3JsCSQtMSwlZWF4CSMgUmV0dXJuIC0xCisxOgorCXJldAorCisJLnNpemUgX19zb2NrZXRjYWxsX2NvbW1vbiwuLV9fc29ja2V0Y2FsbF9jb21tb24KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODcxN2IKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L3N5c2NhbGwuUwpAQCAtMCwwICsxLDY5IEBACisvKgorICogYXJjaC9pMzg2L3N5c2NhbGwuUworICoKKyAqIENvbW1vbiB0YWlsLWhhbmRsaW5nIGNvZGUgZm9yIHN5c3RlbSBjYWxscy4KKyAqCisgKiBUaGUgYXJndW1lbnRzIGFyZSBvbiB0aGUgc3RhY2s7IHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIgaW4gJWVheC4KKyAqLworCisjZGVmaW5lIEFSRyhuKQkoNCpuKzIwKSglZXNwKQorCisJLnRleHQKKwkuYWxpZ24JNAorCS5nbG9ibAlfX3N5c2NhbGxfY29tbW9uCisJLnR5cGUJX19zeXNjYWxsX2NvbW1vbixAZnVuY3Rpb24KK19fc3lzY2FsbF9jb21tb246CisjaWZkZWYgX1JFR1BBUk0KKwl4Y2hnbAklZWJ4LCglZXNwKQorI2Vsc2UKKwlwb3BsCSVlYXgKKwlwdXNobAklZWJ4CisjZW5kaWYKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYnAKKworI2lmZGVmIF9SRUdQQVJNCisJeGNoZ2wJJWVheCwlZWJ4CisJeGNoZ2wJJWVjeCwlZWR4CisJbW92bAlBUkcoMCksJWVzaQorCW1vdmwJQVJHKDEpLCVlZGkKKwltb3ZsCUFSRygyKSwlZWJwCisjZWxzZQorCW1vdmwJQVJHKDApLCVlYngJCSMgU3lzY2FsbCBhcmd1bWVudHMKKwltb3ZsCUFSRygxKSwlZWN4CisJbW92bAlBUkcoMiksJWVkeAorCW1vdmwJQVJHKDMpLCVlc2kKKwltb3ZsCUFSRyg0KSwlZWRpCisJbW92bAlBUkcoNSksJWVicAorI2VuZGlmCisJLmdsb2JsIF9fc3lzY2FsbF9jb21tb25fdGFpbAorX19zeXNjYWxsX2NvbW1vbl90YWlsOgorCWludAkkMHg4MAorCisJY21wbAkkLTQwOTUsJWVheAorCisJcG9wbAklZWJwCisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJcG9wbAklZWJ4CisKKwlqYgkxZgorCisJIyBFcnJvciByZXR1cm4sIG11c3Qgc2V0IGVycm5vCisJbmVnbAklZWF4CisJbW92bAklZWF4LGVycm5vCisJb3JsCSQtMSwlZWF4CQkjIFJldHVybiAtMQorCisxOgorCXJldAorCisJLnNpemUJX19zeXNjYWxsX2NvbW1vbiwuLV9fc3lzY2FsbF9jb21tb24KKworI2lmbmRlZiBfUkVHUEFSTQorCisJLmdsb2JsCV9fc3lzY2FsbF92YXJhZGljCisJLnR5cGUJX19zeXNjYWxsX3ZhcmFkaWMsQGZ1bmN0aW9uCitfX3N5c2NhbGxfdmFyYWRpYyA9IF9fc3lzY2FsbF9jb21tb24KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9pMzg2L3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczYTNmZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI2IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL2kzODYvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudHlwZSAke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmwgJHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisKKyAgICAkc3R5cGUgPSAnY29tbW9uJyBpZiAoICRzdHlwZSBlcSAnJyApOworCisgICAgcHJpbnQgT1VUICJcdHB1c2hsIFwkX19OUl8ke3NuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0am1wIF9fc3lzY2FsbF8kc3R5cGVcbiI7CisgICAgcHJpbnQgT1VUICJcdC5zaXplICR7Zm5hbWV9LC4tJHtmbmFtZX1cbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvdmFyc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni92YXJzeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzMjllYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvdmFyc3lzY2FsbC5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBhcmNoL2kzODYvdmFyc3lzY2FsbC5TCisgKgorICogQ29tbW9uIHRhaWwtaGFuZGxpbmcgY29kZSBmb3IgdmFyYWRpYyBzeXN0ZW0gY2FsbHMgKHdoaWNoIGFsd2F5cworICogdXNlIHRoZSBjZGVjbCBjb252ZW50aW9uLikKKyAqCisgKiBUaGUgYXJndW1lbnRzIGFyZSBvbiB0aGUgc3RhY2s7IHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIgaW4gJWVheC4KKyAqLworCisjaWZkZWYJX1JFR1BBUk0KKworI2RlZmluZSBBUkcobikJKDQqbisyMCkoJWVzcCkKKworCS50ZXh0CisJLmFsaWduCTQKKwkuZ2xvYmwJX19zeXNjYWxsX3ZhcmFkaWMKKwkudHlwZQlfX3N5c2NhbGxfdmFyYWRpYyxAZnVuY3Rpb24KK19fc3lzY2FsbF92YXJhZGljOgorCXBvcGwJJWVheAorCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYnAKKworCW1vdmwJQVJHKDApLCVlYngJCSMgU3lzY2FsbCBhcmd1bWVudHMKKwltb3ZsCUFSRygxKSwlZWN4CisJbW92bAlBUkcoMiksJWVkeAorCW1vdmwJQVJHKDMpLCVlc2kKKwltb3ZsCUFSRyg0KSwlZWRpCisJbW92bAlBUkcoNSksJWVicAorCisJam1wCV9fc3lzY2FsbF9jb21tb25fdGFpbAorCisJLnNpemUJX19zeXNjYWxsX3ZhcmFkaWMsLi1fX3N5c2NhbGxfdmFyYWRpYworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvdmZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvdmZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThiYTNhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni92Zm9yay5TCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgdXNyL2tsaWJjL2FyY2gvaTM4Ni92Zm9yay5TCisjCisjIHZmb3JrIGlzIG5hc3R5IC0gdGhlcmUgbXVzdCBiZSBub3RoaW5nIGF0IGFsbCBvbiB0aGUgc3RhY2sgYWJvdmUKKyMgdGhlIHN0YWNrIGZyYW1lIG9mIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24uCisjCisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgLmFsaWduICA0CisJLmdsb2JsCXZmb3JrCisJLnR5cGUJdmZvcmssIEBmdW5jdGlvbgordmZvcms6CisJcG9wbAklZWR4CQkJLyogUmV0dXJuIGFkZHJlc3MgKi8KKwltb3ZsCSRfX05SX3Zmb3JrLCAlZWF4CisJaW50CSQweDgwCisJcHVzaGwJJWVkeAorCWNtcGwJJC00MDk1LCAlZWF4CisJamFlCTFmCisJcmV0CisxOgorCW5lZ2wJJWVheAorCW1vdmwJJWVheCwgZXJybm8KKwlvcmwJJC0xLCAlZWF4CisJcmV0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pYTY0L0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL2lhNjQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MDcwZmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pYTY0L0tidWlsZApAQCAtMCwwICsxLDEzIEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBpYTY0CisjCisKK2tsaWIteSA6PSB2Zm9yay5vIHNldGptcC5vIHBpcGUubyBzeXNjYWxsLm8KKwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vICAgICAuLi8uLi9saWJnY2MvX19kaXZzaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZkaTMubyAgICAuLi8uLi9saWJnY2MvX191ZGl2c2kzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191bW9kc2kzLm8gICAgLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdm1vZHNpNC5vIC4uLy4uL2xpYmdjYy9fX3VkaXZtb2RkaTQubworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2lhNjQvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDg2OGVmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9NQ09ORklHCkBAIC0wLDAgKzEsMTEgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL2lhNjQvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisKK0tMSUJDT1BURkxBR1MgKz0gLU9zCitLTElCQ0JJVFNJWkUgID0gNjQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2lhNjQvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyMjc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvY3J0MC5TCkBAIC0wLDAgKzEsMjcgQEAKKworI2luY2x1ZGUgPGFzbS9mcHUuaD4KKworCS5hbGlnbiAzMgorCS5nbG9iYWwgX3N0YXJ0CisKKwkucHJvYyBfc3RhcnQKKwkudHlwZSBfc3RhcnQsQGZ1bmN0aW9uCitfc3RhcnQ6CisJLnByb2xvZ3VlCisJLnNhdmUgcnAsIHIwCisKKwlhbGxvYyByMiA9IGFyLnBmcywwLDAsMiwwCisJbW92bCByMyA9IEZQU1JfREVGQVVMVAorCTs7CisJYWRkcyBvdXQwPSAxNixzcCAgICAvKiBhcmdjIHBvaW50ZXIgKi8KKwltb3ZsIGdwID0gQGdwcmVsKDBmKQorMDoJbW92IHI5ID0gaXAKKwk7OworCXN1YiBncCA9IHI5LCBncCAgICAgLyogYmFjay1jb21wdXRlIGdwIHZhbHVlICovCisKKwkuYm9keQorCWJyLmNhbGwuc3B0ay5mZXcgcnAgPSBfX2xpYmNfaW5pdAorCTs7CisJYnJlYWsgMCAgICAgICAgICAgICAvKiBicmVhayBtaXNlcmFibHkgaWYgd2UgZXZlciByZXR1cm4gKi8KKworCS5lbmRwIF9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaWE2NC9waXBlLmMgYi91c3Iva2xpYmMvYXJjaC9pYTY0L3BpcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNhMjcyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9waXBlLmMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIHBpcGUuYworICovCisKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGtsaWJjL2FyY2hzeXMuaD4KKworI2RlZmluZSBBU01fQ0xPQkJFUlMgLCJvdXQyIiwgIm91dDMiLCAib3V0NCIsICJvdXQ1IiwgIm91dDYiLCAib3V0NyIsICAgIFwKKyAgIC8qIE5vbi1zdGFja2VkIGludGVnZXIgcmVnaXN0ZXJzLCBtaW51cyByOCwgcjksIHIxMCwgcjE1LiAgKi8JXAorICAicjIiLCAicjMiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNiIsICJyMTciLCAicjE4IiwJICAgICAgICBcCisgICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsCVwKKyAgInIyOCIsICJyMjkiLCAicjMwIiwgInIzMSIsCQkJCQkJXAorICAvKiBQcmVkaWNhdGUgcmVnaXN0ZXJzLiAgKi8JCQkJCQlcCisgICJwNiIsICJwNyIsICJwOCIsICJwOSIsICJwMTAiLCAicDExIiwgInAxMiIsICJwMTMiLCAicDE0IiwgInAxNSIsCVwKKyAgLyogTm9uLXJvdGF0aW5nIGZwIHJlZ2lzdGVycy4gICovCQkJCQlcCisgICJmNiIsICJmNyIsICJmOCIsICJmOSIsICJmMTAiLCAiZjExIiwgImYxMiIsICJmMTMiLCAiZjE0IiwgImYxNSIsCVwKKyAgLyogQnJhbmNoIHJlZ2lzdGVycy4gICovCQkJCQkJXAorICAiYjYiLCAiYjciCisKK2ludCBwaXBlKGludCAqZmlsZWRlcykKK3sKKwlyZWdpc3RlciBsb25nIF9yOCBhc20oInI4Iik7CisJcmVnaXN0ZXIgbG9uZyBfcjkgYXNtKCJyOSIpOworCXJlZ2lzdGVyIGxvbmcgX3IxMCBhc20oInIxMCIpOworCXJlZ2lzdGVyIGxvbmcgX3IxNSBhc20oInIxNSIpID0gX19OUl9waXBlOworCXJlZ2lzdGVyIGxvbmcgX291dDAgYXNtKCJvdXQwIikgPSAobG9uZylmaWxlZGVzOworCWxvbmcgX3JldHZhbDsKKwlfX2FzbSBfX3ZvbGF0aWxlKF9fSUE2NF9CUkVBSzoiPXIiKF9yOCksICI9ciIoX3IxMCksICI9ciIoX3IxNSksCisJCQkgIj1yIihfb3V0MCksICI9ciIoX3I5KQorCQkJIDoiMiIoX3IxNSksICIzIihfb3V0MCkKKwkJCSA6Im1lbW9yeSIgQVNNX0NMT0JCRVJTKTsKKwlpZiAoX3IxMCA9PSAtMSkgeworCQllcnJubyA9IF9yODsKKwkJX3JldHZhbCA9IC0xOworCX0gZWxzZSB7CisJCWZpbGVkZXNbMF0gPSBfcjg7CisJCWZpbGVkZXNbMV0gPSBfcjk7CisJCV9yZXR2YWwgPSAwOworCX0KKwlyZXR1cm4gX3JldHZhbDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2lhNjQvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9pYTY0L3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMWNlYTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pYTY0L3NldGptcC5TCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogSUEtNjQgc3BlY2lmaWMgc2V0am1wL2xvbmdqbXAgcm91dGluZXMKKyAqCisgKiBJbnNwaXJlZCBieSBzZXRqbXAucyBmcm9tIHRoZSBGcmVlQlNEIGtlcm5lbC4KKyAqLworCisjZGVmaW5lCUpfVU5BVAkJMAorI2RlZmluZQlKX05BVFMJCTB4OAorI2RlZmluZQlKX1BGUwkJMHgxMAorI2RlZmluZQlKX0JTUAkJMHgxOAorI2RlZmluZQlKX1JOQVQJCTB4MjAKKyNkZWZpbmUJSl9QUkVEUwkJMHgyOAorI2RlZmluZQlKX0xDCQkweDMwCisjZGVmaW5lCUpfUjQJCTB4MzgKKyNkZWZpbmUJSl9SNQkJMHg0MAorI2RlZmluZQlKX1I2CQkweDQ4CisjZGVmaW5lCUpfUjcJCTB4NTAKKyNkZWZpbmUJSl9TUAkJMHg1OAorI2RlZmluZQlKX0YyCQkweDYwCisjZGVmaW5lCUpfRjMJCTB4NzAKKyNkZWZpbmUJSl9GNAkJMHg4MAorI2RlZmluZQlKX0Y1CQkweDkwCisjZGVmaW5lCUpfRjE2CQkweGEwCisjZGVmaW5lCUpfRjE3CQkweGIwCisjZGVmaW5lCUpfRjE4CQkweGMwCisjZGVmaW5lCUpfRjE5CQkweGQwCisjZGVmaW5lCUpfRjIwCQkweGUwCisjZGVmaW5lCUpfRjIxCQkweGYwCisjZGVmaW5lCUpfRjIyCQkweDEwMAorI2RlZmluZQlKX0YyMwkJMHgxMTAKKyNkZWZpbmUJSl9GMjQJCTB4MTIwCisjZGVmaW5lCUpfRjI1CQkweDEzMAorI2RlZmluZQlKX0YyNgkJMHgxNDAKKyNkZWZpbmUJSl9GMjcJCTB4MTUwCisjZGVmaW5lCUpfRjI4CQkweDE2MAorI2RlZmluZQlKX0YyOQkJMHgxNzAKKyNkZWZpbmUJSl9GMzAJCTB4MTgwCisjZGVmaW5lCUpfRjMxCQkweDE5MAorI2RlZmluZQlKX0ZQU1IJCTB4MWEwCisjZGVmaW5lCUpfQjAJCTB4MWE4CisjZGVmaW5lCUpfQjEJCTB4MWIwCisjZGVmaW5lCUpfQjIJCTB4MWI4CisjZGVmaW5lCUpfQjMJCTB4MWMwCisjZGVmaW5lCUpfQjQJCTB4MWM4CisjZGVmaW5lCUpfQjUJCTB4MWQwCisjZGVmaW5lCUpfU0lHTUFTSwkweDFkOAorI2RlZmluZQlKX1NJR1NFVAkweDFlMAorI2RlZmluZQlKX0dQCQkweDFmMAorCisvLyBpbnQgc2V0am1wKHN0cnVjdCBqbXBfYnVmZmVyICopCisvLworLy8gIFNldHVwIGEgbm9uLWxvY2FsIGdvdG8uCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gIFNldEp1bXAgc3RvcmVzIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHNldCBpbiB0aGUgYXJlYSBwb2ludGVkIHRvCisvLyAgYnkgInNhdmUiLiAgSXQgcmV0dXJucyB6ZXJvLiAgU3Vic2VxdWVudCBjYWxscyB0byAiTG9uZ0p1bXAiIHdpbGwKKy8vICByZXN0b3JlIHRoZSByZWdpc3RlcnMgYW5kIHJldHVybiBub24temVybyB0byB0aGUgc2FtZSBsb2NhdGlvbi4KKy8vCisvLyBPbiBlbnRyeSwgcjMyIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBqbXBfYnVmZmVyCisvLworCS5hbGlnbiAzMgorCS5nbG9iYWwgc2V0am1wCisJLnByb2Mgc2V0am1wCitzZXRqbXA6CisgICAgLy8KKyAgICAvLyAgTWFrZSBzdXJlIGJ1ZmZlciBpcyBhbGlnbmVkIGF0IDE2Ynl0ZSBib3VuZGFyeQorICAgIC8vCisgICAgYWRkICAgICByMTAgPSAtMHgxMCxyMCAgOzsgIC8vIG1hc2sgdGhlIGxvd2VyIDQgYml0cworICAgIGFuZCAgICAgcjMyID0gcjMyLCByMTA7OworICAgIGFkZCAgICAgcjMyID0gMHgxMCwgcjMyOzsgICAvLyBtb3ZlIHRvIG5leHQgMTYgYnl0ZSBib3VuZGFyeQorCisgICAgYWRkICAgICByMTAgPSBKX1BSRURTLCByMzIgIC8vIHNraXAgVW5hdHMgJiBwZnMgc2F2ZSBhcmVhCisgICAgYWRkICAgICByMTEgPSBKX0JTUCwgcjMyCisgICAgLy8KKyAgICAvLyAgc2F2ZSBpbW1lZGlhdGUgY29udGV4dAorICAgIC8vCisgICAgbW92ICAgICByMiA9IGFyLmJzcCAgICAgICAgIC8vIHNhdmUgYmFja2luZyBzdG9yZSBwb2ludGVyCisgICAgbW92ICAgICByMyA9IHByICAgICAgICAgICAgIC8vIHNhdmUgcHJlZGljYXRlcworICAgIGZsdXNocnMKKyAgICA7OworICAgIC8vCisgICAgLy8gc2F2ZSB1c2VyIFVuYXQgcmVnaXN0ZXIKKyAgICAvLworICAgIG1vdiAgICAgcjE2ID0gYXIubGMgICAgICAgICAvLyBzYXZlIGxvb3AgY291bnQgcmVnaXN0ZXIKKyAgICBtb3YgICAgIHIxNCA9IGFyLnVuYXQgICAgICAgLy8gc2F2ZSB1c2VyIFVuYXQgcmVnaXN0ZXIKKworICAgIHN0OCAgICAgW3IxMF0gPSByMywgSl9MQy1KX1BSRURTCisgICAgc3Q4ICAgICBbcjExXSA9IHIyLCBKX1I0LUpfQlNQCisgICAgOzsKKyAgICBzdDggICAgIFtyMTBdID0gcjE2LCBKX1I1LUpfTEMKKyAgICBzdDggICAgIFtyMzJdID0gcjE0LCBKX05BVFMgLy8gTm90ZTogVW5hdCBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBzYXZlIGFyZWEKKyAgICBtb3YgICAgIHIxNSA9IGFyLnBmcworICAgIDs7CisgICAgLy8KKyAgICAvLyAgc2F2ZSBwcmVzZXJ2ZWQgZ2VuZXJhbCByZWdpc3RlcnMgJiBOYVQncworICAgIC8vCisgICAgc3Q4LnNwaWxsICAgW3IxMV0gPSByNCwgSl9SNi1KX1I0CisgICAgOzsKKyAgICBzdDguc3BpbGwgICBbcjEwXSA9IHI1LCBKX1I3LUpfUjUKKyAgICA7OworICAgIHN0OC5zcGlsbCAgIFtyMTFdID0gcjYsIEpfU1AtSl9SNgorICAgIDs7CisgICAgc3Q4LnNwaWxsICAgW3IxMF0gPSByNywgSl9GMy1KX1I3CisgICAgOzsKKyAgICBzdDguc3BpbGwgICBbcjExXSA9IHNwLCBKX0YyLUpfU1AKKyAgICA7OworICAgIC8vCisgICAgLy8gc2F2ZSBzcGlsbGVkIFVuYXQgYW5kIHBmcyByZWdpc3RlcnMKKyAgICAvLworICAgIG1vdiAgICAgcjIgPSBhci51bmF0ICAgICAgICAvLyBzYXZlIFVuYXQgcmVnaXN0ZXIgYWZ0ZXIgc3BpbGwKKyAgICA7OworICAgIHN0OCAgICAgW3IzMl0gPSByMiwgSl9QRlMtSl9OQVRTICAgIC8vIHNhdmUgdW5hdCBmb3Igc3BpbGxlZCByZWdzCisgICAgOzsKKyAgICBzdDggICAgIFtyMzJdID0gcjE1ICAgICAgICAgLy8gc2F2ZSBwZnMKKyAgICAvLworICAgIC8vICBzYXZlIGZsb2F0aW5nIHJlZ2lzdGVycworICAgIC8vCisgICAgc3RmLnNwaWxsICAgW3IxMV0gPSBmMiwgSl9GNC1KX0YyCisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmMywgSl9GNS1KX0YzCisgICAgOzsKKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGY0LCBKX0YxNi1KX0Y0CisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmNSwgSl9GMTctSl9GNQorICAgIDs7CisgICAgc3RmLnNwaWxsICAgW3IxMV0gPSBmMTYsIEpfRjE4LUpfRjE2CisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmMTcsIEpfRjE5LUpfRjE3CisgICAgOzsKKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGYxOCwgSl9GMjAtSl9GMTgKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGYxOSwgSl9GMjEtSl9GMTkKKyAgICA7OworICAgIHN0Zi5zcGlsbCAgIFtyMTFdID0gZjIwLCBKX0YyMi1KX0YyMAorICAgIHN0Zi5zcGlsbCAgIFtyMTBdID0gZjIxLCBKX0YyMy1KX0YyMQorICAgIDs7CisgICAgc3RmLnNwaWxsICAgW3IxMV0gPSBmMjIsIEpfRjI0LUpfRjIyCisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmMjMsIEpfRjI1LUpfRjIzCisgICAgOzsKKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGYyNCwgSl9GMjYtSl9GMjQKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGYyNSwgSl9GMjctSl9GMjUKKyAgICA7OworICAgIHN0Zi5zcGlsbCAgIFtyMTFdID0gZjI2LCBKX0YyOC1KX0YyNgorICAgIHN0Zi5zcGlsbCAgIFtyMTBdID0gZjI3LCBKX0YyOS1KX0YyNworICAgIDs7CisgICAgc3RmLnNwaWxsICAgW3IxMV0gPSBmMjgsIEpfRjMwLUpfRjI4CisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmMjksIEpfRjMxLUpfRjI5CisgICAgOzsKKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGYzMCwgSl9GUFNSLUpfRjMwCisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmMzEsIEpfQjAtSl9GMzEgICAgIC8vIHNpemUgb2YgZjMxICsgZnBzcgorICAgIC8vCisgICAgLy8gc2F2ZSBGUFNSIHJlZ2lzdGVyICYgYnJhbmNoIHJlZ2lzdGVycworICAgIC8vCisgICAgbW92ICAgICByMiA9IGFyLmZwc3IgICAgLy8gc2F2ZSBmcHNyIHJlZ2lzdGVyCisgICAgbW92ICAgICByMyA9IGIwCisgICAgOzsKKyAgICBzdDggICAgIFtyMTFdID0gcjIsIEpfQjEtSl9GUFNSCisgICAgc3Q4ICAgICBbcjEwXSA9IHIzLCBKX0IyLUpfQjAKKyAgICBtb3YgICAgIHIyID0gYjEKKyAgICBtb3YgICAgIHIzID0gYjIKKyAgICA7OworICAgIHN0OCAgICAgW3IxMV0gPSByMiwgSl9CMy1KX0IxCisgICAgc3Q4ICAgICBbcjEwXSA9IHIzLCBKX0I0LUpfQjIKKyAgICBtb3YgICAgIHIyID0gYjMKKyAgICBtb3YgICAgIHIzID0gYjQKKyAgICA7OworICAgIHN0OCAgICAgW3IxMV0gPSByMiwgSl9CNS1KX0IzCisgICAgc3Q4ICAgICBbcjEwXSA9IHIzCisgICAgbW92ICAgICByMiA9IGI1CisgICAgOzsKKyAgICBzdDggICAgIFtyMTFdID0gcjIKKyAgICA7OworICAgIC8vCisgICAgLy8gcmV0dXJuCisgICAgLy8KKyAgICBtb3YgICAgIHI4ID0gcjAgICAgICAgICAvLyByZXR1cm4gMCBmcm9tIHNldGptcAorICAgIG1vdiAgICAgYXIudW5hdCA9IHIxNCAgIC8vIHJlc3RvcmUgdW5hdAorICAgIGJyLnJldC5zcHRrIGIwCisgICAgLmVuZHAgc2V0am1wCisKKy8vCisvLyB2b2lkIGxvbmdqbXAoc3RydWN0IGptcF9idWZmZXIgKiwgaW50IHZhbCkKKy8vCisvLyAgUGVyZm9ybSBhIG5vbi1sb2NhbCBnb3RvLgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vICBMb25nSnVtcCBpbml0aWFsaXplcyB0aGUgcmVnaXN0ZXIgc2V0IHRvIHRoZSB2YWx1ZXMgc2F2ZWQgYnkgYQorLy8gIHByZXZpb3VzICdTZXRKdW1wJyBhbmQganVtcHMgdG8gdGhlIHJldHVybiBsb2NhdGlvbiBzYXZlZCBieSB0aGF0CisvLyAgJ1NldEp1bXAnLiAgVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiB1bndpbmRpbmcgdGhlIHN0YWNrIGFuZCByZXR1cm5pbmcKKy8vICBmb3IgYSBzZWNvbmQgdGltZSB0byB0aGUgJ1NldEp1bXAnLgorLy8KKworCS5hbGlnbiAzMgorCS5nbG9iYWwgbG9uZ2ptcAorCS5wcm9jIGxvbmdqbXAKK2xvbmdqbXA6CisgICAgLy8KKyAgICAvLyAgTWFrZSBzdXJlIGJ1ZmZlciBpcyBhbGlnbmVkIGF0IDE2Ynl0ZSBib3VuZGFyeQorICAgIC8vCisgICAgYWRkICAgICByMTAgPSAtMHgxMCxyMCAgOzsgIC8vIG1hc2sgdGhlIGxvd2VyIDQgYml0cworICAgIGFuZCAgICAgcjMyID0gcjMyLCByMTA7OworICAgIGFkZCAgICAgcjMyID0gMHgxMCwgcjMyOzsgICAvLyBtb3ZlIHRvIG5leHQgMTYgYnl0ZSBib3VuZGFyeQorCisgICAgLy8KKyAgICAvLyBjYWNoaW5nIHRoZSByZXR1cm4gdmFsdWUgYXMgd2UgZG8gaW52YWxhIGluIHRoZSBlbmQKKyAgICAvLworICAgIG1vdiAgICAgcjggPSByMzMgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUKKworICAgIC8vCisgICAgLy8gIGdldCBpbW1lZGlhdGUgY29udGV4dAorICAgIC8vCisgICAgbW92ICAgICByMTQgPSBhci5yc2MgICAgICAgIC8vIGdldCB1c2VyIFJTQyBjb25mCisgICAgYWRkICAgICByMTAgPSBKX1BGUywgcjMyICAgIC8vIGdldCBhZGRyZXNzIG9mIHBmcworICAgIGFkZCAgICAgcjExID0gSl9OQVRTLCByMzIKKyAgICA7OworICAgIGxkOCAgICAgcjE1ID0gW3IxMF0sIEpfQlNQLUpfUEZTICAgIC8vIGdldCBwZnMKKyAgICBsZDggICAgIHIyID0gW3IxMV0sIEpfTEMtSl9OQVRTICAgICAvLyBnZXQgdW5hdCBmb3Igc3BpbGxlZCByZWdzCisgICAgOzsKKyAgICBtb3YgICAgIGFyLnVuYXQgPSByMgorICAgIDs7CisgICAgbGQ4ICAgICByMTYgPSBbcjEwXSwgSl9QUkVEUy1KX0JTUCAgLy8gZ2V0IGJhY2tpbmcgc3RvcmUgcG9pbnRlcgorICAgIG1vdiAgICAgYXIucnNjID0gcjAgICAgICAgICAvLyBwdXQgUlNFIGluIGVuZm9yY2VkIGxhenkKKyAgICBtb3YgICAgIGFyLnBmcyA9IHIxNQorICAgIDs7CisKKyAgICAvLworICAgIC8vIHdoaWxlIHJldHVybmluZyBmcm9tIGxvbmdqbXAgdGhlIEJTUFNUT1JFIGFuZCBCU1AgbmVlZHMgdG8gYmUKKyAgICAvLyBzYW1lIGFuZCBkaXNjYXJkIGFsbCB0aGUgcmVnaXN0ZXJzIGFsbG9jYXRlZCBhZnRlciB3ZSBkaWQKKyAgICAvLyBzZXRqbXAuIEFsc28sIHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIFJOQVQgcmVnaXN0ZXIgc2luY2Ugd2UKKyAgICAvLyBkaWQgbm90IGZsdXNoZWQgdGhlIFJTRSBvbiBzZXRqbXAuCisgICAgLy8KKyAgICBtb3YgICAgIHIxNyA9IGFyLmJzcHN0b3JlICAgLy8gZ2V0IGN1cnJlbnQgQlNQU1RPUkUKKyAgICA7OworICAgIGNtcC5sdHUgcDYscDcgPSByMTcsIHIxNiAgICAvLyBpcyBpdCBsZXNzIHRoYW4gQlNQIG9mCisocDYpICAgIGJyLnNwbnQuZmV3IC5mbHVzaF9yc2UKKyAgICBtb3YgICAgIHIxOSA9IGFyLnJuYXQgICAgICAgLy8gZ2V0IGN1cnJlbnQgUk5BVAorICAgIDs7CisgICAgbG9hZHJzICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgZGlydHkgcmVncworICAgIGJyLnNwdGsubWFueSAgICAucmVzdG9yZV9ybmF0ICAgICAgIC8vIHJlc3RvcmUgUk5BVAorCisuZmx1c2hfcnNlOgorICAgIGZsdXNocnMKKyAgICA7OworICAgIG1vdiAgICAgcjE5ID0gYXIucm5hdCAgICAgICAvLyBnZXQgY3VycmVudCBSTkFUCisgICAgbW92ICAgICByMTcgPSByMTYgICAgICAgICAgIC8vIGN1cnJlbnQgQlNQU1RPUkUKKyAgICA7OworLnJlc3RvcmVfcm5hdDoKKyAgICAvLworICAgIC8vIGNoZWNrIGlmIFJOQVQgaXMgc2F2ZWQgYmV0d2VlbiBzYXZlZCBCU1AgYW5kIGN1cnIgQlNQU1RPUkUKKyAgICAvLworICAgIG1vdiAgICAgcjE4ID0gMHgzZgorICAgIDs7CisgICAgZGVwICAgICByMTggPSByMTgscjE2LDMsNiAgIC8vIGdldCBSTkFUIGFkZHJlc3MKKyAgICA7OworICAgIGNtcC5sdHUgcDgscDkgPSByMTgsIHIxNyAgICAvLyBSTkFUIHNhdmVkIG9uIFJTRQorICAgIDs7CisocDgpICAgIGxkOCAgICAgcjE5ID0gW3IxOF0gICAgIC8vIGdldCBSTkFUIGZyb20gUlNFCisgICAgOzsKKyAgICBtb3YgICAgIGFyLmJzcHN0b3JlID0gcjE2ICAgLy8gc2V0IG5ldyBCU1BTVE9SRQorICAgIDs7CisgICAgbW92ICAgICBhci5ybmF0ID0gcjE5ICAgICAgIC8vIHJlc3RvcmUgUk5BVAorICAgIG1vdiAgICAgYXIucnNjID0gcjE0ICAgICAgICAvLyByZXN0b3JlIFJTQyBjb25mCisKKworICAgIGxkOCAgICAgcjMgPSBbcjExXSwgSl9SNC1KX0xDICAgICAgIC8vIGdldCBsYyByZWdpc3RlcgorICAgIGxkOCAgICAgcjIgPSBbcjEwXSwgSl9SNS1KX1BSRURTICAgIC8vIGdldCBwcmVkaWNhdGVzCisgICAgOzsKKyAgICBtb3YgICAgIHByID0gcjIsIC0xCisgICAgbW92ICAgICBhci5sYyA9IHIzCisgICAgLy8KKyAgICAvLyAgcmVzdG9yZSBwcmVzZXJ2ZWQgZ2VuZXJhbCByZWdpc3RlcnMgJiBOYVQncworICAgIC8vCisgICAgbGQ4LmZpbGwgICAgcjQgPSBbcjExXSwgSl9SNi1KX1I0CisgICAgOzsKKyAgICBsZDguZmlsbCAgICByNSA9IFtyMTBdLCBKX1I3LUpfUjUKKyAgICBsZDguZmlsbCAgICByNiA9IFtyMTFdLCBKX1NQLUpfUjYKKyAgICA7OworICAgIGxkOC5maWxsICAgIHI3ID0gW3IxMF0sIEpfRjItSl9SNworICAgIGxkOC5maWxsICAgIHNwID0gW3IxMV0sIEpfRjMtSl9TUAorICAgIDs7CisgICAgLy8KKyAgICAvLyAgcmVzdG9yZSBmbG9hdGluZyByZWdpc3RlcnMKKyAgICAvLworICAgIGxkZi5maWxsICAgIGYyID0gW3IxMF0sIEpfRjQtSl9GMgorICAgIGxkZi5maWxsICAgIGYzID0gW3IxMV0sIEpfRjUtSl9GMworICAgIDs7CisgICAgbGRmLmZpbGwgICAgZjQgPSBbcjEwXSwgSl9GMTYtSl9GNAorICAgIGxkZi5maWxsICAgIGY1ID0gW3IxMV0sIEpfRjE3LUpfRjUKKyAgICA7OworICAgIGxkZi5maWxsICAgIGYxNiA9IFtyMTBdLCBKX0YxOC1KX0YxNgorICAgIGxkZi5maWxsICAgIGYxNyA9IFtyMTFdLCBKX0YxOS1KX0YxNworICAgIDs7CisgICAgbGRmLmZpbGwgICAgZjE4ID0gW3IxMF0sIEpfRjIwLUpfRjE4CisgICAgbGRmLmZpbGwgICAgZjE5ID0gW3IxMV0sIEpfRjIxLUpfRjE5CisgICAgOzsKKyAgICBsZGYuZmlsbCAgICBmMjAgPSBbcjEwXSwgSl9GMjItSl9GMjAKKyAgICBsZGYuZmlsbCAgICBmMjEgPSBbcjExXSwgSl9GMjMtSl9GMjEKKyAgICA7OworICAgIGxkZi5maWxsICAgIGYyMiA9IFtyMTBdLCBKX0YyNC1KX0YyMgorICAgIGxkZi5maWxsICAgIGYyMyA9IFtyMTFdLCBKX0YyNS1KX0YyMworICAgIDs7CisgICAgbGRmLmZpbGwgICAgZjI0ID0gW3IxMF0sIEpfRjI2LUpfRjI0CisgICAgbGRmLmZpbGwgICAgZjI1ID0gW3IxMV0sIEpfRjI3LUpfRjI1CisgICAgOzsKKyAgICBsZGYuZmlsbCAgICBmMjYgPSBbcjEwXSwgSl9GMjgtSl9GMjYKKyAgICBsZGYuZmlsbCAgICBmMjcgPSBbcjExXSwgSl9GMjktSl9GMjcKKyAgICA7OworICAgIGxkZi5maWxsICAgIGYyOCA9IFtyMTBdLCBKX0YzMC1KX0YyOAorICAgIGxkZi5maWxsICAgIGYyOSA9IFtyMTFdLCBKX0YzMS1KX0YyOQorICAgIDs7CisgICAgbGRmLmZpbGwgICAgZjMwID0gW3IxMF0sIEpfRlBTUi1KX0YzMAorICAgIGxkZi5maWxsICAgIGYzMSA9IFtyMTFdLCBKX0IwLUpfRjMxIDs7CisKKyAgICAvLworICAgIC8vIHJlc3RvcmUgYnJhbmNoIHJlZ2lzdGVycyBhbmQgZnBzcgorICAgIC8vCisgICAgbGQ4ICAgICByMTYgPSBbcjEwXSwgSl9CMS1KX0ZQU1IgICAgLy8gZ2V0IGZwc3IKKyAgICBsZDggICAgIHIxNyA9IFtyMTFdLCBKX0IyLUpfQjAgICAgICAvLyBnZXQgcmV0dXJuIHBvaW50ZXIKKyAgICA7OworICAgIG1vdiAgICAgYXIuZnBzciA9IHIxNgorICAgIG1vdiAgICAgYjAgPSByMTcKKyAgICBsZDggICAgIHIyID0gW3IxMF0sIEpfQjMtSl9CMQorICAgIGxkOCAgICAgcjMgPSBbcjExXSwgSl9CNC1KX0IyCisgICAgOzsKKyAgICBtb3YgICAgIGIxID0gcjIKKyAgICBtb3YgICAgIGIyID0gcjMKKyAgICBsZDggICAgIHIyID0gW3IxMF0sIEpfQjUtSl9CMworICAgIGxkOCAgICAgcjMgPSBbcjExXQorICAgIDs7CisgICAgbW92ICAgICBiMyA9IHIyCisgICAgbW92ICAgICBiNCA9IHIzCisgICAgbGQ4ICAgICByMiA9IFtyMTBdCisgICAgbGQ4ICAgICByMjEgPSBbcjMyXSAgICAgICAgIC8vIGdldCB1c2VyIHVuYXQKKyAgICA7OworICAgIG1vdiAgICAgYjUgPSByMgorICAgIG1vdiAgICAgYXIudW5hdCA9IHIyMQorCisgICAgLy8KKyAgICAvLyBpbnZhbGlkYXRlIEFMQVQKKyAgICAvLworICAgIGludmFsYSA7OworCisgICAgYnIucmV0LnNwdGsgYjAKKyAgICAuZW5kcCBsb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pYTY0L3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Mjk2MTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pYTY0L3N5c2NhbGwuUwpAQCAtMCwwICsxLDIwIEBACisjCisjIGFyY2gvaWE2NC9zeXNjYWxsLlMKKyMKKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworCS50ZXh0CisJLmFsaWduCTMyCisJLnByb2MJX19zeXNjYWxsX2Vycm9yCisJLmdsb2JsCV9fc3lzY2FsbF9lcnJvcgorX19zeXNjYWxsX2Vycm9yOgorCWFkZGwJcjIgPSBAbHRvZmZ4KGVycm5vKSxncAorCTs7CisJbGQ4Lm1vdglyMyA9IFtyMl0sZXJybm8KKwk7OworCXN0NAlbcjNdID0gcjgKKwltb3YJcjggPSAtMQorCWJyLnJldC5zcHRrLm1hbnkgYjAKKwkuc2l6ZQlfX3N5c2NhbGxfZXJyb3IsIC4tX19zeXNjYWxsX2Vycm9yCisJLmVuZHAJX19zeXNjYWxsX2Vycm9yCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pYTY0L3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9pYTY0L3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2ODZjNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI5IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL2lhNjQvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudGV4dFxuIjsKKyAgICBwcmludCBPVVQgIlx0LmFsaWduIDMyXG4iOworICAgIHByaW50IE9VVCAiXHQucHJvYyAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHRtb3ZcdHIxNSA9IF9fTlJfJHtzbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdGJyZWFrIF9fQlJFQUtfU1lTQ0FMTFxuIjsKKyAgICBwcmludCBPVVQgIlx0Y21wLmVxIHA2LHAwID0gLTEscjEwXG4iOworICAgIHByaW50IE9VVCAiKHA2KVx0YnIuZmV3IF9fc3lzY2FsbF9lcnJvclxuIjsKKyAgICBwcmludCBPVVQgIlx0YnIucmV0LnNwdGsubWFueSBiMFxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemVcdCR7Zm5hbWV9LC4tJHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdC5lbmRwXHQke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaWE2NC92Zm9yay5TIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC92Zm9yay5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhODQ5MDIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pYTY0L3Zmb3JrLlMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIGlhNjQgc3BlY2lmaWMgdmZvcmsgc3lzY2FsbAorICoKKyAqIFdyaXR0ZW4gQnk6CSBNYXJ0aW4gSGlja3MgPG1vcnRAd2lsZG9wZW5zb3VyY2UuY29tPgorICoKKyAqLworCisvKiBUaGlzIHN5c2NhbGwgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIGNsb25lIHN5c2NhbGwgKi8KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorI2luY2x1ZGUgPGtsaWJjL2FyY2hzeXMuaD4KKworLyogVGhlc2UgYXJlIHJlZGVmaW5lZCBoZXJlIGJlY2F1c2UgbGludXgvc2NoZWQuaCBpc24ndCBzYWZlIGZvcgorICogaW5jbHVzaW9uIGluIGFzbS4KKyAqLworI2RlZmluZSBDTE9ORV9WTSAgICAweDAwMDAwMTAwIC8qIHNldCBpZiBWTSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgKi8KKyNkZWZpbmUgQ0xPTkVfVkZPUksgMHgwMDAwNDAwMCAvKiBzZXQgaWYgcGFyZW50IHdhbnRzIHRoZSBjaGlsZCB0byB3YWtlIGl0IHVwIG9uIGV4aXQgKi8KKworLyogcGlkX3QgdmZvcmsodm9pZCkgKi8KKy8qIEltcGxlbWVudGVkIGFzIGNsb25lKENMT05FX1ZGT1JLIHwgQ0xPTkVfVk0gfCBTSUdDSExELCAwKSAqLworCisJLmFsaWduIDMyCisJLnByb2MgdmZvcmsKKwkuZ2xvYmFsIHZmb3JrCit2Zm9yazoKKwlhbGxvYyByMj1hci5wZnMsMCwwLDIsMAorCW1vdglyMTU9X19OUl9jbG9uZQorCW1vdglvdXQwPUNMT05FX1ZNfENMT05FX1ZGT1JLfFNJR0NITEQKKwltb3YgICAgIG91dDE9MAorCTs7CisJYnJlYWsgMHgxMDAwMDAgICAgICAvLyBEbyB0aGUgc3lzY2FsbAorCTs7CisJYWRkbAlyMTU9MCxyMQorCWNtcC5lcSAgcDcscDYgPSAtMSxyMTAKKwk7OworCWxkOAlyMTQ9W3IxNV0KKwk7OworKHA3KQlzdDQJW3IxNF09cjgKKwk7OworKHA3KQltb3YJcjg9LTEKKwlici5yZXQuc3B0ay5tYW55IGIwCisJLmVuZHAgdmZvcmsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL20zMnIvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViMmJhMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL20zMnIvS2J1aWxkCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIG0zMnIKKyMKKworCitrbGliLXkgOj0gc2V0am1wLm8gc3lzY2FsbC5vCisKK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19kaXZkaTMubyAgICAgLi4vLi4vbGliZ2NjL19fbW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2ZGkzLm8gICAgLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdm1vZGRpNC5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTMyci9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTI3ODUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9tMzJyL01DT05GSUcKQEAgLTAsMCArMSwxOCBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvbTMyci9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNPUFRGTEFHUyArPSAtT3MKK0tMSUJDQklUU0laRSAgPSAzMgorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyAyMjQgTUIgLSBub3JtYWwgYmluYXJpZXMgc3RhcnQgYXQgMCAoPykKKyMgKGxpYj8pZ2NjIG9uIGNyaXMgc2VlbXMgdG8gaW5zaXN0IG9uIHByb2R1Y2luZyAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMKK0tMSUJDU0hBUkVERkxBR1MgICAgID0gLS1zZWN0aW9uLXN0YXJ0IC5pbml0PTB4MGUwMDAxMDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL20zMnIvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZTVkOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL20zMnIvY3J0MC5TCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgYXJjaC9tMzJyL2NydDAuUworIworIyBEb2VzIGFyY2gtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gYW5kIGludm9rZXMgX19saWJjX2luaXQKKyMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorIworIyBTZWUgX19zdGF0aWNfaW5pdC5jIG9yIF9fc2hhcmVkX2luaXQuYyBmb3IgdGhlIGV4cGVjdGVkCisjIGFyZ3VtZW50cy4KKyMKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLnR5cGUJX3N0YXJ0LEBmdW5jdGlvbgorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwkvKiBTYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBFTEYgYXJndW1lbnQgYXJyYXkgKi8KKwltdglyMCwgc3AKKworCS8qIGF0ZXhpdCgpIGZ1bmN0aW9uIChhc3N1bWUgbnVsbCkgKi8KKwl4b3IJcjEsIHIxCisKKwlibAlfX2xpYmNfaW5pdAorCisJLnNpemUgX3N0YXJ0LCAuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTMyci9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL20zMnIvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMjVlNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL20zMnIvc2V0am1wLlMKQEAgLTAsMCArMSw0NyBAQAorIworIyBhcmNoL20zMnIvc2V0am1wLlMKKyMKKyMgc2V0am1wL2xvbmdqbXAgZm9yIHRoZSBNMzJSIGFyY2hpdGVjdHVyZQorIworCisjCisjIFRoZSBqbXBfYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyMJcjgtcjE1CisjCisjCU5vdGUgdGhhdCByMTQgaXMgdGhlIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIGFuZAorIwlyMTUgaXMgdGhlIHN0YWNrIHBvaW50ZXIuCisjCisKKwkudGV4dAorCS5iYWxpZ24gNAorCS5nbG9ibAlzZXRqbXAKKwkudHlwZQlzZXRqbXAsIEBmdW5jdGlvbgorc2V0am1wOgorCXN0CXI4LCBAcjAKKwlzdAlyOSwgQCtyMAorCXN0CXIxMCwgQCtyMAorCXN0CXIxMSwgQCtyMAorCXN0CXIxMiwgQCtyMAorCXN0CXIxMywgQCtyMAorCXN0CXIxNCwgQCtyMAorCXN0CXIxNSwgQCtyMAorCXhvcglyMCwgcjAKKwlqbXAJcjE0CisJLnNpemUJc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5iYWxpZ24gNAorCS5nbG9ibAlsb25nam1wCisJLnR5cGUJbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorCWxkCXI4LCBAcjArCisJbGQJcjksIEByMCsKKwlsZAlyMTAsIEByMCsKKwlsZAlyMTEsIEByMCsKKwlsZAlyMTIsIEByMCsKKwlsZAlyMTMsIEByMCsKKwlsZAlyMTQsIEByMCsKKwlsZAlyMTUsIEByMAorCW12CXIwLCByMQorCWptcAlyMTQKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTMyci9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9tMzJyL3N5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBhMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9zeXNjYWxsLlMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGFyY2gvbTMyci9zeXNjYWxsLlMKKyAqCisgKiAgICAgcjcgY29udGFpbnMgdGhlIHN5c2NhbGwgbnVtYmVyIChzZXQgYnkgc3R1Yik7CisgKiByMC4ucjMgY29udGFpbnMgYXJndW1lbnRzIDAtMyBwZXIgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uOworICogcjQuLnI1IGNvbnRhaW5zIGFyZ3VtZW50cyA0LTUsIGJ1dCB3ZSBoYXZlIHRvIGdldCB0aG9zZSBmcm9tCisgKiAgICAgICAgdGhlIHN0YWNrLgorICovCisKKwkuc2VjdGlvbiAiLnRleHQiLCJheCIKKwkuYmFsaWduCTQKKwkuZ2xvYmwJX19zeXNjYWxsX2NvbW1vbgorCS50eXBlCV9fc3lzY2FsbF9jb21tb24sQGZ1bmN0aW9uCitfX3N5c2NhbGxfY29tbW9uOgorCWxkCXI0LEBzcAorCWxkCXI1LEAoNCxzcCkKKwl0cmFwCSMyCisJY21waQlyMCwgIy00MDk2CisJYm5jCTFmCisJam1wCXIxNAorMToKKwlzZXRoCXIyLCNoaWdoKGVycm5vKQorCW9yMwlyMixyMiwjbG93KGVycm5vKQorCW5lZwlyMSxyMAorCXN0CXIxLEByNworCWxkaQlyMCwjLTEKKwlqbXAJcjE0CisKKwkuc2l6ZQlfX3N5c2NhbGxfY29tbW9uLC4tX19zeXNjYWxsX2NvbW1vbgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTMyci9zeXNzdHViLnBoIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZGZiOWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9tMzJyL3N5c3N0dWIucGgKQEAgLTAsMCArMSwyNSBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9tMzJyL3N5c3N0dWIucGgKKyMKKyMgU2NyaXB0IHRvIGdlbmVyYXRlIHN5c3RlbSBjYWxsIHN0dWJzCisjCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnRleHRcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlXHQke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmxcdCR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHQuYmFsaWduXHQ0XG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHRsZGlcdHI3LCNfX05SXyR7c25hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHRicmFcdF9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5zaXplICR7Zm5hbWV9LC4tJHtmbmFtZX1cbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL202OGsvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2MTM3YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL202OGsvS2J1aWxkCkBAIC0wLDAgKzEsOCBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgbTY4aworIworCitrbGliLXkgOj0gc2V0am1wLm8gc3lzY2FsbC5vIHZmb3JrLm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tNjhrL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9tNjhrL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0NjE1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL202OGsvTUNPTkZJRwpAQCAtMCwwICsxLDE5IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9tNjhrL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitLTElCQ09QVEZMQUdTICs9IC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlcgorS0xJQkNCSVRTSVpFICA9IDMyCisKKyMgRXh0cmEgbGlua2ZsYWdzIHdoZW4gYnVpbGRpbmcgdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisjIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSByZWFjaGFibGUgdXNpbmcgbm9ybWFsIGludGVyLW1vZHVsZQorIyBjYWxscywgYW5kIHdvcmsgb24gdGhlIG1lbW9yeSBtb2RlbHMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCisjIDI4MTYgTUIgLSBub3JtYWwgYmluYXJpZXMgc3RhcnQgYXQgMjA0OCBNQiBpZiBJIHJlYWQgdGhlIGxpbmsKKyMgc2NyaXB0IHJpZ2h0LiAgTm90IHN1cmUgaWYgdGhlcmUgaXMgYSBmdW5kYW1lbnRhbCByZWFzb24KKyMgdG8gbm90IGR1Y2sgYmVsb3cgdGhlIGhhbGZ3YXkgcG9pbnQuLi4KK0tMSUJDU0hBUkVERkxBR1MgICAgICAgID0gLVR0ZXh0IDB4YjAwMDAwMDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL202OGsvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmNmYxMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL202OGsvY3J0MC5TCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgYXJjaC9tNjhrL2NydDAuUworIworIyBEb2VzIGFyY2gtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gYW5kIGludm9rZXMgX19saWJjX2luaXQKKyMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorIworIyBTZWUgX19zdGF0aWNfaW5pdC5jIG9yIF9fc2hhcmVkX2luaXQuYyBmb3IgdGhlIGV4cGVjdGVkCisjIGFyZ3VtZW50cy4KKyMKKworCS50ZXh0CisJLmFsaWduIDQKKwkudHlwZSBfc3RhcnQsQGZ1bmN0aW9uCisJLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCSMgWmVybyBvdXQgdGhlIGZyYW1lIHBvaW50ZXIgdG8gYmUgbmljZSB0byB0aGUgZGVidWdnZXIKKwltb3ZlYS5sCSMwLCVhNgorCSMgU2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgRUxGIGFyZ3VtZW50IGFycmF5CisJbW92ZS5sCSVhNywgJWQwCisJIyBQdXNoIGEgemVybyBvbiB0aGUgc3RhY2sgaW4gbGlldSBvZiBhdGV4aXQgcG9pbnRlcgorCWNsci5sCS0oJXNwKQorCSMgUHVzaCBFTEYgYXJndW1lbnQgcG9pbnRlciBvbiB0aGUgc3RhY2sKKwltb3ZlLmwJJWQwLCAtKCVhNykKKworCWpic3IJX19saWJjX2luaXQKKworCS5zaXplIF9zdGFydCwgLi1fc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL202OGsvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9tNjhrL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9tNjhrL3NldGptcC5TCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgYXJjaC9tNjhrL3NldGptcC5TCisjCisjIHNldGptcC9sb25nam1wIGZvciB0aGUgbTY4ayBhcmNoaXRlY3R1cmUKKyMKKworIworIyBUaGUgam1wX2J1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZywgaW4gb3JkZXI6CisjCSVkMi4uJWQ3CisjCSVhMi4uJWE3CisjCXJldHVybiBhZGRyZXNzCisjCisKKwkudGV4dAorCS5hbGlnbiAyCisJLmdsb2JsIHNldGptcAorCS50eXBlIHNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisJbW92ZS5sCSglc3ApKywgJWQwCQl8IFJldHVybiBhZGRyZXNzCisJbW92ZWEubAkoJXNwKSwgJWEwCQl8IEJ1ZmZlciBhZGRyZXNzCisJfCBQb3N0aW5jcmVtZW50IG1vZGUgaXMgbm90IHBlcm1pdHRlZCBoZXJlLi4uCisJbW92ZW0ubAklZDItJWQ3LyVhMi0lYTcsICglYTApCisJbW92ZS5sCSVkMCwgNDgoJWEwKQkJfCBSZXR1cm4gYWRkcmVzcworCW1vdmUubAklZDAsIC0oJXNwKQkJfCBSZXN0b3JlIHJldHVybiBhZGRyZXNzCisJY2xyLmwJJWQwCQkJfCBSZXR1cm4gdmFsdWUKKwltb3ZlYS5sCSVkMCwgJWEwCQl8IFJlZHVuZGFudCByZXR1cm4uLi4KKwlydHMKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnRleHQKKwkuYWxpZ24gMgorCS5nbG9ibCBsb25nam1wCisJLnR5cGUgbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorCW1vdmUubAk0KCVzcCksICVhMAkJfCBCdWZmZXIgYWRkcmVzcworCW1vdmUubAk4KCVzcCksICVkMAkJfCBSZXR1cm4gdmFsdWUKKwltb3ZlbS5sCSglYTApKywgJWQyLSVkNy8lYTItJWE3CisJbW92ZWEubAkoJWEwKSwgJWExCisJbW92ZWEubAklZDAsICVhMAkJfCBSZWR1bmRhbnQgcmV0dXJuLi4uCisJam1wLmwJKCVhMSkKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tNjhrL3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL202OGsvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmM5MmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9tNjhrL3N5c2NhbGwuUwpAQCAtMCwwICsxLDI3IEBACisvKgorICogYXJjaC9tNjhrL3N5c2NhbGwuUworICoKKyAqIENvbW1vbiB0YWlsLWhhbmRsaW5nIGNvZGUgZm9yIHN5c3RlbSBjYWxscy4KKyAqCisgKiBUaGUgYXJndW1lbnRzIGFyZSBvbiB0aGUgc3RhY2s7IHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIgaW4gJWQwLgorICovCisKKwkudGV4dAorCS5hbGlnbgkyCisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KKwkudHlwZQlfX3N5c2NhbGxfY29tbW9uLCBAZnVuY3Rpb24KK19fc3lzY2FsbF9jb21tb246CisJbW92ZW0ubCAlZDItJWQ2LCAtKCVzcCkJLyogNSByZWdpc3RlcnMgc2F2ZWQgKi8KKwltb3ZlbS5sCTI0KCVzcCksICVkMS0lZDYKKwl0cmFwCSMwCisJY21waS5sCSMtNDA5NSwgJWQwCisJYmx0LmwJMWYKKwluZWcubAklZDAKKwltb3ZlLmwJJWQwLCAoZXJybm8pCisJbW92ZXEJIy0xLCAlZDAKKzE6CisJbW92ZWEubAklZDAsICVhMAkvKiBSZWR1bmRhbnQgcmV0dXJuICovCisJbW92ZW0ubCAoJXNwKSssICVkMi0lZDYgLyogUmVzdG9yZSByZWdpc3RlcnMgKi8KKwlydHMKKworCS5zaXplCV9fc3lzY2FsbF9jb21tb24sLi1fX3N5c2NhbGxfY29tbW9uCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tNjhrL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9tNjhrL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMjM5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL202OGsvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI2IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL202OGsvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudHlwZSAke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmwgJHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisKKyAgICAkc3R5cGUgPSAnY29tbW9uJyBpZiAoICRzdHlwZSBlcSAnJyApOworCisgICAgcHJpbnQgT1VUICJcdG1vdmUubFx0IyBfX05SXyR7c25hbWV9LCAlZDBcbiI7CisgICAgcHJpbnQgT1VUICJcdGJyXHRfX3N5c2NhbGxfJHN0eXBlXG4iOworICAgIHByaW50IE9VVCAiXHQuc2l6ZSAke2ZuYW1lfSwuLSR7Zm5hbWV9XG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tNjhrL3Zmb3JrLlMgYi91c3Iva2xpYmMvYXJjaC9tNjhrL3Zmb3JrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhN2U0NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL202OGsvdmZvcmsuUwpAQCAtMCwwICsxLDI4IEBACisjCisjIHVzci9rbGliYy9hcmNoL202OGsvdmZvcmsuUworIworIyB2Zm9yayBpcyBuYXN0eSAtIHRoZXJlIG11c3QgYmUgbm90aGluZyBhdCBhbGwgb24gdGhlIHN0YWNrIGFib3ZlCisjIHRoZSBzdGFjayBmcmFtZSBvZiB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLgorIworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnRleHQKKwkuYWxpZ24JMgorCS5nbG9ibAl2Zm9yaworCS50eXBlCXZmb3JrLCBAZnVuY3Rpb24KK3Zmb3JrOgorCW1vdmUubAkoJXNwKSssICVkMQkJLyogUmV0dXJuIGFkZHJlc3MgKi8KKwltb3ZlLmwJIyBfX05SX3Zmb3JrLCAlZDAKKwl0cmFwCSMwCisJbW92ZS5sCSVkMSwgLSglc3ApCisJY21waS5sCSMtNDA5NSwgJWQwCisJYmx0LmwJMWYKKwluZWcubAklZDAKKwltb3ZlLmwJJWQwLCAoZXJybm8pCisJbW92ZXEJIy0xLCAlZDAKKzE6CisJbW92ZWEubAklZDAsICVhMAorCXJ0cworCisJLnNpemUJdmZvcmssIC4tdmZvcmsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHMvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyZTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHMvS2J1aWxkCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIG1pcHMKKyMKKwora2xpYi15IDo9IHBpcGUubyB2Zm9yay5vIHNldGptcC5vIHN5c2NhbGwubworCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fY2x6c2kyLm8gICAgIC4uLy4uL2xpYmdjYy9fX2FzaGxkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2FzaHJkaTMubyAgICAuLi8uLi9saWJnY2MvX19sc2hyZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19kaXZkaTMubyAgICAgLi4vLi4vbGliZ2NjL19fbW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2ZGkzLm8gICAgLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdm1vZGRpNC5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbWlwcy9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzMxYTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9taXBzL01DT05GSUcKQEAgLTAsMCArMSwxNSBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvbWlwcy9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNBUkNIUkVRRkxBR1MgPSAtZm5vLXBpYyAtbW5vLWFiaWNhbGxzIC1HIDAKK0tMSUJDT1BURkxBR1MgICAgICs9IC1PcworS0xJQkNCSVRTSVpFICAgICAgPSAzMgorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorS0xJQkNTSEFSRURGTEFHUwk9IC1UICQoc3JjKS9hcmNoLyQoS0xJQkNBUkNIKS9rbGliYy5sZApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbWlwcy9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9taXBzL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJkOWYyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9jcnQwLlMKQEAgLTAsMCArMSwyNSBAQAorIworIyBhcmNoL21pcHMvY3J0MC5TCisjCisjIERvZXMgYXJjaC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBhbmQgaW52b2tlcyBfX2xpYmNfaW5pdAorIyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCisjCisjIFNlZSBfX3N0YXRpY19pbml0LmMgb3IgX19zaGFyZWRfaW5pdC5jIGZvciB0aGUgZXhwZWN0ZWQKKyMgYXJndW1lbnRzLgorIworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworTkVTVEVEKF9fc3RhcnQsIDMyLCBzcCkKKwlzdWJ1CXNwLCAzMgorCXN3CXplcm8sIDE2KHNwKQorCisJbHVpCWdwLCAlaGkoX2dwKQkJIyBJbml0aWFsaXplIGdwCisJYWRkaXUJZ3AsIGdwLCBfZ3AKKworCWFkZGl1CWEwLCBzcCwgMzIJCSMgUG9pbnRlciB0byBFTEYgZW50cnkgc3RydWN0dXJlCisJbW92ZQlhMSwgdjAJCQkjIEtlcm5lbC1wcm92aWRlZCBhdGV4aXQoKSBwb2ludGVyCisKKwlqYWwJX19saWJjX2luaXQKKworCUVORChfX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbWlwcy9rbGliYy5sZCBiL3Vzci9rbGliYy9hcmNoL21pcHMva2xpYmMubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyYTdhNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHMva2xpYmMubGQKQEAgLTAsMCArMSwyMTQgQEAKKy8qIExpbmtlciBzY3JpcHQgZm9yIGtsaWJjLnNvLCBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgdGhlIGRhbW5lZAorICAgR05VIGxkIHNjcmlwdCBoZWFkZXJzIHByb2JsZW0gKi8KKworRU5UUlkoX19zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAvKiBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyAgICAgIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKyAgLyogMiBNQiAtLSB0aGUgbm9ybWFsIHN0YXJ0aW5nIHBvaW50IGZvciB0ZXh0IGlzIDQgTUIgKi8KKyAgLiA9IDB4MDAyMDA0MDA7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5yZWdpbmZvICAgICAgICA6IHsgKigucmVnaW5mbykgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuc2RhdGEgLnJlbC5zZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnMuKikKKyAgICAgICooLnJlbC5zYnNzIC5yZWwuc2Jzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnNiLiopCisgICAgICAqKC5yZWwuc2RhdGEyIC5yZWwuc2RhdGEyLiogLnJlbC5nbnUubGlua29uY2UuczIuKikKKyAgICAgICooLnJlbC5zYnNzMiAucmVsLnNic3MyLiogLnJlbC5nbnUubGlua29uY2Uuc2IyLiopCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLnNkYXRhIC5yZWxhLnNkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnMuKikKKyAgICAgICooLnJlbGEuc2JzcyAucmVsYS5zYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnNiLiopCisgICAgICAqKC5yZWxhLnNkYXRhMiAucmVsYS5zZGF0YTIuKiAucmVsYS5nbnUubGlua29uY2UuczIuKikKKyAgICAgICooLnJlbGEuc2JzczIgLnJlbGEuc2JzczIuKiAucmVsYS5nbnUubGlua29uY2Uuc2IyLiopCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDogeyAqKC5yZWwucGx0KSB9CisgIC5yZWxhLnBsdCAgICAgICA6IHsgKigucmVsYS5wbHQpIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0wCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICBfZnRleHQgPSAuIDsKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgICAgKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopCisgIH0gPTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0wCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLnNkYXRhMiAgICAgICAgIDogeyAqKC5zZGF0YTIgLnNkYXRhMi4qIC5nbnUubGlua29uY2UuczIuKikgfQorICAuc2JzczIgICAgICAgICAgOiB7ICooLnNic3MyIC5zYnNzMi4qIC5nbnUubGlua29uY2Uuc2IyLiopIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04oODE5Mik7CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREUgKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOiB7ICooLnByZWluaXRfYXJyYXkpIH0KKyAgUFJPVklERSAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDogeyAqKC5pbml0X2FycmF5KSB9CisgIFBST1ZJREUgKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERSAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6IHsgKiguZmluaV9hcnJheSkgfQorICBQUk9WSURFIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICBfZmRhdGEgPSAuIDsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5laF9mcmFtZSAgICAgICA6IHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiB7ICooLmdjY19leGNlcHRfdGFibGUpIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KKyAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKKyAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbworICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLworICAuc2RhdGEgICAgICAgICAgOgorICB7CisgICAgKiguc2RhdGEgLnNkYXRhLiogLmdudS5saW5rb25jZS5zLiopCisgIH0KKyAgLmxpdDggICAgICAgICAgIDogeyAqKC5saXQ4KSB9CisgIC5saXQ0ICAgICAgICAgICA6IHsgKigubGl0NCkgfQorICBfZWRhdGEgPSAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIF9mYnNzID0gLjsKKyAgLnNic3MgICAgICAgICAgIDoKKyAgeworICAgIFBST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pOworICAgIFBST1ZJREUgKF9fX3Nic3Nfc3RhcnQgPSAuKTsKKyAgICAqKC5keW5zYnNzKQorICAgICooLnNic3MgLnNic3MuKiAuZ251LmxpbmtvbmNlLnNiLiopCisgICAgKiguc2NvbW1vbikKKyAgICBQUk9WSURFIChfX3Nic3NfZW5kID0gLik7CisgICAgUFJPVklERSAoX19fc2Jzc19lbmQgPSAuKTsKKyAgfQorICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSB9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzL3BpcGUuUyBiL3Vzci9rbGliYy9hcmNoL21pcHMvcGlwZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjk0MDUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9taXBzL3BpcGUuUwpAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKK0xFQUYocGlwZSkKKwlsaQl2MCwgX19OUl9waXBlCisJc3lzY2FsbAorCWJuZXoJYTMsIDFmCisJc3cJdjAsICAoYTApCisJc3cJdjEsIDQoYTApCisJbGkJdjAsIDAKKwliCTJmCisxOglzdwl2MCwgZXJybm8KKwlsaQl2MCwgLTEKKzI6CWpyCXJhCisJRU5EKHBpcGUpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzL3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGVlZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9zZXRqbXAuUwpAQCAtMCwwICsxLDgwIEBACisjCisjIGFyY2gvbWlwcy9zZXRqbXAuUworIworIyBzZXRqbXAvbG9uZ2ptcCBmb3IgdGhlIE1JUFMgYXJjaGl0ZWN0dXJlCisjCisjIFRoZSBqbXBfYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyMJczAuLnM3CisjCWdwCisjCXNwCisjCXM4CisjCXJhCisjCWYyMC4uZjMxCisjCWZjcjMxCisjCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitMRUFGKHNldGptcCkKKwlzdwlzMCwgIDAoYTApCisJc3cJczEsICA0KGEwKQorCXN3CXMyLCAgOChhMCkKKwlzdwlzMywgMTIoYTApCisJc3cJczQsIDE2KGEwKQorCXN3CXM1LCAyMChhMCkKKwlzdwlzNiwgMjQoYTApCisJc3cJczcsIDI4KGEwKQorCXN3CWdwLCAzMihhMCkKKwlzdwlzcCwgMzYoYTApCisJc3cJczgsIDQwKGEwKQorCXN3CXJhLCA0NChhMCkKKwljZmMxCXQwLCQzMQorCXN3YzEJJGYyMCw0OChhMCkKKwlzd2MxCSRmMjEsNTIoYTApCisJc3djMQkkZjIyLDU2KGEwKQorCXN3YzEJJGYyMyw2MChhMCkKKwlzd2MxCSRmMjQsNjQoYTApCisJc3djMQkkZjI1LDY4KGEwKQorCXN3YzEJJGYyNiw3MihhMCkKKwlzd2MxCSRmMjcsNzYoYTApCisJc3djMQkkZjI4LDgwKGEwKQorCXN3YzEJJGYyOSw4NChhMCkKKwlzd2MxCSRmMzAsODgoYTApCisJc3djMQkkZjMxLDkyKGEwKQorCXN3CXQwLDk2KGEwKQorCW1vdmUJdjAsemVybworCWpyCXJhCisKKwlFTkQoc2V0am1wKQorCitMRUFGKGxvbmdqbXApCisJbHcJczAsICAwKGEwKQorCWx3CXMxLCAgNChhMCkKKwlsdwlzMiwgIDgoYTApCisJbHcJczMsIDEyKGEwKQorCWx3CXM0LCAxNihhMCkKKwlsdwlzNSwgMjAoYTApCisJbHcJczYsIDI0KGEwKQorCWx3CXM3LCAyOChhMCkKKwlsdwlncCwgMzIoYTApCisJbHcJc3AsIDM2KGEwKQorCWx3CXM4LCA0MChhMCkKKwlsdwlyYSwgNDQoYTApCisJbHcJdDAsIDk2KGEwKQorCWx3YzEJJGYyMCw0OChhMCkKKwlsd2MxCSRmMjEsNTIoYTApCisJbHdjMQkkZjIyLDU2KGEwKQorCWx3YzEJJGYyMyw2MChhMCkKKwlsd2MxCSRmMjQsNjQoYTApCisJbHdjMQkkZjI1LDY4KGEwKQorCWx3YzEJJGYyNiw3MihhMCkKKwlsd2MxCSRmMjcsNzYoYTApCisJbHdjMQkkZjI4LDgwKGEwKQorCWx3YzEJJGYyOSw4NChhMCkKKwlsd2MxCSRmMzAsODgoYTApCisJbHdjMQkkZjMxLDkyKGEwKQorCWN0YzEJdDAsJDMxCisJbW92ZQl2MCxhMQorCWpyCXJhCisKKwlFTkQobG9uZ2ptcCkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHMvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzMDhkZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHMvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworCS5zZXQgbm9yZW9yZGVyCisKK0xFQUYoX19zeXNjYWxsX2NvbW1vbikKKwlzeXNjYWxsCisgICAgICAgIGJlcXogICAgYTMsIDFmCisJIyBzdyBpcyBhY3R1YWxseSB0d28gaW5zdHJ1Y3Rpb25zOyB0aGUgZmlyc3Qgb25lIGdvZXMKKwkjIGluIHRoZSBicmFuY2ggZGVsYXkgc2xvdAorCSMgWFhYOiBCcmVhayB0aGlzIHVwIG1hbnVhbGx5OyBhcyBpdCBpcyBub3cgaXQgZ2VuZXJhdGVzIHdhcm5pbmdzLgorICAgICAgICBzdyAgICAgIHYwLCBlcnJubworICAgICAgICBsaSAgICAgIHYwLCAtMQorMTogICAgICBqciAgICAgIHJhCisJRU5EKF9fc3lzY2FsbF9jb21tb24pCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9taXBzL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxZDVkMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHMvc3lzc3R1Yi5waApAQCAtMCwwICsxLDMwIEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL21pcHMvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworIyBPbiBNSVBTLCBtb3N0IHN5c3RlbSBjYWxscyBmb2xsb3cgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24sIHdpdGggdGhlCisjIHN5c3RlbSBjYWxsIG51bWJlciBpbiByMCAodjApLCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgaW4gcjE5IChhMykgYXMKKyMgd2VsbCBhcyB0aGUgcmV0dXJuIHZhbHVlIGluIHIwICh2MCkuCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgJHN0eXBlID0gJHN0eXBlIHx8ICdjb21tb24nOworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS9hc20uaD5cbiI7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPlxuIjsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQuc2V0IG5vcmVvcmRlclxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIkxFQUYoJHtmbmFtZX0pXG4iOworICAgIHByaW50IE9VVCAiXHRqXHRfX3N5c2NhbGxfJHtzdHlwZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdCAgbGlcdHYwLCBfX05SXyR7c25hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHRFTkQoJHtmbmFtZX0pXG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzL3Zmb3JrLlMgYi91c3Iva2xpYmMvYXJjaC9taXBzL3Zmb3JrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmMDM1YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHMvdmZvcmsuUwpAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNkZWZpbmUgQ0xPTkVfVk0JMHgwMDAwMDEwMAorI2RlZmluZSBDTE9ORV9WRk9SSwkweDAwMDA0MDAwCisjZGVmaW5lIFNJR0NITEQJCTE4CisKKwkuc2V0IG5vcmVvcmRlcgorCitMRUFGKHZmb3JrKQorCWxpCWEwLCBDTE9ORV9WRk9SSyB8IENMT05FX1ZNIHwgU0lHQ0hMRAorCWxpCWExLCAwCisJaglfX3N5c2NhbGxfY29tbW9uCisJICBsaQl2MCwgX19OUl9jbG9uZQorCUVORCh2Zm9yaykKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHM2NC9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9taXBzNjQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGMwZjgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9taXBzNjQvS2J1aWxkCkBAIC0wLDAgKzEsMyBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgbWlwczY0CisjCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzNjQvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL21pcHM2NC9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTBiOGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9taXBzNjQvTUNPTkZJRwpAQCAtMCwwICsxLDExIEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9taXBzNjQvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisKK0tMSUJDT1BURkxBR1MgKz0gLU9zCitLTElCQ0JJVFNJWkUgID0gNjQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2MvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2E1YzIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2MvS2J1aWxkCkBAIC0wLDAgKzEsOCBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgcGFyaXNjCisjCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8gdmZvcmsubworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4ZTk4NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9NQ09ORklHCkBAIC0wLDAgKzEsMTIgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL3BhcmlzYy9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNPUFRGTEFHUyArPSAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIKK0tMSUJDQklUU0laRSAgPSAzMgorS0xJQkNTSEFSRURGTEFHUwk9IC1UdGV4dCAweDQwMDAxMDAwCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wYXJpc2MvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTIyNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL2NydDAuUwpAQCAtMCwwICsxLDM3IEBACisJLmFsaWduIDQKKworCS5pbXBvcnQgJGdsb2JhbCQsIGRhdGEKKwkuaW1wb3J0IF9fbGliY19pbml0LCBjb2RlCisKKwkuZ2xvYmFsIF9zdGFydAorCS5leHBvcnQgX3N0YXJ0LCBFTlRSWQorCS50eXBlIF9zdGFydCxAZnVuY3Rpb24KKworCS5wcm9jCisJLmNhbGxpbmZvCisKK19zdGFydDoKKy8qIGV4dGVuZCB0aGUgc3RhY2sgYnkgNjQtYnl0ZXMgKi8KKwlsZG8JNjQoJXNwKSwgJXNwCisKKy8qICVyMjUgPSBhcmdjCisgKiAlcjI0ID0gYXJndgorICogZW52cCA9IGFyZ3YgKyAoYXJnYyArIDEpCisgKiBlbGZkYXRhID0gKGFyZ3YgLSA0KQorICovCisJbGRvCS00KCVyMjQpLCAlcjI2CisKKy8qIGxvYWQgZ2xvYmFsIGRhdGEgKi8KKwlsZGlsCUwlJGdsb2JhbCQsICVkcAorCWxkbwlSJSRnbG9iYWwkKCVkcCksICVkcAorCisvKiBwYXJpc2MgYWJpIHB1dHMgdGhlIGF0ZXhpdCBwb2ludGVyIGluICVyMjMsIHNlZSBFTEZfUExBVF9JTklUKCkgKi8KKwljb3B5CSVyMjMsICVyMjUKKworLyogYnJhbmNoIHRvIF9fbGliY19pbml0ICovCisJYmwJX19saWJjX2luaXQsJXIyCisJbm9wCisvKiBicmVhayBtaXNlcmFibHkgaWYgd2UgZXZlciByZXR1cm4gKi8KKwlpaXRsYnAJJXIwLCglc3IwLCVyMCkgLyogaWxsZWdhbCBpbnN0cnVjdGlvbiAqLworCW5vcAorCS5wcm9jZW5kCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wYXJpc2Mvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2Mvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkNzY2YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9zZXRqbXAuUwpAQCAtMCwwICsxLDg4IEBACisvKgorICogcGFyaXNjIHNwZWNpZmljIHNldGptcC9sb25nam1wIHJvdXRpbmVzCisgKgorICovCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgLmFsaWduIDQKKyAgICAgICAgLmdsb2JhbCBzZXRqbXAKKyAgICAgICAgLmV4cG9ydCBzZXRqbXAsIGNvZGUKKyAgICAgICAgLnByb2MKKyAgICAgICAgLmNhbGxpbmZvCitzZXRqbXA6CisgICAgICAgIHN0dyAgICAgJXIzLDAoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjQsOCglcjI2KQorICAgICAgICBzdHcgICAgICVyNSwxMiglcjI2KQorICAgICAgICBzdHcgICAgICVyNiwxNiglcjI2KQorICAgICAgICBzdHcgICAgICVyNywyMCglcjI2KQorICAgICAgICBzdHcgICAgICVyOCwyNCglcjI2KQorICAgICAgICBzdHcgICAgICVyOSwyOCglcjI2KQorICAgICAgICBzdHcgICAgICVyMTAsMzIoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjExLDM2KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIxMiw0MCglcjI2KQorICAgICAgICBzdHcgICAgICVyMTMsNDQoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjE0LDQ4KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIxNSw1MiglcjI2KQorICAgICAgICBzdHcgICAgICVyMTYsNTYoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjE3LDYwKCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIxOCw2NCglcjI2KQorICAgICAgICBzdHcgICAgICVyMTksNjgoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjI3LDcyKCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIzMCw3NiglcjI2KQorICAgICAgICBzdHcgICAgICVycCw4MCglcjI2KQorICAgICAgICBsZG8gICAgIDg4KCVyMjYpLCVyMTkKKyAgICAgICAgZnN0ZCxtYSAlZnIxMiw4KCVyMTkpCisgICAgICAgIGZzdGQsbWEgJWZyMTMsOCglcjE5KQorICAgICAgICBmc3RkLG1hICVmcjE0LDgoJXIxOSkKKyAgICAgICAgZnN0ZCxtYSAlZnIxNSw4KCVyMTkpCisgICAgICAgIGZzdGQsbWEgJWZyMTYsOCglcjE5KQorICAgICAgICBmc3RkLG1hICVmcjE3LDgoJXIxOSkKKyAgICAgICAgZnN0ZCxtYSAlZnIxOCw4KCVyMTkpCisgICAgICAgIGZzdGQsbWEgJWZyMTksOCglcjE5KQorICAgICAgICBmc3RkLG1hICVmcjIwLDgoJXIxOSkKKyAgICAgICAgZnN0ZCAgICAgJWZyMjEsMCglcjE5KQorICAgICAgICBidiAgICAgICAlcjAoJXJwKQorICAgICAgICBjb3B5ICAgICAlcjAsJXIyOAorCS5wcm9jZW5kCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JhbCBsb25nam1wCisJLmV4cG9ydCBsb25nam1wLCBjb2RlCisJLnByb2MKKwkuY2FsbGluZm8KK2xvbmdqbXA6CisgICAgICAgIGxkdyAgICAgMCglcjI2KSwlcjMKKyAgICAgICAgbGR3ICAgICA4KCVyMjYpLCVyNAorICAgICAgICBsZHcgICAgIDEyKCVyMjYpLCVyNQorICAgICAgICBsZHcgICAgIDE2KCVyMjYpLCVyNgorICAgICAgICBsZHcgICAgIDIwKCVyMjYpLCVyNworICAgICAgICBsZHcgICAgIDI0KCVyMjYpLCVyOAorICAgICAgICBsZHcgICAgIDI4KCVyMjYpLCVyOQorICAgICAgICBsZHcgICAgIDMyKCVyMjYpLCVyMTAKKyAgICAgICAgbGR3ICAgICAzNiglcjI2KSwlcjExCisgICAgICAgIGxkdyAgICAgNDAoJXIyNiksJXIxMgorICAgICAgICBsZHcgICAgIDQ0KCVyMjYpLCVyMTMKKyAgICAgICAgbGR3ICAgICA0OCglcjI2KSwlcjE0CisgICAgICAgIGxkdyAgICAgNTIoJXIyNiksJXIxNQorICAgICAgICBsZHcgICAgIDU2KCVyMjYpLCVyMTYKKyAgICAgICAgbGR3ICAgICA2MCglcjI2KSwlcjE3CisgICAgICAgIGxkdyAgICAgNjQoJXIyNiksJXIxOAorICAgICAgICBsZHcgICAgIDY4KCVyMjYpLCVyMTkKKyAgICAgICAgbGR3ICAgICA3MiglcjI2KSwlcjI3CisgICAgICAgIGxkdyAgICAgNzYoJXIyNiksJXIzMAorICAgICAgICBsZHcgICAgIDgwKCVyMjYpLCVycAorICAgICAgICBsZG8gICAgIDg4KCVyMjYpLCVyMjAKKyAgICAgICAgZmxkZCxtYSA4KCVyMjApLCVmcjEyCisgICAgICAgIGZsZGQsbWEgOCglcjIwKSwlZnIxMworICAgICAgICBmbGRkLG1hIDgoJXIyMCksJWZyMTQKKyAgICAgICAgZmxkZCxtYSA4KCVyMjApLCVmcjE1CisgICAgICAgIGZsZGQsbWEgOCglcjIwKSwlZnIxNgorICAgICAgICBmbGRkLG1hIDgoJXIyMCksJWZyMTcKKyAgICAgICAgZmxkZCxtYSA4KCVyMjApLCVmcjE4CisgICAgICAgIGZsZGQsbWEgOCglcjIwKSwlZnIxOQorICAgICAgICBmbGRkLG1hIDgoJXIyMCksJWZyMjAKKyAgICAgICAgZmxkZCAgICAwKCVyMjApLCVmcjIxCisgICAgICAgIGJ2ICAgICAgJXIwKCVycCkKKyAgICAgICAgY29weSAgICAlcjI1LCVyMjgKKyAgICAgICAgLnByb2NlbmQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2Mvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjJhNjUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2Mvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBhcmNoL3BhcmlzYy9zeXNjYWxsLlMKKyAqCisgKiAlcjIwIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIsICVyMiBjb250YWlucyB3aGVuY2Ugd2UgY2FtZQorICoKKyAqLworCisJLnRleHQKKwkuYWxpZ24gNjQJCQkJOyBjYWNoZS13aWR0aCBhbGlnbmVkCisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KKwkudHlwZQlfX3N5c2NhbGxfY29tbW9uLEBmdW5jdGlvbgorX19zeXNjYWxsX2NvbW1vbjoKKwlsZG8gCQkweDQwKCVzcCksJXNwCisJc3R3IAkJJXJwLC0weDU0KCVzcCkJCTsgc2F2ZSByZXR1cm4gcG9pbnRlcgorCisJbGR3IAkJLTB4NzQoJXNwKSwlcjIyCQk7ICVhcmc0CisJbGR3IAkJLTB4NzgoJXNwKSwlcjIxCQk7ICVhcmc1CisKKwlibGUJCTB4MTAwKCVzcjIsICVyMCkJOyBqdW1wIHRvIGdhdGV3YXkgcGFnZQorCW5vcAkJCQkJOyBjYW4gd2UgbW92ZSBhIGxvYWQgaGVyZT8KKworCWxkaQkJLTB4MTAwMCwlcjE5CQk7ICVyMTkgPSAtNDA5NgorCXN1YgkJJXIwLCVyZXQwLCVyMjIJCTsgJXIyMiA9IC0lcmV0MAorCWNtcGIsPj49LG4JJXIxOSwlcmV0MCwxZgkJOyBpZiAlcmV0MCA+PSAtNDA5NlVMCisJbGRpCQktMSwlcmV0MAkJOyBudWxsaWZpZWQgb24gdGFrZW4gZm9yd2FyZAorCisJLyogc3RvcmUgJXIyMiB0byBlcnJuby4uLiAqLworCWxkaWwJCUwlZXJybm8sJXIxCisJbGRvCQlSJWVycm5vKCVyMSksJXIxCisJc3R3CQklcjIyLDAoJXIxKQorMToKKwlsZHcgCQktMHg1NCglc3ApLCVycAkJOyByZXN0b3JlIHJldHVybiBwb2ludGVyCisJYnYJCSVyMCglcnApCQk7IGp1bXAgYmFjaworCWxkbyAJCS0weDQwKCVzcCksJXNwCisKKwkuc2l6ZSBfX3N5c2NhbGxfY29tbW9uLC4tX19zeXNjYWxsX2NvbW1vbgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9wYXJpc2Mvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE5NmFjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL3N5c3N0dWIucGgKQEAgLTAsMCArMSwyOCBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9wYXJpc2Mvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudGV4dFxuIjsKKyAgICBwcmludCBPVVQgIlx0LmFsaWduIDRcbiI7CisgICAgcHJpbnQgT1VUICJcdC5pbXBvcnQgX19zeXNjYWxsX2NvbW1vbiwgY29kZVxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JhbCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0LmV4cG9ydCAke2ZuYW1lfSwgY29kZVxuIjsKKyAgICBwcmludCBPVVQgIlx0LnByb2NcbiI7CisgICAgcHJpbnQgT1VUICJcLmNhbGxpbmZvXG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHRiXHRfX3N5c2NhbGxfY29tbW9uXG4iOworICAgIHByaW50IE9VVCAiXHQgIGxkb1x0X19OUl8ke3NuYW1lfSglcjApLCVyMjBcbiI7CisgICAgcHJpbnQgT1VUICJcdC5wcm9jZW5kXG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wYXJpc2MvdmZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy92Zm9yay5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWJjOGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2MvdmZvcmsuUwpAQCAtMCwwICsxLDMxIEBACisvKgorICogYXJjaC9wYXJpc2MvdmZvcmsuUywgInZmb3JrKCkgbWUgaGFyZGVyLiB1Z2guIiAtLSBreWxlCisgKgorICogJXIyMCBjb250YWlucyB0aGUgc3lzdGVtIGNhbGwgbnVtYmVyLCAlcnAgY29udGFpbnMgd2hlbmNlIHdlIGNhbWUsCisgKiAlcnAgaXMgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyB0aGUgc3lzY2FsbCwgdGhhbmtmdWxseS4KKyAqCisgKi8KKworCS50ZXh0CisJLmFsaWduIDY0CQkJCTsgY2FjaGUtd2lkdGggYWxpZ25lZAorCS5nbG9ibAl2Zm9yaworCS50eXBlCXZmb3JrLEBmdW5jdGlvbgordmZvcms6CisJLyogcGlkX3QgdmZvcmsodm9pZCkgKi8KKwlibGUJCTB4MTAwKCVzcjIsICVyMCkJOyBqdW1wIHRvIGdhdGV3YXkgcGFnZQorCW5vcAorCisJbGRpCQktMHgxMDAwLCVyMTkJCTsgJXIxOSA9IC00MDk2CisJc3ViCQklcjAsJXJldDAsJXIyMgkJOyAlcjIyID0gLSVyZXQwCisJY21wYiw+Pj0sbgklcjE5LCVyZXQwLDFmCQk7IGlmICVyZXQwID49IC00MDk2VUwKKwlsZGkJCS0xLCVyZXQwCQk7IG51bGxpZmllZCBvbiB0YWtlbiBmb3J3YXJkCisKKwkvKiBzdG9yZSAlcjIyIHRvIGVycm5vLi4uICovCisJbGRpbAkJTCVlcnJubywlcjEKKwlsZG8JCVIlZXJybm8oJXIxKSwlcjEKKwlzdHcJCSVyMjIsMCglcjEpCisxOgorCWJ2CQklcjAoJXJwKQkJOyBqdW1wIGJhY2sKKwlub3AKKworCS5zaXplIHZmb3JrLC4tdmZvcmsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BwYy9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9wcGMvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTM4MGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGMvS2J1aWxkCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIHBwYworIworCitrbGliLXkgOj0gc2V0am1wLm8gc3lzY2FsbC5vCisKK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19kaXZkaTMubyAgICAgLi4vLi4vbGliZ2NjL19fbW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2ZGkzLm8gICAgLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdm1vZGRpNC5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9wcGMvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTczMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjL01DT05GSUcKQEAgLTAsMCArMSwyOSBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvcHBjL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitnY2NfbTMyX29wdGlvbiAgOj0gJChjYWxsIGNjLW9wdGlvbiwgLW0zMiwgKQorCitLTElCQ09QVEZMQUdTCSAgICs9IC1PcworS0xJQkNMREZMQUdTICAgICAgID0gLW0gZWxmMzJwcGNsaW51eAorS0xJQkNBUkNIUkVRRkxBR1MgKz0gJChnY2NfbTMyX29wdGlvbikKKworS0xJQkNCSVRTSVpFICAgICAgID0gMzIKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgMjU2LTE2IE1CIC0gbm9ybWFsIGJpbmFyaWVzIHN0YXJ0IGF0IDI1NiBNQiwgYW5kIGp1bXBzIGFyZSBsaW1pdGVkCisjIHRvICsvLSAxNiBNQgorS0xJQkNTSEFSRURGTEFHUyAgICAgPSAtVHRleHQgMHgwZjgwMDIwMAorCisjIFRoZSBrZXJuZWwgc28gZmFyIGhhcyBib3RoIGFzbS1wcGMqIGFuZCBhc20tcG93ZXJwYy4KK0tMSUJDQVJDSElOQ0ZMQUdTID0gLUkkKEtMSUJDS0VSTkVMT0JKKWFyY2gvJChLTElCQ0FSQ0gpL2luY2x1ZGUKKworIyBUaGUgYXNtIGluY2x1ZGUgZmlsZXMgbGl2ZSBpbiBhc20tcG93ZXJwYworS0xJQkNBU01BUkNICT0gcG93ZXJwYwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjL2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL3BwYy9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViNmRjYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BwYy9jcnQwLlMKQEAgLTAsMCArMSwyMyBAQAorIworIyBhcmNoL3BwYy9jcnQwLlMKKyMKKworCS50ZXh0CisJLmFsaWduIDQKKwkudHlwZSBfc3RhcnQsQGZ1bmN0aW9uCisJLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCXN0d3UJMSwtMTYoMSkKKwlhZGRpCTMsMSwxNgorCS8qCisJICogdGhlIFNWUjRhYmlwcGMucGRmIHNwZWNpZmllcyByNyBhcyBhIHBvaW50ZXIgdG8KKwkgKiBhIHRlcm1pbmF0aW9uIGZ1bmN0aW9uIHBvaW50CisJICogSG93ZXZlciwgU2VjdGlvbiA4LjQuMSBvZiB0aGUgTFNCIEFQSSBkb2NzIHNheSB0aGF0CisJICogVGhlIHZhbHVlIHRvIGJlIHBsYWNlZCBpbnRvIHJlZ2lzdGVyIHI3LCB0aGUgdGVybWluYXRpb24KKwkgKiBmdW5jdGlvbiBwb2ludGVyLCBpcyBub3QgcGFzc2VkIHRvIHRoZSBwcm9jZXNzLgorCSAqIFNvIHdlIHN0dWIgaXQgb3V0LCBpbnN0ZWFkLgorCSAqLworCWxpCTQsMAorCWJsCV9fbGliY19pbml0CisKKwkuc2l6ZSBfc3RhcnQsLi1fc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BwYy9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3BwYy9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJiN2RhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjL3NldGptcC5TCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgYXJjaC9wcGMvc2V0am1wLlMKKyMKKyMgQmFzaWMgc2V0am1wL2xvbmdqbXAgaW1wbGVtZW50YXRpb24KKyMgVGhpcyBmaWxlIHdhcyBkZXJpdmVkIGZyb20gdGhlIGVxdWl2YWxlbnQgZmlsZSBpbiBOZXRCU0QKKyMKKworCS50ZXh0CisJLmFsaWduIDQKKwkudHlwZSBzZXRqbXAsQGZ1bmN0aW9uCisJLmdsb2JsIHNldGptcAorc2V0am1wOgorICAgICAgICBtZmxyICAgICVyMTEgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgcmV0dXJuIGFkZHJlc3MgKi8KKyAgICAgICAgbWZjciAgICAlcjEyICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGNvbmRpdGlvbiByZWdpc3RlciAqLworICAgICAgICBtciAgICAgICVyMTAsJXIxICAgICAgICAgICAgICAgIC8qIHNhdmUgc3RhY2sgcG9pbnRlciAqLworICAgICAgICBtciAgICAgICVyOSwlcjIgICAgICAgICAgICAgICAgIC8qIHNhdmUgR1BSMiAobm90IG5lZWRlZCkgKi8KKyAgICAgICAgc3RtdyAgICAlcjksMCglcjMpICAgICAgICAgICAgICAvKiBzYXZlIHI5Li5yMzEgKi8KKyAgICAgICAgbGkgICAgICAlcjMsMCAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSBzdWNjZXNzICovCisgICAgICAgIGJsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuICovCisKKwkuc2l6ZSBzZXRqbXAsLi1zZXRqbXAKKworCS50eXBlIGxvbmdqbXAsQGZ1bmN0aW9uCisJLmdsb2JsIGxvbmdqbXAKK2xvbmdqbXA6CisgICAgICAgIGxtdyAgICAgJXI5LDAoJXIzKSAgICAgICAgICAgICAgLyogc2F2ZSByOS4ucjMxICovCisgICAgICAgIG10bHIgICAgJXIxMSAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBMUiAqLworICAgICAgICBtdGNyICAgICVyMTIgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgQ1IgKi8KKyAgICAgICAgbXIgICAgICAlcjIsJXI5ICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIEdQUjIgKG5vdCBuZWVkZWQpICovCisgICAgICAgIG1yICAgICAgJXIxLCVyMTAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBzdGFjayAqLworICAgICAgICBtciAgICAgICVyMywlcjQgICAgICAgICAgICAgICAgIC8qIGdldCByZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gKi8KKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGMvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvcHBjL3N5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTdjMzdjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjL3N5c2NhbGwuUwpAQCAtMCwwICsxLDE2IEBACisvKgorICogYXJjaC9wcGMvc3lzY2FsbC5TCisgKgorICogQ29tbW9uIGVycm9yLWhhbmRsaW5nIHBhdGggZm9yIHN5c3RlbSBjYWxscy4KKyAqLworCisJLnRleHQKKwkuYWxpZ24JMgorCS5nbG9ibAlfX3N5c2NhbGxfZXJyb3IKKwkudHlwZQlfX3N5c2NhbGxfZXJyb3IsQGZ1bmN0aW9uCitfX3N5c2NhbGxfZXJyb3I6CisJbGlzCTksZXJybm9AaGEKKwlzdHcJMyxlcnJub0BsKDkpCisJbGkJMywtMQorCWJscgorCS5zaXplCV9fc3lzY2FsbF9lcnJvciwuLV9fc3lzY2FsbF9lcnJvcgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9wcGMvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM5MTZjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjL3N5c3N0dWIucGgKQEAgLTAsMCArMSwyNSBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9wcGMvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudHlwZSAke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmwgJHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICJcdGxpIDAsX19OUl8ke3NuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0c2NcbiI7CisgICAgcHJpbnQgT1VUICJcdGJuc2xyXG4iOworICAgIHByaW50IE9VVCAiXHRiIF9fc3lzY2FsbF9lcnJvclxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjNjQvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOWU5MWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGM2NC9LYnVpbGQKQEAgLTAsMCArMSw4IEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBwcGM2NAorIworCitrbGliLXkgOj0gc2V0am1wLm8gc3lzY2FsbC5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjNjQvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyZDA3YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L01DT05GSUcKQEAgLTAsMCArMSwyNiBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvcHBjNjQvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisKK0tMSUJDQVJDSFJFUUZMQUdTID0gLW02NCAtbWNhbGwtYWl4ZGVzYworS0xJQkNPUFRGTEFHUyAgICAgKz0gLU9zCitLTElCQ0JJVFNJWkUgICAgICA9IDY0CitLTElCQ0xERkxBR1MgICAgICA9IC1tIGVsZjY0cHBjCisKKyMgRXh0cmEgbGlua2ZsYWdzIHdoZW4gYnVpbGRpbmcgdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisjIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSByZWFjaGFibGUgdXNpbmcgbm9ybWFsIGludGVyLW1vZHVsZQorIyBjYWxscywgYW5kIHdvcmsgb24gdGhlIG1lbW9yeSBtb2RlbHMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCisjIDI1Ni0xNiBNQiAtIG5vcm1hbCBiaW5hcmllcyBzdGFydCBhdCAyNTYgTUIsIGFuZCBqdW1wcyBhcmUgbGltaXRlZAorIyB0byArLy0gMTYgTUIKK0tMSUJDU0hBUkVERkxBR1MgICAgID0gLVR0ZXh0IDB4MGYwMDAyMDAKKworIyBUaGUga2VybmVsIHNvIGZhciBoYXMgYm90aCBhc20tcHBjKiBhbmQgYXNtLXBvd2VycGMuCitLTElCQ0FSQ0hJTkNGTEFHUyA9IC1JJChLTElCQ0tFUk5FTE9CSilhcmNoLyQoS0xJQkNBUkNIKS9pbmNsdWRlCisKKyMgVGhlIGFzbSBpbmNsdWRlIGZpbGVzIGxpdmUgaW4gYXNtLXBvd2VycGMKK0tMSUJDQVNNQVJDSAk9IHBvd2VycGMKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BwYzY0L2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzc3NmExCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvY3J0MC5TCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgYXJjaC9wcGM2NC9jcnQwLlMKKyMKKyMgdm9pZCBfc3RhcnQodm9pZCkKKyMgeworIyAgICAvKiBEaXZpbmUgdXAgYXJnYywgYXJndiwgYW5kIGVudnAgKi8KKyMgICAgZW52aXJvbiA9IGVudnA7CisjICAgIGV4aXQobWFpbihhcmdjLCBhcmd2LCBlbnZwKSk7CisjIH0KKyMKKworCS5zZWN0aW9uICIudG9jIiwiYXciCisuTEMwOgkudGMJZW52aXJvbltUQ10sZW52aXJvbgorCisJLnNlY3Rpb24gIi5vcGQiLCJhdyIKKwkuYWxpZ24gMworCS5nbG9ibCBfc3RhcnQKK19zdGFydDoKKwkucXVhZAkuX3N0YXJ0CisJLnF1YWQJLlRPQy5AdG9jYmFzZSwgMAorCisJLnRleHQKKwkuZ2xvYmwJLl9zdGFydAorCS50eXBlCS5fc3RhcnQsQGZ1bmN0aW9uCisuX3N0YXJ0OgorCXN0ZHUgICAgJXIxLC0zMiglcjEpCisJYWRkaSAgICAlcjMsJXIxLDMyCisJbGkJJXI0LDAJCS8qIGZpbmkgKHVudXNlZCkgKi8KKwliIAkuX19saWJjX2luaXQKKwlub3AKKworCS5zaXplIF9zdGFydCwuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjNjQvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9wcGM2NC9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRiNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvc2V0am1wLlMKQEAgLTAsMCArMSw4NSBAQAorIworIyBhcmNoL3BwYzY0L3NldGptcC5TCisjCisjIEJhc2ljIHNldGptcC9sb25nam1wIGltcGxlbWVudGF0aW9uCisjCisKKwkudGV4dAorCS5hbGlnbiA0CisKKwkuc2VjdGlvbiAiLm9wZCIsImF3Igorc2V0am1wOgorCS5xdWFkCS5zZXRqbXAsLlRPQy5AdG9jYmFzZSwwCisJLnByZXZpb3VzCisJLnNpemUJc2V0am1wLDI0CisJLnR5cGUJLnNldGptcCxAZnVuY3Rpb24KKwkuZ2xvYmwJc2V0am1wCisJLmdsb2JsCS5zZXRqbXAKKy5zZXRqbXA6CisJbWZscgklcjExCQkJLyogc2F2ZSByZXR1cm4gYWRkcmVzcyAqLworCW1mY3IJJXIxMgkJCS8qIHNhdmUgY29uZGl0aW9uIHJlZ2lzdGVyICovCisJc3RkCSVyMiwwKCVyMykJCS8qIHNhdmUgVE9DIHBvaW50ZXIgKG5vdCBuZWVkZWQpICovCisJc3RkdQklcjEsOCglcjMpCQkvKiBzYXZlIHN0YWNrIHBvaW50ZXIgKi8KKwlzdGR1CSVyMTEsOCglcjMpCisJc3RkdQklcjEyLDgoJXIzKQorCXN0ZHUJJXIxMyw4KCVyMykJCS8qIHNhdmUgY2FsbGVyIHNhdmVkIHJlZ3MgKi8KKwlzdGR1CSVyMTQsOCglcjMpCisJc3RkdQklcjE1LDgoJXIzKQorCXN0ZHUJJXIxNiw4KCVyMykKKwlzdGR1CSVyMTcsOCglcjMpCisJc3RkdQklcjE4LDgoJXIzKQorCXN0ZHUJJXIxOSw4KCVyMykKKwlzdGR1CSVyMjAsOCglcjMpCisJc3RkdQklcjIxLDgoJXIzKQorCXN0ZHUJJXIyMiw4KCVyMykKKwlzdGR1CSVyMjMsOCglcjMpCisJc3RkdQklcjI0LDgoJXIzKQorCXN0ZHUJJXIyNSw4KCVyMykKKwlzdGR1CSVyMjYsOCglcjMpCisJc3RkdQklcjI3LDgoJXIzKQorCXN0ZHUJJXIyOCw4KCVyMykKKwlzdGR1CSVyMjksOCglcjMpCisJc3RkdQklcjMwLDgoJXIzKQorCXN0ZAklcjMxLDgoJXIzKQorCWxpCSVyMywwCQkJLyogaW5kaWNhdGUgc3VjY2VzcyAqLworCWJscgkJCQkvKiByZXR1cm4gKi8KKworCS5zaXplIC5zZXRqbXAsLi0uc2V0am1wCisJLnNlY3Rpb24gIi5vcGQiLCJhdyIKK2xvbmdqbXA6CisJLnF1YWQJLmxvbmdqbXAsLlRPQy5AdG9jYmFzZSwwCisJLnByZXZpb3VzCisJLnNpemUJbG9uZ2ptcCwyNAorCS50eXBlCS5sb25nam1wLEBmdW5jdGlvbgorCS5nbG9ibAlsb25nam1wCisJLmdsb2JsCS5sb25nam1wCisubG9uZ2ptcDoKKwlsZAklcjIsMCglcjMpCQkvKiByZXN0b3JlIFRPQyBwb2ludGVyIChub3QgbmVlZGVkKSAqLworCWxkdQklcjEsOCglcjMpCQkvKiByZXN0b3JlIHN0YWNrICovCisJbGR1CSVyMTEsOCglcjMpCisJbGR1CSVyMTIsOCglcjMpCisJbGR1CSVyMTMsOCglcjMpCQkvKiByZXN0b3JlIGNhbGxlciBzYXZlZCByZWdzICovCisJbGR1CSVyMTQsOCglcjMpCisJbGR1CSVyMTUsOCglcjMpCisJbGR1CSVyMTYsOCglcjMpCisJbGR1CSVyMTcsOCglcjMpCisJbGR1CSVyMTgsOCglcjMpCisJbGR1CSVyMTksOCglcjMpCisJbGR1CSVyMjAsOCglcjMpCisJbGR1CSVyMjEsOCglcjMpCisJbGR1CSVyMjIsOCglcjMpCisJbGR1CSVyMjMsOCglcjMpCisJbGR1CSVyMjQsOCglcjMpCisJbGR1CSVyMjUsOCglcjMpCisJbGR1CSVyMjYsOCglcjMpCisJbGR1CSVyMjcsOCglcjMpCisJbGR1CSVyMjgsOCglcjMpCisJbGR1CSVyMjksOCglcjMpCisJbGR1CSVyMzAsOCglcjMpCisJbGQJJXIzMSw4KCVyMykKKwltdGxyCSVyMTEJCQkvKiByZXN0b3JlIExSICovCisJbXRjcgklcjEyCQkJLyogcmVzdG9yZSBDUiAqLworCW1yCSVyMywlcjQJCQkvKiBnZXQgcmV0dXJuIHZhbHVlICovCisJYmxyCQkJCS8qIHJldHVybiAqLworCisJLnNpemUgLmxvbmdqbXAsLi0ubG9uZ2ptcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjNjQvc3lzY2FsbC5jIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvc3lzY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODk1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGM2NC9zeXNjYWxsLmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvcHBjNjQvc3lzY2FsbC5jCisgKgorICogQ29tbW9uIGVycm9yLWhhbmRsaW5nIHBhdGggZm9yIHN5c3RlbSBjYWxscy4KKyAqIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBfX3N5c2NhbGxfZXJyb3IgYmVjb21lcyB0aGUKKyAqIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBzeXN0ZW0gY2FsbC4KKyAqLworI2luY2x1ZGUgPGVycm5vLmg+CisKK2xvbmcgaW50IF9fc3lzY2FsbF9lcnJvcihsb25nIGludCBlcnIpCit7CisJZXJybm8gPSBlcnI7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjNjQvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlOTM3MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L3N5c3N0dWIucGgKQEAgLTAsMCArMSwzMSBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9wcGM2NC9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNlY3Rpb24gXCIub3BkXCIsXCJhd1wiXG4iOworICAgIHByaW50IE9VVCAiXHQuYWxpZ24gM1xuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnF1YWQgLiR7Zm5hbWV9LC5UT0MuXEB0b2NiYXNlLDBcbiI7CisgICAgcHJpbnQgT1VUICJcdC50ZXh0XG4iOworICAgIHByaW50IE9VVCAiXHQudHlwZSAuJHtmbmFtZX0sXEBmdW5jdGlvblxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsIC4ke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIi4ke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICJcdGxpIDAsX19OUl8ke3NuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0c2NcbiI7CisgICAgcHJpbnQgT1VUICJcdGJuc2xyXG4iOworICAgIHByaW50IE9VVCAiXHRiIC5fX3N5c2NhbGxfZXJyb3JcbiI7CisgICAgcHJpbnQgT1VUICJcdC5zaXplIC4ke2ZuYW1lfSwuLS4ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvczM5MC9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9zMzkwL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThlOTdhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvczM5MC9LYnVpbGQKQEAgLTAsMCArMSwyMiBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgczM5MAorIworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KKworaWZuZXEgKCIkKEtMSUJDQVJDSCkiLCAiczM5MHgiKQorCitrbGliLXkgOj0gc2V0am1wLm8gbW1hcC5vIHN5c2NhbGwubworCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fY2x6c2kyLm8gICAuLi8uLi9saWJnY2MvX19hc2hsZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19hc2hyZGkzLm8gIC4uLy4uL2xpYmdjYy9fX2xzaHJkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vICAgLi4vLi4vbGliZ2NjL19fbW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2ZGkzLm8gIC4uLy4uL2xpYmdjYy9fX3Vtb2RkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZtb2RkaTQubworCitlbHNlCisKK2tsaWIteSA6PSBzZXRqbXAubyBtbWFwLm8gc3lzY2FsbC5vCisKK2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zMzkwL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9zMzkwL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkOWE3NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvTUNPTkZJRwpAQCAtMCwwICsxLDIzIEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9zMzkwL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisKK0tMSUJDT1BURkxBR1MgKz0gLU9zCisKK2lmbmVxICgiJChLTElCQ0FSQ0gpIiwgInMzOTB4IikKKwlLTElCQ0JJVFNJWkUJPSAzMgorCUtMSUJDQ0ZMQUdTCSs9IC1tMzEKKwlLTElCQ0xERkxBR1MJKz0gLW0gZWxmX3MzOTAKK2Vsc2UKKwlLTElCQ0JJVFNJWkUJPSA2NAorCUtMSUJDQ0ZMQUdTCSs9IC1tNjQKKwlLTElCQ0xERkxBR1MJKz0gLW0gZWxmNjRfczM5MAorZW5kaWYKKworS0xJQkNBU01BUkNICQk9IHMzOTAKK0tMSUJDU0hBUkVERkxBR1MJPSAtVHRleHQgMHg0MDAwMDIwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvczM5MC9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9zMzkwL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkyMzdlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvczM5MC9jcnQwLlMKQEAgLTAsMCArMSwzNSBAQAorIworIyBhcmNoL3MzOTAvY3J0MC5TCisjCisjIERvZXMgYXJjaC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBhbmQgaW52b2tlcyBfX2xpYmNfaW5pdAorIyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCisjCisjIFNlZSBfX3N0YXRpY19pbml0LmMgb3IgX19zaGFyZWRfaW5pdC5jIGZvciB0aGUgZXhwZWN0ZWQKKyMgYXJndW1lbnRzLgorIworCS50ZXh0CisJLmFsaWduIDQKKwkudHlwZSBfc3RhcnQsQGZ1bmN0aW9uCisJLmdsb2JsIF9zdGFydAorCisjaWZuZGVmIF9fczM5MHhfXworCitfc3RhcnQ6CisJbHIJJXIyLCVyMTUKKwlsaGkJJXIzLDAKKwlhaGkJJXIxNSwtOTYKKwlicmFzCSVyMSwuTDAKKy5MMDoKKwlsCSVyMSwuTDEtLkwwKCVyMSkKKwlicgklcjEKKy5MMToKKwkubG9uZwlfX2xpYmNfaW5pdAorI2Vsc2UKKworX3N0YXJ0OgorCWxncgklcjIsJXIxNQorCWxnaGkJJXIzLDAKKwlhZ2hpCSVyMTUsLTE2MAorCWpnCV9fbGliY19pbml0CisjZW5kaWYKKwkuc2l6ZSBfc3RhcnQsLi1fc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3MzOTAvbW1hcC5jIGIvdXNyL2tsaWJjL2FyY2gvczM5MC9tbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzMTIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvbW1hcC5jCkBAIC0wLDAgKzEsNzQgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorCitzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBwcm90OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKK307CisKKyNpZm5kZWYgX19zMzkweF9fCisKK3ZvaWQgKl9fbW1hcDIodm9pZCAqYWRkciwgc2l6ZV90IGxlbiwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IGFyZ3MgPSB7CisJCS5hZGRyCT0gKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJLmxlbgk9ICh1bnNpZ25lZCBsb25nKWxlbiwKKwkJLnByb3QJPSAodW5zaWduZWQgbG9uZylwcm90LAorCQkuZmxhZ3MJPSAodW5zaWduZWQgbG9uZylmbGFncywKKwkJLmZkCT0gKHVuc2lnbmVkIGxvbmcpZmQsCisJCS5vZmZzZXQgPSAodW5zaWduZWQgbG9uZylvZmZzZXQsCisJfTsKKworCXJlZ2lzdGVyIHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgKl9fYXJnMSBhc20oIjIiKSA9ICZhcmdzOworCXJlZ2lzdGVyIGxvbmcgX19zdmNyZXMgYXNtKCIyIik7CisJdW5zaWduZWQgbG9uZyBfX3JlczsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCIgICAgc3ZjICViMVxuIgorCQkJICAgICA6ICI9ZCIoX19zdmNyZXMpCisJCQkgICAgIDogImkiKF9fTlJfbW1hcDIpLCAiMCIoX19hcmcxKQorCQkJICAgICA6ICIxIiwgImNjIiwgIm1lbW9yeSIpOworCV9fcmVzID0gX19zdmNyZXM7CisJaWYgKF9fcmVzID49ICh1bnNpZ25lZCBsb25nKS00MDk1KSB7CisJCWVycm5vID0gLV9fcmVzOworCQlfX3JlcyA9IC0xOworCX0KKwlyZXR1cm4gKHZvaWQgKilfX3JlczsKK30KKworI2Vsc2UgLyogX19zMzkweF9fICovCisKK3ZvaWQgKm1tYXAodm9pZCAqYWRkciwgc2l6ZV90IGxlbiwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpCit7CisJc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBhcmdzID0geworCQkuYWRkcgk9ICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCS5sZW4JPSAodW5zaWduZWQgbG9uZylsZW4sCisJCS5wcm90CT0gKHVuc2lnbmVkIGxvbmcpcHJvdCwKKwkJLmZsYWdzCT0gKHVuc2lnbmVkIGxvbmcpZmxhZ3MsCisJCS5mZAk9ICh1bnNpZ25lZCBsb25nKWZkLAorCQkub2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpb2Zmc2V0LAorCX07CisKKwlyZWdpc3RlciBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0ICpfX2FyZzEgYXNtKCIyIikgPSAmYXJnczsKKwlyZWdpc3RlciBsb25nIF9fc3ZjcmVzIGFzbSgiMiIpOworCXVuc2lnbmVkIGxvbmcgX19yZXM7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIgICAgc3ZjICViMVxuIgorCQk6ICI9ZCIgKF9fc3ZjcmVzKQorCQk6ICJpIiAoX19OUl9tbWFwKSwKKwkJICAiMCIgKF9fYXJnMSkKKwkJOiAiMSIsICJjYyIsICJtZW1vcnkiKTsKKwlfX3JlcyA9IF9fc3ZjcmVzOworCWlmIChfX3JlcyA+PSAodW5zaWduZWQgbG9uZyktNDA5NSkgeworCQllcnJubyA9IC1fX3JlczsKKwkJX19yZXMgPSAtMTsKKwl9CisJcmV0dXJuICh2b2lkICopX19yZXM7Cit9CisKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3MzOTAvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9zMzkwL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNmEwNTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zMzkwL3NldGptcC5TCkBAIC0wLDAgKzEsNjYgQEAKKyMKKyMgYXJjaC9zMzkwL3NldGptcC5TCisjCisjIHNldGptcC9sb25nam1wIGZvciB0aGUgczM5MCBhcmNoaXRlY3R1cmUKKyMKKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgc2V0am1wCisJLnR5cGUgc2V0am1wLCBAZnVuY3Rpb24KKworI2lmbmRlZiBfX3MzOTB4X18KKworc2V0am1wOgorCXN0bQklcjYsJXIxNSwwKCVyMikJCSMgc2F2ZSBhbGwgZ2VuZXJhbCByZWdpc3RlcnMKKwlzdGQJJWY0LDQwKCVyMikJCSMgc2F2ZSBmcCByZWdpc3RlcnMgZjQgYW5kIGY2CisJc3RkCSVmNiw0OCglcjIpCisJbGhpCSVyMiwwCQkJIyByZXR1cm4gMAorCWJyCSVyMTQKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBsb25nam1wCisJLnR5cGUgbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorCWxyCSVyMSwlcjIJCQkjIGptcF9idWYKKwlscgklcjIsJXIzCQkJIyByZXR1cm4gdmFsdWUKKwlsZAklZjYsNDgoJXIxKQkJIyByZXN0b3JlIGFsbCBzYXZlZCByZWdpc3RlcnMKKwlsZAklZjQsNDAoJXIxKQorCWxtCSVyNiwlcjE1LDAoJXIxKQorCWJyCSVyMTQJCQkjIHJldHVybiB0byByZXN0b3JlZCBhZGRyZXNzCisKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcAorCisjZWxzZQorCitzZXRqbXA6CisJc3RtZwklcjYsJXIxNSwwKCVyMikJCSMgc2F2ZSBhbGwgZ2VuZXJhbCByZWdpc3RlcnMKKwlzdGQJJWYxLDgwKCVyMikJCSMgc2F2ZSBmcCByZWdpc3RlcnMgZjQgYW5kIGY2CisJc3RkCSVmMyw4OCglcjIpCisJc3RkCSVmNSw5NiglcjIpCisJc3RkCSVmNywxMDQoJXIyKQorCWxnaGkJJXIyLDAJCQkjIHJldHVybiAwCisJYnIJJXIxNAorCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCBAZnVuY3Rpb24KK2xvbmdqbXA6CisJbGdyCSVyMSwlcjIJCQkjIGptcF9idWYKKwlsZ3IJJXIyLCVyMwkJCSMgcmV0dXJuIHZhbHVlCisJbGQJJWY3LDEwNCglcjEpCQkjIHJlc3RvcmUgYWxsIHNhdmVkIHJlZ2lzdGVycworCWxkCSVmNSw5NiglcjEpCisJbGQJJWYzLDg4KCVyMSkKKwlsZAklZjEsODAoJXIxKQorCWxtZwklcjYsJXIxNSwwKCVyMSkKKwlicgklcjE0CQkJIyByZXR1cm4gdG8gcmVzdG9yZWQgYWRkcmVzcworCisJLnNpemUgbG9uZ2ptcCwuLWxvbmdqbXAKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zMzkwL3N5c2NhbGwuYyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvc3lzY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDIwMWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zMzkwL3N5c2NhbGwuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogYXJjaC9zMzkwL3N5c2NhbGwuYworICoKKyAqIENvbW1vbiBlcnJvci1oYW5kbGluZyBwYXRoIGZvciBzeXN0ZW0gY2FsbHMuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gX19zeXNjYWxsX2NvbW1vbiBiZWNvbWVzIHRoZQorICogcmV0dXJuIHZhbHVlIGZyb20gdGhlIHN5c3RlbSBjYWxsLgorICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKwordW5zaWduZWQgbG9uZyBfX3N5c2NhbGxfY29tbW9uKHVuc2lnbmVkIGxvbmcgZXJyKQoreworCWlmIChlcnIgPCAtNDA5NVVMKQorCQlyZXR1cm4gZXJyOworCWVycm5vID0gLWVycjsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zMzkwL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9zMzkwL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhN2I2YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvc3lzc3R1Yi5waApAQCAtMCwwICsxLDYzIEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL3MzOTAvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisgICAgbXkoJHQpOworICAgIG15KCRyLCAkbGxyZWdzKSA9ICgwLCAoJHR5cGVzaXpleyd2b2lkIConfSA9PSA4KSA/IDEgOiAyKTsKKworICAgIGZvcmVhY2ggJHQgKEBhcmdzKSB7CisJICAgICRyICs9ICgkdHlwZXNpemV7JHR9ID09IDgpID8gJGxscmVncyA6IDE7CisgICAgfQorCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUIDw8RU9GOworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworCS50eXBlICR7Zm5hbWV9LFxAZnVuY3Rpb24KKwkuZ2xvYmwgJHtmbmFtZX0KKyR7Zm5hbWV9OgorLmlmICR7cn0gPiA2CisucHJpbnQgIlN5c3RlbSBjYWxsIHdpdGggbW9yZSB0aGFuIHNpeCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQgeWV0LiIKKy5lcnIKKy5lbmRpZgorLmlmICR7cn0gPT0gNgorI2lmbmRlZiBfX3MzOTB4X18KKwlzdAklcjcsNTYoJXIxNSkKKwlsCSVyNyw5NiglcjE1KQorI2Vsc2UKKwlzdGcJJXI3LDgwKCVyMTUpCisJbGcJJXI3LDE2MCglcjE1KQorI2VuZGlmCisuZW5kaWYKKy5pZiBfX05SXyR7c25hbWV9IDwgMjU2CisJc3ZjCV9fTlJfJHtzbmFtZX0KKy5lbHNlCisJbGEJJXIxLF9fTlJfJHtzbmFtZX0KKwlzdmMJMAorLmVuZGlmCisuaWYgJHtyfSA9PSA2CisjaWZuZGVmIF9fczM5MHhfXworCWwJJXI3LDU2KCVyMTUpCisjZWxzZQorCWxnCSVyNywxNjAoJXIxNSkKKyNlbmRpZgorLmVuZGlmCisjaWZuZGVmIF9fczM5MHhfXworCWJyYXMJJXIzLDFmCisJLmxvbmcJX19zeXNjYWxsX2NvbW1vbgorMToJbAklcjMsMCglcjMpCisJYnIJJXIzCisjZWxzZQorCWJyYXNsCSVyMyxfX3N5c2NhbGxfY29tbW9uCisjZW5kaWYKKwkuc2l6ZQkke2ZuYW1lfSwuLSR7Zm5hbWV9CitFT0YKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc2gvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvc2gvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiN2FkNWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zaC9LYnVpbGQKQEAgLTAsMCArMSw4IEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBzaAorIworCitrbGliLXkgOj0gc2V0am1wLm8gc3lzY2FsbC5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc2gvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL3NoL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5MDg1MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NoL01DT05GSUcKQEAgLTAsMCArMSwxOCBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvc2gvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisKK0FSQ0hSRUdGTEFHUyA9IC1tNCAtbW5vLWltcGxpY2l0LWZwCitLTElCQ09QVEZMQUdTICAgICArPSAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIKK0tMSUJDQklUU0laRSAgICAgID0gMzIKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgMiBNQiAtLSB0aGUgbm9ybWFsIHN0YXJ0aW5nIHBvaW50IGZvciB0ZXh0IGlzIDQgTUIuCitLTElCQ1NIQVJFREZMQUdTCT0gLVR0ZXh0IDB4MDAyMDAyMDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NoL2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL3NoL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBhNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc2gvY3J0MC5TCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgYXJjaC9zaC9jcnQwLlMKKyMKKyMgRG9lcyBhcmNoLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGFuZCBpbnZva2VzIF9fbGliY19pbml0CisjIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy4KKyMKKyMgU2VlIF9fc3RhdGljX2luaXQuYyBvciBfX3NoYXJlZF9pbml0LmMgZm9yIHRoZSBleHBlY3RlZAorIyBhcmd1bWVudHMuCisjCisKKwkudGV4dAorCS5hbGlnbiAyCisJLnR5cGUgX3N0YXJ0LCNmdW5jdGlvbgorCS5nbG9ibCBfc3RhcnQKKworX3N0YXJ0OgorCW1vdglyMTUsIHI0CisJbW92CSMwLCByNQorCW1vdi5sCTFmLCByMAorCisJanNyCUByMAorCSBub3AKKworCS5hbGlnbiAyCisxOgkubG9uZwlfX2xpYmNfaW5pdAorCisJLnNpemUgX3N0YXJ0LC4tX3N0YXJ0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zaC9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3NoL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTIzNTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zaC9zZXRqbXAuUwpAQCAtMCwwICsxLDY0IEBACisjCisjIGFyY2gvc2gvc2V0am1wLlMKKyMKKyMgc2V0am1wL2xvbmdqbXAgZm9yIHRoZSBTdXBlckggYXJjaGl0ZWN0dXJlCisjCisKKyMKKyMgVGhlIGptcF9idWYgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyOgorIworIwkJcjgKKyMJCXI5CisjCQlyMTAKKyMJCXIxMQorIwkJcjEyCisjCQlyMTMKKyMJCXIxNAorIwkJcjE1CisjCQlwcgorIworCisJLnRleHQKKwkuYWxpZ24gMgorCisJLmdsb2JsIHNldGptcAorCS50eXBlIHNldGptcCwgI2Z1bmN0aW9uCisKK3NldGptcDoKKwlhZGQJIyg5KjQpLCByNAorCXN0cy5sCXByLCBALXI0CisJbW92LmwJcjE1LCBALXI0CisJbW92LmwJcjE0LCBALXI0CisJbW92LmwJcjEzLCBALXI0CisJbW92LmwJcjEyLCBALXI0CisJbW92LmwJcjExLCBALXI0CisJbW92LmwJcjEwLCBALXI0CisJbW92LmwJcjksIEAtcjQKKwltb3YubAlyOCwgQC1yNAorCXJ0cworCSBtb3YJIzAsIHIwCisKKwkuc2l6ZSBzZXRqbXAsLi1zZXRqbXAKKworCS5hbGlnbiAyCisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBzZXRqbXAsICNmdW5jdGlvbgorCitsb25nam1wOgorCW1vdi5sCUByNCssIHI4CisJbW92LmwJQHI0KywgcjkKKwltb3YubAlAcjQrLCByMTAKKwltb3YubAlAcjQrLCByMTEKKwltb3YubAlAcjQrLCByMTIKKwltb3YubAlAcjQrLCByMTMKKwltb3YubAlAcjQrLCByMTQKKwltb3YubAlAcjQrLCByMTUKKwlsZHMubAlAcjQrLCBwcgorCW1vdglyNSwgcjAKKwl0c3QJcjAsIHIwCisJYmYJMWYKKwltb3YJIzEsIHIwCSEgaW4gY2FzZSB2YWw9PTAKKzE6CXJ0cworCSBub3AKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zaC9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9zaC9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmODVjYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NoL3N5c2NhbGwuUwpAQCAtMCwwICsxLDM1IEBACisvKgorICogYXJjaC9zaC9zeXNjYWxsLlMKKyAqCisgKiBPbiBzaCwgcjMgY29udGFpbnMgdGhlIHN5c2NhbGwgbnVtYmVyIChzZXQgYnkgZ2VuZXJhdGVkIHN0dWIpOworICogcjQuLnI3IGNvbnRhaW4gYXJndW1lbnRzIDAtMyBwZXIgdGhlIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbiwKKyAqIGFuZCBhcmd1bWVudHMgNC01IGFyZSBwYXNzZWQgaW4gcjAgYW5kIHIxLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgaW4gcjMgcmF0aGVyIHRoYW4gc3RhbmRhcmQgcjAuCisgKi8KKworCS5zZWN0aW9uICIudGV4dC5zeXNjYWxsIiwiYXgiCisJLmFsaWduCTIKKwkuZ2xvYmwJX19zeXNjYWxsX2NvbW1vbgorCS50eXBlCV9fc3lzY2FsbF9jb21tb24sQGZ1bmN0aW9uCitfX3N5c2NhbGxfY29tbW9uOgorCW1vdi5sCUAoMCxzcCkscjAKKwltb3YubAlAKDQsc3ApLHIxCisJdHJhcGEJIzB4MTUKKwltb3YubAkxZixyMAorCWNtcC9ocwlyMCxyMworCWJ0L3MJM2YKKwkgIG5lZwlyMyxyNAorCW1vdi5sCTJmLHI1CisJbW92LmwJcjQsQHI1CisJcnRzCisJICBtb3YJIy0xLHIwCiszOgorCXJ0cworCSAgbW92CXIzLHIwCisKKwkuYWxpZ24gMgorMToJLmxvbmcJLTQwOTYJCS8qIEVycm5vIGxpbWl0ICovCisyOgkubG9uZwllcnJubworCisJLnNpemUJX19zeXNjYWxsX2NvbW1vbiwuLV9fc3lzY2FsbF9jb21tb24KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NoL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9zaC9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjQ2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zaC9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMzggQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvc2gvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQuc2VjdGlvblx0XCIudGV4dC5zeXNjYWxsXCIsXCJheFwiXG4iOworICAgIHByaW50IE9VVCAiXHQudHlwZVx0JHtmbmFtZX0sXCNmdW5jdGlvblxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsXHQke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0LmFsaWduXHQyXG4iOworICAgIHByaW50IE9VVCAiXHQuaW1wb3J0IF9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICJcdCAgbW92LmxcdDFmLCByM1xuIjsKKyAgICBwcmludCBPVVQgIlx0ICBqbXBcdFxAcjNcbiI7CisgICAgcHJpbnQgT1VUICIjaWYgX19OUl8ke3NuYW1lfSA+PSAxMjhcbiI7CisgICAgcHJpbnQgT1VUICJcdCAgbW92LmxcdDJmLCByM1xuIjsKKyAgICBwcmludCBPVVQgIiNlbHNlXG4iOworICAgIHByaW50IE9VVCAiXHQgIG1vdlx0IyBfX05SXyR7c25hbWV9LCByM1xuIjsKKyAgICBwcmludCBPVVQgIiNlbmRpZlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0LmFsaWduXHQyXG4iOworICAgIHByaW50IE9VVCAiXHQuaW1wb3J0XHRfX3N5c2NhbGxfY29tbW9uXG4iOworICAgIHByaW50IE9VVCAiMTpcdC5sb25nXHRfX3N5c2NhbGxfY29tbW9uXG4iOworICAgIHByaW50IE9VVCAiI2lmIF9fTlJfJHtzbmFtZX0gPj0gMTI4XG4iOworICAgIHByaW50IE9VVCAiMjpcdC5sb25nXHRfX05SXyR7c25hbWV9XG4iOworICAgIHByaW50IE9VVCAiI2VuZGlmXG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxM2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL0tidWlsZApAQCAtMCwwICsxLDM0IEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBzcGFyYworIworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KKworbTQtdGFyZ2V0cyA6PSBzZGl2Lm8gc3JlbS5vIHVkaXYubyB1cmVtLm8KKwora2xpYi15IDo9ICQobTQtdGFyZ2V0cykgc211bC5vIHVtdWwubyBfX211bGRpMy5vCitrbGliLXkgKz0gc2V0am1wLm8gcGlwZS5vIHN5c2NhbGwubyBzeXNmb3JrLm8KKwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2FzaGxkaTMubyAuLi8uLi9saWJnY2MvX19hc2hyZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19sc2hyZGkzLm8gLi4vLi4vbGliZ2NjL19fZGl2ZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19tb2RkaTMubyAgLi4vLi4vbGliZ2NjL19fdWRpdmRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vIC4uLy4uL2xpYmdjYy9fX3VkaXZtb2RkaTQubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2NsenNpMi5vCisKKworJChvYmopL3NkaXYuUzogbTQgOj0gZGVmaW5lKE5BTUUsXGAuZGl2JylkZWZpbmUoT1AsXGBkaXYnKWRlZmluZShTLFxgdHJ1ZScpCiskKG9iaikvc3JlbS5TOiBtNCA6PSBkZWZpbmUoTkFNRSxcYC5yZW0nKWRlZmluZShPUCxcYHJlbScpZGVmaW5lKFMsXGB0cnVlJykKKyQob2JqKS91ZGl2LlM6IG00IDo9IGRlZmluZShOQU1FLFxgLnVkaXYnKWRlZmluZShPUCxcYGRpdicpZGVmaW5lKFMsXGBmYWxzZScpCiskKG9iaikvdXJlbS5TOiBtNCA6PSBkZWZpbmUoTkFNRSxcYC51cmVtJylkZWZpbmUoT1AsXGByZW0nKWRlZmluZShTLFxgZmFsc2UnKQorCit0YXJnZXRzICs9ICQobTQtdGFyZ2V0cykgJChtNC10YXJnZXRzOi5vPS5TKQorCitxdWlldF9jbWRfbTQgPSBNNCAgICAgICRACisgICAgICBjbWRfbTQgPSAoZWNobyAiJChtNCkiOyBjYXQgJF4pIHwgbTQgPiAkQAorCisjIGJ1aWxkIC5vIGZyb20gLlMKKyQoYWRkcHJlZml4ICQob2JqKS8sJChtNC10YXJnZXRzKSk6ICQob2JqKS8lLm8gOiAkKG9iaikvJS5TCisjIGJ1aWxkIC5TIGZyb20gLm00CiskKGFkZHByZWZpeCAkKG9iaikvLCQobTQtdGFyZ2V0czoubz0uUykpOiAkKHNyYykvZGl2cmVtLm00CisJJChjYWxsIGlmX2NoYW5nZWQsbTQpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzVjZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvTUNPTkZJRwpAQCAtMCwwICsxLDE5IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9zcGFyYy9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNPUFRGTEFHUwkJICs9IC1PcyAtbTMyIC1tcHRyMzIKK0tMSUJDQklUU0laRQkJID0gMzIKK0tMSUJDQVJDSFJFUUZMQUdTCSs9IC1EX19zcGFyYzMyX18KKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgTm9ybWFsIGJpbmFyaWVzIHN0YXJ0IGF0IDY0SzsgdGhlIGxpbmtlciB3YW50cyA2NEsgYWxpZ25tZW50LAorIyBhbmQgY2FsbCBpbnN0cnVjdGlvbnMgaGF2ZSBhIDMwLWJpdCBzaWduZWQgb2Zmc2V0LCA8PCAyLgorS0xJQkNTSEFSRURGTEFHUwkgPSAtVHRleHQgMHg0MDAwMDEwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmMvX19tdWxkaTMuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL19fbXVsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzODQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL19fbXVsZGkzLlMKQEAgLTAsMCArMSwyNyBAQAorCS5nbG9iYWwgLnVtdWwKKwkuc2VjdGlvbgkiLnRleHQiCisJLmFsaWduIDQKKwkuZ2xvYmFsIF9fbXVsZGkzCisJLnR5cGUJX19tdWxkaTMsICNmdW5jdGlvbgorCS5wcm9jCTAxNworX19tdWxkaTM6CisJc2F2ZQklc3AsIC0xMDQsICVzcAorCW1vdgklaTEsICVvMAorCWNhbGwJLnVtdWwsIDAKKwkgbW92CSVpMywgJW8xCisJbW92CSVvMCwgJWwyCisJbW92CSVvMSwgJWwzCisJbW92CSVpMSwgJW8wCisJY2FsbAkudW11bCwgMAorCSBtb3YJJWkyLCAlbzEKKwltb3YJJWkwLCAlbzEKKwltb3YJJW8wLCAlbDAKKwljYWxsCS51bXVsLCAwCisJIG1vdgklaTMsICVvMAorCW1vdgkwLCAlbDEKKwlhZGQJJWwwLCAlbzAsICVsMAorCWFkZGNjCSVsMywgJWwxLCAlaTEKKwlhZGR4CSVsMiwgJWwwLCAlaTAKKwlqbXAJJWk3KzgKKwkgcmVzdG9yZQorCS5zaXplCV9fbXVsZGkzLCAuLV9fbXVsZGkzCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkYjE4OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL2NydDAuUwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgVEFSR0VUX1BUUl9TSVpFCTMyCisjaW5jbHVkZSAiY3J0MGkuUyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL2NydDBpLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9jcnQwaS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjBiMDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9jcnQwaS5TCkBAIC0wLDAgKzEsMTAwIEBACishIFRoaXMgZmlsZSBkZXJpdmVkIGZyb20gdGhlIGVxdWl2YWxlbnQgaW4gbmV3bGliCishCishIEMgcnVuIHRpbWUgc3RhcnQgb2ZmCisKKyEgVGhpcyBmaWxlIHN1cHBvcnRzOgorIQorISAtIGJvdGggMzJiaXQgcG9pbnRlciBhbmQgNjRiaXQgcG9pbnRlciBlbnZpcm9ubWVudHMgKGF0IGNvbXBpbGUgdGltZSkKKyEgLSBhbiBpbXBvc2VkIHN0YWNrIGJpYXMgKG9mIDIwNDcpIChhdCBydW4gdGltZSkKKyEgLSBtZWRpdW0vbG93IGFuZCBtZWRpdW0vYW55d2hlcmUgY29kZSBtb2RlbHMgKGF0IHJ1biB0aW1lKQorCishIEluaXRpYWwgc3RhY2sgc2V0dXA6CishCishICAgIGJvdHRvbSBvZiBzdGFjayAoaGlnaGVyIG1lbW9yeSBhZGRyZXNzKQorISAJLi4uCishCXRleHQgb2YgZW52aXJvbm1lbnQgc3RyaW5ncworIQl0ZXh0IG9mIGFyZ3VtZW50IHN0cmluZ3MKKyEJZW52cFtlbnZjXSA9IDAgKDQvOCBieXRlcykKKyEJLi4uCishCWVudlswXSAoNC84IGJ5dGVzKQorIQlhcmd2W2FyZ2NdID0gMCAoNC84IGJ5dGVzKQorIQkuLi4KKyEJYXJndlswXSAoNC84IGJ5dGVzKQorIQlhcmdjICg0LzggYnl0ZXMpCishCXJlZ2lzdGVyIHNhdmUgYXJlYSAoNjQgYml0cyBieSAxNiByZWdpc3RlcnMgPSAxMjggYnl0ZXMpCishCXRvcCBvZiBzdGFjayAoJXNwKQorCishIFN0YWNrIEJpYXM6CishCishIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgby9zIHRvIHNldCB0aGlzIHVwLgorISBXZSBoYW5kbGUgYm90aCBhIDAgYW5kIDIwNDcgdmFsdWUgZm9yIHRoZSBzdGFjayBiaWFzLgorCishIE1lZGl1bS9Bbnl3aGVyZSBjb2RlIG1vZGVsIHN1cHBvcnQ6CishCishIEluIHRoaXMgbW9kZWwgJWc0IHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudC4KKyEgVGhlIHRleHQgc2VnbWVudCBjYW4gZ28gYW55d2hlcmUsIGJ1dCAlZzQgcG9pbnRzIHRvIHRoZSAqZGF0YSogc2VnbWVudC4KKyEgSXQgaXMgdXAgdG8gdGhlIGNvbXBpbGVyL2xpbmtlciB0byBnZXQgdGhpcyByaWdodC4KKyEKKyEgU2luY2UgdGhpcyBtb2RlbCBpcyBzdGF0aWNhbGx5IGxpbmtlZCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudAorISBpcyBrbm93biBhdCBsaW5rIHRpbWUuICBFZzoKKyEKKyEJc2V0aGkJJWhoKGRhdGFfc3RhcnQpLCAlZzEKKyEJc2V0aGkJJWxtKGRhdGFfc3RhcnQpLCAlZzQKKyEJb3IJJWcxLCAlaG0oZGF0YV9zdGFydCksICVnMQorIQlvcgklZzQsICVsbyhkYXRhX3N0YXJ0KSwgJWc0CishCXNsbHgJJWcxLCAzMiwgJWcxCishCW9yCSVnNCwgJWcxLCAlZzQKKyEKKyEgRklYTUU6IEZvciBub3cgd2UganVzdCBhc3N1bWUgMC4KKworISBGSVhNRTogaWYgJWcxIGNvbnRhaW5zIGEgbm9uLXplcm8gdmFsdWUsIGF0ZXhpdCgpIHNob3VsZCBiZSBpbnZva2VkCishIHdpdGggdGhpcyB2YWx1ZS4KKworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBfc3RhcnQKKwkudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgorX3N0YXJ0OgorCWNscgklZnAKKworISBXZSB1c2UgJWc0IGV2ZW4gaWYgdGhlIGNvZGUgbW9kZWwgaXMgTWVkaXVtL0xvdyAoc2ltcGxpZmllcyB0aGUgY29kZSkuCisKKwljbHIJJWc0CQkJISBNZWRpdW0vQW55d2hlcmUgYmFzZSByZWcKKworISBJZiB0aGVyZSBpcyBhIHN0YWNrIGJpYXMgaW4gZWZmZWN0LCBhY2NvdW50IGZvciBpdCBpbiAlZzUuICBUaGVuIGFsd2F5cworISBhZGQgJWc1IHRvIHN0YWNrIHJlZmVyZW5jZXMgYmVsb3cuICBUaGlzIHdheSB0aGUgY29kZSBjYW4gYmUgdXNlZCB3aXRoCishIG9yIHdpdGhvdXQgYW4gaW1wb3NlZCBiaWFzLgorCisJYW5kY2MJJXNwLCAxLCAlZzUKKwlieixhIC5MTm9CaWFzCisJIG5vcAorCW1vdgkyMDQ3LCAlZzUKKy5MTm9CaWFzOgorCWFkZAklc3AsICVnNSwgJWc1CisKKyEgT24gZW50cnksIHRoZSBrZXJuZWwgbGVhdmVzIHJvb20gZm9yIG9uZSByZWdpc3RlciBmcmFtZSwgYnV0CishIHRoZSBDIEFQSSB3YW50cyBtb3JlIGZyZWUgc3BhY2UuICBUaHVzLCB3ZSBuZWVkIHRvIGRyb3AgdGhlIHN0YWNrCishIHBvaW50ZXIgYWRkaXRpb25hbGx5LgorCisjaWYgVEFSR0VUX1BUUl9TSVpFID09IDMyCisJc3ViCSVzcCwgMzIsICVzcAkJISBtYWtlIHJvb20gZm9yIGluY29taW5nIGFyZ3VtZW50cworI2Vsc2UgLyogVEFSR0VUX1BUUl9TSVpFID09IDY0ICovCisJc3ViCSVzcCwgNjQsICVzcAkJISBtYWtlIHJvb20gZm9yIGluY29taW5nIGFyZ3VtZW50cworI2VuZGlmCisKKyEgU2V0IHVwIHBvaW50ZXJzIHRvIHRoZSBFTEYgZGF0YSBzdHJ1Y3R1cmUgKGFyZ2MsIGFyZ3YsIC4uLikKKyEgUGFzcyBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gX19saWJjX2luaXQKKyNpZiBUQVJHRVRfUFRSX1NJWkUgPT0gMzIKKwlhZGQJJWc1LCAweDQwLCAlbzAKKyNlbHNlIC8qIFRBUkdFVF9QVFJfU0laRSA9PSA2NCAqLworCWFkZAklZzUsIDB4ODAsICVvMAorI2VuZGlmCisKKwljYWxsCV9fbGliY19pbml0CisJIG1vdgklZzEsICVvMQkhIFRoaXMgaXMgdGhlICJhdGV4aXQiIHBvaW50ZXI7CisJCQkJISBwYXNzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gX19saWJjX2luaXQKKworISBJZiBfX2xpYmNfaW5pdCByZXR1cm5zLCBzb21ldGhpbmcgaXMgaG9zZWQuICBUcnkgYW4gaWxsZWdhbCBpbnNuLgorISBJZiB0aGF0IGRvZXMgbm90IHdvcmssIHRoZSBvL3MgaXMgaG9zZWQgbW9yZSB0aGFuIHdlIGFyZS4KKwkubG9uZyAwCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9kaXZyZW0ubTQgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9kaXZyZW0ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0MTcxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL2RpdnJlbS5tNApAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zIEVuZ2luZWVyaW5nIGdyb3VwCisgKiBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IHVuZGVyIERBUlBBIGNvbnRyYWN0IEJHIDkxLTY2IGFuZAorICogY29udHJpYnV0ZWQgdG8gQmVya2VsZXkuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBmcm9tOiBIZWFkZXI6IGRpdnJlbS5tNCx2IDEuNCA5Mi8wNi8yNSAxMzoyMzo1NyB0b3JlayBFeHAKKyAqICROZXRCU0Q6IGRpdnJlbS5tNCx2IDEuNCAxOTk3LzEwLzA5IDEwOjA3OjU0IGx1a2VtIEV4cCAkCisgKi8KKworLyoKKyAqIERpdmlzaW9uIGFuZCByZW1haW5kZXIsIGZyb20gQXBwZW5kaXggRSBvZiB0aGUgU3BhcmMgVmVyc2lvbiA4CisgKiBBcmNoaXRlY3R1cmUgTWFudWFsLCB3aXRoIGZpeGVzIGZyb20gR29yZG9uIElybGFtLgorICovCisKKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKKwkuYXNjaXogIkAoIylkaXZyZW0ubTQJOC4xIChCZXJrZWxleSkgNi80LzkzIgorI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworLyoKKyAqIElucHV0OiBkaXZpZGVuZCBhbmQgZGl2aXNvciBpbiAlbzAgYW5kICVvMSByZXNwZWN0aXZlbHkuCisgKgorICogbTQgcGFyYW1ldGVyczoKKyAqICBOQU1FCW5hbWUgb2YgZnVuY3Rpb24gdG8gZ2VuZXJhdGUKKyAqICBPUAkJT1A9ZGl2ID0+ICVvMCAvICVvMTsgT1A9cmVtID0+ICVvMCAlICVvMQorICogIFMJCVM9dHJ1ZSA9PiBzaWduZWQ7IFM9ZmFsc2UgPT4gdW5zaWduZWQKKyAqCisgKiBBbGdvcml0aG0gcGFyYW1ldGVyczoKKyAqICBOCQlob3cgbWFueSBiaXRzIHBlciBpdGVyYXRpb24gd2UgdHJ5IHRvIGdldCAoNCkKKyAqICBXT1JEU0laRQl0b3RhbCBudW1iZXIgb2YgYml0cyAoMzIpCisgKgorICogRGVyaXZlZCBjb25zdGFudHM6CisgKiAgVFdPU1VQTgkyXk4sIGZvciBsYWJlbCBnZW5lcmF0aW9uIChtNCBleHBvbmVudGlhdGlvbiBjdXJyZW50bHkgYnJva2VuKQorICogIFRPUEJJVFMJbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHRvcCBgZGVjYWRlJyBvZiBhIG51bWJlcgorICoKKyAqIEltcG9ydGFudCB2YXJpYWJsZXM6CisgKiAgUQkJdGhlIHBhcnRpYWwgcXVvdGllbnQgdW5kZXIgZGV2ZWxvcG1lbnQgKGluaXRpYWxseSAwKQorICogIFIJCXRoZSByZW1haW5kZXIgc28gZmFyLCBpbml0aWFsbHkgdGhlIGRpdmlkZW5kCisgKiAgSVRFUgludW1iZXIgb2YgbWFpbiBkaXZpc2lvbiBsb29wIGl0ZXJhdGlvbnMgcmVxdWlyZWQ7CisgKgkJZXF1YWwgdG8gY2VpbChsb2cyKHF1b3RpZW50KSAvIE4pLiAgTm90ZSB0aGF0IHRoaXMKKyAqCQlpcyB0aGUgbG9nIGJhc2UgKDJeTikgb2YgdGhlIHF1b3RpZW50LgorICogIFYJCXRoZSBjdXJyZW50IGNvbXBhcmFuZCwgaW5pdGlhbGx5IGRpdmlzb3IqMl4oSVRFUipOLTEpCisgKgorICogQ29zdDoKKyAqICBDdXJyZW50IGVzdGltYXRlIGZvciBub24tbGFyZ2UgZGl2aWRlbmQgaXMKKyAqCWNlaWwobG9nMihxdW90aWVudCkgLyBOKSAqICgxMCArIDdOLzIpICsgQworICogIEEgbGFyZ2UgZGl2aWRlbmQgaXMgb25lIGdyZWF0ZXIgdGhhbiAyXigzMS1UT1BCSVRTKSBhbmQgdGFrZXMgYQorICogIGRpZmZlcmVudCBwYXRoLCBhcyB0aGUgdXBwZXIgYml0cyBvZiB0aGUgcXVvdGllbnQgbXVzdCBiZSBkZXZlbG9wZWQKKyAqICBvbmUgYml0IGF0IGEgdGltZS4KKyAqLworCitkZWZpbmUoTiwgYDQnKQorZGVmaW5lKFRXT1NVUE4sIGAxNicpCitkZWZpbmUoV09SRFNJWkUsIGAzMicpCitkZWZpbmUoVE9QQklUUywgZXZhbChXT1JEU0laRSAtIE4qKChXT1JEU0laRS0xKS9OKSkpCisKK2RlZmluZShkaXZpZGVuZCwgYCVvMCcpCitkZWZpbmUoZGl2aXNvciwgYCVvMScpCitkZWZpbmUoUSwgYCVvMicpCitkZWZpbmUoUiwgYCVvMycpCitkZWZpbmUoSVRFUiwgYCVvNCcpCitkZWZpbmUoViwgYCVvNScpCisKKy8qIG00IHJlbWluZGVyOiBpZmVsc2UoYSxiLGMsZCkgPT4gaWYgYSBpcyBiLCB0aGVuIGMsIGVsc2UgZCAqLworZGVmaW5lKFQsIGAlZzEnKQorZGVmaW5lKFNDLCBgJWc3JykKK2lmZWxzZShTLCBgdHJ1ZScsIGBkZWZpbmUoU0lHTiwgYCVnNicpJykKKworLyoKKyAqIFRoaXMgaXMgdGhlIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIGZvciBkZXZlbG9waW5nIHF1b3RpZW50IGRpZ2l0cy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICQxCXRoZSBjdXJyZW50IGRlcHRoLCAxIDw9ICQxIDw9IE4KKyAqICAkMgl0aGUgY3VycmVudCBhY2N1bXVsYXRpb24gb2YgcXVvdGllbnQgYml0cworICogIE4JbWF4IGRlcHRoCisgKgorICogV2UgYWRkIGEgbmV3IGJpdCB0byAkMiBhbmQgZWl0aGVyIHJlY3Vyc2Ugb3IgaW5zZXJ0IHRoZSBiaXRzIGluCisgKiB0aGUgcXVvdGllbnQuICBSLCBRLCBhbmQgViBhcmUgaW5wdXRzIGFuZCBvdXRwdXRzIGFzIGRlZmluZWQgYWJvdmU7CisgKiB0aGUgY29uZGl0aW9uIGNvZGVzIGFyZSBleHBlY3RlZCB0byByZWZsZWN0IHRoZSBpbnB1dCBSLCBhbmQgYXJlCisgKiBtb2RpZmllZCB0byByZWZsZWN0IHRoZSBvdXRwdXQgUi4KKyAqLworZGVmaW5lKERFVkVMT1BfUVVPVElFTlRfQklUUywKK2AJISBkZXB0aCAkMSwgYWNjdW11bGF0ZWQgYml0cyAkMgorCWJsCUwuJDEuZXZhbChUV09TVVBOKyQyKQorCXNybAlWLDEsVgorCSEgcmVtYWluZGVyIGlzIHBvc2l0aXZlCisJc3ViY2MJUixWLFIKKwlpZmVsc2UoJDEsIE4sCisJYAliCTlmCisJCWFkZAlRLCAoJDIqMisxKSwgUQorCScsIGAJREVWRUxPUF9RVU9USUVOVF9CSVRTKGluY3IoJDEpLCBgZXZhbCgyKiQyKzEpJyknKQorTC4kMS5ldmFsKFRXT1NVUE4rJDIpOgorCSEgcmVtYWluZGVyIGlzIG5lZ2F0aXZlCisJYWRkY2MJUixWLFIKKwlpZmVsc2UoJDEsIE4sCisJYAliCTlmCisJCWFkZAlRLCAoJDIqMi0xKSwgUQorCScsIGAJREVWRUxPUF9RVU9USUVOVF9CSVRTKGluY3IoJDEpLCBgZXZhbCgyKiQyLTEpJyknKQorCWlmZWxzZSgkMSwgMSwgYDk6JyknKQorCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RyYXAuaD4KKworRlVOQyhOQU1FKQoraWZlbHNlKFMsIGB0cnVlJywKK2AJISBjb21wdXRlIHNpZ24gb2YgcmVzdWx0OyBpZiBuZWl0aGVyIGlzIG5lZ2F0aXZlLCBubyBwcm9ibGVtCisJb3JjYwlkaXZpc29yLCBkaXZpZGVuZCwgJWcwCSEgZWl0aGVyIG5lZ2F0aXZlPworCWJnZQkyZgkJCSEgbm8sIGdvIGRvIHRoZSBkaXZpZGUKKwlpZmVsc2UoT1AsIGBkaXYnLAorCQlgeG9yCWRpdmlzb3IsIGRpdmlkZW5kLCBTSUdOJywKKwkJYG1vdglkaXZpZGVuZCwgU0lHTicpCSEgY29tcHV0ZSBzaWduIGluIGFueSBjYXNlCisJdHN0CWRpdmlzb3IKKwliZ2UJMWYKKwl0c3QJZGl2aWRlbmQKKwkhIGRpdmlzb3IgaXMgZGVmaW5pdGVseSBuZWdhdGl2ZTsgZGl2aWRlbmQgbWlnaHQgYWxzbyBiZSBuZWdhdGl2ZQorCWJnZQkyZgkJCSEgaWYgZGl2aWRlbmQgbm90IG5lZ2F0aXZlLi4uCisJbmVnCWRpdmlzb3IJCQkhIGluIGFueSBjYXNlLCBtYWtlIGRpdmlzb3Igbm9ubmVnCisxOgkhIGRpdmlkZW5kIGlzIG5lZ2F0aXZlLCBkaXZpc29yIGlzIG5vbm5lZ2F0aXZlCisJbmVnCWRpdmlkZW5kCQkhIG1ha2UgZGl2aWRlbmQgbm9ubmVnYXRpdmUKKzI6CisnKQorCSEgUmVhZHkgdG8gZGl2aWRlLiAgQ29tcHV0ZSBzaXplIG9mIHF1b3RpZW50OyBzY2FsZSBjb21wYXJhbmQuCisJb3JjYwlkaXZpc29yLCAlZzAsIFYKKwlibnoJMWYKKwltb3YJZGl2aWRlbmQsIFIKKworCQkhIERpdmlkZSBieSB6ZXJvIHRyYXAuICBJZiBpdCByZXR1cm5zLCByZXR1cm4gMCAoYWJvdXQgYXMKKwkJISB3cm9uZyBhcyBwb3NzaWJsZSwgYnV0IHRoYXQgaXMgd2hhdCBTdW5PUyBkb2VzLi4uKS4KKwkJdAlTVF9ESVYwCisJCXJldGwKKwkJY2xyCSVvMAorCisxOgorCWNtcAlSLCBWCQkJISBpZiBkaXZpc29yIGV4Y2VlZHMgZGl2aWRlbmQsIGRvbmUKKwlibHUJTGdvdF9yZXN1bHQJCSEgKGFuZCBhbGdvcml0aG0gZmFpbHMgb3RoZXJ3aXNlKQorCWNscglRCisJc2V0aGkJJWhpKDEgPDwgKFdPUkRTSVpFIC0gVE9QQklUUyAtIDEpKSwgVAorCWNtcAlSLCBUCisJYmx1CUxub3RfcmVhbGx5X2JpZworCWNscglJVEVSCisKKwkhIGBIZXJlIHRoZSBkaXZpZGVuZCBpcyA+PSAyXigzMS1OKSBvciBzby4gIFdlIG11c3QgYmUgY2FyZWZ1bCBoZXJlLAorCSEgYXMgb3VyIHVzdWFsIE4tYXQtYS1zaG90IGRpdmlkZSBzdGVwIHdpbGwgY2F1c2Ugb3ZlcmZsb3cgYW5kIGhhdm9jLgorCSEgVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSByZXN1bHQgaGVyZSBpcyBOKklURVIrU0MsIHdoZXJlIFNDIDw9IE4uCisJISBDb21wdXRlIElURVIgaW4gYW4gdW5vcnRob2RveCBtYW5uZXI6IGtub3cgd2UgbmVlZCB0byBzaGlmdCBWIGludG8KKwkhIHRoZSB0b3AgZGVjYWRlOiBzbyBkbyBub3QgZXZlbiBib3RoZXIgdG8gY29tcGFyZSB0byBSLicKKwkxOgorCQljbXAJViwgVAorCQliZ2V1CTNmCisJCW1vdgkxLCBTQworCQlzbGwJViwgTiwgVgorCQliCTFiCisJCWluYwlJVEVSCisKKwkhIE5vdyBjb21wdXRlIFNDLgorCTI6CWFkZGNjCVYsIFYsIFYKKwkJYmNjCUxub3RfdG9vX2JpZworCQlpbmMJU0MKKworCQkhIFdlIGdldCBoZXJlIGlmIHRoZSBkaXZpc29yIG92ZXJmbG93ZWQgd2hpbGUgc2hpZnRpbmcuCisJCSEgVGhpcyBtZWFucyB0aGF0IFIgaGFzIHRoZSBoaWdoLW9yZGVyIGJpdCBzZXQuCisJCSEgUmVzdG9yZSBWIGFuZCBzdWJ0cmFjdCBmcm9tIFIuCisJCXNsbAlULCBUT1BCSVRTLCBUCSEgaGlnaCBvcmRlciBiaXQKKwkJc3JsCVYsIDEsIFYJCSEgcmVzdCBvZiBWCisJCWFkZAlWLCBULCBWCisJCWIJTGRvX3NpbmdsZV9kaXYKKwkJZGVjCVNDCisKKwlMbm90X3Rvb19iaWc6CisJMzoJY21wCVYsIFIKKwkJYmx1CTJiCisJCW5vcAorCQliZQlMZG9fc2luZ2xlX2RpdgorCQlub3AKKwkvKiBOQjogdGhlc2UgYXJlIGNvbW1lbnRlZCBvdXQgaW4gdGhlIFY4LVNwYXJjIG1hbnVhbCBhcyB3ZWxsICovCisJLyogKEkgZG8gbm90IHVuZGVyc3RhbmQgdGhpcykgKi8KKwkhIFYgPiBSOiB3ZW50IHRvbyBmYXI6IGJhY2sgdXAgMSBzdGVwCisJIQlzcmwJViwgMSwgVgorCSEJZGVjCVNDCisJISBkbyBzaW5nbGUtYml0IGRpdmlkZSBzdGVwcworCSEKKwkhIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBoZXJlLiAgV2Uga25vdyB0aGF0IFIgPj0gViwgc28gd2UgY2FuIGRvIHRoZQorCSEgZmlyc3QgZGl2aWRlIHN0ZXAgd2l0aG91dCB0aGlua2luZy4gIEJVVCwgdGhlIG90aGVycyBhcmUgY29uZGl0aW9uYWwsCisJISBhbmQgYXJlIG9ubHkgZG9uZSBpZiBSID49IDAuICBCZWNhdXNlIGJvdGggUiBhbmQgViBtYXkgaGF2ZSB0aGUgaGlnaC0KKwkhIG9yZGVyIGJpdCBzZXQgaW4gdGhlIGZpcnN0IHN0ZXAsIGp1c3QgZmFsbGluZyBpbnRvIHRoZSByZWd1bGFyCisJISBkaXZpc2lvbiBsb29wIHdpbGwgbWVzcyB1cCB0aGUgZmlyc3QgdGltZSBhcm91bmQuCisJISBTbyB3ZSB1bnJvbGwgc2xpZ2h0bHkuLi4KKwlMZG9fc2luZ2xlX2RpdjoKKwkJZGVjY2MJU0MKKwkJYmwJTGVuZF9yZWd1bGFyX2RpdmlkZQorCQlub3AKKwkJc3ViCVIsIFYsIFIKKwkJbW92CTEsIFEKKwkJYglMZW5kX3NpbmdsZV9kaXZsb29wCisJCW5vcAorCUxzaW5nbGVfZGl2bG9vcDoKKwkJc2xsCVEsIDEsIFEKKwkJYmwJMWYKKwkJc3JsCVYsIDEsIFYKKwkJISBSID49IDAKKwkJc3ViCVIsIFYsIFIKKwkJYgkyZgorCQlpbmMJUQorCTE6CSEgUiA8IDAKKwkJYWRkCVIsIFYsIFIKKwkJZGVjCVEKKwkyOgorCUxlbmRfc2luZ2xlX2Rpdmxvb3A6CisJCWRlY2NjCVNDCisJCWJnZQlMc2luZ2xlX2Rpdmxvb3AKKwkJdHN0CVIKKwkJYixhCUxlbmRfcmVndWxhcl9kaXZpZGUKKworTG5vdF9yZWFsbHlfYmlnOgorMToKKwlzbGwJViwgTiwgVgorCWNtcAlWLCBSCisJYmxldQkxYgorCWluY2NjCUlURVIKKwliZQlMZ290X3Jlc3VsdAorCWRlYwlJVEVSCisKKwl0c3QJUgkhIHNldCB1cCBmb3IgaW5pdGlhbCBpdGVyYXRpb24KK0xkaXZsb29wOgorCXNsbAlRLCBOLCBRCisJREVWRUxPUF9RVU9USUVOVF9CSVRTKDEsIDApCitMZW5kX3JlZ3VsYXJfZGl2aWRlOgorCWRlY2NjCUlURVIKKwliZ2UJTGRpdmxvb3AKKwl0c3QJUgorCWJsLGEJTGdvdF9yZXN1bHQKKwkhIG5vbi1yZXN0b3JpbmcgZml4dXAgaGVyZSAob25lIGluc3RydWN0aW9uIG9ubHkhKQoraWZlbHNlKE9QLCBgZGl2JywKK2AJZGVjCVEKKycsIGAJYWRkCVIsIGRpdmlzb3IsIFIKKycpCisKK0xnb3RfcmVzdWx0OgoraWZlbHNlKFMsIGB0cnVlJywKK2AJISBjaGVjayB0byBzZWUgaWYgYW5zd2VyIHNob3VsZCBiZSA8IDAKKwl0c3QJU0lHTgorCWJsLGEJMWYKKwlpZmVsc2UoT1AsIGBkaXYnLCBgbmVnIFEnLCBgbmVnIFInKQorMTonKQorCXJldGwKKwlpZmVsc2UoT1AsIGBkaXYnLCBgbW92IFEsICVvMCcsIGBtb3YgUiwgJW8wJykKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL3BpcGUuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3BpcGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGFiZjNjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvcGlwZS5TCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBhcmNoL3NwYXJjL3BpcGUuUworICoKKyAqIFRoZSBwaXBlIHN5c3RlbSBjYWxsIGFyZSBzcGVjaWFsIG9uIHNwYXJjWzY0XToKKyAqIHRoZXkgcmV0dXJuIHRoZSB0d28gZmlsZSBkZXNjcmlwdG9ycyBpbiAlbzAgYW5kICVvMS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLmdsb2JsCXBpcGUKKwkudHlwZQlwaXBlLCNmdW5jdGlvbgorICAgICAgIAkuYWxpZ24JNAorcGlwZToKKwltb3YJX19OUl9waXBlLCAlZzEKKwlvcgklbzAsIDAsICVnNAorCXQJMHgxMAorCWJjYwkxZgorCSAgbm9wCisJc2V0aGkJJWhpKGVycm5vKSwgJWc0CisJb3IJJWc0LCAlbG8oZXJybm8pLCAlZzQKKwlzdAklbzAsWyVnNF0KKwlyZXRsCisJICBtb3YJLTEsICVvMAorMToKKwlzdAklbzAsWyVnNF0KKwlzdAklbzEsWyVnNCs0XQorCXJldGwKKwkgIG1vdgkwLCAlbzAKKworCS5zaXplIHBpcGUsLi1waXBlCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOGVhNzgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9zZXRqbXAuUwpAQCAtMCwwICsxLDM4IEBACishCishIHNldGptcC5TCishCishIEJhc2ljIHNldGptcC9sb25nam1wCishCishIFRoaXMgY29kZSB3YXMgYmFzZWQgb24gdGhlIGVxdWl2YWxlbnQgY29kZSBpbiBOZXRCU0QKKyEKKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisjaW5jbHVkZSA8bWFjaGluZS90cmFwLmg+CisKKyEKKyEgVGhlIGptcF9idWYgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorISAgIHNwCishICAgZnAKKyEgICBwYworIQorRU5UUlkoc2V0am1wKQorCXN0CSVzcCxbJW8wKzBdCSEgQ2FsbGVycyBzdGFjayBwb2ludGVyCisJc3QJJW83LFslbzArNF0JISBSZXR1cm4gcGMKKwlzdAklZnAsWyVvMCs4XQkhIEZyYW1lIHBvaW50ZXIKKwlyZXRsCQkJISBSZXR1cm4KKwkgY2xyCSVvMAkJISAgLi4uMAorCitFTlRSWShsb25nam1wKQorCXN1Ygklc3AsIDY0LCAlc3AJISBzZXQgdXAgYSBsb2NhbCBzdGFjayBmcmFtZQorMDoKKwl0CVNUX0ZMVVNIV0lOCSEgZmx1c2ggcmVnaXN0ZXIgd2luZG93cyBvdXQgdG8gbWVtb3J5CisJIQorCSEgV2UgcmVzdG9yZSB0aGUgc2F2ZWQgc3RhY2sgcG9pbnRlciB0byAlZnAsIHRoZW4gaXNzdWUKKwkhIGEgcmVzdG9yZSBpbnN0cnVjdGlvbiB3aGljaCB3aWxsIHJlbG9hZCB0aGUgcmVnaXN0ZXIKKwkhIHdpbmRvdyBmcm9tIHRoZSBzdGFjay4KKwkhCisgICAgICAgIGxkICAgICAgWyVvMCs0XSwgJW83ICAgIC8qIHJlc3RvcmUgcmV0dXJuIHBjICovCisgICAgICAgIGxkICAgICAgWyVvMCswXSwgJWZwICAgIC8qIGFuZCBzdGFjayBwb2ludGVyICovCisKKyAgICAgICAgcmV0bCAgICAgICAgICAgICAgICAgICAgISBzdWNjZXNzLCByZXR1cm4gJWc2CisgICAgICAgICByZXN0b3JlICAgICAgICAlbzEsIDAsICVvMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc211bC5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc211bC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGZmNmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9zbXVsLlMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCSROZXRCU0Q6IG11bC5TLHYgMS4zIDE5OTcvMDcvMTYgMTQ6Mzc6NDIgY2hyaXN0b3MgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zIEVuZ2luZWVyaW5nIGdyb3VwCisgKiBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IHVuZGVyIERBUlBBIGNvbnRyYWN0IEJHIDkxLTY2IGFuZAorICogY29udHJpYnV0ZWQgdG8gQmVya2VsZXkuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBmcm9tOiBIZWFkZXI6IG11bC5zLHYgMS41IDkyLzA2LzI1IDEzOjI0OjAzIHRvcmVrIEV4cAorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorI2lmIDAKKwkuYXNjaXogIkAoIyltdWwucwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiCisjZWxzZQorCVJDU0lEKCIkTmV0QlNEOiBtdWwuUyx2IDEuMyAxOTk3LzA3LzE2IDE0OjM3OjQyIGNocmlzdG9zIEV4cCAkIikKKyNlbmRpZgorI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworLyoKKyAqIFNpZ25lZCBtdWx0aXBseSwgZnJvbSBBcHBlbmRpeCBFIG9mIHRoZSBTcGFyYyBWZXJzaW9uIDgKKyAqIEFyY2hpdGVjdHVyZSBNYW51YWwuCisgKgorICogUmV0dXJucyAlbzAgKiAlbzEgaW4gJW8xJW8wIChpLmUuLCAlbzEgaG9sZHMgdGhlIHVwcGVyIDMyIGJpdHMgb2YKKyAqIHRoZSA2NC1iaXQgcHJvZHVjdCkuCisgKgorICogVGhpcyBjb2RlIG9wdGltaXplcyBzaG9ydCAobGVzcyB0aGFuIDEzLWJpdCkgbXVsdGlwbGllcy4KKyAqLworCitGVU5DKC5tdWwpCisJbW92CSVvMCwgJXkJCSEgbXVsdGlwbGllciAtPiBZCisJYW5kbmNjCSVvMCwgMHhmZmYsICVnMAkhIHRlc3QgYml0cyAxMi4uMzEKKwliZQlMbXVsX3Nob3J0d2F5CSEgaWYgemVybywgY2FuIGRvIGl0IHRoZSBzaG9ydCB3YXkKKwlhbmRjYwklZzAsICVnMCwgJW80CSEgemVybyB0aGUgcGFydGlhbCBwcm9kdWN0IGFuZCBjbGVhciBOIGFuZCBWCisKKwkvKgorCSAqIExvbmcgbXVsdGlwbHkuICAzMiBzdGVwcywgZm9sbG93ZWQgYnkgYSBmaW5hbCBzaGlmdCBzdGVwLgorCSAqLworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMworCW11bHNjYwklbzQsICVvMSwgJW80CSEgNAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNworCW11bHNjYwklbzQsICVvMSwgJW80CSEgOAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgOQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTAKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDExCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTMKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE0CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxNQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTYKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE3CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxOAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTkKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIwCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjIKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIzCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyNAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjUKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI2CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyNworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjgKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI5CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAzMAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMzEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDMyCisJbXVsc2NjCSVvNCwgJWcwLCAlbzQJISBmaW5hbCBzaGlmdAorCisJISBJZiAlbzAgd2FzIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGlzCisJIQkoJW8wICogJW8xKSArICglbzEgPDwgMzIpKQorCSEgV2UgZml4IHRoYXQgaGVyZS4KKworCXRzdAklbzAKKwliZ2UJMWYKKwlyZAkleSwgJW8wCisKKwkhICVvMCB3YXMgaW5kZWVkIG5lZ2F0aXZlOyBmaXggdXBwZXIgMzIgYml0cyBvZiByZXN1bHQgYnkgc3VidHJhY3RpbmcKKwkhICVvMSAoaS5lLiwgcmV0dXJuICVvNCAtICVvMSBpbiAlbzEpLgorCXJldGwKKwlzdWIJJW80LCAlbzEsICVvMQorCisxOgorCXJldGwKKwltb3YJJW80LCAlbzEKKworTG11bF9zaG9ydHdheToKKwkvKgorCSAqIFNob3J0IG11bHRpcGx5LiAgMTIgc3RlcHMsIGZvbGxvd2VkIGJ5IGEgZmluYWwgc2hpZnQgc3RlcC4KKwkgKiBUaGUgcmVzdWx0aW5nIGJpdHMgYXJlIG9mZiBieSAxMiBhbmQgKDMyLTEyKSA9IDIwIGJpdCBwb3NpdGlvbnMsCisJICogYnV0IHRoZXJlIGlzIG5vIHByb2JsZW0gd2l0aCAlbzAgYmVpbmcgbmVnYXRpdmUgKHVubGlrZSBhYm92ZSkuCisJICovCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAzCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA0CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA1CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA2CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA3CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA4CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA5CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEyCisJbXVsc2NjCSVvNCwgJWcwLCAlbzQJISBmaW5hbCBzaGlmdAorCisJLyoKKwkgKiAgJW80IGhhcyAyMCBvZiB0aGUgYml0cyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgbG93IHBhcnQgb2YgdGhlCisJICogcmVzdWx0OyAleSBoYXMgdGhlIGJvdHRvbSAxMiAoYXMgJXkncyB0b3AgMTIpLiAgVGhhdCBpczoKKwkgKgorCSAqCSAgJW80CQkgICAgJXkKKwkgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworCSAqIHwgLTEyLSB8ICAgLTIwLSAgfCAtMTItIHwgICAtMjAtICB8CisJICogKy0tLS0tLSgtLS0tLS0tLS0rLS0tLS0tKS0tLS0tLS0tLSsKKwkgKiAgLS1oaS0tIC0tLS1sb3ctcGFydC0tLS0KKwkgKgorCSAqIFRoZSB1cHBlciAxMiBiaXRzIG9mICVvNCBzaG91bGQgYmUgc2lnbi1leHRlbmRlZCB0byBmb3JtIHRoZQorCSAqIGhpZ2ggcGFydCBvZiB0aGUgcHJvZHVjdCAoaS5lLiwgaGlnaHBhcnQgPSAlbzQgPj4gMjApLgorCSAqLworCisJcmQJJXksICVvNQorCXNsbAklbzQsIDEyLCAlbzAJISBzaGlmdCBtaWRkbGUgYml0cyBsZWZ0IDEyCisJc3JsCSVvNSwgMjAsICVvNQkhIHNoaWZ0IGxvdyBiaXRzIHJpZ2h0IDIwLCB6ZXJvIGZpbGwgYXQgbGVmdAorCW9yCSVvNSwgJW8wLCAlbzAJISBjb25zdHJ1Y3QgbG93IHBhcnQgb2YgcmVzdWx0CisJcmV0bAorCXNyYQklbzQsIDIwLCAlbzEJISAuLi4gYW5kIGV4dHJhY3QgaGlnaCBwYXJ0IG9mIHJlc3VsdApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjczZjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9zeXNjYWxsLlMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIGFyY2gvc3BhcmMvc3lzY2FsbC5TCisgKgorICogQ29tbW9uIHN5c3RlbS1jYWxsIHN0dWI7ICVnMSBhbHJlYWR5IHNldCB0byBzeXNjYWxsIG51bWJlcgorICovCisKKwkuZ2xvYmwJX19zeXNjYWxsX2NvbW1vbgorCS50eXBlCV9fc3lzY2FsbF9jb21tb24sI2Z1bmN0aW9uCisgICAgICAgCS5hbGlnbgk0CitfX3N5c2NhbGxfY29tbW9uOgorCXQJMHgxMAorCWJjYwkxZgorCSAgc2V0aGkJJWhpKGVycm5vKSwgJWc0CisJb3IJJWc0LCAlbG8oZXJybm8pLCAlZzQKKwlzdAklbzAsWyVnNF0KKwltb3YJLTEsICVvMAorMToKKyAgICAgICAJcmV0bAorCSAgbm9wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9zeXNmb3JrLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9zeXNmb3JrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2Yzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3N5c2ZvcmsuUwpAQCAtMCwwICsxLDI1IEBACisvKgorICogYXJjaC9zcGFyYy9zeXNmb3JrLlMKKyAqCisgKiBUaGUgZm9yayBhbmQgdmZvcmsgc3lzdGVtIGNhbGxzIGFyZSBzcGVjaWFsIG9uIHNwYXJjWzY0XToKKyAqIHRoZXkgcmV0dXJuIHRoZSAib3RoZXIgcHJvY2VzcyIgcGlkIGluICVvMCBhbmQgdGhlCisgKiAiaXMgY2hpbGQiIGZsYWcgaW4gJW8xCisgKgorICogQ29tbW9uIHN5c3RlbS1jYWxsIHN0dWI7ICVnMSBhbHJlYWR5IHNldCB0byBzeXNjYWxsIG51bWJlcgorICovCisKKwkuZ2xvYmwJX19zeXNjYWxsX2Zvcmtpc2gKKwkudHlwZQlfX3N5c2NhbGxfZm9ya2lzaCwjZnVuY3Rpb24KKyAgICAgICAJLmFsaWduCTQKK19fc3lzY2FsbF9mb3JraXNoOgorCXQJMHgxMAorCXN1YgklbzEsIDEsICVvMQorCWJjYyxhCTFmCisJICBhbmQJJW8wLCAlbzEsICVvMAorCXNldGhpCSVoaShlcnJubyksICVnNAorCW9yCSVnNCwgJWxvKGVycm5vKSwgJWc0CisJc3QJJW8wLFslZzRdCisJbW92CS0xLCAlbzAKKzE6CisgICAgICAgCXJldGwKKwkgIG5vcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjZWRiNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3N5c3N0dWIucGgKQEAgLTAsMCArMSwyNSBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9zcGFyYzMyL3N5c3N0dWIucGgKKyMKKyMgU2NyaXB0IHRvIGdlbmVyYXRlIHN5c3RlbSBjYWxsIHN0dWJzCisjCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgJHN0eXBlID0gJHN0eXBlIHx8ICdjb21tb24nOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnR5cGUgJHtmbmFtZX0sXEBmdW5jdGlvblxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHRiIF9fc3lzY2FsbF8ke3N0eXBlfVxuIjsKKyAgICBwcmludCBPVVQgIlx0ICBtb3ZcdF9fTlJfJHtzbmFtZX0sICVnMVxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmMvdW11bC5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvdW11bC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNzE5M2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy91bXVsLlMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCSROZXRCU0Q6IHVtdWwuUyx2IDEuMyAxOTk3LzA3LzE2IDE0OjM3OjQ0IGNocmlzdG9zIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcyBFbmdpbmVlcmluZyBncm91cAorICogYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSB1bmRlciBEQVJQQSBjb250cmFjdCBCRyA5MS02NiBhbmQKKyAqIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogZnJvbTogSGVhZGVyOiB1bXVsLnMsdiAxLjQgOTIvMDYvMjUgMTM6MjQ6MDUgdG9yZWsgRXhwCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCisjaWYgMAorCS5hc2NpeiAiQCgjKXVtdWwucwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiCisjZWxzZQorCVJDU0lEKCIkTmV0QlNEOiB1bXVsLlMsdiAxLjMgMTk5Ny8wNy8xNiAxNDozNzo0NCBjaHJpc3RvcyBFeHAgJCIpCisjZW5kaWYKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKy8qCisgKiBVbnNpZ25lZCBtdWx0aXBseS4gIFJldHVybnMgJW8wICogJW8xIGluICVvMSVvMCAoaS5lLiwgJW8xIGhvbGRzIHRoZQorICogdXBwZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHByb2R1Y3QpLgorICoKKyAqIFRoaXMgY29kZSBvcHRpbWl6ZXMgc2hvcnQgKGxlc3MgdGhhbiAxMy1iaXQpIG11bHRpcGxpZXMuICBTaG9ydAorICogbXVsdGlwbGllcyByZXF1aXJlIDI1IGluc3RydWN0aW9uIGN5Y2xlcywgYW5kIGxvbmcgb25lcyByZXF1aXJlCisgKiA0NSBpbnN0cnVjdGlvbiBjeWNsZXMuCisgKgorICogT24gcmV0dXJuLCBvdmVyZmxvdyBoYXMgb2NjdXJyZWQgKCVvMSBpcyBub3QgemVybykgaWYgYW5kIG9ubHkgaWYKKyAqIHRoZSBaIGNvbmRpdGlvbiBjb2RlIGlzIGNsZWFyLCBhbGxvd2luZywgZS5nLiwgdGhlIGZvbGxvd2luZzoKKyAqCisgKgljYWxsCS51bXVsCisgKglub3AKKyAqCWJueglvdmVyZmxvdwkob3IgdG56KQorICovCisKK0ZVTkMoLnVtdWwpCisJb3IJJW8wLCAlbzEsICVvNAorCW1vdgklbzAsICV5CQkhIG11bHRpcGxpZXIgLT4gWQorCWFuZG5jYwklbzQsIDB4ZmZmLCAlZzAJISB0ZXN0IGJpdHMgMTIuLjMxIG9mICpib3RoKiBhcmdzCisJYmUJTG11bF9zaG9ydHdheQkhIGlmIHplcm8sIGNhbiBkbyBpdCB0aGUgc2hvcnQgd2F5CisJYW5kY2MJJWcwLCAlZzAsICVvNAkhIHplcm8gdGhlIHBhcnRpYWwgcHJvZHVjdCBhbmQgY2xlYXIgTiBhbmQgVgorCisJLyoKKwkgKiBMb25nIG11bHRpcGx5LiAgMzIgc3RlcHMsIGZvbGxvd2VkIGJ5IGEgZmluYWwgc2hpZnQgc3RlcC4KKwkgKi8KKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDMKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDQKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDUKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDYKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDcKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDgKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDkKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEwCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTIKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEzCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxNAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTUKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE2CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxNworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTgKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE5CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyMAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIyCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyMworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjQKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI1CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyNgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjcKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI4CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyOQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMzAKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDMxCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAzMgorCW11bHNjYwklbzQsICVnMCwgJW80CSEgZmluYWwgc2hpZnQKKworCisJLyoKKwkgKiBOb3JtYWxseSwgd2l0aCB0aGUgc2hpZnQtYW5kLWFkZCBhcHByb2FjaCwgaWYgYm90aCBudW1iZXJzIGFyZQorCSAqIHBvc2l0aXZlIHlvdSBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LiAgV0l0aCAzMi1iaXQgdHdvJ3MtY29tcGxlbWVudAorCSAqIG51bWJlcnMsIC14IGlzIHJlcHJlc2VudGVkIGFzCisJICoKKwkgKgkJICB4CQkgICAgMzIKKwkgKgkoIDIgIC0gIC0tLS0tLSApIG1vZCAyICAqICAyCisJICoJCSAgIDMyCisJICoJCSAgMgorCSAqCisJICogKHRoZSBgbW9kIDInIHN1YnRyYWN0cyAxIGZyb20gMS5iYmJiKS4gIFRvIGF2b2lkIGxvdHMgb2YgMl4zMnMsCisJICogd2UgY2FuIHRyZWF0IHRoaXMgYXMgaWYgdGhlIHJhZGl4IHBvaW50IHdlcmUganVzdCB0byB0aGUgbGVmdAorCSAqIG9mIHRoZSBzaWduIGJpdCAobXVsdGlwbHkgYnkgMl4zMiksIGFuZCBnZXQKKwkgKgorCSAqCS14ICA9ICAoMiAtIHgpIG1vZCAyCisJICoKKwkgKiBUaGVuLCBpZ25vcmluZyB0aGUgYG1vZCAyJ3MgZm9yIGNvbnZlbmllbmNlOgorCSAqCisJICogICB4ICogIHkJPSB4eQorCSAqICAteCAqICB5CT0gMnkgLSB4eQorCSAqICAgeCAqIC15CT0gMnggLSB4eQorCSAqICAteCAqIC15CT0gNCAtIDJ4IC0gMnkgKyB4eQorCSAqCisJICogRm9yIHNpZ25lZCBtdWx0aXBsaWVzLCB3ZSBzdWJ0cmFjdCAoeCA8PCAzMikgZnJvbSB0aGUgcGFydGlhbAorCSAqIHByb2R1Y3QgdG8gZml4IHRoaXMgcHJvYmxlbSBmb3IgbmVnYXRpdmUgbXVsdGlwbGllcnMgKHNlZSBtdWwucykuCisJICogQmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBzaGlmdCBpbnRvIHRoZSBwYXJ0aWFsIHByb2R1Y3QgaXMgY2FsY3VsYXRlZAorCSAqIChOIHhvciBWKSwgdGhpcyB0ZXJtIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmb3IgdGhlIG11bHRpcGxpY2FuZCwKKwkgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGFkanVzdC4KKwkgKgorCSAqIEJ1dCBmb3IgdW5zaWduZWQgbXVsdGlwbGllcywgdGhlIGhpZ2ggb3JkZXIgYml0IHdhc24ndCBhIHNpZ24gYml0LAorCSAqIGFuZCB0aGUgY29ycmVjdGlvbiBpcyB3cm9uZy4gIFNvIGZvciB1bnNpZ25lZCBtdWx0aXBsaWVzIHdoZXJlIHRoZQorCSAqIGhpZ2ggb3JkZXIgYml0IGlzIG9uZSwgd2UgZW5kIHVwIHdpdGggeHkgLSAoeSA8PCAzMikuICBUbyBmaXggaXQKKwkgKiB3ZSBhZGQgeSA8PCAzMi4KKwkgKi8KKwl0c3QJJW8xCisJYmwsYQkxZgkJISBpZiAlbzEgPCAwIChoaWdoIG9yZGVyIGJpdCA9IDEpLAorCWFkZAklbzQsICVvMCwgJW80CSEgJW80ICs9ICVvMCAoYWRkIHkgdG8gdXBwZXIgaGFsZikKKzE6CXJkCSV5LCAlbzAJCSEgZ2V0IGxvd2VyIGhhbGYgb2YgcHJvZHVjdAorCXJldGwKKwlhZGRjYwklbzQsICVnMCwgJW8xCSEgcHV0IHVwcGVyIGhhbGYgaW4gcGxhY2UgYW5kIHNldCBaIGZvciAlbzE9PTAKKworTG11bF9zaG9ydHdheToKKwkvKgorCSAqIFNob3J0IG11bHRpcGx5LiAgMTIgc3RlcHMsIGZvbGxvd2VkIGJ5IGEgZmluYWwgc2hpZnQgc3RlcC4KKwkgKiBUaGUgcmVzdWx0aW5nIGJpdHMgYXJlIG9mZiBieSAxMiBhbmQgKDMyLTEyKSA9IDIwIGJpdCBwb3NpdGlvbnMsCisJICogYnV0IHRoZXJlIGlzIG5vIHByb2JsZW0gd2l0aCAlbzAgYmVpbmcgbmVnYXRpdmUgKHVubGlrZSBhYm92ZSksCisJICogYW5kIG92ZXJmbG93IGlzIGltcG9zc2libGUgKHRoZSBhbnN3ZXIgaXMgYXQgbW9zdCAyNCBiaXRzIGxvbmcpLgorCSAqLworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMworCW11bHNjYwklbzQsICVvMSwgJW80CSEgNAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNworCW11bHNjYwklbzQsICVvMSwgJW80CSEgOAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgOQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTAKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDExCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMgorCW11bHNjYwklbzQsICVnMCwgJW80CSEgZmluYWwgc2hpZnQKKworCS8qCisJICogJW80IGhhcyAyMCBvZiB0aGUgYml0cyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgcmVzdWx0OyAleSBoYXMKKwkgKiB0aGUgYm90dG9tIDEyIChhcyAleSdzIHRvcCAxMikuICBUaGF0IGlzOgorCSAqCisJICoJICAlbzQJCSAgICAleQorCSAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisJICogfCAtMTItIHwgICAtMjAtICB8IC0xMi0gfCAgIC0yMC0gIHwKKwkgKiArLS0tLS0tKC0tLS0tLS0tLSstLS0tLS0pLS0tLS0tLS0tKworCSAqCSAgIC0tLS0tcmVzdWx0LS0tLS0KKwkgKgorCSAqIFRoZSAxMiBiaXRzIG9mICVvNCBsZWZ0IG9mIHRoZSBgcmVzdWx0JyBhcmVhIGFyZSBhbGwgemVybzsKKwkgKiBpbiBmYWN0LCBhbGwgdG9wIDIwIGJpdHMgb2YgJW80IGFyZSB6ZXJvLgorCSAqLworCisJcmQJJXksICVvNQorCXNsbAklbzQsIDEyLCAlbzAJISBzaGlmdCBtaWRkbGUgYml0cyBsZWZ0IDEyCisJc3JsCSVvNSwgMjAsICVvNQkhIHNoaWZ0IGxvdyBiaXRzIHJpZ2h0IDIwCisJb3IJJW81LCAlbzAsICVvMAorCXJldGwKKwlhZGRjYwklZzAsICVnMCwgJW8xCSEgJW8xID0gemVybywgYW5kIHNldCBaCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTRmNjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L0tidWlsZApAQCAtMCwwICsxLDggQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIHNwYXJjNjQKKyMKKwora2xpYi15IDo9IHBpcGUubyBzZXRqbXAubyBzeXNjYWxsLm8gc3lzZm9yay5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNmYwMDQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L01DT05GSUcKQEAgLTAsMCArMSwyMSBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvc3BhcmM2NC9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNBUkNIUkVRRkxBR1MgPSAtbTY0IC1tcHRyNjQgLURfX3NwYXJjNjRfXworS0xJQkNPUFRGTEFHUyAgICAgKz0gLU9zCitLTElCQ0JJVFNJWkUgICAgICA9IDY0CisKK0tMSUJDTERGTEFHUyAgICAgID0gLW0gZWxmNjRfc3BhcmMKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgTm9ybWFsIGJpbmFyaWVzIHN0YXJ0IGF0IDEgTUI7IHRoZSBsaW5rZXIgd2FudHMgMSBNQiBhbGlnbm1lbnQsCisjIGFuZCBjYWxsIGluc3RydWN0aW9ucyBoYXZlIGEgMzAtYml0IHNpZ25lZCBvZmZzZXQsIDw8IDIuCitLTElCQ1NIQVJFREZMQUdTCT0gLVR0ZXh0IDB4ODAwMDAyMDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhZWU3YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvY3J0MC5TCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBUQVJHRVRfUFRSX1NJWkUgNjQKKyNpbmNsdWRlICIuLi9zcGFyYy9jcnQwaS5TIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9waXBlLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3BpcGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNiMjBmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9waXBlLlMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGFyY2gvc3BhcmM2NC9waXBlLlMKKyAqCisgKiBUaGUgcGlwZSBzeXN0ZW0gY2FsbCBhcmUgc3BlY2lhbCBvbiBzcGFyY1s2NF06CisgKiB0aGV5IHJldHVybiB0aGUgdHdvIGZpbGUgZGVzY3JpcHRvcnMgaW4gJW8wIGFuZCAlbzEuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworCS5nbG9ibAlwaXBlCisJLnR5cGUJcGlwZSwjZnVuY3Rpb24KKyAgICAgICAJLmFsaWduCTQKK3BpcGU6CisJbW92CV9fTlJfcGlwZSwgJWcxCisJb3IJJW8wLCAwLCAlZzQKKwl0CTB4NmQKKwliY2MJJXhjYywgMWYKKwkgIG5vcAorCXNldGhpCSVoaShlcnJubyksICVnNAorCW9yCSVnNCwgJWxvKGVycm5vKSwgJWc0CisJc3QJJW8wLFslZzRdCisJcmV0bAorCSAgbW92CS0xLCAlbzAKKzE6CisJc3QJJW8wLFslZzRdCisJc3QJJW8xLFslZzQrNF0KKwlyZXRsCisJICBtb3YJMCwgJW8wCisKKwkuc2l6ZSBwaXBlLC4tcGlwZQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhNmE2OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvc2V0am1wLlMKQEAgLTAsMCArMSw1NSBAQAorIQorISBzZXRqbXAuUworIQorISBCYXNpYyBzZXRqbXAvbG9uZ2ptcAorIQorISBUaGlzIGNvZGUgd2FzIGJhc2VkIG9uIHRoZSBlcXVpdmFsZW50IGNvZGUgaW4gTmV0QlNECishCisKKyEKKyEgVGhlIGptcF9idWYgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorISAgIHNwCishICAgZnAKKyEgICBwYworIQorCS50ZXh0CisJLmFsaWduCTQKKwkuZ2xvYmFsCXNldGptcAorCS50eXBlCXNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisJc3R4CSVzcCxbJW8wKzBdCSEgQ2FsbGVycyBzdGFjayBwb2ludGVyCisJc3R4CSVvNyxbJW8wKzhdCSEgUmV0dXJuIHBjCisJc3R4CSVmcCxbJW8wKzE2XQkhIEZyYW1lIHBvaW50ZXIKKwlyZXRsCQkJISBSZXR1cm4KKwkgY2xyCSVvMAkJISAgLi4uMAorCisJLnNpemUJc2V0am1wLC4tc2V0am1wCisKKworICAgICAgIAkuZ2xvYmwJbG9uZ2ptcAorCS50eXBlCWxvbmdqbXAsIEBmdW5jdGlvbgorbG9uZ2ptcDoKKwltb3YJJW8xLCAlZzQJISBzYXZlIHJldHVybiB2YWx1ZQorCW1vdgklbzAsICVnMQkhIHNhdmUgdGFyZ2V0CisJbGR4CVslZzErMTZdLCVnNQkhIGdldCBjYWxsZXJzIGZyYW1lCisxOgorCWNtcAklZnAsICVnNQkhIGNvbXBhcmUgYWdhaW5zdCBkZXNpcmVkIGZyYW1lCisJYmwsYQkxYgkJISBpZiBiZWxvdy4uLgorCSByZXN0b3JlCQkhIHBvcCBmcmFtZSBhbmQgbG9vcAorCWJlLGEJMmYJCSEgaWYgdGhlcmUuLi4KKyAgICAgICAJIGxkeAlbJWcxKzBdLCVvMgkhIGZldGNoIHJldHVybiAlc3AKKworLkxib3RjaDoKKwl1bmltcAkwCQkhIC4uLiBlcnJvciAuLi4KKworMjoKKyAgICAgICAJY21wCSVvMiwgJXNwCSEgJXNwIG11c3Qgbm90IGRlY3JlYXNlCisJYmwJLkxib3RjaAorCSBub3AKKwltb3YJJW8yLCAlc3AJISBpdCBpcyBPSywgcHV0IGl0IGluIHBsYWNlCisKKwlsZHgJWyVnMSs4XSwlbzMJISBmZXRjaCAlcGMKKwlqbXAJJW8zICsgOAkJISBpZiBzdWNlc3MuLi4KKwkgbW92CSVnNCwlbzAJCSEgICByZXR1cm4gJWc0CisKKwkuc2l6ZQlsb25nam1wLC4tbG9uZ2ptcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3N5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI5ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zeXNjYWxsLlMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGFyY2gvc3BhcmM2NC9zeXNjYWxsLlMKKyAqCisgKiBDb21tb24gc3lzdGVtLWNhbGwgc3R1YjsgJWcxIGFscmVhZHkgc2V0IHRvIHN5c2NhbGwgbnVtYmVyCisgKi8KKworCS5nbG9ibAlfX3N5c2NhbGxfY29tbW9uCisJLnR5cGUJX19zeXNjYWxsX2NvbW1vbiwjZnVuY3Rpb24KKyAgICAgICAJLmFsaWduCTQKK19fc3lzY2FsbF9jb21tb246CisJdAkweDZkCisJYmNjCSV4Y2MsIDFmCisJICBzZXRoaQklaGkoZXJybm8pLCAlZzQKKwlvcgklZzQsICVsbyhlcnJubyksICVnNAorCXN0CSVvMCxbJWc0XQorMToKKyAgICAgICAJcmV0bAorCSAgbW92Y3MJJXhjYywgLTEsICVvMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zeXNmb3JrLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3N5c2ZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWVkNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zeXNmb3JrLlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGFyY2gvc3BhcmM2NC9zeXNmb3JrLlMKKyAqCisgKiBUaGUgZm9yayBhbmQgdmZvcmsgc3lzdGVtIGNhbGxzIGFyZSBzcGVjaWFsIG9uIHNwYXJjWzY0XToKKyAqIHRoZXkgcmV0dXJuIHRoZSAib3RoZXIgcHJvY2VzcyIgcGlkIGluICVvMCBhbmQgdGhlCisgKiAiaXMgY2hpbGQiIGZsYWcgaW4gJW8xCisgKgorICogQ29tbW9uIHN5c3RlbS1jYWxsIHN0dWI7ICVnMSBhbHJlYWR5IHNldCB0byBzeXNjYWxsIG51bWJlcgorICovCisKKwkuZ2xvYmwJX19zeXNjYWxsX2Zvcmtpc2gKKwkudHlwZQlfX3N5c2NhbGxfZm9ya2lzaCwjZnVuY3Rpb24KKyAgICAgICAJLmFsaWduCTQKK19fc3lzY2FsbF9mb3JraXNoOgorCXQJMHg2ZAorCXN1YgklbzEsIDEsICVvMQorCWJjYyxhCSV4Y2MsIDFmCisJICBhbmQJJW8wLCAlbzEsICVvMAorCXNldGhpCSVoaShlcnJubyksICVnNAorCW9yCSVnNCwgJWxvKGVycm5vKSwgJWc0CisJc3QJJW8wLCBbJWc0XQorCXJldGwKKwkgIG1vdgktMSwgJW8wCisxOgorICAgICAgIAlyZXRsCisJICBub3AKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWViODhjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMjUgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvc3BhcmM2NC9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgICRzdHlwZSA9ICRzdHlwZSB8fCAnY29tbW9uJzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlICR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCBPVVQgIlx0YiBfX3N5c2NhbGxfJHtzdHlwZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdCAgbW92XHRfX05SXyR7c25hbWV9LCAlZzFcbiI7CisgICAgcHJpbnQgT1VUICJcdC5zaXplICR7Zm5hbWV9LC4tJHtmbmFtZX1cbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjljNWIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvS2J1aWxkCkBAIC0wLDAgKzEsOCBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGtsaWJjIGZpbGVzIGZvciB4ODZfNjQKKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8gc2lncmV0dXJuLm8gdmZvcmsubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gveDg2XzY0L01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDBjNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L01DT05GSUcKQEAgLTAsMCArMSwzOSBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gveDg2LTY0L01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworIyBCbGF0YW50bHkgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIGkzODYgdmVyc2lvbiBieSBNYXRzIFBldGVyc3NvbiwgQU1ELgorIworCisjCisjIE5PVEU6IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgcHJvZHVjZSBzaWduaWZpY2FudGx5IHNtYWxsZXIKKyMgYmluYXJpZXMgKDIwJSBzbWFsbGVyKSwgYnV0IG1ha2VzIHRoZSBjb2RlIGNvbXBsZXRlbHkgdXNlbGVzcyBmb3IKKyMgZGVidWdnaW5nIHVzaW5nIGdkYi4KKyMKK0tMSUJDQVJDSFJFUUZMQUdTID0gLW02NAoraWZlcSAoJChERUJVRykseSkKK0tMSUJDT1BURkxBR1MgICAgICs9IC1nIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisJCS1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MQorZWxzZQorS0xJQkNPUFRGTEFHUyAgICAgKz0gLU9zIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorCQktZmFsaWduLWZ1bmN0aW9ucz0xIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEKK2VuZGlmCitLTElCQ0JJVFNJWkUgICAgICA9IDY0CitLTElCQ0xERkxBR1MgICAgICA9IC1tIGVsZl94ODZfNjQKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgMiBNQiAtIG5vcm1hbCBiaW5hcmllcyBzdGFydCBhdCA0IE1CCisjCisjIFJlY2VudCBiaW51dGlscyB1c2UgbWF4LXBhZ2Utc2l6ZT0weDIwMDAwMCBieSBkZWZhdWx0LCB3aGljaCBwdXNoZXMKKyMga2xpYmMuc28gZGF0YSBvdmVyIHRoZSA0IE1CIG1hcmssIG92ZXJsYXBwaW5nIHRoZSBleGVjdXRhYmxlLgorIyBSZXZlcnQgdG8gdGhlIG9sZCBtYXgtcGFnZS1zaXplPTB4MTAwMDAwIHZhbHVlLgorS0xJQkNTSEFSRURGTEFHUyAgICAgPSAtVHRleHQgMHgwMDIwMDIwMCAteiBtYXgtcGFnZS1zaXplPTB4MTAwMDAwCisKKyMgQWRkaXRpb25hbCBhc20tIGRpcmVjdG9yaWVzIG5lZWRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uCitBU01BUkNIID0gYXNtLWkzODYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWYzMzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvY3J0MC5TCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgYXJjaC94ODZfNjQvY3J0MC5TCisjCisjIERvZXMgYXJjaC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBhbmQgaW52b2tlcyBfX2xpYmNfaW5pdAorIyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCisjCisjIFNlZSBfX3N0YXRpY19pbml0LmMgb3IgX19zaGFyZWRfaW5pdC5jIGZvciB0aGUgZXhwZWN0ZWQKKyMgYXJndW1lbnRzLgorIworCisJLnRleHQKKwkuYWxpZ24gNAorCS50eXBlIF9zdGFydCxAZnVuY3Rpb24KKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJbW92cSAlcnNwLCVyZGkJCQkjIE9mZnNldCBvZiB0aGUgRUxGIGRhdGEgc3RydWN0dXJlCisJbW92cSAlcmR4LCVyc2kJCQkjIFRoZSBhdGV4aXQoKSBwb2ludGVyIChpZiBhbnkpCisJY2FsbCBfX2xpYmNfaW5pdAorCSMgV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCisJaGx0CisKKwkuc2l6ZSBfc3RhcnQsLi1fc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY1NDdiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3NldGptcC5TCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgYXJjaC94ODZfNjQvc2V0am1wLlMKKyMKKyMgc2V0am1wL2xvbmdqbXAgZm9yIHRoZSB4ODYtNjQgYXJjaGl0ZWN0dXJlCisjCisKKyMKKyMgVGhlIGptcF9idWYgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyOgorIwklcmJ4CisjCSVyc3AgKHBvc3QtcmV0dXJuKQorIwklcmJwCisjCSVyMTIKKyMJJXIxMworIwklcjE0CisjCSVyMTUKKyMJPHJldHVybiBhZGRyZXNzPgorIworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBzZXRqbXAKKwkudHlwZSBzZXRqbXAsIEBmdW5jdGlvbgorc2V0am1wOgorCXBvcCAgJXJzaQkJCSMgUmV0dXJuIGFkZHJlc3MsIGFuZCBhZGp1c3QgdGhlIHN0YWNrCisJeG9ybCAlZWF4LCVlYXgJCQkjIFJldHVybiB2YWx1ZQorCW1vdnEgJXJieCwoJXJkaSkKKwltb3ZxICVyc3AsOCglcmRpKQkJIyBQb3N0LXJldHVybiAlcnNwIQorCXB1c2ggJXJzaQkJCSMgTWFrZSB0aGUgY2FsbC9yZXR1cm4gc3RhY2sgaGFwcHkKKwltb3ZxICVyYnAsMTYoJXJkaSkKKwltb3ZxICVyMTIsMjQoJXJkaSkKKwltb3ZxICVyMTMsMzIoJXJkaSkKKwltb3ZxICVyMTQsNDAoJXJkaSkKKwltb3ZxICVyMTUsNDgoJXJkaSkKKwltb3ZxICVyc2ksNTYoJXJkaSkJCSMgUmV0dXJuIGFkZHJlc3MKKwlyZXQKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBsb25nam1wCisJLnR5cGUgbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorCW1vdmwgJWVzaSwlZWF4CQkJIyBSZXR1cm4gdmFsdWUgKGludCkKKwltb3ZxICglcmRpKSwlcmJ4CisJbW92cSA4KCVyZGkpLCVyc3AKKwltb3ZxIDE2KCVyZGkpLCVyYnAKKwltb3ZxIDI0KCVyZGkpLCVyMTIKKwltb3ZxIDMyKCVyZGkpLCVyMTMKKwltb3ZxIDQwKCVyZGkpLCVyMTQKKwltb3ZxIDQ4KCVyZGkpLCVyMTUKKwlqbXAgKjU2KCVyZGkpCisKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3NpZ3JldHVybi5TIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3NpZ3JldHVybi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTVhMGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvc2lncmV0dXJuLlMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGFyY2gveDg2XzY0L3NpZ3JldHVybi5TCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworCS50ZXh0CisJLmFsaWduCTQKKwkuZ2xvYmwJX19zaWdyZXR1cm4KKwkudHlwZQlfX3NpZ3JldHVybixAZnVuY3Rpb24KK19fc2lncmV0dXJuOgorCW1vdmwJJF9fTlJfcnRfc2lncmV0dXJuLCVlYXgKKwlzeXNjYWxsCisKKwkuc2l6ZQlfX3NpZ3JldHVybiwuLV9fc2lncmV0dXJuCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC94ODZfNjQvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3N5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk3Nzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3N5c2NhbGwuUwpAQCAtMCwwICsxLDI4IEBACisvKgorICogYXJjaC94ODYtNjQvc3lzY2FsbC5TCisgKgorICogQ29tbW9uIHRhaWwtaGFuZGxpbmcgY29kZSBmb3Igc3lzdGVtIGNhbGxzLgorICoKKyAqIFRoZSBhcmd1bWVudHMgYXJlIGluIHRoZSBzdGFuZGFyZCBhcmd1bWVudCByZWdpc3RlcnM7IHRoZSBzeXN0ZW0KKyAqIGNhbGwgbnVtYmVyIGluICVlYXguCisgKi8KKwkudGV4dAorCS5hbGlnbgk0CisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KKwkudHlwZQlfX3N5c2NhbGxfY29tbW9uLEBmdW5jdGlvbgorX19zeXNjYWxsX2NvbW1vbjoKKwltb3ZxCSVyY3gsJXIxMAkJIyBUaGUga2VybmVsIHVzZXMgJXIxMCBpc3RmICVyY3gKKwlzeXNjYWxsCisKKwljbXBxCSQtNDA5NSwlcmF4CisJam5iCTFmCisJcmV0CisKKwkjIEVycm9yIHJldHVybiwgbXVzdCBzZXQgZXJybm8KKzE6CisJbmVnbAklZWF4CisJbW92bAklZWF4LGVycm5vKCVyaXApCSMgZXJybm8gaXMgdHlwZSBpbnQsIHNvIDMyIGJpdHMKKwlvcnEJJC0xLCVyYXgJCSMgb3JxICQtMSBzbWFsbGVyIHRoYW4gbW92cSAkLTEKKwlyZXQKKworCS5zaXplCV9fc3lzY2FsbF9jb21tb24sLi1fX3N5c2NhbGxfY29tbW9uCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC94ODZfNjQvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDc5N2IKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvc3lzc3R1Yi5waApAQCAtMCwwICsxLDIzIEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL3g4Nl82NC9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlICR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCBPVVQgIlx0bW92bCBcJF9fTlJfJHtzbmFtZX0sJWVheFxuIjsgIyBaZXJvLWV4dGVuZHMgdG8gNjQgYml0cworICAgIHByaW50IE9VVCAiXHRqbXAgX19zeXNjYWxsX2NvbW1vblxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3Zmb3JrLlMgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvdmZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM4MDkwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3Zmb3JrLlMKQEAgLTAsMCArMSwyNiBAQAorIworIyB1c3Iva2xpYmMvYXJjaC94ODZfNjQvdmZvcmsuUworIworIyB2Zm9yayBpcyBuYXN0eSAtIHRoZXJlIG11c3QgYmUgbm90aGluZyBhdCBhbGwgb24gdGhlIHN0YWNrIGFib3ZlCisjIHRoZSBzdGFjayBmcmFtZSBvZiB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLgorIworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnRleHQKKwkuYWxpZ24JNAorCS5nbG9ibAl2Zm9yaworCS50eXBlCXZmb3JrLCBAZnVuY3Rpb24KK3Zmb3JrOgorCXBvcAklcmR4CQkJLyogUmV0dXJuIGFkZHJlc3MgKi8KKwltb3ZsCSRfX05SX3Zmb3JrLCAlZWF4CisJc3lzY2FsbAorCXB1c2gJJXJkeAorCWNtcHEJJC00MDk1LCAlcmF4CisJamFlCTFmCisJcmV0CisxOgorCW5lZ2wJJWVheAorCW1vdmwJJWVheCwgZXJybm8oJXJpcCkKKwlvcnEJJC0xLCAlcmF4CisJcmV0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXNwcmludGYuYyBiL3Vzci9rbGliYy9hc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZjVmMDAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXNwcmludGYuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogYXNwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgYXNwcmludGYoY2hhciAqKmJ1ZnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXAsIGFwMTsKKwlpbnQgcnY7CisJaW50IGJ5dGVzOworCWNoYXIgKnA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwl2YV9jb3B5KGFwMSwgYXApOworCisJYnl0ZXMgPSB2c25wcmludGYoTlVMTCwgMCwgZm9ybWF0LCBhcDEpICsgMTsKKwl2YV9lbmQoYXAxKTsKKworCSpidWZwID0gcCA9IG1hbGxvYyhieXRlcyk7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisKKwlydiA9IHZzbnByaW50ZihwLCBieXRlcywgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hc3NlcnQuYyBiL3Vzci9rbGliYy9hc3NlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E0MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2Fzc2VydC5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhc3NlcnQuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisKK19fbm9yZXR1cm4gX19hc3NlcnRfZmFpbChjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkKK3sKKwlwcmludGYoIkFzc2VydGlvbiAlcyBmYWlsZWQsIGZpbGUgJXMsIGxpbmUgJXVcbiIsIGV4cHIsIGZpbGUsIGxpbmUpOworCWFib3J0KCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXRleGl0LmMgYi91c3Iva2xpYmMvYXRleGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYjQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hdGV4aXQuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogYXRleGl0LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBhdGV4aXQodm9pZCAoKmZjdG4pICh2b2lkKSkKK3sKKwlyZXR1cm4gb25fZXhpdCgodm9pZCAoKikoaW50LCB2b2lkICopKWZjdG4sIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2F0ZXhpdC5oIGIvdXNyL2tsaWJjL2F0ZXhpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMTg2ODkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXRleGl0LmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGF0ZXhpdC5oCisgKgorICogYXRleGl0KCkvb25fZXhpdCgpIGludGVybmFsIGRlZmluaXRpb25zCisgKi8KKworI2lmbmRlZiBBVEVYSVRfSAorI2RlZmluZSBBVEVYSVRfSAorCitzdHJ1Y3QgYXRleGl0IHsKKwl2b2lkICgqZmN0bikgKGludCwgdm9pZCAqKTsKKwl2b2lkICphcmc7CQkvKiBvbl9leGl0KCkgcGFyYW1ldGVyICovCisJc3RydWN0IGF0ZXhpdCAqbmV4dDsKK307CisKK2V4dGVybiBzdHJ1Y3QgYXRleGl0ICpfX2F0ZXhpdF9saXN0OworCisjZW5kaWYJCQkJLyogQVRFWElUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hdG9pLmMgYi91c3Iva2xpYmMvYXRvaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZWMwYmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXRvaS5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIGludAorI2RlZmluZSBOQU1FIGF0b2kKKyNpbmNsdWRlICJhdG94LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXRvbC5jIGIvdXNyL2tsaWJjL2F0b2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU0ODRlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2F0b2wuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSBsb25nCisjZGVmaW5lIE5BTUUgYXRvbAorI2luY2x1ZGUgImF0b3guYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hdG9sbC5jIGIvdXNyL2tsaWJjL2F0b2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkZjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hdG9sbC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIGxvbmcgbG9uZworI2RlZmluZSBOQU1FIGF0b2xsCisjaW5jbHVkZSAiYXRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2F0b3guYyBiL3Vzci9rbGliYy9hdG94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxM2JiNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hdG94LmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGF0b3guYworICoKKyAqIGF0b2koKSwgYXRvbCgpLCBhdG9sbCgpCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworVFlQRSBOQU1FKGNvbnN0IGNoYXIgKm5wdHIpCit7CisJcmV0dXJuIChUWVBFKSBzdHJudG91bWF4KG5wdHIsIChjaGFyICoqKU5VTEwsIDEwLCB+KHNpemVfdCkgMCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYnJrLmMgYi91c3Iva2xpYmMvYnJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwYmI3YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9icmsuYwpAQCAtMCwwICsxLDI5IEBACisvKiBicmsuYyAtIENoYW5nZSBkYXRhIHNlZ21lbnQgc2l6ZSAqLworCisvKiBXcml0dGVuIDIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJtYWxsb2MuaCIKKworI2lmICFfS0xJQkNfTk9fTU1VCQkvKiB1Q2xpbnV4IGRvZXNuJ3QgaGF2ZSBicmsoKSAqLworCitjaGFyICpfX2N1cnJlbnRfYnJrOworCisvKgorICogVGhlIExpbnV4IGJyaygpIGlzbid0IHdoYXQgbW9zdCBwZW9wbGUgZXhwZWN0LCBzbyB3ZSBjYWxsIHRoZQorICogc3lzdGVtIGNhbGwgX19icmsoKSBhbmQgcHJvdmlkZSBhIHdyYXBwZXIuCisgKi8KK2ludCBicmsodm9pZCAqZW5kX2RhdGFfc2VnbWVudCkKK3sKKwljaGFyICpuZXdfYnJrOworCisJbmV3X2JyayA9IF9fYnJrKGVuZF9kYXRhX3NlZ21lbnQpOworCWlmIChuZXdfYnJrICE9IGVuZF9kYXRhX3NlZ21lbnQpCisJCXJldHVybiAtMTsKKwlfX2N1cnJlbnRfYnJrID0gbmV3X2JyazsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYnNkX3NpZ25hbC5jIGIvdXNyL2tsaWJjL2JzZF9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTYyMzhjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2JzZF9zaWduYWwuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogYnNkX3NpZ25hbC5jCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCitfX3NpZ2hhbmRsZXJfdCBic2Rfc2lnbmFsKGludCBzaWdudW0sIF9fc2lnaGFuZGxlcl90IGhhbmRsZXIpCit7CisJLyogQlNEIHNpZ25hbCgpIHNlbWFudGljcyAqLworCXJldHVybiBfX3NpZ25hbChzaWdudW0sIGhhbmRsZXIsIFNBX1JFU1RBUlQpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2JzZWFyY2guYyBiL3Vzci9rbGliYy9ic2VhcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4YjA3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9ic2VhcmNoLmMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGJzZWFyY2guYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordm9pZCAqYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwKKwkgICAgICBzaXplX3Qgc2l6ZSwgaW50ICgqY21wKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQoreworCXdoaWxlIChubWVtYikgeworCQlzaXplX3QgbWlkaWR4ID0gbm1lbWIgLyAyOworCQljb25zdCB2b2lkICptaWRvYmogPSBiYXNlICsgbWlkaWR4ICogc2l6ZTsKKwkJaW50IGRpZmYgPSBjbXAoa2V5LCBtaWRvYmopOworCisJCWlmIChkaWZmID09IDApCisJCQlyZXR1cm4gKHZvaWQgKiltaWRvYmo7CisKKwkJaWYgKGRpZmYgPiAwKSB7CisJCQliYXNlID0gbWlkb2JqICsgc2l6ZTsKKwkJCW5tZW1iIC09IG1pZGlkeCArIDE7CisJCX0gZWxzZQorCQkJbm1lbWIgPSBtaWRpZHg7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY2FsbG9jLmMgYi91c3Iva2xpYmMvY2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiNzY2NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jYWxsb2MuYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogY2FsbG9jLmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEZJWE1FOiBUaGlzIHNob3VsZCBsb29rIGZvciBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyAqLworCit2b2lkICpjYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpwdHI7CisKKwlzaXplICo9IG5tZW1iOworCXB0ciA9IG1hbGxvYyhzaXplKTsKKwlpZiAocHRyKQorCQltZW1zZXQocHRyLCAwLCBzaXplKTsKKworCXJldHVybiBwdHI7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY2xlYXJlbnYuYyBiL3Vzci9rbGliYy9jbGVhcmVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjQzNWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY2xlYXJlbnYuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogY2xlYXJlbnYuYworICoKKyAqIEVtcHR5IHRoZSBlbnZpcm9ubWVudAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJlbnYuaCIKKworLyogTm90ZTogaWYgZW52aXJvbiBoYXMgYmVlbiBtYWxsb2MnZCwgaXQgd2lsbCBiZSBmcmVlZCBvbiB0aGUgbmV4dAorICAgc2V0ZW52KCkgb3IgcHV0ZW52KCkgKi8KK2ludCBjbGVhcmVudih2b2lkKQoreworCWVudmlyb24gPSAoY2hhciAqKilfX251bGxfZW52aXJvbjsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jbG9zZWxvZy5jIGIvdXNyL2tsaWJjL2Nsb3NlbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzNzcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jbG9zZWxvZy5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBjbG9zZWxvZy5jCisgKi8KKworI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitleHRlcm4gaW50IF9fc3lzbG9nX2ZkOworCit2b2lkIGNsb3NlbG9nKHZvaWQpCit7CisJaW50IGxvZ2ZkID0gX19zeXNsb2dfZmQ7CisKKwlpZiAobG9nZmQgIT0gLTEpIHsKKwkJY2xvc2UobG9nZmQpOworCQlfX3N5c2xvZ19mZCA9IC0xOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jcmVhdC5jIGIvdXNyL2tsaWJjL2NyZWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwM2JjYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jcmVhdC5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiBjcmVhdC5jCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworaW50IGNyZWF0KGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBtb2RlX3QgbW9kZSkKK3sKKwlyZXR1cm4gb3BlbihwYXRobmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywgbW9kZSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvY3R5cGVmdW5jLmggYi91c3Iva2xpYmMvY3R5cGUvY3R5cGVmdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMjQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9jdHlwZWZ1bmMuaApAQCAtMCwwICsxLDEzIEBACisvKgorICogY3R5cGUvY3R5cGUuaAorICoKKyAqIENvbW1vbiBoZWFkZXIgZm9yIG91dC1vZi1saW5lIGN0eXBlIGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgX19DVFlQRV9OT19JTkxJTkUKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjZGVmaW5lIENUWVBFRlVOQyhYKQkJCQlcCisgIGludCBYKGludCBjKSB7CQkJCVwKKyAgICByZXR1cm4gX19jdHlwZV8jI1goYyk7CQkJXAorICB9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNhbG51bS5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzYWxudW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2FmMThiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzYWxudW0uYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc2FsbnVtKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzYWxwaGEuYyBiL3Vzci9rbGliYy9jdHlwZS9pc2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyZWZmZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc2FscGhhLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXNhbHBoYSkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc2FzY2lpLmMgYi91c3Iva2xpYmMvY3R5cGUvaXNhc2NpaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTc0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXNhc2NpaS5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzYXNjaWkpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNibGFuay5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzYmxhbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzI4NTUwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzYmxhbmsuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc2JsYW5rKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzY250cmwuYyBiL3Vzci9rbGliYy9jdHlwZS9pc2NudHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkYjgwNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc2NudHJsLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXNjbnRybCkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc2RpZ2l0LmMgYi91c3Iva2xpYmMvY3R5cGUvaXNkaWdpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTM5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXNkaWdpdC5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzZGlnaXQpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNncmFwaC5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzZ3JhcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI4M2QxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzZ3JhcGguYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc2dyYXBoKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzbG93ZXIuYyBiL3Vzci9rbGliYy9jdHlwZS9pc2xvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxNzlhZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc2xvd2VyLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXNsb3dlcikKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc3ByaW50LmMgYi91c3Iva2xpYmMvY3R5cGUvaXNwcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmEzNTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXNwcmludC5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzcHJpbnQpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNwdW5jdC5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzcHVuY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmI1MjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzcHVuY3QuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc3B1bmN0KQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzc3BhY2UuYyBiL3Vzci9rbGliYy9jdHlwZS9pc3NwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkMDZjOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc3NwYWNlLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXNzcGFjZSkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc3VwcGVyLmMgYi91c3Iva2xpYmMvY3R5cGUvaXN1cHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTEzOWIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXN1cHBlci5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzdXBwZXIpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXN4ZGlnaXQuYyBiL3Vzci9rbGliYy9jdHlwZS9pc3hkaWdpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODljMWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXN4ZGlnaXQuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc3hkaWdpdCkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS90b2xvd2VyLmMgYi91c3Iva2xpYmMvY3R5cGUvdG9sb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Y2E3MmIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvdG9sb3dlci5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKHRvbG93ZXIpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvdG91cHBlci5jIGIvdXNyL2tsaWJjL2N0eXBlL3RvdXBwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTc2M2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL3RvdXBwZXIuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyh0b3VwcGVyKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlcy5jIGIvdXNyL2tsaWJjL2N0eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjU2NmEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGVzLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBjdHlwZXMuYworICoKKyAqIFRoaXMgaXMgdGhlIGFycmF5IHRoYXQgZGVmaW5lcyA8Y3R5cGUuaD4gY2xhc3Nlcy4KKyAqIFRoaXMgYXNzdW1lcyBJU08gODg1OS0xLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitjb25zdCB1bnNpZ25lZCBjaGFyIF9fY3R5cGVzWzI1N10gPSB7CisJMCwJCQkvKiBFT0YgKi8KKworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBCUyAqLworCV9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBUQUIgKi8KKwlfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogTEYgKi8KKwlfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogVlQgKi8KKwlfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogRkYgKi8KKwlfX2N0eXBlX2NudHJsIHwgX19jdHlwZV9zcGFjZSwJLyogQ1IgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfc3BhY2UsCS8qIHNwYWNlICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogQS1GICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX3hkaWdpdCwJLyogYS1mICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisKKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3NwYWNlLAkvKiBOQlNQICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiB1cHBlciBhY2NlbnRlZCAqLworCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9kYWVtb24uYyBiL3Vzci9rbGliYy9kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWI4OGRkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2RhZW1vbi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBkYWVtb24uYyAtICJkYWVtb25pemUiIGEgcHJvY2VzcworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitpbnQgZGFlbW9uKGludCBub2NoZGlyLCBpbnQgbm9jbG9zZSkKK3sKKwlpbnQgbnVsbGZkOworCXBpZF90IGY7CisKKwlpZiAoIW5vY2hkaXIpIHsKKwkJaWYgKGNoZGlyKCIvIikpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFub2Nsb3NlKSB7CisJCWlmICgobnVsbGZkID0gb3BlbigiL2Rldi9udWxsIiwgT19SRFdSKSkgPCAwIHx8CisJCSAgICBkdXAyKG51bGxmZCwgMCkgPCAwIHx8CisJCSAgICBkdXAyKG51bGxmZCwgMSkgPCAwIHx8CisJCSAgICBkdXAyKG51bGxmZCwgMikgPCAwKQorCQkJcmV0dXJuIC0xOworCQljbG9zZShudWxsZmQpOworCX0KKworCWYgPSBmb3JrKCk7CisJaWYgKGYgPCAwKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoZiA+IDApCisJCV9leGl0KDApOworCisJcmV0dXJuIHNldHNpZCgpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2Vudi5oIGIvdXNyL2tsaWJjL2Vudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzBiZTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZW52LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBFTlZfSAorI2RlZmluZSBFTlZfSAorCisvKiBzdHIgc2hvdWxkIGJlIGEgZHVwbGljYXRlZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dCBzdHJpbmc7CisgICBsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGluY2x1ZGluZyB0aGUgPSBzaWduICovCitpbnQgX19wdXRfZW52KGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IG92ZXJ3cml0ZSk7CisKK2V4dGVybiBjaGFyICpjb25zdCBfX251bGxfZW52aXJvbltdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9leGVjX2wuYyBiL3Vzci9rbGliYy9leGVjX2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmI3MGRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2V4ZWNfbC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBleGVjX2wuYworICoKKyAqIENvbW1vbiBpbXBsZW1lbnRhdGlvbiBvZiBleGVjbCgpIGV4ZWNsZSgpIGV4ZWNscCgpCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgTkFNRShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphcmcwLCAuLi4pCit7CisJdmFfbGlzdCBhcCwgY2FwOworCWludCBhcmdjID0gMSwgcnY7CisJY29uc3QgY2hhciAqKmFyZ3YsICoqYXJncDsKKwljb25zdCBjaGFyICphcmc7CisJY2hhciAqY29uc3QgKmVudnA7CisKKwl2YV9zdGFydChhcCwgYXJnMCk7CisJdmFfY29weShjYXAsIGFwKTsKKworCS8qIENvdW50IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCisJZG8geworCQlhcmcgPSB2YV9hcmcoY2FwLCBjb25zdCBjaGFyICopOworCQlhcmdjKys7CisJfSB3aGlsZSAoYXJnKTsKKworCXZhX2VuZChjYXApOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcG9pbnRlciBhcnJheSAqLworCWFyZ3AgPSBhcmd2ID0gYWxsb2NhKGFyZ2MgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJaWYgKCFhcmd2KSB7CisJCXZhX2VuZChhcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDb3B5IHRoZSBsaXN0IGludG8gYW4gYXJyYXkgKi8KKwkqYXJncCsrID0gYXJnMDsKKwlkbyB7CisJCSphcmdwKysgPSBhcmcgPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKik7CisJfSB3aGlsZSAoYXJnKTsKKworI2lmIEVYRUNfRQorCS8qIGV4ZWNsZSgpIHRha2VzIG9uZSBtb3JlIGFyZ3VtZW50IGZvciB0aGUgZW52aXJvbm1lbnQgcG9pbnRlciAqLworCWVudnAgPSB2YV9hcmcoYXAsIGNoYXIgKmNvbnN0ICopOworI2Vsc2UKKwllbnZwID0gZW52aXJvbjsKKyNlbmRpZgorCisjaWYgRVhFQ19QCisJcnYgPSBleGVjdnBlKHBhdGgsIChjaGFyICogY29uc3QgKilhcmd2LCBlbnZwKTsKKyNlbHNlCisJcnYgPSBleGVjdmUocGF0aCwgKGNoYXIgKiBjb25zdCAqKWFyZ3YsIGVudnApOworI2VuZGlmCisKKwl2YV9lbmQoYXApOworCisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2V4ZWNsLmMgYi91c3Iva2xpYmMvZXhlY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTgxMTEzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2V4ZWNsLmMKQEAgLTAsMCArMSw4IEBACisvKgorICogZXhlY2wuYworICovCisKKyNkZWZpbmUgTkFNRSBleGVjbAorI2RlZmluZSBFWEVDX1AgMAorI2RlZmluZSBFWEVDX0UgMAorI2luY2x1ZGUgImV4ZWNfbC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2V4ZWNsZS5jIGIvdXNyL2tsaWJjL2V4ZWNsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzM5ODgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZXhlY2xlLmMKQEAgLTAsMCArMSw4IEBACisvKgorICogZXhlY2xlLmMKKyAqLworCisjZGVmaW5lIE5BTUUgZXhlY2xlCisjZGVmaW5lIEVYRUNfUCAwCisjZGVmaW5lIEVYRUNfRSAxCisjaW5jbHVkZSAiZXhlY19sLmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZXhlY2xwLmMgYi91c3Iva2xpYmMvZXhlY2xwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjOWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9leGVjbHAuYwpAQCAtMCwwICsxLDggQEAKKy8qCisgKiBleGVjbHAuYworICovCisKKyNkZWZpbmUgTkFNRSBleGVjbHAKKyNkZWZpbmUgRVhFQ19QIDEKKyNkZWZpbmUgRVhFQ19FIDAKKyNpbmNsdWRlICJleGVjX2wuYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9leGVjbHBlLmMgYi91c3Iva2xpYmMvZXhlY2xwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjk3MmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZXhlY2xwZS5jCkBAIC0wLDAgKzEsOCBAQAorLyoKKyAqIGV4ZWNscGUuYworICovCisKKyNkZWZpbmUgTkFNRSBleGVjbHBlCisjZGVmaW5lIEVYRUNfUCAxCisjZGVmaW5lIEVYRUNfRSAxCisjaW5jbHVkZSAiZXhlY19sLmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZXhlY3YuYyBiL3Vzci9rbGliYy9leGVjdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTU3MzcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZXhlY3YuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogZXhlY3YuYworICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IGV4ZWN2KGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKmNvbnN0ICphcmd2KQoreworCXJldHVybiBleGVjdmUocGF0aCwgYXJndiwgZW52aXJvbik7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZXhlY3ZwLmMgYi91c3Iva2xpYmMvZXhlY3ZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5ZjMxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9leGVjdnAuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogZXhlY3ZwLmMKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBleGVjdnAoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqY29uc3QgKmFyZ3YpCit7CisJcmV0dXJuIGV4ZWN2cGUocGF0aCwgYXJndiwgZW52aXJvbik7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZXhlY3ZwZS5jIGIvdXNyL2tsaWJjL2V4ZWN2cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg0NGYyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2V4ZWN2cGUuYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogZXhlY3ZwZS5jCisgKgorICogZXhlY3ZwZSgpIGZ1bmN0aW9uIChmcm9tIHdoaWNoIHdlIGJ1aWxkIGV4ZWNscCwgZXhlY2xwZSwgZXhlY3ZwKS4KKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgZXhlY3ZwZSgpIHdpbGwgKm5vdCogc3Bhd24gL2Jpbi9zaCBpZiB0aGUgY29tbWFuZAorICogcmV0dXJuIEVOT0VYRUMuICBUaGF0J3Mgd2hhdCAjISBpcyBmb3IsIGZvbGtzIQorICoKKyAqIFNpbmNlIGV4ZWNscGUoKSBhbmQgZXhlY3ZwZSgpIGFyZW4ndCBpbiBQT1NJWCwgbm9yIGluIGdsaWJjLAorICogSSBoYXZlIGZvbGxvd2VkIFFOWCBwcmVjZWRlbnQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQQVRIOgorICogdGhlIFBBVEggdGhhdCBpcyB1c2VkIGlzIHRoZSBvbmUgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQsIG5vdAorICogaW4gdGhlIG5ldyBlbnZpcm9ubWVudC4gIE90aGVyd2lzZSBpdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIHBhc3MKKyAqIGEgZGlmZmVyZW50IFBBVEggdG8gdGhlIG5ldyBwcm9jZXNzIHRoYW4gdGhlIG9uZSBvbmUgd291bGQgd2FudCB0bworICogdXNlIHRvIHNlYXJjaC4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2RlZmluZSBERUZBVUxUX1BBVEggCSIvYmluOi91c3IvYmluOi4iCisKK2ludCBleGVjdnBlKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0ICphcmd2LCBjaGFyICpjb25zdCAqZW52cCkKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKnNlYXJjaHBhdGgsICplc3A7CisJc2l6ZV90IHByZWZpeGxlbiwgZmlsZWxlbiwgdG90YWxsZW47CisKKwlpZiAoc3RyY2hyKGZpbGUsICcvJykpCS8qIFNwZWNpZmljIHBhdGggKi8KKwkJcmV0dXJuIGV4ZWN2ZShmaWxlLCBhcmd2LCBlbnZwKTsKKworCWZpbGVsZW4gPSBzdHJsZW4oZmlsZSk7CisKKwlzZWFyY2hwYXRoID0gZ2V0ZW52KCJQQVRIIik7CisJaWYgKCFzZWFyY2hwYXRoKQorCQlzZWFyY2hwYXRoID0gREVGQVVMVF9QQVRIOworCisJZXJybm8gPSBFTk9FTlQ7CQkvKiBEZWZhdWx0IGVycm5vLCBpZiBleGVjdmUoKSBkb2Vzbid0CisJCQkJICAgY2hhbmdlIGl0ICovCisKKwlkbyB7CisJCWVzcCA9IHN0cmNocihzZWFyY2hwYXRoLCAnOicpOworCQlpZiAoZXNwKQorCQkJcHJlZml4bGVuID0gZXNwIC0gc2VhcmNocGF0aDsKKwkJZWxzZQorCQkJcHJlZml4bGVuID0gc3RybGVuKHNlYXJjaHBhdGgpOworCisJCWlmIChwcmVmaXhsZW4gPT0gMCB8fCBzZWFyY2hwYXRoW3ByZWZpeGxlbiAtIDFdID09ICcvJykgeworCQkJdG90YWxsZW4gPSBwcmVmaXhsZW4gKyBmaWxlbGVuOworCQkJaWYgKHRvdGFsbGVuID49IFBBVEhfTUFYKQorCQkJCWNvbnRpbnVlOworCQkJbWVtY3B5KHBhdGgsIHNlYXJjaHBhdGgsIHByZWZpeGxlbik7CisJCQltZW1jcHkocGF0aCArIHByZWZpeGxlbiwgZmlsZSwgZmlsZWxlbik7CisJCX0gZWxzZSB7CisJCQl0b3RhbGxlbiA9IHByZWZpeGxlbiArIGZpbGVsZW4gKyAxOworCQkJaWYgKHRvdGFsbGVuID49IFBBVEhfTUFYKQorCQkJCWNvbnRpbnVlOworCQkJbWVtY3B5KHBhdGgsIHNlYXJjaHBhdGgsIHByZWZpeGxlbik7CisJCQlwYXRoW3ByZWZpeGxlbl0gPSAnLyc7CisJCQltZW1jcHkocGF0aCArIHByZWZpeGxlbiArIDEsIGZpbGUsIGZpbGVsZW4pOworCQl9CisJCXBhdGhbdG90YWxsZW5dID0gJ1wwJzsKKworCQlleGVjdmUocGF0aCwgYXJndiwgZW52cCk7CisJCWlmIChlcnJubyA9PSBFMkJJRyAgfHwgZXJybm8gPT0gRU5PRVhFQyB8fAorCQkgICAgZXJybm8gPT0gRU5PTUVNIHx8IGVycm5vID09IEVUWFRCU1kpCisJCQlicmVhazsJLyogUmVwb3J0IHRoaXMgYXMgYW4gZXJyb3IsIG5vIG1vcmUgc2VhcmNoICovCisKKwkJc2VhcmNocGF0aCA9IGVzcCArIDE7CisJfSB3aGlsZSAoZXNwKTsKKworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9leGl0LmMgYi91c3Iva2xpYmMvZXhpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjExYzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZXhpdC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBleGl0LmMKKyAqCisgKiBleGl0KCksIGluY2x1ZGluZyB0aGUgaGFuZGxpbmcgb2YgdGhlIGF0ZXhpdCBjaGFpbi4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlICJhdGV4aXQuaCIKKworLyogTGluayBjaGFpbiBmb3IgYXRleGl0L29uX2V4aXQgKi8KK3N0cnVjdCBhdGV4aXQgKl9fYXRleGl0X2xpc3Q7CisKK19fbm9yZXR1cm4gZXhpdChpbnQgcnYpCit7CisJc3RydWN0IGF0ZXhpdCAqYXA7CisKKwlmb3IgKGFwID0gX19hdGV4aXRfbGlzdDsgYXA7IGFwID0gYXAtPm5leHQpIHsKKwkJLyogVGhpcyBhc3N1bWVzIGV4dHJhIGFyZ3MgYXJlIGhhcm1sZXNzLiAgVGhleSBzaG91bGQKKwkJICAgYmUgaW4gYWxsIG5vcm1hbCBDIEFCSXMsIGJ1dCBpZiBhbiBhcmNoaXRlY3R1cmUgaGFzCisJCSAgIHNvbWUgcGFydGljdWxhcmx5IGJpemFycmUgQUJJIHRoaXMgbWlnaHQgYmUgd29ydGgKKwkJICAgd2F0Y2hpbmcgb3V0IGZvci4gKi8KKwkJYXAtPmZjdG4ocnYsIGFwLT5hcmcpOworCX0KKworCS8qIEhhbmRsZSBhbnkgbGlicmFyeSBkZXN0cnVjdG9ycyBpZiB3ZSBldmVyIHN0YXJ0IHVzaW5nIHRoZW0uLi4gKi8KKworCV9leGl0KHJ2KTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mZ2V0Yy5jIGIvdXNyL2tsaWJjL2ZnZXRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5MmVhZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9mZ2V0Yy5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBmZ2V0Yy5jCisgKgorICogRXh0cmVtZWx5IHNsb3cgZmdldGMgaW1wbGVtZW50YXRpb24sIHVzaW5nIF9mcmVhZCgpLiAgSWYgcGVvcGxlCisgKiBhY3R1YWxseSBuZWVkIGNoYXJhY3Rlci1vcmllbnRlZCBpbnB1dCB0byBiZSBmYXN0LCB3ZSBtYXkgYWN0dWFsbHkKKyAqIGhhdmUgdG8gaW1wbGVtZW50IGJ1ZmZlcmluZy4gIFNpZ2guCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworaW50IGZnZXRjKEZJTEUgKmYpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKworCXJldHVybiAoX2ZyZWFkKCZjaCwgMSwgZikgPT0gMSkgPyAoaW50KWNoIDogRU9GOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2ZnZXRzLmMgYi91c3Iva2xpYmMvZmdldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTljZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZnZXRzLmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIGZnZXRzLmMKKyAqCisgKiBUaGlzIHdpbGwgYmUgdmVyeSBzbG93IGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgZ2V0YygpLAorICogYnV0IHdlIGRvbid0IGhhdmUgYW55d2hlcmUgdG8gcHV0IGNoYXJhY3RlcnMgd2UgZG9uJ3QgbmVlZCBmcm9tCisgKiB0aGUgaW5wdXQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2NoYXIgKmZnZXRzKGNoYXIgKnMsIGludCBuLCBGSUxFICpmKQoreworCWludCBjaDsKKwljaGFyICpwID0gczsKKworCXdoaWxlIChuID4gMSkgeworCQljaCA9IGdldGMoZik7CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCSpwID0gJ1wwJzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSpwKysgPSBjaDsKKwkJbi0tOworCQlpZiAoY2ggPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwlpZiAobikKKwkJKnAgPSAnXDAnOworCisJcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZm5tYXRjaC5jIGIvdXNyL2tsaWJjL2ZubWF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDBhMjVmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZubWF0Y2guYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogZm5tYXRjaC5jCisgKgorICogT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gYnkgS2F5IFNpZXZlcnMsIG1vZGlmaWVkIGJ5IEguIFBldGVyIEFudmluLgorICovCisKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKK2ludCBmbm1hdGNoKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnMsIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBGTk1fUEFUSE5BTUUgJiYgKnMgPT0gJy8nKQorCQlyZXR1cm4gKCpwICE9ICcvJykgfHwgZm5tYXRjaChwKzEsIHMrMSwgZmxhZ3MpOworCWlmIChmbGFncyAmIEZOTV9QRVJJT0QgJiYgKnMgPT0gJy4nKQorCQlyZXR1cm4gKCpwICE9ICcuJykgfHwgZm5tYXRjaChwKzEsIHMrMSwgZmxhZ3MpOworCisJZmxhZ3MgJj0gfkZOTV9QRVJJT0Q7CS8qIE9ubHkgYXBwbGllcyBhdCBiZWdpbm5pbmcgKi8KKworCWlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiAqcCA9PSAnXFwnKSB7CisJCXArKzsKKwkJcmV0dXJuICgqcCAhPSAqcykgfHwgZm5tYXRjaChwKzEsIHMrMSwgZmxhZ3MpOworCX0KKworCWlmICgqcyA9PSAnXDAnKSB7CisJCXdoaWxlICgqcCA9PSAnKicpCisJCQlwKys7CisJCXJldHVybiAoKnAgIT0gJ1wwJyk7CisJfQorCisJc3dpdGNoICgqcCkgeworCWNhc2UgJ1snOgorCQl7CisJCQlpbnQgbm90ID0gMDsKKwkJCXArKzsKKwkJCWlmICgqcCA9PSAnIScpIHsKKwkJCQlub3QgPSAxOworCQkJCXArKzsKKwkJCX0KKwkJCXdoaWxlICgoKnAgIT0gJ1wwJykgJiYgKCpwICE9ICddJykpIHsKKwkJCQlpbnQgbWF0Y2ggPSAwOworCQkJCWlmIChwWzFdID09ICctJykgeworCQkJCQlpZiAoKCpzID49ICpwKSAmJiAoKnMgPD0gcFsyXSkpCisJCQkJCQltYXRjaCA9IDE7CisJCQkJCXAgKz0gMzsKKwkJCQl9IGVsc2UgeworCQkJCQltYXRjaCA9ICgqcCA9PSAqcyk7CisJCQkJCXArKzsKKwkJCQl9CisJCQkJaWYgKG1hdGNoIF4gbm90KSB7CisJCQkJCXdoaWxlICgoKnAgIT0gJ1wwJykgJiYgKCpwICE9ICddJykpCisJCQkJCQlwKys7CisJCQkJCWlmICgqcCA9PSAnXScpCisJCQkJCQlyZXR1cm4gZm5tYXRjaChwKzEsIHMrMSwgZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlICcqJzoKKwkJaWYgKGZubWF0Y2gocCwgcysxLCBmbGFncykpCisJCQlyZXR1cm4gZm5tYXRjaChwKzEsIHMsIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJY2FzZSAnXDAnOgorCQlpZiAoKnMgPT0gJ1wwJykgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCgqcCA9PSAqcykgfHwgKCpwID09ICc/JykpCisJCQlyZXR1cm4gZm5tYXRjaChwKzEsIHMrMSwgZmxhZ3MpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZm9wZW4uYyBiL3Vzci9rbGliYy9mb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTgwZDcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZm9wZW4uYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogZm9wZW4uYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8qIFRoaXMgZGVwZW5kcyBvbiBPX1JET05MWSA9PSAwLCBPX1dST05MWSA9PSAxLCBPX1JEV1IgPT0gMiAqLworCitGSUxFICpmb3Blbihjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICptb2RlKQoreworCWludCBmbGFncyA9IE9fUkRPTkxZOworCWludCBwbHVzID0gMDsKKworCXdoaWxlICgqbW9kZSkgeworCQlzd2l0Y2ggKCptb2RlKyspIHsKKwkJY2FzZSAncic6CisJCQlmbGFncyA9IE9fUkRPTkxZOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0FQUEVORDsKKwkJCWJyZWFrOworCQljYXNlICcrJzoKKwkJCXBsdXMgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocGx1cykgeworCQlmbGFncyA9IChmbGFncyAmIH4oT19SRE9OTFkgfCBPX1dST05MWSkpIHwgT19SRFdSOworCX0KKworCS8qIE5vdGU6IF9fY3JlYXRlX2ZpbGUoLTEpID09IE5VTEwsIHNvIHRoaXMgaXMgc2FmZSAqLworCXJldHVybiBfX2NyZWF0ZV9maWxlKG9wZW4oZmlsZSwgZmxhZ3MsIDA2NjYpKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mb3JrLmMgYi91c3Iva2xpYmMvZm9yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzQ4NmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZm9yay5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBmb3JrLmMKKyAqCisgKiBUaGlzIGlzIG5vcm1hbGx5IGp1c3QgYSBzeXNjYWxsIHN0dWIsIGJ1dCBhdCBsZWFzdCBvbmUgc3lzdGVtCisgKiBkb2Vzbid0IGhhdmUgc3lzX2ZvcmssIG9ubHkgc3lzX2Nsb25lLi4uCisgKi8KKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKworI2lmICFfS0xJQkNfTk9fTU1VICYmICFkZWZpbmVkKF9fTlJfZm9yaykKKworcGlkX3QgZm9yayh2b2lkKQoreworCXJldHVybiBfX2Nsb25lKFNJR0NITEQsIDApOworfQorCisjZW5kaWYJCQkJLyogX19OUl9mb3JrICovCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZnByaW50Zi5jIGIvdXNyL2tsaWJjL2ZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDAzOTIzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZwcmludGYuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogZnByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNkZWZpbmUgQlVGRkVSX1NJWkUJMTYzODQKKworaW50IGZwcmludGYoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJ2OworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJcnYgPSB2ZnByaW50ZihmaWxlLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mcHV0Yy5jIGIvdXNyL2tsaWJjL2ZwdXRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2ZDg2YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9mcHV0Yy5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBmcHV0Yy5jCisgKgorICogZ2NjICJwcmludGYgZGVjb21waWxhdGlvbiIgZXhwZWN0cyB0aGlzIHRvIGV4aXN0Li4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBmcHV0YyhpbnQgYywgRklMRSAqZikKK3sKKwl1bnNpZ25lZCBjaGFyIGNoID0gYzsKKworCXJldHVybiBfZndyaXRlKCZjaCwgMSwgZikgPT0gMSA/IGNoIDogRU9GOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2ZwdXRzLmMgYi91c3Iva2xpYmMvZnB1dHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI0MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZwdXRzLmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGZwdXRzLmMKKyAqCisgKiBUaGlzIGlzbid0IHF1aXRlIGZwdXRzKCkgaW4gdGhlIHN0ZGlvIHNlbnNlLCBzaW5jZSB3ZSBkb24ndAorICogaGF2ZSBzdGRpbywgYnV0IGl0IHRha2VzIGEgZmlsZSBkZXNjcmlwdG9yIGFyZ3VtZW50IGluc3RlYWQKKyAqIG9mIHRoZSBGSUxFICouCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBmcHV0cyhjb25zdCBjaGFyICpzLCBGSUxFICpmaWxlKQoreworCXJldHVybiBfZndyaXRlKHMsIHN0cmxlbihzKSwgZmlsZSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZnJlYWQuYyBiL3Vzci9rbGliYy9mcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDMzYWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZnJlYWQuYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogZnJlYWQuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3NpemVfdCBfZnJlYWQodm9pZCAqYnVmLCBzaXplX3QgY291bnQsIEZJTEUgKmYpCit7CisJc2l6ZV90IGJ5dGVzID0gMDsKKwlzc2l6ZV90IHJ2OworCWNoYXIgKnAgPSBidWY7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJcnYgPSByZWFkKGZpbGVubyhmKSwgcCwgY291bnQpOworCQlpZiAocnYgPT0gLTEpIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikgeworCQkJCWVycm5vID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHJ2ID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJcCArPSBydjsKKwkJYnl0ZXMgKz0gcnY7CisJCWNvdW50IC09IHJ2OworCX0KKworCXJldHVybiBieXRlczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mcmVhZDIuYyBiL3Vzci9rbGliYy9mcmVhZDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM2ZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZyZWFkMi5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBmcmVhZDIuYworICoKKyAqIFRoZSBhY3R1YWwgZnJlYWQoKSBmdW5jdGlvbiBhcyBhIG5vbi1pbmxpbmUKKyAqLworCisjZGVmaW5lIF9fTk9fRlJFQURfRldSSVRFX0lOTElORVMKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzaXplX3QgZnJlYWQodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCBGSUxFICogZikKK3sKKwlyZXR1cm4gX2ZyZWFkKHB0ciwgc2l6ZSAqIG5tZW1iLCBmKSAvIHNpemU7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZnN0YXRmcy5jIGIvdXNyL2tsaWJjL2ZzdGF0ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTRmMmVjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZzdGF0ZnMuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogZnN0YXRmcy5jCisgKgorICogT24gYXJjaGl0ZWN0dXJlcyB3aGljaCBkbyBmc3RhdGZzNjQsIHdyYXAgdGhlIHN5c3RlbSBjYWxsCisgKi8KKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCisjaWZkZWYgX19OUl9mc3RhdGZzNjQKKworZXh0ZXJuIGludCBfX2ZzdGF0ZnM2NChpbnQsIHNpemVfdCwgc3RydWN0IHN0YXRmcyAqKTsKKworaW50IGZzdGF0ZnMoaW50IGZkLCBzdHJ1Y3Qgc3RhdGZzICpidWYpCit7CisJcmV0dXJuIF9fZnN0YXRmczY0KGZkLCBzaXplb2YgKmJ1ZiwgYnVmKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZndyaXRlLmMgYi91c3Iva2xpYmMvZndyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhOGRlOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9md3JpdGUuYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogZndyaXRlLmMKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzaXplX3QgX2Z3cml0ZShjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgRklMRSAqZikKK3sKKwlzaXplX3QgYnl0ZXMgPSAwOworCXNzaXplX3QgcnY7CisJY29uc3QgY2hhciAqcCA9IGJ1ZjsKKworCXdoaWxlIChjb3VudCkgeworCQlydiA9IHdyaXRlKGZpbGVubyhmKSwgcCwgY291bnQpOworCQlpZiAocnYgPT0gLTEpIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikgeworCQkJCWVycm5vID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHJ2ID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJcCArPSBydjsKKwkJYnl0ZXMgKz0gcnY7CisJCWNvdW50IC09IHJ2OworCX0KKworCXJldHVybiBieXRlczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9md3JpdGUyLmMgYi91c3Iva2xpYmMvZndyaXRlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWIwYTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZndyaXRlMi5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBmd3JpdGUyLmMKKyAqCisgKiBUaGUgYWN0dWFsIGZ3cml0ZSgpIGZ1bmN0aW9uIGFzIGEgbm9uLWlubGluZQorICovCisKKyNkZWZpbmUgX19OT19GUkVBRF9GV1JJVEVfSU5MSU5FUworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3NpemVfdCBmd3JpdGUoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCBGSUxFICogZikKK3sKKwlyZXR1cm4gX2Z3cml0ZShwdHIsIHNpemUgKiBubWVtYiwgZikgLyBzaXplOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2dldGN3ZC5jIGIvdXNyL2tsaWJjL2dldGN3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWM4MTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZ2V0Y3dkLmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGdldGN3ZC5jCisgKgorICogVGhlIHN5c3RlbSBjYWxsIGJlaGF2ZXMgZGlmZmVyZW50bHkgdGhhbiB0aGUgbGlicmFyeSBmdW5jdGlvbi4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworZXh0ZXJuIGludCBfX2dldGN3ZChjaGFyICpidWYsIHNpemVfdCBzaXplKTsKKworY2hhciAqZ2V0Y3dkKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIChfX2dldGN3ZChidWYsIHNpemUpIDwgMCkgPyBOVUxMIDogYnVmOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2dldGRvbWFpbm5hbWUuYyBiL3Vzci9rbGliYy9nZXRkb21haW5uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3MjJjYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9nZXRkb21haW5uYW1lLmMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIGdldGRvbWFpbm5hbWUuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKK2ludCBnZXRkb21haW5uYW1lKGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHV0c25hbWUgdW47CisKKwlpZiAoIXVuYW1lKCZ1bikpCisJCXJldHVybiAtMTsKKworCWlmIChsZW4gPCBzdHJsZW4odW4uZG9tYWlubmFtZSkgKyAxKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RyY3B5KG5hbWUsIHVuLmRvbWFpbm5hbWUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2V0ZW52LmMgYi91c3Iva2xpYmMvZ2V0ZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0YWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9nZXRlbnYuYwpAQCAtMCwwICsxLDI0IEBACisvKgorICogZ2V0ZW52LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2NoYXIgKmdldGVudihjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKipwLCAqcTsKKwlpbnQgbGVuID0gc3RybGVuKG5hbWUpOworCisJaWYgKCFlbnZpcm9uKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAocCA9IGVudmlyb247IChxID0gKnApOyBwKyspIHsKKwkJaWYgKCFzdHJuY21wKG5hbWUsIHEsIGxlbikgJiYgcVtsZW5dID09ICc9JykgeworCQkJcmV0dXJuIHEgKyAobGVuICsgMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9nZXRob3N0bmFtZS5jIGIvdXNyL2tsaWJjL2dldGhvc3RuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9nZXRob3N0bmFtZS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBnZXRob3N0bmFtZS5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworaW50IGdldGhvc3RuYW1lKGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHV0c25hbWUgdW47CisKKwlpZiAoIXVuYW1lKCZ1bikpCisJCXJldHVybiAtMTsKKworCWlmIChsZW4gPCBzdHJsZW4odW4ubm9kZW5hbWUpICsgMSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0cmNweShuYW1lLCB1bi5ub2RlbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9nZXRvcHQuYyBiL3Vzci9rbGliYy9nZXRvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDY3MzVkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dldG9wdC5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBnZXRvcHQuYworICoKKyAqIFNpbXBsZSBQT1NJWCBnZXRvcHQoKSwgbm8gR05VIGV4dGVuc2lvbnMuLi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKm9wdGFyZzsKK2ludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0Oworc3RhdGljIHN0cnVjdCBnZXRvcHRfcHJpdmF0ZV9zdGF0ZSB7CisJY29uc3QgY2hhciAqb3B0cHRyOworCWNvbnN0IGNoYXIgKmxhc3Rfb3B0c3RyaW5nOworCWNoYXIgKmNvbnN0ICpsYXN0X2FyZ3Y7Cit9IHB2dDsKKworaW50IGdldG9wdChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKm9wdHN0cmluZykKK3sKKwljb25zdCBjaGFyICpjYXJnOworCWNvbnN0IGNoYXIgKm9zcHRyOworCWludCBvcHQ7CisKKwkvKiBnZXRvcHQoKSByZWxpZXMgb24gYSBudW1iZXIgb2YgZGlmZmVyZW50IGdsb2JhbCBzdGF0ZQorCSAgIHZhcmlhYmxlcywgd2hpY2ggY2FuIG1ha2UgdGhpcyByZWFsbHkgY29uZnVzaW5nIGlmIHRoZXJlIGlzCisJICAgbW9yZSB0aGFuIG9uZSB1c2Ugb2YgZ2V0b3B0KCkgaW4gdGhlIHNhbWUgcHJvZ3JhbS4gIFRoaXMKKwkgICBhdHRlbXB0cyB0byBkZXRlY3QgdGhhdCBzaXR1YXRpb24gYnkgZGV0ZWN0aW5nIGlmIHRoZQorCSAgICJvcHRzdHJpbmciIG9yICJhcmd2IiBhcmd1bWVudCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lCisJICAgd2Ugd2VyZSBjYWxsZWQ7IGlmIHNvLCByZWluaXRpYWxpemUgdGhlIHF1ZXJ5IHN0YXRlLiAqLworCisJaWYgKG9wdHN0cmluZyAhPSBwdnQubGFzdF9vcHRzdHJpbmcgfHwgYXJndiAhPSBwdnQubGFzdF9hcmd2IHx8CisJICAgIG9wdGluZCA8IDEgfHwgb3B0aW5kID4gYXJnYykgeworCQkvKiBvcHRpbmQgZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBxdWVyeSAqLworCQlwdnQubGFzdF9vcHRzdHJpbmcgPSBvcHRzdHJpbmc7CisJCXB2dC5sYXN0X2FyZ3YgPSBhcmd2OworCQlvcHRpbmQgPSAxOworCQlwdnQub3B0cHRyID0gTlVMTDsKKwl9CisKKwljYXJnID0gYXJndltvcHRpbmRdOworCisJLyogRmlyc3QsIGVsaW1pbmF0ZSBhbGwgbm9uLW9wdGlvbiBjYXNlcyAqLworCisJaWYgKCFjYXJnIHx8IGNhcmdbMF0gIT0gJy0nIHx8ICFjYXJnWzFdKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY2FyZ1sxXSA9PSAnLScgJiYgIWNhcmdbMl0pIHsKKwkJb3B0aW5kKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKHVpbnRwdHJfdCkgKHB2dC5vcHRwdHIgLSBjYXJnKSA+ICh1aW50cHRyX3QpIHN0cmxlbihjYXJnKSkgeworCQkvKiBTb21lb25lIGZyb2JiZWQgb3B0aW5kLCBjaGFuZ2UgdG8gbmV3IG9wdC4gKi8KKwkJcHZ0Lm9wdHB0ciA9IGNhcmcgKyAxOworCX0KKworCW9wdCA9ICpwdnQub3B0cHRyKys7CisKKwlpZiAob3B0ICE9ICc6JyAmJiAob3NwdHIgPSBzdHJjaHIob3B0c3RyaW5nLCBvcHQpKSkgeworCQlpZiAob3NwdHJbMV0gPT0gJzonKSB7CisJCQlpZiAoKnB2dC5vcHRwdHIpIHsKKwkJCQkvKiBBcmd1bWVudC10YWtpbmcgb3B0aW9uIHdpdGggYXR0YWNoZWQKKwkJCQkgICBhcmd1bWVudCAqLworCQkJCW9wdGFyZyA9IChjaGFyICopcHZ0Lm9wdHB0cjsKKwkJCQlvcHRpbmQrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyogQXJndW1lbnQtdGFraW5nIG9wdGlvbiB3aXRoIG5vbi1hdHRhY2hlZAorCQkJCSAgIGFyZ3VtZW50ICovCisJCQkJaWYgKGFyZ3Zbb3B0aW5kICsgMV0pIHsKKwkJCQkJb3B0YXJnID0gKGNoYXIgKilhcmd2W29wdGluZCsxXTsKKwkJCQkJb3B0aW5kICs9IDI7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogTWlzc2luZyBhcmd1bWVudCAqLworCQkJCQlvcHRpbmQrKzsKKwkJCQkJcmV0dXJuIChvcHRzdHJpbmdbMF0gPT0gJzonKQorCQkJCQkJPyAnOicgOiAnPyc7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG9wdDsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vbi1hcmd1bWVudC10YWtpbmcgb3B0aW9uICovCisJCQkvKiBwdnQub3B0cHRyIHdpbGwgcmVtZW1iZXIgdGhlIGV4YWN0IHBvc2l0aW9uIHRvCisJCQkgICByZXN1bWUgYXQgKi8KKwkJCWlmICghKnB2dC5vcHRwdHIpCisJCQkJb3B0aW5kKys7CisJCQlyZXR1cm4gb3B0OworCQl9CisJfSBlbHNlIHsKKwkJLyogVW5rbm93biBvcHRpb24gKi8KKwkJb3B0b3B0ID0gb3B0OworCQlpZiAoISpwdnQub3B0cHRyKQorCQkJb3B0aW5kKys7CisJCXJldHVybiAnPyc7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2dldG9wdF9sb25nLmMgYi91c3Iva2xpYmMvZ2V0b3B0X2xvbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2QwNjRiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dldG9wdF9sb25nLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBnZXRvcHQuYworICoKKyAqIGdldG9wdF9sb25nKCksIG9yIGF0IGxlYXN0IGEgY29tbW9uIHN1YnNldCB0aGVyZW9mOgorICoKKyAqIC0gT3B0aW9uIHJlb3JkZXJpbmcgaXMgbm90IHN1cHBvcnRlZAorICogLSAtVyBmb28gaXMgbm90IHN1cHBvcnRlZAorICogLSBGaXJzdCBvcHRzdHJpbmcgY2hhcmFjdGVyICItIiBub3Qgc3VwcG9ydGVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworY2hhciAqb3B0YXJnOworaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CitzdGF0aWMgc3RydWN0IGdldG9wdF9wcml2YXRlX3N0YXRlIHsKKwljb25zdCBjaGFyICpvcHRwdHI7CisJY29uc3QgY2hhciAqbGFzdF9vcHRzdHJpbmc7CisJY2hhciAqY29uc3QgKmxhc3RfYXJndjsKK30gcHZ0OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm9wdGlvbl9tYXRjaGVzKGNvbnN0IGNoYXIgKmFyZ19zdHIsCisJCQkJCSBjb25zdCBjaGFyICpvcHRfbmFtZSkKK3sKKwl3aGlsZSAoKmFyZ19zdHIgIT0gJ1wwJyAmJiAqYXJnX3N0ciAhPSAnPScpIHsKKwkJaWYgKCphcmdfc3RyKysgIT0gKm9wdF9uYW1lKyspCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKm9wdF9uYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBhcmdfc3RyOworfQorCitpbnQgZ2V0b3B0X2xvbmcoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpvcHRzdHJpbmcsCisJCWNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzLCBpbnQgKmxvbmdpbmRleCkKK3sKKwljb25zdCBjaGFyICpjYXJnOworCWNvbnN0IGNoYXIgKm9zcHRyOworCWludCBvcHQ7CisKKwkvKiBnZXRvcHQoKSByZWxpZXMgb24gYSBudW1iZXIgb2YgZGlmZmVyZW50IGdsb2JhbCBzdGF0ZQorCSAgIHZhcmlhYmxlcywgd2hpY2ggY2FuIG1ha2UgdGhpcyByZWFsbHkgY29uZnVzaW5nIGlmIHRoZXJlIGlzCisJICAgbW9yZSB0aGFuIG9uZSB1c2Ugb2YgZ2V0b3B0KCkgaW4gdGhlIHNhbWUgcHJvZ3JhbS4gIFRoaXMKKwkgICBhdHRlbXB0cyB0byBkZXRlY3QgdGhhdCBzaXR1YXRpb24gYnkgZGV0ZWN0aW5nIGlmIHRoZQorCSAgICJvcHRzdHJpbmciIG9yICJhcmd2IiBhcmd1bWVudCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lCisJICAgd2Ugd2VyZSBjYWxsZWQ7IGlmIHNvLCByZWluaXRpYWxpemUgdGhlIHF1ZXJ5IHN0YXRlLiAqLworCisJaWYgKG9wdHN0cmluZyAhPSBwdnQubGFzdF9vcHRzdHJpbmcgfHwgYXJndiAhPSBwdnQubGFzdF9hcmd2IHx8CisJICAgIG9wdGluZCA8IDEgfHwgb3B0aW5kID4gYXJnYykgeworCQkvKiBvcHRpbmQgZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBxdWVyeSAqLworCQlwdnQubGFzdF9vcHRzdHJpbmcgPSBvcHRzdHJpbmc7CisJCXB2dC5sYXN0X2FyZ3YgPSBhcmd2OworCQlvcHRpbmQgPSAxOworCQlwdnQub3B0cHRyID0gTlVMTDsKKwl9CisKKwljYXJnID0gYXJndltvcHRpbmRdOworCisJLyogRmlyc3QsIGVsaW1pbmF0ZSBhbGwgbm9uLW9wdGlvbiBjYXNlcyAqLworCisJaWYgKCFjYXJnIHx8IGNhcmdbMF0gIT0gJy0nIHx8ICFjYXJnWzFdKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoY2FyZ1sxXSA9PSAnLScpIHsKKwkJY29uc3Qgc3RydWN0IG9wdGlvbiAqbG87CisJCWNvbnN0IGNoYXIgKm9wdF9lbmQgPSBOVUxMOworCisJCW9wdGluZCsrOworCisJCS8qIEVpdGhlciBpdCdzIGEgbG9uZyBvcHRpb24sIG9yIGl0J3MgLS0gKi8KKwkJaWYgKCFjYXJnWzJdKSB7CisJCQkvKiBJdCdzIC0tICovCisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlmb3IgKGxvID0gbG9uZ29wdHM7IGxvLT5uYW1lOyBsbysrKSB7CisJCQlpZiAoKG9wdF9lbmQgPSBvcHRpb25fbWF0Y2hlcyhjYXJnKzIsIGxvLT5uYW1lKSkpCisJCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKCFvcHRfZW5kKQorCQkJcmV0dXJuICc/JzsKKworCQlpZiAobG9uZ2luZGV4KQorCQkJKmxvbmdpbmRleCA9IGxvLWxvbmdvcHRzOworCisJCWlmICgqb3B0X2VuZCA9PSAnPScpIHsKKwkJCWlmIChsby0+aGFzX2FyZykKKwkJCQlvcHRhcmcgPSAoY2hhciAqKW9wdF9lbmQrMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gJz8nOworCQl9IGVsc2UgaWYgKGxvLT5oYXNfYXJnID09IDEpIHsKKwkJCWlmICghKG9wdGFyZyA9IGFyZ3Zbb3B0aW5kXSkpCisJCQkJcmV0dXJuICc/JzsKKwkJCW9wdGluZCsrOworCQl9CisKKwkJaWYgKGxvLT5mbGFnKSB7CisJCQkqbG8tPmZsYWcgPSBsby0+dmFsOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbG8tPnZhbDsKKwkJfQorCX0KKworCWlmICgodWludHB0cl90KSAocHZ0Lm9wdHB0ciAtIGNhcmcpID4gKHVpbnRwdHJfdCkgc3RybGVuKGNhcmcpKSB7CisJCS8qIFNvbWVvbmUgZnJvYmJlZCBvcHRpbmQsIGNoYW5nZSB0byBuZXcgb3B0LiAqLworCQlwdnQub3B0cHRyID0gY2FyZyArIDE7CisJfQorCisJb3B0ID0gKnB2dC5vcHRwdHIrKzsKKworCWlmIChvcHQgIT0gJzonICYmIChvc3B0ciA9IHN0cmNocihvcHRzdHJpbmcsIG9wdCkpKSB7CisJCWlmIChvc3B0clsxXSA9PSAnOicpIHsKKwkJCWlmICgqcHZ0Lm9wdHB0cikgeworCQkJCS8qIEFyZ3VtZW50LXRha2luZyBvcHRpb24gd2l0aCBhdHRhY2hlZAorCQkJCSAgIGFyZ3VtZW50ICovCisJCQkJb3B0YXJnID0gKGNoYXIgKilwdnQub3B0cHRyOworCQkJCW9wdGluZCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBcmd1bWVudC10YWtpbmcgb3B0aW9uIHdpdGggbm9uLWF0dGFjaGVkCisJCQkJICAgYXJndW1lbnQgKi8KKwkJCQlpZiAoYXJndltvcHRpbmQgKyAxXSkgeworCQkJCQlvcHRhcmcgPSAoY2hhciAqKWFyZ3Zbb3B0aW5kKzFdOworCQkJCQlvcHRpbmQgKz0gMjsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBNaXNzaW5nIGFyZ3VtZW50ICovCisJCQkJCW9wdGluZCsrOworCQkJCQlyZXR1cm4gKG9wdHN0cmluZ1swXSA9PSAnOicpCisJCQkJCQk/ICc6JyA6ICc/JzsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gb3B0OworCQl9IGVsc2UgeworCQkJLyogTm9uLWFyZ3VtZW50LXRha2luZyBvcHRpb24gKi8KKwkJCS8qIHB2dC5vcHRwdHIgd2lsbCByZW1lbWJlciB0aGUgZXhhY3QgcG9zaXRpb24gdG8KKwkJCSAgIHJlc3VtZSBhdCAqLworCQkJaWYgKCEqcHZ0Lm9wdHB0cikKKwkJCQlvcHRpbmQrKzsKKwkJCXJldHVybiBvcHQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG9wdGlvbiAqLworCQlvcHRvcHQgPSBvcHQ7CisJCWlmICghKnB2dC5vcHRwdHIpCisJCQlvcHRpbmQrKzsKKwkJcmV0dXJuICc/JzsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2V0cGdycC5jIGIvdXNyL2tsaWJjL2dldHBncnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjBiMTdhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dldHBncnAuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogZ2V0cGdycC5jCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitwaWRfdCBnZXRwZ3JwKHZvaWQpCit7CisJcmV0dXJuIGdldHBnaWQoMCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2V0cHJpb3JpdHkuYyBiL3Vzci9rbGliYy9nZXRwcmlvcml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDZlMDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZ2V0cHJpb3JpdHkuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogZ2V0cHJpb3JpdHkuYworICoKKyAqIE5lZWRzIHRvIGRvIHNvbWUgcG9zdC1zeXNjYWxsIG1hbmdsaW5nIHRvIGRpc3Rpbmd1aXNoIGVycm9yIHJldHVybnMuLi4KKyAqIGJ1dCBvbmx5IG9uIHNvbWUgcGxhdGZvcm1zLiAgU2lnaC4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX2lhNjRfXykKKworZXh0ZXJuIGludCBfX2dldHByaW9yaXR5KGludCwgaW50KTsKKworaW50IGdldHByaW9yaXR5KGludCB3aGljaCwgaW50IHdobykKK3sKKwlpbnQgcnYgPSBfX2dldHByaW9yaXR5KHdoaWNoLCB3aG8pOworCXJldHVybiAocnYgPCAwKSA/IHJ2IDogMjAtcnY7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2dldHB0LmMgYi91c3Iva2xpYmMvZ2V0cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNhMzcxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dldHB0LmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGdldHB0LmMKKyAqCisgKiBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBzdGFuZGFyZCBVbml4OTggcHR5IHN1aXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKK2ludCBnZXRwdCh2b2lkKQoreworCXJldHVybiBvcGVuKCIvZGV2L3B0bXgiLCBPX1JEV1IgfCBPX05PQ1RUWSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2xvYmFscy5jIGIvdXNyL2tsaWJjL2dsb2JhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmFlOTFmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dsb2JhbHMuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogZ2xvYmFscy5jCisgKgorICogVGhlc2UgaGF2ZSB0byBiZSBkZWZpbmVkIHNvbWV3aGVyZS4uLgorICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IGVycm5vOworY2hhciAqKmVudmlyb247CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvaW5ldC9iaW5kcmVzdnBvcnQuYyBiL3Vzci9rbGliYy9pbmV0L2JpbmRyZXN2cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmMxYzIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvaW5ldC9iaW5kcmVzdnBvcnQuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogaW5ldC9iaW5kcmVzdnBvcnQuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgU1RBUlRfUE9SVAk3NjgKKyNkZWZpbmUgRU5EX1BPUlQJSVBQT1JUX1JFU0VSVkVECisjZGVmaW5lIE5VTV9QT1JUUwkoRU5EX1BPUlQgLSBTVEFSVF9QT1JUKQorCitpbnQgYmluZHJlc3Zwb3J0KGludCBzZCwgc3RydWN0IHNvY2thZGRyX2luICpzaW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luIG1lOworCXN0YXRpYyBzaG9ydCBwb3J0OworCWludCByZXQgPSAwOworCWludCBpOworCisJaWYgKHNpbiA9PSBOVUxMKSB7CisJCW1lbXNldCgmbWUsIDAsIHNpemVvZihtZSkpOworCQlzaW4gPSAmbWU7CisJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJfSBlbHNlIGlmIChzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQllcnJubyA9IEVQRk5PU1VQUE9SVDsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChwb3J0ID09IDApCisJCXBvcnQgPSBTVEFSVF9QT1JUICsgKGdldHBpZCgpICUgTlVNX1BPUlRTKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUE9SVFM7IGkrKywgcG9ydCsrKSB7CisJCWlmIChwb3J0ID09IEVORF9QT1JUKQorCQkJcG9ydCA9IFNUQVJUX1BPUlQ7CisJCXNpbi0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworCQlyZXQgPSBiaW5kKHNkLCAoc3RydWN0IHNvY2thZGRyICopc2luLCBzaXplb2YoKnNpbikpOworCQlpZiAocmV0ICE9IC0xKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9pbmV0L2luZXRfYWRkci5jIGIvdXNyL2tsaWJjL2luZXQvaW5ldF9hZGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmNDUzNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9pbmV0L2luZXRfYWRkci5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBpbmV0L2luZXRfYWRkci5jCisgKi8KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3VpbnQzMl90IGluZXRfYWRkcihjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IGluX2FkZHIgYTsKKwlpbnQgcnYgPSBpbmV0X2F0b24oc3RyLCAmYSk7CisKKwlyZXR1cm4gcnYgPyBJTkFERFJfTk9ORSA6IGEuc19hZGRyOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2luZXQvaW5ldF9hdG9uLmMgYi91c3Iva2xpYmMvaW5ldC9pbmV0X2F0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWNlZWVhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2luZXQvaW5ldF9hdG9uLmMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGluZXQvaW5ldF9hdG9uLmMKKyAqLworCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IGluZXRfYXRvbihjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBpbl9hZGRyICphZGRyKQoreworCXVuaW9uIHsKKwkJdWludDhfdAkgYls0XTsKKwkJdWludDMyX3QgbDsKKwl9IGE7CisKKwlpZiAoc3NjYW5mKHN0ciwgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorCQkgICAmYS5iWzBdLCAmYS5iWzFdLCAmYS5iWzJdLCAmYS5iWzNdKSA9PSA0KSB7CisJCWFkZHItPnNfYWRkciA9IGEubDsJLyogQWx3YXlzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvaW5ldC9pbmV0X250b2EuYyBiL3Vzci9rbGliYy9pbmV0L2luZXRfbnRvYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmYwNTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvaW5ldC9pbmV0X250b2EuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogaW5ldC9pbmV0X250b2EuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitjaGFyICppbmV0X250b2Eoc3RydWN0IGluX2FkZHIgYWRkcikKK3sKKwlzdGF0aWMgY2hhciBuYW1lWzE2XTsKKwljb25zdCB1aW50OF90ICpjcCA9IChjb25zdCB1aW50OF90ICopICZhZGRyLnNfYWRkcjsKKworCXNwcmludGYobmFtZSwgIiV1LiV1LiV1LiV1IiwgY3BbMF0sIGNwWzFdLCBjcFsyXSwgY3BbM10pOworCXJldHVybiBuYW1lOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2luZXQvaW5ldF9udG9wLmMgYi91c3Iva2xpYmMvaW5ldC9pbmV0X250b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZmYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2luZXQvaW5ldF9udG9wLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIGluZXQvaW5ldF9udG9wLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luNi5oPgorCitjb25zdCBjaGFyICppbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpjcCwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCB4bGVuOworCisJc3dpdGNoIChhZikgeworCWNhc2UgQUZfSU5FVDoKKwkJeworCQkJY29uc3QgdWludDhfdCAqYnAgPSAoY29uc3QgdWludDhfdCAqKQorCQkJCSYoKGNvbnN0IHN0cnVjdCBpbl9hZGRyICopY3ApLT5zX2FkZHI7CisKKwkJCXhsZW4gPSBzbnByaW50ZihidWYsIGxlbiwgIiV1LiV1LiV1LiV1IiwKKwkJCQkJYnBbMF0sIGJwWzFdLCBicFsyXSwgYnBbM10pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRl9JTkVUNjoKKwkJeworCQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpzID0gKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqKWNwOworCisJCQl4bGVuID0gc25wcmludGYoYnVmLCBsZW4sICIleDoleDoleDoleDoleDoleDoleDoleCIsCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNlswXSksCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNlsxXSksCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNlsyXSksCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNlszXSksCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNls0XSksCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNls1XSksCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNls2XSksCisJCQkJCW50b2hzKHMtPnM2X2FkZHIxNls3XSkpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh4bGVuID4gbGVuKSB7CisJCWVycm5vID0gRU5PU1BDOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2luZXQvaW5ldF9wdG9uLmMgYi91c3Iva2xpYmMvaW5ldC9pbmV0X3B0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWZlMTZlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2luZXQvaW5ldF9wdG9uLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIGluZXQvaW5ldF9wdG9uLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbjYuaD4KKworc3RhdGljIGlubGluZSBpbnQgaGV4dmFsKGludCBjaCkKK3sKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworCQlyZXR1cm4gY2ggLSAnMCc7CisJfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB7CisJCXJldHVybiBjaCAtICdBJyArIDEwOworCX0gZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgeworCQlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLTE7CisJfQorfQorCitpbnQgaW5ldF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICpkc3QpCit7CisJc3dpdGNoIChhZikgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIGluZXRfYXRvbihzcmMsIChzdHJ1Y3QgaW5fYWRkciAqKWRzdCk7CisKKwljYXNlIEFGX0lORVQ2OgorCQl7CisJCQlzdHJ1Y3QgaW42X2FkZHIgKmQgPSAoc3RydWN0IGluNl9hZGRyICopZHN0OworCQkJaW50IGNvbG9ucyA9IDAsIGRjb2xvbnMgPSAwOworCQkJaW50IGk7CisJCQljb25zdCBjaGFyICpwOworCisJCQkvKiBBIGRvdWJsZSBjb2xvbiB3aWxsIGluY3JlbWVudCBjb2xvbnMgYnkgMiwKKwkJCSAgIGRjb2xvbnMgYnkgMSAqLworCQkJZm9yIChwID0gZHN0OyAqcDsgcCsrKSB7CisJCQkJaWYgKHBbMF0gPT0gJzonKSB7CisJCQkJCWNvbG9ucysrOworCQkJCQlpZiAocFsxXSA9PSAnOicpCisJCQkJCQlkY29sb25zKys7CisJCQkJfSBlbHNlIGlmICghaXN4ZGlnaXQoKnApKQorCQkJCQlyZXR1cm4gMDsJLyogSW52YWxpZCBhZGRyZXNzICovCisJCQl9CisKKwkJCWlmIChjb2xvbnMgPiA3IHx8IGRjb2xvbnMgPiAxCisJCQkgICAgfHwgKCFkY29sb25zICYmIGNvbG9ucyAhPSA3KSkKKwkJCQlyZXR1cm4gMDsJLyogSW52YWxpZCBhZGRyZXNzICovCisKKwkJCW1lbXNldChkLCAwLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwkJCWkgPSAwOworCQkJZm9yIChwID0gZHN0OyAqcDsgcCsrKSB7CisJCQkJaWYgKCpwID09ICc6JykgeworCQkJCQlpZiAocFsxXSA9PSAnOicpIHsKKwkJCQkJCWkgKz0gKDggLSBjb2xvbnMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaSsrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZC0+czZfYWRkcjE2W2ldID0KKwkJCQkJICAgIGh0b25zKChudG9ocyhkLT5zNl9hZGRyMTZbaV0pIDw8IDQpCisJCQkJCQkgICsgaGV4dmFsKCpwKSk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gMTsKKwkJfQorCisJZGVmYXVsdDoKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCXJldHVybiAtMTsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvaW50ZXJwLlMgYi91c3Iva2xpYmMvaW50ZXJwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxNWNmYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9pbnRlcnAuUwpAQCAtMCwwICsxLDEzIEBACisjCisjIFRoaXMgaXMgYSBoYWNrIHRvIGdlbmVyYXRlIHRoZSAuaW50cnAgc2VjdGlvbiwgd2hpY2ggdGhlbgorIyBsZCB0dXJucyBpbnRvIGFuIFBUX0lOVEVSUCBoZWFkZXIuCisjCisjIE5PVEU6IFRoZSAuaW50ZXJwIHNlY3Rpb24gbmVlZHMgdG8gYmUgImEiLCBvciBpdCBkb2VzbnQgd29yay4uLgorIworCisgICAgICAgIC5zZWN0aW9uICIuaW50ZXJwIiwiYSIKKyAgICAgICAgLmFzY2lpIExJQkRJUgorCS5hc2NpaSAiL2tsaWJjLSIKKyAgICAgICAgLmFzY2lpIFNPSEFTSAorICAgICAgICAuYXNjaWkgIi5zbyIKKyAgICAgICAgLmJ5dGUgMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2lzYXR0eS5jIGIvdXNyL2tsaWJjL2lzYXR0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTg0YjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvaXNhdHR5LmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIGlzYXR0eS5jCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQgaXNhdHR5KGludCBmZCkKK3sKKwlpbnQgb2xkX2Vycm5vID0gZXJybm87CisJaW50IGlzdHR5OworCXBpZF90IGR1bW15OworCisJLyogQWxsIHR0eXMgc3VwcG9ydCBUSU9DR1BHUlAgKi8KKwlpc3R0eSA9ICFpb2N0bChmZCwgVElPQ0dQR1JQLCAmZHVtbXkpOworCWVycm5vID0gb2xkX2Vycm5vOworCisJcmV0dXJuIGlzdHR5OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2pyYW5kNDguYyBiL3Vzci9rbGliYy9qcmFuZDQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyYjNhYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9qcmFuZDQ4LmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIGpyYW5kNDguYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbG9uZyBqcmFuZDQ4KHVuc2lnbmVkIHNob3J0IHhzdWJpWzNdKQoreworCXVpbnQ2NF90IHg7CisKKwkvKiBUaGUgeHN1YmlbXSBhcnJheSBpcyBsaXR0bGVlbmRpYW4gYnkgc3BlYyAqLworCXggPSAodWludDY0X3QpICh1aW50MTZfdCkgeHN1YmlbMF0gKworCSAgICAoKHVpbnQ2NF90KSAodWludDE2X3QpIHhzdWJpWzFdIDw8IDE2KSArCisJICAgICgodWludDY0X3QpICh1aW50MTZfdCkgeHN1YmlbMl0gPDwgMzIpOworCisJeCA9ICgweDVkZWVjZTY2ZFVMTCAqIHgpICsgMHhiOworCisJeHN1YmlbMF0gPSAodW5zaWduZWQgc2hvcnQpKHVpbnQxNl90KSB4OworCXhzdWJpWzFdID0gKHVuc2lnbmVkIHNob3J0KSh1aW50MTZfdCkgKHggPj4gMTYpOworCXhzdWJpWzJdID0gKHVuc2lnbmVkIHNob3J0KSh1aW50MTZfdCkgKHggPj4gMzIpOworCisJcmV0dXJuIChsb25nKShpbnQzMl90KSAoeCA+PiAxNik7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliY19pbml0LmMgYi91c3Iva2xpYmMvbGliY19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0NjBjZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJjX2luaXQuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIGxpYmNfaW5pdC5jCisgKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcmF3IGRhdGEgYmxvY2sgc2V0IHVwIGJ5IHRoZSBFTEYgbG9hZGVyCisgKiBpbiB0aGUga2VybmVsIGFuZCBwYXJzZXMgaXQuICBJdCBpcyBpbnZva2VkIGJ5IGNydDAuUyB3aGljaCBtYWtlcworICogYW55IG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBhbmQgcGFzc2VzIGNhbGxzIHRoaXMgZnVuY3Rpb24gdXNpbmcKKyAqIHRoZSBzdGFuZGFyZCBDIGNhbGxpbmcgY29udmVudGlvbi4KKyAqCisgKiBUaGUgYXJndW1lbnRzIGFyZToKKyAqICB1aW50cHRyX3QgKmVsZmRhdGEJIC0tIFRoZSBFTEYgbG9hZGVyIGRhdGEgYmxvY2s7IHVzdWFsbHkgZnJvbSB0aGUgc3RhY2suCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNhbGx5IGEgcG9pbnRlciB0byBhcmdjLgorICogIHZvaWQgKCpvbmV4aXQpKHZvaWQpIC0tIEZ1bmN0aW9uIHRvIGluc3RhbGwgaW50byBvbmV4aXQKKyAqLworCisvKgorICogU2V2ZXJhbCBMaW51eCBBQklzIGRvbid0IHBhc3MgdGhlIG9uZXhpdCBwb2ludGVyLCBhbmQgdGhlIG9uZXMgdGhhdAorICogZG8gbmV2ZXIgdXNlIGl0LiAgVGhlcmVmb3JlLCB1bmxlc3MgVVNFX09ORVhJVCBpcyBkZWZpbmVkLCB3ZSBqdXN0CisgKiBpZ25vcmUgdGhlIG9uZXhpdCBwb2ludGVyLgorICovCisvKiAjZGVmaW5lIFVTRV9PTkVYSVQgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjaW5jbHVkZSAiYXRleGl0LmgiCisKKy8qIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBmcm9tIF9fc3RhdGljX2luaXQuYyBvciBfX3NoYXJlZF9pbml0LmMgKi8KKyNpZm5kZWYgU0hBUkVECisjIGVycm9yICJTSEFSRUQgc2hvdWxkIGJlIGRlZmluZWQgdG8gMCBvciAxIgorI2VuZGlmCisKK2NoYXIgKiplbnZpcm9uOwordW5zaWduZWQgaW50IF9fcGFnZV9zaXplLCBfX3BhZ2Vfc2hpZnQ7CisKK3N0cnVjdCBhdXhlbnRyeSB7CisJdWludHB0cl90IHR5cGU7CisJdWludHB0cl90IHY7Cit9OworCitfX25vcmV0dXJuIF9fbGliY19pbml0KHVpbnRwdHJfdCAqIGVsZmRhdGEsIHZvaWQgKCpvbmV4aXQpICh2b2lkKSkKK3sKKwlpbnQgYXJnYzsKKwljaGFyICoqYXJndiwgKiplbnZwLCAqKmVudmVuZDsKKwlzdHJ1Y3QgYXV4ZW50cnkgKmF1eGVudHJ5OworI2lmIFNIQVJFRAorCXR5cGVkZWYgaW50ICgqbWFpbl90KSAoaW50LCBjaGFyICoqLCBjaGFyICoqKTsKKwltYWluX3QgTUFJTiA9IE5VTEw7CisjZWxzZQorCWV4dGVybiBpbnQgbWFpbihpbnQsIGNoYXIgKiosIGNoYXIgKiopOworI2RlZmluZSBNQUlOIG1haW4KKyNlbmRpZgorCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSAwLCBwYWdlX3NoaWZ0ID0gMDsKKworI2lmZGVmIFVTRV9PTkVYSVQKKwlpZiAob25leGl0KSB7CisJCXN0YXRpYyBzdHJ1Y3QgYXRleGl0IGF0X2V4aXQ7CisKKwkJYXRfZXhpdC5mY3RuID0gKHZvaWQgKCopKGludCwgdm9pZCAqKSlvbmV4aXQ7CisJCS8qIGF0X2V4aXQubmV4dCA9IE5VTEwgYWxyZWFkeSAqLworCQlfX2F0ZXhpdF9saXN0ID0gJmF0X2V4aXQ7CisJfQorI2Vsc2UKKwkodm9pZClvbmV4aXQ7CQkvKiBJZ25vcmUgdGhpcy4uLiAqLworI2VuZGlmCisKKwlhcmdjID0gKGludCkqZWxmZGF0YSsrOworCWFyZ3YgPSAoY2hhciAqKillbGZkYXRhOworCWVudnAgPSBhcmd2ICsgKGFyZ2MgKyAxKTsKKworCS8qIFRoZSBhdXhpbGxhcnkgZW50cnkgdmVjdG9yIGlzIGFmdGVyIGFsbCB0aGUgZW52aXJvbm1lbnQgdmFycyAqLworCWZvciAoZW52ZW5kID0gZW52cDsgKmVudmVuZDsgZW52ZW5kKyspIDsKKwlhdXhlbnRyeSA9IChzdHJ1Y3QgYXV4ZW50cnkgKikoZW52ZW5kICsgMSk7CisKKwl3aGlsZSAoYXV4ZW50cnktPnR5cGUpIHsKKwkJc3dpdGNoIChhdXhlbnRyeS0+dHlwZSkgeworI2lmIFNIQVJFRAorCQljYXNlIEFUX0VOVFJZOgorCQkJTUFJTiA9IChtYWluX3QpIChhdXhlbnRyeS0+dik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIEFUX1BBR0VTWjoKKwkJCXBhZ2Vfc2l6ZSA9ICh1bnNpZ25lZCBpbnQpKGF1eGVudHJ5LT52KTsKKwkJCWJyZWFrOworCQl9CisJCWF1eGVudHJ5Kys7CisJfQorCisJX19wYWdlX3NpemUgPSBwYWdlX3NpemU7CisKKyNpZiBfX0dOVUNfXyA+PSA0CisJLyogdW5zaWduZWQgaW50IGlzIDMyIGJpdHMgb24gYWxsIG91ciBhcmNoaXRlY3R1cmVzICovCisJcGFnZV9zaGlmdCA9IF9fYnVpbHRpbl9jbHoocGFnZV9zaXplKSBeIDMxOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgICAgYXNtKCJic3JsICUxLCUwIjogIj1yIihwYWdlX3NoaWZ0KToiciIocGFnZV9zaXplKSk7CisjZWxzZQorCXdoaWxlIChwYWdlX3NpemUgPiAxKSB7CisJCXBhZ2Vfc2hpZnQrKzsKKwkJcGFnZV9zaXplID4+PSAxOworCX0KKyNlbmRpZgorCV9fcGFnZV9zaGlmdCA9IHBhZ2Vfc2hpZnQ7CisKKwllbnZpcm9uID0gZW52cDsKKwlleGl0KE1BSU4oYXJnYywgYXJndiwgZW52cCkpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xpYmdjYy9fX2FzaGxkaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX19hc2hsZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5MzdmMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX19hc2hsZGkzLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGxpYmdjYy9fX2FzaGxkaTMuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwordWludDY0X3QgX19hc2hsZGkzKHVpbnQ2NF90IHYsIGludCBjbnQpCit7CisJaW50IGMgPSBjbnQgJiAzMTsKKwl1aW50MzJfdCB2bCA9ICh1aW50MzJfdCkgdjsKKwl1aW50MzJfdCB2aCA9ICh1aW50MzJfdCkgKHYgPj4gMzIpOworCisJaWYgKGNudCAmIDMyKSB7CisJCXZoID0gKHZsIDw8IGMpOworCQl2bCA9IDA7CisJfSBlbHNlIHsKKwkJdmggPSAodmggPDwgYykgKyAodmwgPj4gKDMyIC0gYykpOworCQl2bCA9ICh2bCA8PCBjKTsKKwl9CisKKwlyZXR1cm4gKCh1aW50NjRfdCkgdmggPDwgMzIpICsgdmw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fYXNocmRpMy5jIGIvdXNyL2tsaWJjL2xpYmdjYy9fX2FzaHJkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU2ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX2FzaHJkaTMuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogbGliZ2NjL19fYXNocmRpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit1aW50NjRfdCBfX2FzaHJkaTModWludDY0X3QgdiwgaW50IGNudCkKK3sKKwlpbnQgYyA9IGNudCAmIDMxOworCXVpbnQzMl90IHZsID0gKHVpbnQzMl90KSB2OworCXVpbnQzMl90IHZoID0gKHVpbnQzMl90KSAodiA+PiAzMik7CisKKwlpZiAoY250ICYgMzIpIHsKKwkJdmwgPSAoKGludDMyX3QpIHZoID4+IGMpOworCQl2aCA9IChpbnQzMl90KSB2aCA+PiAzMTsKKwl9IGVsc2UgeworCQl2bCA9ICh2bCA+PiBjKSArICh2aCA8PCAoMzIgLSBjKSk7CisJCXZoID0gKChpbnQzMl90KSB2aCA+PiBjKTsKKwl9CisKKwlyZXR1cm4gKCh1aW50NjRfdCkgdmggPDwgMzIpICsgdmw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fY2x6c2kyLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fY2x6c2kyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiMTFmMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX19jbHpzaTIuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogbGliZ2NjL19fY2x6c2kyLmMKKyAqCisgKiBSZXR1cm5zIHRoZSBsZWFkaW5nIG51bWJlciBvZiAwIGJpdHMgaW4gdGhlIGFyZ3VtZW50CisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit1aW50MzJfdCBfX2NsenNpMih1aW50MzJfdCB2KQoreworCWludCBwID0gMzE7CisKKwlpZiAodiAmIDB4ZmZmZjAwMDApIHsKKwkJcCAtPSAxNjsKKwkJdiA+Pj0gMTY7CisJfQorCWlmICh2ICYgMHhmZjAwKSB7CisJCXAgLT0gODsKKwkJdiA+Pj0gODsKKwl9CisJaWYgKHYgJiAweGYwKSB7CisJCXAgLT0gNDsKKwkJdiA+Pj0gNDsKKwl9CisJaWYgKHYgJiAweGMpIHsKKwkJcCAtPSAyOworCQl2ID4+PSAyOworCX0KKwlpZiAodiAmIDB4MikgeworCQlwIC09IDE7CisJCXYgPj49IDE7CisJfQorCisJcmV0dXJuIHA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fZGl2ZGkzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fZGl2ZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZmU2MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX19kaXZkaTMuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2RpdmRpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitleHRlcm4gdWludDY0X3QgX191ZGl2bW9kZGk0KHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLCB1aW50NjRfdCAqIHJlbSk7CisKK2ludDY0X3QgX19kaXZkaTMoaW50NjRfdCBudW0sIGludDY0X3QgZGVuKQoreworCWludCBtaW51cyA9IDA7CisJaW50NjRfdCB2OworCisJaWYgKG51bSA8IDApIHsKKwkJbnVtID0gLW51bTsKKwkJbWludXMgPSAxOworCX0KKwlpZiAoZGVuIDwgMCkgeworCQlkZW4gPSAtZGVuOworCQltaW51cyBePSAxOworCX0KKworCXYgPSBfX3VkaXZtb2RkaTQobnVtLCBkZW4sIE5VTEwpOworCWlmIChtaW51cykKKwkJdiA9IC12OworCisJcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fZGl2c2kzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fZGl2c2kzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MjBmNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX19kaXZzaTMuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogbGliZ2NjL19fZGl2c2kzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50MzJfdCBfX3VkaXZtb2RzaTQodWludDMyX3QgbnVtLCB1aW50MzJfdCBkZW4sIHVpbnQzMl90ICogcmVtKTsKKworaW50MzJfdCBfX2RpdnNpMyhpbnQzMl90IG51bSwgaW50MzJfdCBkZW4pCit7CisJaW50IG1pbnVzID0gMDsKKwlpbnQzMl90IHY7CisKKwlpZiAobnVtIDwgMCkgeworCQludW0gPSAtbnVtOworCQltaW51cyA9IDE7CisJfQorCWlmIChkZW4gPCAwKSB7CisJCWRlbiA9IC1kZW47CisJCW1pbnVzIF49IDE7CisJfQorCisJdiA9IF9fdWRpdm1vZHNpNChudW0sIGRlbiwgTlVMTCk7CisJaWYgKG1pbnVzKQorCQl2ID0gLXY7CisKKwlyZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX19sc2hyZGkzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fbHNocmRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUxZjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbGliZ2NjL19fbHNocmRpMy5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBsaWJnY2MvX19sc2hyZGkzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3VpbnQ2NF90IF9fbHNocmRpMyh1aW50NjRfdCB2LCBpbnQgY250KQoreworCWludCBjID0gY250ICYgMzE7CisJdWludDMyX3QgdmwgPSAodWludDMyX3QpIHY7CisJdWludDMyX3QgdmggPSAodWludDMyX3QpICh2ID4+IDMyKTsKKworCWlmIChjbnQgJiAzMikgeworCQl2bCA9ICh2aCA+PiBjKTsKKwkJdmggPSAwOworCX0gZWxzZSB7CisJCXZsID0gKHZsID4+IGMpICsgKHZoIDw8ICgzMiAtIGMpKTsKKwkJdmggPSAodmggPj4gYyk7CisJfQorCisJcmV0dXJuICgodWludDY0X3QpIHZoIDw8IDMyKSArIHZsOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xpYmdjYy9fX21vZGRpMy5jIGIvdXNyL2tsaWJjL2xpYmdjYy9fX21vZGRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2VkOTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbGliZ2NjL19fbW9kZGkzLmMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19tb2RkaTMuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIHVpbnQ2NF90IF9fdWRpdm1vZGRpNCh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbiwgdWludDY0X3QgKiByZW0pOworCitpbnQ2NF90IF9fbW9kZGkzKGludDY0X3QgbnVtLCBpbnQ2NF90IGRlbikKK3sKKwlpbnQgbWludXMgPSAwOworCWludDY0X3QgdjsKKworCWlmIChudW0gPCAwKSB7CisJCW51bSA9IC1udW07CisJCW1pbnVzID0gMTsKKwl9CisJaWYgKGRlbiA8IDApIHsKKwkJZGVuID0gLWRlbjsKKwkJbWludXMgXj0gMTsKKwl9CisKKwkodm9pZClfX3VkaXZtb2RkaTQobnVtLCBkZW4sICh1aW50NjRfdCAqKSAmIHYpOworCWlmIChtaW51cykKKwkJdiA9IC12OworCisJcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fbW9kc2kzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fbW9kc2kzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhMjFiYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX19tb2RzaTMuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogbGliZ2NjL19fbW9kc2kzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50MzJfdCBfX3VkaXZtb2RzaTQodWludDMyX3QgbnVtLCB1aW50MzJfdCBkZW4sIHVpbnQzMl90ICogcmVtKTsKKworaW50MzJfdCBfX21vZHNpMyhpbnQzMl90IG51bSwgaW50MzJfdCBkZW4pCit7CisJaW50IG1pbnVzID0gMDsKKwlpbnQzMl90IHY7CisKKwlpZiAobnVtIDwgMCkgeworCQludW0gPSAtbnVtOworCQltaW51cyA9IDE7CisJfQorCWlmIChkZW4gPCAwKSB7CisJCWRlbiA9IC1kZW47CisJCW1pbnVzIF49IDE7CisJfQorCisJKHZvaWQpX191ZGl2bW9kc2k0KG51bSwgZGVuLCAodWludDMyX3QgKikgJiB2KTsKKwlpZiAobWludXMpCisJCXYgPSAtdjsKKworCXJldHVybiB2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZkaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX191ZGl2ZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlYTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX191ZGl2ZGkzLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19kaXZkaTMuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIHVpbnQ2NF90IF9fdWRpdm1vZGRpNCh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbiwgdWludDY0X3QgKiByZW0pOworCit1aW50NjRfdCBfX3VkaXZkaTModWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4pCit7CisJcmV0dXJuIF9fdWRpdm1vZGRpNChudW0sIGRlbiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fdWRpdm1vZGRpNC5jIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZtb2RkaTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg2MTEyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZtb2RkaTQuYwpAQCAtMCwwICsxLDMyIEBACisjaW5jbHVkZSA8a2xpYmMvZGl2ZXJyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VpbnQ2NF90IF9fdWRpdm1vZGRpNCh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbiwgdWludDY0X3QgKiByZW1fcCkKK3sKKwl1aW50NjRfdCBxdW90ID0gMCwgcWJpdCA9IDE7CisKKwlpZiAoZGVuID09IDApIHsKKwkJX19kaXZpZGVfZXJyb3IoKTsKKwkJcmV0dXJuIDA7CS8qIElmIHRyYXAgcmV0dXJucy4uLiAqLworCX0KKworCS8qIExlZnQtanVzdGlmeSBkZW5vbWluYXRvciBhbmQgY291bnQgc2hpZnQgKi8KKwl3aGlsZSAoKGludDY0X3QpIGRlbiA+PSAwKSB7CisJCWRlbiA8PD0gMTsKKwkJcWJpdCA8PD0gMTsKKwl9CisKKwl3aGlsZSAocWJpdCkgeworCQlpZiAoZGVuIDw9IG51bSkgeworCQkJbnVtIC09IGRlbjsKKwkJCXF1b3QgKz0gcWJpdDsKKwkJfQorCQlkZW4gPj49IDE7CisJCXFiaXQgPj49IDE7CisJfQorCisJaWYgKHJlbV9wKQorCQkqcmVtX3AgPSBudW07CisKKwlyZXR1cm4gcXVvdDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX191ZGl2bW9kc2k0LmMgYi91c3Iva2xpYmMvbGliZ2NjL19fdWRpdm1vZHNpNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTgwZjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbGliZ2NjL19fdWRpdm1vZHNpNC5jCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxrbGliYy9kaXZlcnIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordWludDMyX3QgX191ZGl2bW9kc2k0KHVpbnQzMl90IG51bSwgdWludDMyX3QgZGVuLCB1aW50MzJfdCAqIHJlbV9wKQoreworCXVpbnQzMl90IHF1b3QgPSAwLCBxYml0ID0gMTsKKworCWlmIChkZW4gPT0gMCkgeworCQlfX2RpdmlkZV9lcnJvcigpOworCQlyZXR1cm4gMDsJLyogSWYgdHJhcCByZXR1cm5zLi4uICovCisJfQorCisJLyogTGVmdC1qdXN0aWZ5IGRlbm9taW5hdG9yIGFuZCBjb3VudCBzaGlmdCAqLworCXdoaWxlICgoaW50MzJfdCkgZGVuID49IDApIHsKKwkJZGVuIDw8PSAxOworCQlxYml0IDw8PSAxOworCX0KKworCXdoaWxlIChxYml0KSB7CisJCWlmIChkZW4gPD0gbnVtKSB7CisJCQludW0gLT0gZGVuOworCQkJcXVvdCArPSBxYml0OworCQl9CisJCWRlbiA+Pj0gMTsKKwkJcWJpdCA+Pj0gMTsKKwl9CisKKwlpZiAocmVtX3ApCisJCSpyZW1fcCA9IG51bTsKKworCXJldHVybiBxdW90OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZzaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX191ZGl2c2kzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzNWYzZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX191ZGl2c2kzLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGxpYmdjYy9fX2RpdnNpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitleHRlcm4gdWludDMyX3QgX191ZGl2bW9kc2k0KHVpbnQzMl90IG51bSwgdWludDMyX3QgZGVuLCB1aW50MzJfdCAqIHJlbSk7CisKK3VpbnQzMl90IF9fdWRpdnNpMyh1aW50MzJfdCBudW0sIHVpbnQzMl90IGRlbikKK3sKKwlyZXR1cm4gX191ZGl2bW9kc2k0KG51bSwgZGVuLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX191bW9kZGkzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fdW1vZGRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzc1NGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbGliZ2NjL19fdW1vZGRpMy5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBhcmNoL2kzODYvbGliZ2NjL19fdW1vZGRpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitleHRlcm4gdWludDY0X3QgX191ZGl2bW9kZGk0KHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLCB1aW50NjRfdCAqIHJlbSk7CisKK3VpbnQ2NF90IF9fdW1vZGRpMyh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbikKK3sKKwl1aW50NjRfdCB2OworCisJKHZvaWQpX191ZGl2bW9kZGk0KG51bSwgZGVuLCAmdik7CisJcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fdW1vZHNpMy5jIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3Vtb2RzaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU2ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3Vtb2RzaTMuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogbGliZ2NjL19fdW1vZHNpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitleHRlcm4gdWludDMyX3QgX191ZGl2bW9kc2k0KHVpbnQzMl90IG51bSwgdWludDMyX3QgZGVuLCB1aW50MzJfdCAqIHJlbSk7CisKK3VpbnQzMl90IF9fdW1vZHNpMyh1aW50MzJfdCBudW0sIHVpbnQzMl90IGRlbikKK3sKKwl1aW50MzJfdCB2OworCisJKHZvaWQpX191ZGl2bW9kc2k0KG51bSwgZGVuLCAmdik7CisJcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGxzZWVrLmMgYi91c3Iva2xpYmMvbGxzZWVrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkODEzYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9sbHNlZWsuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogbGxzZWVrLmMKKyAqCisgKiBPbiAzMi1iaXQgcGxhdGZvcm1zLCB3ZSBuZWVkIHRvIHVzZSB0aGUgX2xsc2VlaygpIHN5c3RlbSBjYWxsCisgKiByYXRoZXIgdGhhbiBsc2VlaygpLCB0byBiZSBhYmxlIHRvIGhhbmRsZSBsYXJnZSBkaXNrcy4gIF9sbHNlZWsoKQorICogaXNuJ3QganVzdCBhIG5vcm1hbCBzeXNjYWxsIHdoaWNoIHRha2VzIGEgNjQtYml0IGFyZ3VtZW50OyBpdCBuZWVkcworICogdG8gcmV0dXJuIGEgNjQtYml0IHZhbHVlIGFuZCBzbyB0YWtlcyBhbiBleHRyYSBwb2ludGVyLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGJpdHNpemUuaD4KKworI2lmIF9CSVRTSVpFID09IDMyCisKK2V4dGVybiBpbnQgX19sbHNlZWsoaW50IGZkLCB1bnNpZ25lZCBsb25nIGhpLCB1bnNpZ25lZCBsb25nIGxvLCBvZmZfdCAqIHJlcywKKwkJICAgIGludCB3aGVuY2UpOworCitvZmZfdCBsc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKwlvZmZfdCByZXN1bHQ7CisJaW50IHJ2OworCisJcnYgPSBfX2xsc2VlayhmZCwgKHVuc2lnbmVkIGxvbmcpKG9mZnNldCA+PiAzMiksICh1bnNpZ25lZCBsb25nKW9mZnNldCwKKwkJICAgICAgJnJlc3VsdCwgd2hlbmNlKTsKKworCXJldHVybiBydiA/IChvZmZfdCkgLSAxIDogcmVzdWx0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9scmFuZDQ4LmMgYi91c3Iva2xpYmMvbHJhbmQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmNmOTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbHJhbmQ0OC5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBscmFuZDQ4LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3Vuc2lnbmVkIHNob3J0IF9fcmFuZDQ4X3NlZWRbM107CS8qIENvbW1vbiB3aXRoIG1yYW5kNDguYywgc3JhbmQ0OC5jICovCisKK2xvbmcgbHJhbmQ0OCh2b2lkKQoreworCXJldHVybiAodWludDMyX3QpIGpyYW5kNDgoX19yYW5kNDhfc2VlZCkgPj4gMTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tYWtlZXJybGlzdC5wbCBiL3Vzci9rbGliYy9tYWtlZXJybGlzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M3NDdjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21ha2VlcnJsaXN0LnBsCkBAIC0wLDAgKzEsOTggQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBUaGlzIGNyZWF0ZXMgc3lzX2Vycmxpc3QgZnJvbSA8YXNtL2Vycm5vLmg+IHRocm91Z2ggc29tZXdoYXQKKyMgaGV1cmlzdGljIG1hdGNoaW5nLiAgSXQgcHJlc3VtZXMgdGhlIHJlbGV2YW50IGVudHJpZXMgYXJlIG9mIHRoZSBmb3JtCisjICNkZWZpbmUgRXh4eHggPGludGVnZXI+IC8qIGNvbW1lbnQgKi8KKyMKKwordXNlIEZpbGVIYW5kbGU7CisKKyVlcnJvcnMgID0gKCk7CislZXJybXNnICA9ICgpOworJG1heGVyciAgPSAtMTsKK0BpbmNsdWRlbGlzdCA9ICgpOwkJIyBJbmNsdWRlIGRpcmVjdG9yaWVzCisKK3N1YiBwYXJzZV9maWxlKCQpIHsKKyAgICBteSgkZmlsZSkgPSBAXzsKKyAgICBteSgkZmgpID0gbmV3IEZpbGVIYW5kbGU7CisgICAgbXkoJGxpbmUsICRlcnJvciwgJG1zZyk7CisgICAgbXkoJGtlcm5lbG9ubHkpID0gMDsKKyAgICBteSgkcm9vdCk7CisKKyAgICBwcmludCBTVERFUlIgIm9wZW5pbmcgJGZpbGVcbiIgdW5sZXNzICggJHF1aWV0ICk7CisKKyAgICAkb2sgPSAwOworICAgIGZvcmVhY2ggJHJvb3QgKCBAaW5jbHVkZWxpc3QgKSB7CisJaWYgKCAkZmgtPm9wZW4oJHJvb3QuJy8vJy4kZmlsZSwgJzwnKSApIHsKKwkgICAgJG9rID0gMTsKKwkgICAgbGFzdDsKKwl9CisgICAgfQorCisgICAgaWYgKCAhICRvayApIHsKKwlkaWUgIiQwOiBDYW5ub3QgZmluZCBmaWxlICRmaWxlXG4iOworICAgIH0KKworICAgIHdoaWxlICggZGVmaW5lZCgkbGluZSA9IDwkZmg+KSApIHsKKwlpZiAoICRrZXJuZWxvbmx5ICkgeworCSAgICBpZiAoICRsaW5lID1+IC9eXCNccyplbmRpZi8gKSB7CisJCSRrZXJuZWxvbmx5LS07CisJICAgIH0gZWxzaWYgKCAkbGluZSA9fiAvXlwjXHNpZi8gKSB7CisJCSRrZXJuZWxvbmx5Kys7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoICRsaW5lID1+IC9eXCNccypkZWZpbmVccysoW0EtWjAtOV9dKylccysoWzAtOV0rKVxzKlwvXCpccyooLipcUylccypcKlwvLyApIHsKKwkJJGVycm9yID0gJDE7CisJCSRlcnJubyA9ICQyKzA7CisJCSRtc2cgICA9ICQzOworCQlwcmludCBTVERFUlIgIiRlcnJvciAoJGVycm5vKSA9PiBcIiRtc2dcIlxuIiB1bmxlc3MgKCAkcXVpZXQgKTsKKwkJJGVycm9yc3skZXJybm99ID0gJGVycm9yOworCQkkZXJybXNneyRlcnJub30gPSAkbXNnOworCQkkbWF4ZXJyID0gJGVycm5vIGlmICggJGVycm5vID4gJG1heGVyciApOworCSAgICB9IGVsc2lmICggJGxpbmUgPX4gL15cI1xzKmluY2x1ZGVccytbXDxcIl0oLiopW1w+XCJdLyApIHsKKwkJcGFyc2VfZmlsZSgkMSk7CisJICAgIH0gZWxzaWYgKCAkbGluZSA9fiAvXlwjXHMqaWZkZWZccytfX0tFUk5FTF9fLyApIHsKKwkJJGtlcm5lbG9ubHkrKzsKKwkgICAgfQorCX0KKyAgICB9CisgICAgY2xvc2UoJGZoKTsKKyAgICBwcmludCBTVERFUlIgImNsb3NpbmcgJGZpbGVcbiIgdW5sZXNzICggJHF1aWV0ICk7Cit9CisKKyR2ID0gJEVOVnsnS0JVSUxEX1ZFUkJPU0UnfTsKKyRxdWlldCA9IGRlZmluZWQoJHYpID8gISR2IDogMDsKKworZm9yZWFjaCAkYXJnICggQEFSR1YgKSB7CisgICAgaWYgKCAkYXJnIGVxICctcScgKSB7CisJJHF1aWV0ID0gMTsKKyAgICB9IGVsc2lmICggJGFyZyA9fiAvXi0oZXJybGlzdHxlcnJub3N8bWF4ZXJyKSQvICkgeworCSR0eXBlID0gJGFyZzsKKyAgICB9IGVsc2lmICggJGFyZyA9fiAnXlwtSScgKSB7CisJcHVzaChAaW5jbHVkZWxpc3QsICIkJyIpOworICAgIH0gZWxzZSB7CisJIyBJZ25vcmUKKyAgICB9Cit9CisKK3BhcnNlX2ZpbGUoJ2xpbnV4L2Vycm5vLmgnKTsKKworaWYgKCAkdHlwZSBlcSAnLWVycmxpc3QnICkgeworICAgIHByaW50ICAiI2luY2x1ZGUgPGVycm5vLmg+XG4iOworICAgIHByaW50ZiAiY29uc3QgaW50IHN5c19uZXJyID0gJWQ7XG4iLCAkbWF4ZXJyKzE7CisgICAgcHJpbnRmICJjb25zdCBjaGFyICogY29uc3Qgc3lzX2Vycmxpc3RbJWRdID0ge1xuIiwgJG1heGVycisxOworICAgIGZvcmVhY2ggJGUgKCBzb3J0KGtleXMoJWVycm9ycykpICkgeworCXByaW50ZiAiICBbJXNdID0gXCIlc1wiLFxuIiwgJGVycm9yc3skZX0sICRlcnJtc2d7JGV9OworICAgIH0KKyAgICBwcmludCAifTtcbiI7Cit9IGVsc2lmICggJHR5cGUgZXEgJy1lcnJub3MnICkgeworICAgIHByaW50ICAiI2luY2x1ZGUgPGVycm5vLmg+XG4iOworICAgIHByaW50ZiAiY29uc3QgaW50IHN5c19uZXJyID0gJWQ7XG4iLCAkbWF4ZXJyKzE7CisgICAgcHJpbnRmICJjb25zdCBjaGFyICogY29uc3Qgc3lzX2Vycmxpc3RbJWRdID0ge1xuIiwgJG1heGVycisxOworICAgIGZvcmVhY2ggJGUgKCBzb3J0KGtleXMoJWVycm9ycykpICkgeworCXByaW50ZiAiICBbJXNdID0gXCIlc1wiLFxuIiwgJGVycm9yc3skZX0sICRlcnJvcnN7JGV9OworICAgIH0KKyAgICBwcmludCAifTtcbiI7Cit9IGVsc2lmICggJHR5cGUgZXEgJy1tYXhlcnInICkgeworICAgIHByaW50ICRtYXhlcnIsICJcbiI7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWFsbG9jLmMgYi91c3Iva2xpYmMvbWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiYmJiYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tYWxsb2MuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIG1hbGxvYy5jCisgKgorICogVmVyeSBzaW1wbGUgbGlua2VkLWxpc3QgYmFzZWQgbWFsbG9jKCkvZnJlZSgpLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgIm1hbGxvYy5oIgorCisvKiBCb3RoIHRoZSBhcmVuYSBsaXN0IGFuZCB0aGUgZnJlZSBtZW1vcnkgbGlzdCBhcmUgZG91YmxlIGxpbmtlZAorICAgbGlzdCB3aXRoIGhlYWQgbm9kZS4gIFRoaXMgdGhlIGhlYWQgbm9kZS4gTm90ZSB0aGF0IHRoZSBhcmVuYSBsaXN0CisgICBpcyBzb3J0ZWQgaW4gb3JkZXIgb2YgYWRkcmVzcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgX19tYWxsb2NfaGVhZCA9IHsKKwl7CisJCUFSRU5BX1RZUEVfSEVBRCwKKwkJMCwKKwkJJl9fbWFsbG9jX2hlYWQsCisJCSZfX21hbGxvY19oZWFkLAorCX0sCisJJl9fbWFsbG9jX2hlYWQsCisJJl9fbWFsbG9jX2hlYWQKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX2Jsb2NrX2RlYWQoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCkKK3sKKyNpZmRlZiBERUJVR19NQUxMT0MKKwlhaC0+YS50eXBlID0gQVJFTkFfVFlQRV9ERUFEOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZnJvbV9tYWluX2NoYWluKHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqYWgpCit7CisJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphcCwgKmFuOworCisJbWFya19ibG9ja19kZWFkKGFoKTsKKworCWFwID0gYWgtPmEucHJldjsKKwlhbiA9IGFoLT5hLm5leHQ7CisJYXAtPmEubmV4dCA9IGFuOworCWFuLT5hLnByZXYgPSBhcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9mcm9tX2ZyZWVfY2hhaW4oc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCkKK3sKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFwLCAqYW47CisKKwlhcCA9IGFoLT5wcmV2X2ZyZWU7CisJYW4gPSBhaC0+bmV4dF9mcmVlOworCWFwLT5uZXh0X2ZyZWUgPSBhbjsKKwlhbi0+cHJldl9mcmVlID0gYXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZnJvbV9jaGFpbnMoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCkKK3sKKwlyZW1vdmVfZnJvbV9mcmVlX2NoYWluKGFoKTsKKwlyZW1vdmVfZnJvbV9tYWluX2NoYWluKGFoKTsKK30KKworc3RhdGljIHZvaWQgKl9fbWFsbG9jX2Zyb21fYmxvY2soc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpmcCwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGZzaXplOworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqbmZwLCAqbmEsICpmcG4sICpmcHA7CisKKwlmc2l6ZSA9IGZwLT5hLnNpemU7CisKKwkvKiBXZSBuZWVkIHRoZSAyKiB0byBhY2NvdW50IGZvciB0aGUgbGFyZ2VyIHJlcXVpcmVtZW50cyBvZiBhCisJICAgZnJlZSBibG9jayAqLworCWlmIChmc2l6ZSA+PSBzaXplICsgMiAqIHNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKSkgeworCQkvKiBCaWdnZXIgYmxvY2sgdGhhbiByZXF1aXJlZCAtLSBzcGxpdCBibG9jayAqLworCQluZnAgPSAoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopKChjaGFyICopZnAgKyBzaXplKTsKKwkJbmEgPSBmcC0+YS5uZXh0OworCisJCW5mcC0+YS50eXBlID0gQVJFTkFfVFlQRV9GUkVFOworCQluZnAtPmEuc2l6ZSA9IGZzaXplIC0gc2l6ZTsKKwkJZnAtPmEudHlwZSA9IEFSRU5BX1RZUEVfVVNFRDsKKwkJZnAtPmEuc2l6ZSA9IHNpemU7CisKKwkJLyogSW5zZXJ0IGludG8gYWxsLWJsb2NrIGNoYWluICovCisJCW5mcC0+YS5wcmV2ID0gZnA7CisJCW5mcC0+YS5uZXh0ID0gbmE7CisJCW5hLT5hLnByZXYgPSBuZnA7CisJCWZwLT5hLm5leHQgPSBuZnA7CisKKwkJLyogUmVwbGFjZSBjdXJyZW50IGJsb2NrIG9uIGZyZWUgY2hhaW4gKi8KKwkJbmZwLT5uZXh0X2ZyZWUgPSBmcG4gPSBmcC0+bmV4dF9mcmVlOworCQluZnAtPnByZXZfZnJlZSA9IGZwcCA9IGZwLT5wcmV2X2ZyZWU7CisJCWZwbi0+cHJldl9mcmVlID0gbmZwOworCQlmcHAtPm5leHRfZnJlZSA9IG5mcDsKKwl9IGVsc2UgeworCQlmcC0+YS50eXBlID0gQVJFTkFfVFlQRV9VU0VEOyAvKiBBbGxvY2F0ZSB0aGUgd2hvbGUgYmxvY2sgKi8KKwkJcmVtb3ZlX2Zyb21fZnJlZV9jaGFpbihmcCk7CisJfQorCisJcmV0dXJuICh2b2lkICopKCZmcC0+YSArIDEpOworfQorCitzdGF0aWMgc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpfX2ZyZWVfYmxvY2soc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCkKK3sKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKnBhaCwgKm5haDsKKworCXBhaCA9IGFoLT5hLnByZXY7CisJbmFoID0gYWgtPmEubmV4dDsKKwlpZiAocGFoLT5hLnR5cGUgPT0gQVJFTkFfVFlQRV9GUkVFICYmCisJICAgIChjaGFyICopcGFoICsgcGFoLT5hLnNpemUgPT0gKGNoYXIgKilhaCkgeworCQkvKiBDb2FsZXNjZSBpbnRvIHRoZSBwcmV2aW91cyBibG9jayAqLworCQlwYWgtPmEuc2l6ZSArPSBhaC0+YS5zaXplOworCQlwYWgtPmEubmV4dCA9IG5haDsKKwkJbmFoLT5hLnByZXYgPSBwYWg7CisJCW1hcmtfYmxvY2tfZGVhZChhaCk7CisKKwkJYWggPSBwYWg7CisJCXBhaCA9IGFoLT5hLnByZXY7CisJfSBlbHNlIHsKKwkJLyogTmVlZCB0byBhZGQgdGhpcyBibG9jayB0byB0aGUgZnJlZSBjaGFpbiAqLworCQlhaC0+YS50eXBlID0gQVJFTkFfVFlQRV9GUkVFOworCisJCWFoLT5uZXh0X2ZyZWUgPSBfX21hbGxvY19oZWFkLm5leHRfZnJlZTsKKwkJYWgtPnByZXZfZnJlZSA9ICZfX21hbGxvY19oZWFkOworCQlfX21hbGxvY19oZWFkLm5leHRfZnJlZSA9IGFoOworCQlhaC0+bmV4dF9mcmVlLT5wcmV2X2ZyZWUgPSBhaDsKKwl9CisKKwkvKiBJbiBlaXRoZXIgb2YgdGhlIHByZXZpb3VzIGNhc2VzLCB3ZSBtaWdodCBiZSBhYmxlIHRvIG1lcmdlCisJICAgd2l0aCB0aGUgc3Vic2VxdWVudCBibG9jay4uLiAqLworCWlmIChuYWgtPmEudHlwZSA9PSBBUkVOQV9UWVBFX0ZSRUUgJiYKKwkgICAgKGNoYXIgKilhaCArIGFoLT5hLnNpemUgPT0gKGNoYXIgKiluYWgpIHsKKwkJYWgtPmEuc2l6ZSArPSBuYWgtPmEuc2l6ZTsKKworCQkvKiBSZW1vdmUgdGhlIG9sZCBibG9jayBmcm9tIHRoZSBjaGFpbnMgKi8KKwkJcmVtb3ZlX2Zyb21fY2hhaW5zKG5haCk7CisJfQorCisJLyogUmV0dXJuIHRoZSBibG9jayB0aGF0IGNvbnRhaW5zIHRoZSBjYWxsZWQgYmxvY2sgKi8KKwlyZXR1cm4gYWg7Cit9CisKK3ZvaWQgKm1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmZwOworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqcGFoOworCXNpemVfdCBmc2l6ZTsKKworCWlmIChzaXplID09IDApCisJCXJldHVybiBOVUxMOworCisJLyogQWRkIHRoZSBvYmxpZ2F0b3J5IGFyZW5hIGhlYWRlciwgYW5kIHJvdW5kIHVwICovCisJc2l6ZSA9IChzaXplICsgMiAqIHNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKSAtIDEpICYgQVJFTkFfU0laRV9NQVNLOworCisJZm9yIChmcCA9IF9fbWFsbG9jX2hlYWQubmV4dF9mcmVlOyBmcC0+YS50eXBlICE9IEFSRU5BX1RZUEVfSEVBRDsKKwkgICAgIGZwID0gZnAtPm5leHRfZnJlZSkgeworCQlpZiAoZnAtPmEuc2l6ZSA+PSBzaXplKSB7CisJCQkvKiBGb3VuZCBmaXQgLS0gYWxsb2NhdGUgb3V0IG9mIHRoaXMgYmxvY2sgKi8KKwkJCXJldHVybiBfX21hbGxvY19mcm9tX2Jsb2NrKGZwLCBzaXplKTsKKwkJfQorCX0KKworCS8qIE5vdGhpbmcgZm91bmQuLi4gbmVlZCB0byByZXF1ZXN0IGEgYmxvY2sgZnJvbSB0aGUga2VybmVsICovCisJZnNpemUgPSAoc2l6ZSArIE1BTExPQ19DSFVOS19NQVNLKSAmIH5NQUxMT0NfQ0hVTktfTUFTSzsKKworI2lmIF9LTElCQ19NQUxMT0NfVVNFU19TQlJLCisJZnAgPSAoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopc2Jyayhmc2l6ZSk7CisjZWxzZQorCWZwID0gKHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqKQorCSAgICBtbWFwKE5VTEwsIGZzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAwLCAwKTsKKyNlbmRpZgorCisJaWYgKGZwID09IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKilNQVBfRkFJTEVEKSB7CisJCXJldHVybiBOVUxMOwkvKiBGYWlsZWQgdG8gZ2V0IGEgYmxvY2sgKi8KKwl9CisKKwkvKiBJbnNlcnQgdGhlIGJsb2NrIGludG8gdGhlIG1hbmFnZW1lbnQgY2hhaW5zLiAgV2UgbmVlZCB0byBzZXQKKwkgICB1cCB0aGUgc2l6ZSBhbmQgdGhlIG1haW4gYmxvY2sgbGlzdCBwb2ludGVyLCB0aGUgcmVzdCBvZgorCSAgIHRoZSB3b3JrIGlzIGxvZ2ljYWxseSBpZGVudGljYWwgdG8gZnJlZSgpLiAqLworCWZwLT5hLnR5cGUgPSBBUkVOQV9UWVBFX0ZSRUU7CisJZnAtPmEuc2l6ZSA9IGZzaXplOworCisJLyogV2UgbmVlZCB0byBpbnNlcnQgdGhpcyBpbnRvIHRoZSBtYWluIGJsb2NrIGxpc3QgaW4gdGhlIHByb3BlcgorCSAgIHBsYWNlIC0tIHRoaXMgbGlzdCBpcyByZXF1aXJlZCB0byBiZSBzb3J0ZWQuICBTaW5jZSB3ZSBtb3N0IGxpa2VseQorCSAgIGdldCBtZW1vcnkgYXNzaWdubWVudHMgaW4gYXNjZW5kaW5nIG9yZGVyLCBzZWFyY2ggYmFja3dhcmRzIGZvcgorCSAgIHRoZSBwcm9wZXIgcGxhY2UuICovCisJZm9yIChwYWggPSBfX21hbGxvY19oZWFkLmEucHJldjsgcGFoLT5hLnR5cGUgIT0gQVJFTkFfVFlQRV9IRUFEOworCSAgICAgcGFoID0gcGFoLT5hLnByZXYpIHsKKwkJaWYgKHBhaCA8IGZwKQorCQkJYnJlYWs7CisJfQorCisJLyogTm93IHBhaCBwb2ludHMgdG8gdGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgdGhlIHByZWRlY2Vzc29yIG9mCisJICAgdGhlIG5ldyBub2RlICovCisJZnAtPmEubmV4dCA9IHBhaC0+YS5uZXh0OworCWZwLT5hLnByZXYgPSBwYWg7CisJcGFoLT5hLm5leHQgPSBmcDsKKwlmcC0+YS5uZXh0LT5hLnByZXYgPSBmcDsKKworCS8qIEluc2VydCBpbnRvIHRoZSBmcmVlIGNoYWluIGFuZCBjb2FsZXNjZSB3aXRoIGFkamFjZW50IGJsb2NrcyAqLworCWZwID0gX19mcmVlX2Jsb2NrKGZwKTsKKworCS8qIE5vdyB3ZSBjYW4gYWxsb2NhdGUgZnJvbSB0aGlzIGJsb2NrICovCisJcmV0dXJuIF9fbWFsbG9jX2Zyb21fYmxvY2soZnAsIHNpemUpOworfQorCit2b2lkIGZyZWUodm9pZCAqcHRyKQoreworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqYWg7CisKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCisJYWggPSAoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopCisJICAgICgoc3RydWN0IGFyZW5hX2hlYWRlciAqKXB0ciAtIDEpOworCisjaWZkZWYgREVCVUdfTUFMTE9DCisJYXNzZXJ0KGFoLT5hLnR5cGUgPT0gQVJFTkFfVFlQRV9VU0VEKTsKKyNlbmRpZgorCisJLyogTWVyZ2UgaW50byBhZGphY2VudCBmcmVlIGJsb2NrcyAqLworCWFoID0gX19mcmVlX2Jsb2NrKGFoKTsKKworCS8qIFNlZSBpZiBpdCBtYWtlcyBzZW5zZSB0byByZXR1cm4gbWVtb3J5IHRvIHRoZSBzeXN0ZW0gKi8KKyNpZiBfS0xJQkNfTUFMTE9DX1VTRVNfU0JSSworCWlmIChhaC0+YS5zaXplID49IF9LTElCQ19NQUxMT0NfQ0hVTktfU0laRSAmJgorCSAgICAoY2hhciAqKWFoICsgYWgtPmEuc2l6ZSA9PSBfX2N1cnJlbnRfYnJrKSB7CisJCXJlbW92ZV9mcm9tX2NoYWlucyhhaCk7CisJCWJyayhhaCk7CisJfQorI2Vsc2UKKwl7CisJCXNpemVfdCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworCQlzaXplX3QgcGFnZV9tYXNrID0gcGFnZV9zaXplIC0gMTsKKwkJc2l6ZV90IGhlYWRfcG9ydGlvbiA9IC0oc2l6ZV90KWFoICYgcGFnZV9tYXNrOworCQlzaXplX3QgdGFpbF9wb3J0aW9uID0gKChzaXplX3QpYWggKyBhaC0+YS5zaXplKSAmIHBhZ2VfbWFzazsKKwkJc2l6ZV90IGFkal9zaXplOworCisJCS8qIENhcmVmdWwgaGVyZS4uLiBhbiBpbmRpdmlkdWFsIGNodW5rIG9mIG1lbW9yeSBtdXN0IGhhdmUKKwkJICAgYSBtaW5pbXVtIHNpemUgaWYgaXQgZXhpc3RzIGF0IGFsbCwgc28gaWYgZWl0aGVyIHRoZQorCQkgICBoZWFkIG9yIHRoZSB0YWlsIGlzIGJlbG93IHRoZSBtaW5pbXVtLCB0aGVuIGV4dGVuZAorCQkgICB0aGF0IGNodW5rIGJ5IGEgcGFnZS4gKi8KKworCQlpZiAoaGVhZF9wb3J0aW9uICYmCisJCSAgICBoZWFkX3BvcnRpb24gPCAyKnNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKSkKKwkJCWhlYWRfcG9ydGlvbiArPSBwYWdlX3NpemU7CisKKwkJaWYgKHRhaWxfcG9ydGlvbiAmJgorCQkgICAgdGFpbF9wb3J0aW9uIDwgMipzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlcikpCisJCQl0YWlsX3BvcnRpb24gKz0gcGFnZV9zaXplOworCisJCWFkal9zaXplID0gYWgtPmEuc2l6ZSAtIGhlYWRfcG9ydGlvbiAtIHRhaWxfcG9ydGlvbjsKKworCQkvKiBXb3J0aCBpdD8gIFRoaXMgaXMgd3JpdHRlbiB0aGUgd2F5IGl0IGlzIHRvIGd1YXJkCisJCSAgIGFnYWluc3Qgb3ZlcmZsb3dzLi4uICovCisJCWlmIChhaC0+YS5zaXplID49IGhlYWRfcG9ydGlvbit0YWlsX3BvcnRpb24rCisJCSAgICBfS0xJQkNfTUFMTE9DX0NIVU5LX1NJWkUpIHsKKwkJCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqdGFoLCAqdGFuLCAqdGFwOworCisJCQlpZiAodGFpbF9wb3J0aW9uKSB7CisJCQkJLyogTWFrZSBhIG5ldyBoZWFkZXIsIGFuZCBpbnNlcnQgaW50byBjaGFpbnMKKwkJCQkgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCBibG9jayAqLworCQkJCXRhaCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikKKwkJCQkJKChjaGFyICopYWggKyBoZWFkX3BvcnRpb24gKyBhZGpfc2l6ZSk7CisJCQkJdGFoLT5hLnR5cGUgPSBBUkVOQV9UWVBFX0ZSRUU7CisJCQkJdGFoLT5hLnNpemUgPSB0YWlsX3BvcnRpb247CisJCQkJdGFoLT5hLm5leHQgPSB0YW4gPSBhaC0+YS5uZXh0OworCQkJCXRhbi0+YS5wcmV2ID0gdGFoOworCQkJCXRhaC0+YS5wcmV2ID0gYWg7CisJCQkJYWgtPmEubmV4dCA9IHRhaDsKKwkJCQl0YWgtPnByZXZfZnJlZSA9IHRhcCA9IGFoLT5wcmV2X2ZyZWU7CisJCQkJdGFwLT5uZXh0X2ZyZWUgPSB0YWg7CisJCQkJdGFoLT5uZXh0X2ZyZWUgPSBhaDsKKwkJCQlhaC0+cHJldl9mcmVlID0gdGFoOworCQkJfQorCisJCQlpZiAoaGVhZF9wb3J0aW9uKQorCQkJCWFoLT5hLnNpemUgPSBoZWFkX3BvcnRpb247CisJCQllbHNlCisJCQkJcmVtb3ZlX2Zyb21fY2hhaW5zKGFoKTsKKworCQkJbXVubWFwKChjaGFyICopYWggKyBoZWFkX3BvcnRpb24sIGFkal9zaXplKTsKKwkJfQorCX0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21hbGxvYy5oIGIvdXNyL2tsaWJjL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZWMwYTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbWFsbG9jLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIG1hbGxvYy5oCisgKgorICogSW50ZXJuYWxzIGZvciB0aGUgbWVtb3J5IGFsbG9jYXRvcgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3by4gIFRoaXMgYmVjb21lcyB0aGUKKyAqIGFsaWdubWVudCB1bml0LgorICovCitzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXI7CisKK3N0cnVjdCBhcmVuYV9oZWFkZXIgeworCXNpemVfdCB0eXBlOworCXNpemVfdCBzaXplOwkJLyogQWxzbyBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIG5leHQgZW50cnkgKi8KKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKm5leHQsICpwcmV2OworfTsKKworI2lmZGVmIERFQlVHX01BTExPQworI2RlZmluZSBBUkVOQV9UWVBFX1VTRUQgMHg2NGU2OWM3MAorI2RlZmluZSBBUkVOQV9UWVBFX0ZSRUUgMHgwMTJkNjEwYQorI2RlZmluZSBBUkVOQV9UWVBFX0hFQUQgMHg5NzE2NzZiNQorI2RlZmluZSBBUkVOQV9UWVBFX0RFQUQgMHhlZWVlZWVlZQorI2Vsc2UKKyNkZWZpbmUgQVJFTkFfVFlQRV9VU0VEIDAKKyNkZWZpbmUgQVJFTkFfVFlQRV9GUkVFIDEKKyNkZWZpbmUgQVJFTkFfVFlQRV9IRUFEIDIKKyNlbmRpZgorCisjZGVmaW5lIE1BTExPQ19DSFVOS19NQVNLIChfS0xJQkNfTUFMTE9DX0NIVU5LX1NJWkUtMSkKKworI2RlZmluZSBBUkVOQV9TSVpFX01BU0sgKH4oc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpLTEpKQorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUKKyAqIHByZXZpb3VzIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyIHsKKwlzdHJ1Y3QgYXJlbmFfaGVhZGVyIGE7CisJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpuZXh0X2ZyZWUsICpwcmV2X2ZyZWU7Cit9OworCisvKgorICogSW50ZXJuYWwgdmFyaWFibGUgdXNlZCBieSBicmsvc2JyaworICovCitleHRlcm4gY2hhciAqX19jdXJyZW50X2JyazsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tZW1jY3B5LmMgYi91c3Iva2xpYmMvbWVtY2NweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDAyYzkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbWVtY2NweS5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBtZW1jY3B5LmMKKyAqCisgKiBtZW1jY3B5KCkKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgKm1lbWNjcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGludCBjLCBzaXplX3QgbikKK3sKKwljaGFyICpxID0gZHN0OworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciBjaDsKKworCXdoaWxlIChuLS0pIHsKKwkJKnErKyA9IGNoID0gKnArKzsKKwkJaWYgKGNoID09IChjaGFyKWMpCisJCQlyZXR1cm4gcTsKKwl9CisKKwlyZXR1cm4gTlVMTDsJCS8qIE5vIGluc3RhbmNlIG9mICJjIiBmb3VuZCAqLworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21lbWNoci5jIGIvdXNyL2tsaWJjL21lbWNoci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTQ3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbWVtY2hyLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIG1lbWNoci5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNwID0gczsKKworCXdoaWxlIChuLS0pIHsKKwkJaWYgKCpzcCA9PSAodW5zaWduZWQgY2hhciljKQorCQkJcmV0dXJuICh2b2lkICopc3A7CisJCXNwKys7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWVtY21wLmMgYi91c3Iva2xpYmMvbWVtY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlOTk0MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1jbXAuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogbWVtY21wLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBtZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3QgbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMSA9IHMxLCAqYzIgPSBzMjsKKwlpbnQgZCA9IDA7CisKKwl3aGlsZSAobi0tKSB7CisJCWQgPSAoaW50KSpjMSsrIC0gKGludCkqYzIrKzsKKwkJaWYgKGQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tZW1jcHkuYyBiL3Vzci9rbGliYy9tZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UyMDZkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21lbWNweS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBtZW1jcHkuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCAqbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgKnEgPSBkc3Q7CisjaWYgZGVmaW5lZChfX2kzODZfXykKKwlzaXplX3QgbmwgPSBuID4+IDI7CisJYXNtIHZvbGF0aWxlICgiY2xkIDsgcmVwIDsgbW92c2wgOyBtb3ZsICUzLCUwIDsgcmVwIDsgbW92c2IiOiIrYyIgKG5sKSwKKwkJICAgICAgIitTIihwKSwgIitEIihxKQorCQkgICAgICA6InIiKG4gJiAzKSk7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJc2l6ZV90IG5xID0gbiA+PiAzOworCWFzbSB2b2xhdGlsZSAoImNsZCA7IHJlcCA7IG1vdnNxIDsgbW92bCAlMywlJWVjeCA7IHJlcCA7IG1vdnNiIjoiK2MiCisJCSAgICAgIChucSksICIrUyIocCksICIrRCIocSkKKwkJICAgICAgOiJyIigodWludDMyX3QpIChuICYgNykpKTsKKyNlbHNlCisJd2hpbGUgKG4tLSkgeworCQkqcSsrID0gKnArKzsKKwl9CisjZW5kaWYKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWVtbWVtLmMgYi91c3Iva2xpYmMvbWVtbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1ZmFhMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1tZW0uYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogbWVtbWVtLmMKKyAqCisgKiBGaW5kIGEgYnl0ZSBzdHJpbmcgaW5zaWRlIGEgbG9uZ2VyIGJ5dGUgc3RyaW5nCisgKgorICogVGhpcyB1c2VzIHRoZSAiTm90IFNvIE5haXZlIiBhbGdvcml0aG0sIGEgdmVyeSBzaW1wbGUgYnV0CisgKiB1c3VhbGx5IGVmZmVjdGl2ZSBhbGdvcml0aG0sIHNlZToKKyAqCisgKiBodHRwOi8vd3d3LWlnbS51bml2LW1sdi5mci9+bGVjcm9xL3N0cmluZy8KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgKm1lbW1lbShjb25zdCB2b2lkICpoYXlzdGFjaywgc2l6ZV90IG4sIGNvbnN0IHZvaWQgKm5lZWRsZSwgc2l6ZV90IG0pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqeSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopaGF5c3RhY2s7CisJY29uc3QgdW5zaWduZWQgY2hhciAqeCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopbmVlZGxlOworCisJc2l6ZV90IGosIGssIGw7CisKKwlpZiAobSA+IG4gfHwgIW0gfHwgIW4pCisJCXJldHVybiBOVUxMOworCisJaWYgKDEgIT0gbSkgeworCQlpZiAoeFswXSA9PSB4WzFdKSB7CisJCQlrID0gMjsKKwkJCWwgPSAxOworCQl9IGVsc2UgeworCQkJayA9IDE7CisJCQlsID0gMjsKKwkJfQorCisJCWogPSAwOworCQl3aGlsZSAoaiA8PSBuIC0gbSkgeworCQkJaWYgKHhbMV0gIT0geVtqICsgMV0pIHsKKwkJCQlqICs9IGs7CisJCQl9IGVsc2UgeworCQkJCWlmICghbWVtY21wKHggKyAyLCB5ICsgaiArIDIsIG0gLSAyKQorCQkJCSAgICAmJiB4WzBdID09IHlbal0pCisJCQkJCXJldHVybiAodm9pZCAqKSZ5W2pdOworCQkJCWogKz0gbDsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQlkbyB7CisJCQlpZiAoKnkgPT0gKngpCisJCQkJcmV0dXJuICh2b2lkICopeTsKKwkJCXkrKzsKKwkJfSB3aGlsZSAoLS1uKTsKKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21lbW1vdmUuYyBiL3Vzci9rbGliYy9tZW1tb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5Yzc3OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1tb3ZlLmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIG1lbW1vdmUuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCAqbWVtbW92ZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJY29uc3QgY2hhciAqcCA9IHNyYzsKKwljaGFyICpxID0gZHN0OworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlpZiAocSA8IHApIHsKKwkJYXNtIHZvbGF0aWxlKCJjbGQgOyByZXAgOyBtb3ZzYiIKKwkJCSAgICAgOiAiK2MiIChuKSwgIitTIihwKSwgIitEIihxKSk7CisJfSBlbHNlIHsKKwkJcCArPSAobiAtIDEpOworCQlxICs9IChuIC0gMSk7CisJCWFzbSB2b2xhdGlsZSgic3RkIDsgcmVwIDsgbW92c2IiCisJCQkgICAgIDogIitjIiAobiksICIrUyIocCksICIrRCIocSkpOworCX0KKyNlbHNlCisJaWYgKHEgPCBwKSB7CisJCXdoaWxlIChuLS0pIHsKKwkJCSpxKysgPSAqcCsrOworCQl9CisJfSBlbHNlIHsKKwkJcCArPSBuOworCQlxICs9IG47CisJCXdoaWxlIChuLS0pIHsKKwkJCSotLXEgPSAqLS1wOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21lbXJjaHIuYyBiL3Vzci9rbGliYy9tZW1yY2hyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2ZDcxMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1yY2hyLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIG1lbXJjaHIuYworICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCAqbWVtcmNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMgKyBuIC0gMTsKKworCXdoaWxlIChuLS0pIHsKKwkJaWYgKCpzcCA9PSAodW5zaWduZWQgY2hhciljKQorCQkJcmV0dXJuICh2b2lkICopc3A7CisJCXNwLS07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWVtc2V0LmMgYi91c3Iva2xpYmMvbWVtc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwMGI1YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1zZXQuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogbWVtc2V0LmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbikKK3sKKwljaGFyICpxID0gZHN0OworCisjaWYgZGVmaW5lZChfX2kzODZfXykKKwlzaXplX3QgbmwgPSBuID4+IDI7CisJYXNtIHZvbGF0aWxlICgiY2xkIDsgcmVwIDsgc3Rvc2wgOyBtb3ZsICUzLCUwIDsgcmVwIDsgc3Rvc2IiCisJCSAgICAgIDogIitjIiAobmwpLCAiK0QiIChxKQorCQkgICAgICA6ICJhIiAoKHVuc2lnbmVkIGNoYXIpYyAqIDB4MDEwMTAxMDFVKSwgInIiIChuICYgMykpOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCXNpemVfdCBucSA9IG4gPj4gMzsKKwlhc20gdm9sYXRpbGUgKCJjbGQgOyByZXAgOyBzdG9zcSA7IG1vdmwgJTMsJSVlY3ggOyByZXAgOyBzdG9zYiIKKwkJICAgICAgOiIrYyIgKG5xKSwgIitEIiAocSkKKwkJICAgICAgOiAiYSIgKCh1bnNpZ25lZCBjaGFyKWMgKiAweDAxMDEwMTAxMDEwMTAxMDFVKSwKKwkJCSJyIiAoKHVpbnQzMl90KSBuICYgNykpOworI2Vsc2UKKwl3aGlsZSAobi0tKSB7CisJCSpxKysgPSBjOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tZW1zd2FwLmMgYi91c3Iva2xpYmMvbWVtc3dhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjMxNWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbWVtc3dhcC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBtZW1zd2FwKCkKKyAqCisgKiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIG5vbm92ZXJsYXBwaW5nIG1lbW9yeSBhcmVhcy4KKyAqIFRoaXMgcmVhbGx5IGNvdWxkIGJlIGRvbmUgZmFzdGVyLi4uCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkIG1lbXN3YXAodm9pZCAqbTEsIHZvaWQgKm0yLCBzaXplX3QgbikKK3sKKwljaGFyICpwID0gbTE7CisJY2hhciAqcSA9IG0yOworCWNoYXIgdG1wOworCisJd2hpbGUgKG4tLSkgeworCQl0bXAgPSAqcDsKKwkJKnAgPSAqcTsKKwkJKnEgPSB0bXA7CisKKwkJcCsrOworCQlxKys7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21tYXAuYyBiL3Vzci9rbGliYy9tbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxZGNkOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tbWFwLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIG1tYXAuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxiaXRzaXplLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CisKKy8qCisgKiBTZXQgaW4gU1lTQ0FMTFMgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVzZSBhbiB1bmFkb3JuZWQgbW1hcCgpIHN5c3RlbQorICogY2FsbCAodHlwaWNhbCBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcykuCisgKi8KKyNpZiAhX0tMSUJDX05PX01NVSAmJiBfS0xJQkNfVVNFX01NQVAyCisKKy8qIFRoaXMgYXJjaGl0ZWN0dXJlIHVzZXMgbW1hcDIoKS4gVGhlIExpbnV4IG1tYXAyKCkgc3lzdGVtIGNhbGwgdGFrZXMKKyAgIGEgcGFnZSBvZmZzZXQgYXMgdGhlIG9mZnNldCBhcmd1bWVudC4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUKKyAgIHRoZSBwcm9wZXIgY29udmVyc2lvbiBpbiBwbGFjZS4gKi8KKworZXh0ZXJuIHZvaWQgKl9fbW1hcDIodm9pZCAqLCBzaXplX3QsIGludCwgaW50LCBpbnQsIHNpemVfdCk7CisKK3ZvaWQgKm1tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsIGludCBmZCwKKwkgICBvZmZfdCBvZmZzZXQpCit7CisJY29uc3QgaW50IG1tYXAyX3NoaWZ0ID0gX0tMSUJDX01NQVAyX1NISUZUOworCWNvbnN0IG9mZl90IG1tYXAyX21hc2sgPSAoKG9mZl90KSAxIDw8IG1tYXAyX3NoaWZ0KSAtIDE7CisKKwlpZiAob2Zmc2V0ICYgbW1hcDJfbWFzaykgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIE1BUF9GQUlMRUQ7CisJfQorCisJcmV0dXJuIF9fbW1hcDIoc3RhcnQsIGxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLAorCQkgICAgICAgKHNpemVfdCkgb2Zmc2V0ID4+IG1tYXAyX3NoaWZ0KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbXJhbmQ0OC5jIGIvdXNyL2tsaWJjL21yYW5kNDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2I3M2NjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21yYW5kNDguYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogbXJhbmQ0OC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1bnNpZ25lZCBzaG9ydCBfX3JhbmQ0OF9zZWVkWzNdOwkvKiBDb21tb24gd2l0aCBscmFuZDQ4LmMsIHNyYW5kNDguYyAqLworCitsb25nIG1yYW5kNDgodm9pZCkKK3sKKwlyZXR1cm4ganJhbmQ0OChfX3JhbmQ0OF9zZWVkKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9uaWNlLmMgYi91c3Iva2xpYmMvbmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTk5YWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbmljZS5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBuaWNlLmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWZuZGVmIF9fTlJfbmljZQorCitpbnQgbmljZShpbnQgaW5jKQoreworCXBpZF90IG1lID0gZ2V0cGlkKCk7CisJcmV0dXJuIHNldHByaW9yaXR5KG1lLCBQUklPX1BST0NFU1MsCisJCQkgICBnZXRwcmlvcml0eShtZSwgUFJJT19QUk9DRVNTKSArIGluYyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL25yYW5kNDguYyBiL3Vzci9rbGliYy9ucmFuZDQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzNTMyYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9ucmFuZDQ4LmMKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIG5yYW5kNDguYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbG9uZyBucmFuZDQ4KHVuc2lnbmVkIHNob3J0IHhzdWJpWzNdKQoreworCXJldHVybiAobG9uZykoKHVpbnQzMl90KSBqcmFuZDQ4KHhzdWJpKSA+PiAxKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9udWxsZW52LmMgYi91c3Iva2xpYmMvbnVsbGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2U3MWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbnVsbGVudi5jCkBAIC0wLDAgKzEsOCBAQAorLyoKKyAqIG51bGxlbnYuYworICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJlbnYuaCIKKworY2hhciAqIGNvbnN0IF9fbnVsbF9lbnZpcm9uW10gPSB7IE5VTEwgfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9vbmV4aXQuYyBiL3Vzci9rbGliYy9vbmV4aXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE5NmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL29uZXhpdC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBvbmV4aXQuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJhdGV4aXQuaCIKKworaW50IG9uX2V4aXQodm9pZCAoKmZjdG4pIChpbnQsIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYXRleGl0ICphcyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF0ZXhpdCkpOworCisJaWYgKCFhcykKKwkJcmV0dXJuIC0xOworCisJYXMtPmZjdG4gPSBmY3RuOworCWFzLT5hcmcgPSBhcmc7CisKKwlhcy0+bmV4dCA9IF9fYXRleGl0X2xpc3Q7CisJX19hdGV4aXRfbGlzdCA9IGFzOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvb3Blbi5jIGIvdXNyL2tsaWJjL29wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA4OTdhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL29wZW4uYwpAQCAtMCwwICsxLDIyIEBACisvKgorICogb3Blbi5jCisgKgorICogT24gMzItYml0IHBsYXRmb3JtcyB3ZSBuZWVkIHRvIHBhc3MgT19MQVJHRUZJTEUgdG8gdGhlIG9wZW4oKQorICogc3lzdGVtIGNhbGwsIHRvIGluZGljYXRlIHRoYXQgd2UncmUgNjQtYml0IHNhZmUuCisgKi8KKworI2RlZmluZSBfS0xJQkNfSU5fT1BFTl9DCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxiaXRzaXplLmg+CisKKyNpZiBfQklUU0laRSA9PSAzMiAmJiAhZGVmaW5lZChfX2kzODZfXykKKworZXh0ZXJuIGludCBfX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIG1vZGVfdCk7CisKK2ludCBvcGVuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIG1vZGVfdCBtb2RlKQoreworCXJldHVybiBfX29wZW4ocGF0aG5hbWUsIGZsYWdzIHwgT19MQVJHRUZJTEUsIG1vZGUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9vcGVuX2Nsb2V4ZWMuYyBiL3Vzci9rbGliYy9vcGVuX2Nsb2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzBiMDlkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL29wZW5fY2xvZXhlYy5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBvcGVuX2Nsb2V4ZWMuYworICoKKyAqIEEgcXVpY2sgaGFjayB0byBkbyBhbiBvcGVuKCkgYW5kIHNldCB0aGUgY2xvZXhlYyBmbGFnCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK2ludCBvcGVuX2Nsb2V4ZWMoY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSkKK3sKKwlpbnQgZmQgPSBvcGVuKHBhdGgsIGZsYWdzLCBtb2RlKTsKKworCWlmIChmZCA+PSAwKQorCQlmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisKKwlyZXR1cm4gZmQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvb3BlbmF0LmMgYi91c3Iva2xpYmMvb3BlbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjODdjZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9vcGVuYXQuYwpAQCAtMCwwICsxLDIyIEBACisvKgorICogb3BlbmF0LmMKKyAqCisgKiBPbiAzMi1iaXQgcGxhdGZvcm1zIHdlIG5lZWQgdG8gcGFzcyBPX0xBUkdFRklMRSB0byB0aGUgb3BlbmF0KCkKKyAqIHN5c3RlbSBjYWxsLCB0byBpbmRpY2F0ZSB0aGF0IHdlJ3JlIDY0LWJpdCBzYWZlLgorICovCisKKyNkZWZpbmUgX0tMSUJDX0lOX09QRU5fQworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Yml0c2l6ZS5oPgorCisjaWYgX0JJVFNJWkUgPT0gMzIgJiYgIWRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoX19OUl9vcGVuYXQpCisKK2V4dGVybiBpbnQgX19vcGVuYXQoaW50LCBjb25zdCBjaGFyICosIGludCwgbW9kZV90KTsKKworaW50IG9wZW5hdChpbnQgZGlyZmQsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIG1vZGVfdCBtb2RlKQoreworCXJldHVybiBfX29wZW5hdChkaXJmZCwgcGF0aG5hbWUsIGZsYWdzIHwgT19MQVJHRUZJTEUsIG1vZGUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9wYXVzZS5jIGIvdXNyL2tsaWJjL3BhdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjOTdhOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9wYXVzZS5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBwYXVzZS5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworI2lmbmRlZiBfX05SX3BhdXNlCisKK2ludCBwYXVzZSh2b2lkKQoreworCXJldHVybiBzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3BlcnJvci5jIGIvdXNyL2tsaWJjL3BlcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNzcwNTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcGVycm9yLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIHBlcnJvci5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCBwZXJyb3IoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgZSA9IGVycm5vOworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBzLCBzdHJlcnJvcihlKSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcHBvbGwuYyBiL3Vzci9rbGliYy9wcG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjBhODkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcHBvbGwuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogcHBvbGwuYworICovCisKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZmRlZiBfX05SX3Bwb2xsCisKK19fZXh0ZXJuIGludCBfX3Bwb2xsKHN0cnVjdCBwb2xsZmQgKiwgbmZkc190LCBzdHJ1Y3QgdGltZXNwZWMgKiwKKwkJICAgICBjb25zdCBzaWdzZXRfdCAqLCBzaXplX3QpOworCitpbnQgcHBvbGwoc3RydWN0IHBvbGxmZCAqdWZkcywgbmZkc190IG5mZHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCwKKwkgIGNvbnN0IHNpZ3NldF90ICogc2lnbWFzaykKK3sKKwlyZXR1cm4gX19wcG9sbCh1ZmRzLCBuZmRzLCB0aW1lb3V0LCBzaWdtYXNrLCBzaXplb2YgKnNpZ21hc2spOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9wcmludGYuYyBiL3Vzci9rbGliYy9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmJkYmEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3ByaW50Zi5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIEJVRkZFUl9TSVpFCTE2Mzg0CisKK2ludCBwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcnY7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlydiA9IHZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcHNlbGVjdC5jIGIvdXNyL2tsaWJjL3BzZWxlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI2ODUyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3BzZWxlY3QuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogcHNlbGVjdC5jCisgKi8KKworI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWYgZGVmaW5lZChfX05SX3BzZWxlY3QpICYmICFfS0xJQkNfVVNFX1JUX1NJRworCisvKiBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmU7IHVzZSBzeXNjYWxsIHN0dWIgZGlyZWN0bHkgKi8KKworI2VsaWYgZGVmaW5lZChfX05SX3BzZWxlY3Q3KQorCitfX2V4dGVybiBpbnQgX19wc2VsZWN0NyhpbnQsIGZkX3NldCAqLCBmZF9zZXQgKiwgZmRfc2V0ICosCisJCQljb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc2lnc2V0X3QgKiwgc2l6ZV90KTsKKworaW50IHBzZWxlY3QoaW50IG4sIGZkX3NldCAqIHJlYWRmZHMsIGZkX3NldCAqIHdyaXRlZmRzLCBmZF9zZXQgKiBleGNlcHRmZHMsCisJICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCwgY29uc3Qgc2lnc2V0X3QgKiBzaWdtYXNrKQoreworCXJldHVybiBfX3BzZWxlY3Q3KG4sIHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHMsCisJCQkgIHRpbWVvdXQsIHNpZ21hc2ssIHNpemVvZiAqc2lnbWFzayk7Cit9CisKKyNlbGlmIGRlZmluZWQoX19OUl9wc2VsZWN0NikKKworc3RydWN0IF9fcHNlbGVjdDYgeworCWNvbnN0IHNpZ3NldF90ICpzaWdtYXNrOworCXNpemVfdCBzaWdzaXplOworfTsKKworX19leHRlcm4gaW50IF9fcHNlbGVjdDYoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICosIGZkX3NldCAqLAorCQkJY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHN0cnVjdCBfX3BzZWxlY3Q2ICopOworCitpbnQgcHNlbGVjdChpbnQgbiwgZmRfc2V0ICogcmVhZGZkcywgZmRfc2V0ICogd3JpdGVmZHMsIGZkX3NldCAqIGV4Y2VwdGZkcywKKwkgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0LCBjb25zdCBzaWdzZXRfdCAqIHNpZ21hc2spCit7CisJc3RydWN0IF9fcHNlbGVjdDYgZXh0ZW5kZWRfc2lnbWFzayA9IHsgc2lnbWFzaywgc2l6ZW9mICpzaWdtYXNrIH07CisJcmV0dXJuIF9fcHNlbGVjdDYobiwgcmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcywKKwkJCSAgdGltZW91dCwgJmV4dGVuZGVkX3NpZ21hc2spOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9wdHkuYyBiL3Vzci9rbGliYy9wdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNiMmJhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3B0eS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBwdHkuYworICoKKyAqIEJhc2ljIFVuaXg5OCBQVFkgZnVuY3Rpb25hbGl0eTsgYXNzdW1lcyBkZXZwdHMgbW91bnRlZCBvbiAvZGV2L3B0cworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworY2hhciAqcHRzbmFtZShpbnQgZmQpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzMyXTsJLyogQmlnIGVub3VnaCB0byBob2xkIGV2ZW4gYSA2NC1iaXQgcHRzIG5vICovCisJdW5zaWduZWQgaW50IHB0eW5vOworCisJaWYgKGlvY3RsKGZkLCBUSU9DR1BUTiwgJnB0eW5vKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICIvZGV2L3B0cy8ldSIsIHB0eW5vKTsKKworCXJldHVybiBidWZmZXI7Cit9CisKK2ludCB1bmxvY2twdChpbnQgZmQpCit7CisJaW50IHVubG9jayA9IDA7CisKKwlyZXR1cm4gaW9jdGwoZmQsIFRJT0NTUFRMQ0ssICZ1bmxvY2spOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3B1dGNoYXIuYyBiL3Vzci9rbGliYy9wdXRjaGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMjRjYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9wdXRjaGFyLmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIHB1dGNoYXIuYworICoKKyAqIC0gZ2NjIHdhbnRzIHRoaXMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI3VuZGVmIHB1dGNoYXIJCQkvKiBEZWZpbmVkIGFzIGEgbWFjcm8gKi8KK2ludCBwdXRjaGFyKGludCk7CisKK2ludCBwdXRjaGFyKGludCBjKQoreworCXJldHVybiBmcHV0YyhjLCBzdGRvdXQpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3B1dGVudi5jIGIvdXNyL2tsaWJjL3B1dGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTllY2IKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcHV0ZW52LmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIHB1dGVudi5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZW52LmgiCisKK2ludCBwdXRlbnYoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnM7CisJY29uc3QgY2hhciAqZSwgKno7CisKKwlpZiAoIXN0cikgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKworCWUgPSBOVUxMOworCWZvciAoeiA9IHN0cjsgKno7IHorKykgeworCQlpZiAoKnogPT0gJz0nKQorCQkJZSA9IHo7CisJfQorCisJaWYgKCFlKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJcyA9IHN0cmR1cChzdHIpOworCWlmICghcykKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIF9fcHV0X2VudihzLCBlIC0gc3RyLCAxKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9wdXRzLmMgYi91c3Iva2xpYmMvcHV0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTE2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcHV0cy5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBwdXRzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IHB1dHMoY29uc3QgY2hhciAqcykKK3sKKwlpZiAoZnB1dHMocywgc3Rkb3V0KSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiBfZndyaXRlKCJcbiIsIDEsIHN0ZG91dCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcXNvcnQuYyBiL3Vzci9rbGliYy9xc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDg0YTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcXNvcnQuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogcXNvcnQuYworICoKKyAqIFRoaXMgaXMgYWN0dWFsbHkgY29tYnNvcnQuICBJdCdzIGFuIE8obiBsb2cgbikgYWxnb3JpdGhtIHdpdGgKKyAqIHNpbXBsaWNpdHkvc21hbGwgY29kZSBzaXplIGJlaW5nIGl0cyBtYWluIHZpcnR1ZS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IG5ld2dhcChzaXplX3QgZ2FwKQoreworCWdhcCA9IChnYXAgKiAxMCkgLyAxMzsKKwlpZiAoZ2FwID09IDkgfHwgZ2FwID09IDEwKQorCQlnYXAgPSAxMTsKKworCWlmIChnYXAgPCAxKQorCQlnYXAgPSAxOworCXJldHVybiBnYXA7Cit9CisKK3ZvaWQgcXNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwKKwkgICBpbnQgKCpjb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpCit7CisJc2l6ZV90IGdhcCA9IG5tZW1iOworCXNpemVfdCBpLCBqOworCWNoYXIgKnAxLCAqcDI7CisJaW50IHN3YXBwZWQ7CisKKwlpZiAoIW5tZW1iKQorCQlyZXR1cm47CisKKwlkbyB7CisJCWdhcCA9IG5ld2dhcChnYXApOworCQlzd2FwcGVkID0gMDsKKworCQlmb3IgKGkgPSAwLCBwMSA9IGJhc2U7IGkgPCBubWVtYiAtIGdhcDsgaSsrLCBwMSArPSBzaXplKSB7CisJCQlqID0gaSArIGdhcDsKKwkJCWlmIChjb21wYXIocDEsIHAyID0gKGNoYXIgKiliYXNlICsgaiAqIHNpemUpID4gMCkgeworCQkJCW1lbXN3YXAocDEsIHAyLCBzaXplKTsKKwkJCQlzd2FwcGVkID0gMTsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKGdhcCA+IDEgfHwgc3dhcHBlZCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcmFpc2UuYyBiL3Vzci9rbGliYy9yYWlzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWQyM2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcmFpc2UuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogcmFpc2UuYworICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworaW50IHJhaXNlKGludCBzaWduYWwpCit7CisJcmV0dXJuIGtpbGwoZ2V0cGlkKCksIHNpZ25hbCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcmVhZGRpci5jIGIvdXNyL2tsaWJjL3JlYWRkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTNmYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3JlYWRkaXIuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogcmVhZGRpci5jOiBvcGVuZGlyL3JlYWRkaXIvY2xvc2VkaXIKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBfX0tMSUJDX0RJUkVOVF9JTlRFUk5BTFMKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworRElSICpvcGVuZGlyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRElSICpkcCA9IG1hbGxvYyhzaXplb2YoRElSKSk7CisKKwlpZiAoIWRwKQorCQlyZXR1cm4gTlVMTDsKKworCWRwLT5fX2ZkID0gb3BlbihuYW1lLCBPX0RJUkVDVE9SWSB8IE9fUkRPTkxZKTsKKworCWlmIChkcC0+X19mZCA8IDApIHsKKwkJZnJlZShkcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRwLT5ieXRlc19sZWZ0ID0gMDsKKworCXJldHVybiBkcDsKK30KKworc3RydWN0IGRpcmVudCAqcmVhZGRpcihESVIgKmRpcikKK3sKKwlzdHJ1Y3QgZGlyZW50ICpkZW50OworCWludCBydjsKKworCWlmICghZGlyLT5ieXRlc19sZWZ0KSB7CisJCXJ2ID0gZ2V0ZGVudHMoZGlyLT5fX2ZkLCBkaXItPmJ1ZmZlciwgc2l6ZW9mKGRpci0+YnVmZmVyKSk7CisJCWlmIChydiA8PSAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWRpci0+Ynl0ZXNfbGVmdCA9IHJ2OworCQlkaXItPm5leHQgPSBkaXItPmJ1ZmZlcjsKKwl9CisKKwlkZW50ID0gZGlyLT5uZXh0OworCWRpci0+bmV4dCA9IChzdHJ1Y3QgZGlyZW50ICopKChjaGFyICopZGlyLT5uZXh0ICsgZGVudC0+ZF9yZWNsZW4pOworCWRpci0+Ynl0ZXNfbGVmdCAtPSBkZW50LT5kX3JlY2xlbjsKKworCXJldHVybiBkZW50OworfQorCitpbnQgY2xvc2VkaXIoRElSICpkaXIpCit7CisJaW50IHJ2OworCXJ2ID0gY2xvc2UoZGlyLT5fX2ZkKTsKKwlmcmVlKGRpcik7CisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3JlYWxsb2MuYyBiL3Vzci9rbGliYy9yZWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhMmYyZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9yZWFsbG9jLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIHJlYWxsb2MuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm1hbGxvYy5oIgorCisvKiBGSVhNRTogVGhpcyBpcyBjaGVlc3ksIGl0IHNob3VsZCBiZSBmaXhlZCBsYXRlciAqLworCit2b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaDsKKwl2b2lkICpuZXdwdHI7CisJc2l6ZV90IG9sZHNpemU7CisKKwlpZiAoIXB0cikKKwkJcmV0dXJuIG1hbGxvYyhzaXplKTsKKworCWlmIChzaXplID09IDApIHsKKwkJZnJlZShwdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBBZGQgdGhlIG9ibGlnYXRvcnkgYXJlbmEgaGVhZGVyLCBhbmQgcm91bmQgdXAgKi8KKwlzaXplID0gKHNpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpIC0gMSkgJiBBUkVOQV9TSVpFX01BU0s7CisKKwlhaCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikKKwkgICAgKChzdHJ1Y3QgYXJlbmFfaGVhZGVyICopcHRyIC0gMSk7CisKKwlpZiAoYWgtPmEuc2l6ZSA+PSBzaXplICYmIHNpemUgPj0gKGFoLT5hLnNpemUgPj4gMikpIHsKKwkJLyogVGhpcyBmaWVsZCBpcyBhIGdvb2Qgc2l6ZSBhbHJlYWR5LiAqLworCQlyZXR1cm4gcHRyOworCX0gZWxzZSB7CisJCS8qIE1ha2UgbWUgYSBuZXcgYmxvY2suICBUaGlzIGlzIGtpbmQgb2YgYm9ndXM7IHdlIHNob3VsZAorCQkgICBiZSBjaGVja2luZyB0aGUgZm9sbG93aW5nIGJsb2NrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gYW4KKwkJICAgaW4tcGxhY2UgYWRqdXN0bWVudC4uLiBmaXggdGhhdCBsYXRlci4gKi8KKworCQlvbGRzaXplID0gYWgtPmEuc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKTsKKworCQluZXdwdHIgPSBtYWxsb2Moc2l6ZSk7CisJCW1lbWNweShuZXdwdHIsIHB0ciwgKHNpemUgPCBvbGRzaXplKSA/IHNpemUgOiBvbGRzaXplKTsKKwkJZnJlZShwdHIpOworCisJCXJldHVybiBuZXdwdHI7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3JlYm9vdC5jIGIvdXNyL2tsaWJjL3JlYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTVkYzMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcmVib290LmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIHJlYm9vdC5jCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9yZWJvb3QuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisvKiBUaGlzIHByb3ZpZGVzIHRoZSBvbmUtYXJndW1lbnQgZ2xpYmMtaXNoIHZlcnNpb24gb2YgcmVib290LgorICAgVGhlIGZ1bGwgZm91ci1hcmd1bWVudCBzeXN0ZW0gY2FsbCBpcyBhdmFpbGFibGUgYXMgX19yZWJvb3QoKS4gKi8KKworaW50IHJlYm9vdChpbnQgZmxhZykKK3sKKwlyZXR1cm4gX19yZWJvb3QoTElOVVhfUkVCT09UX01BR0lDMSwgTElOVVhfUkVCT09UX01BR0lDMiwgZmxhZywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcmVjdi5jIGIvdXNyL2tsaWJjL3JlY3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFhMDBhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3JlY3YuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogcmVjdi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworaW50IHJlY3YoaW50IHMsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiByZWN2ZnJvbShzLCBidWYsIGxlbiwgZmxhZ3MsIE5VTEwsIDApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3JlbW92ZS5jIGIvdXNyL2tsaWJjL3JlbW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODgyMDQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcmVtb3ZlLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHJlbW92ZS5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworaW50IHJlbW92ZShjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwlpbnQgcnY7CisKKwlydiA9IHVubGluayhwYXRobmFtZSk7CisJaWYgKHJ2ID09IC0xICYmIGVycm5vID09IEVJU0RJUikKKwkJcmV0dXJuIHJtZGlyKHBhdGhuYW1lKTsKKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zYnJrLmMgYi91c3Iva2xpYmMvc2Jyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OTZjZTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2Jyay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIHNicmsuYyAtIENoYW5nZSBkYXRhIHNlZ21lbnQgc2l6ZSAqLworCisvKiBXcml0dGVuIDIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyICovCisvKiBNb2RpZmllZCAyMDAzLTIwMDQgZm9yIGtsaWJjIGJ5IEguIFBldGVyIEFudmluICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAibWFsbG9jLmgiCisKKyNpZiAhX0tMSUJDX05PX01NVQkJLyogdUNsaW51eCBkb2Vzbid0IGhhdmUgYnJrKCkgKi8KKworY2hhciAqX19jdXJyZW50X2JyazsJCS8qIENvbW1vbiB3aXRoIGJyay5jICovCisKKy8qIHAgaXMgYW4gYWRkcmVzcywgIGEgaXMgYWxpZ25tZW50OyBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworc3RhdGljIGlubGluZSB2b2lkICphbGlnbl91cCh2b2lkICpwLCB1aW50cHRyX3QgYSkKK3sKKwlyZXR1cm4gKHZvaWQgKikoKCh1aW50cHRyX3QpIHAgKyBhIC0gMSkgJiB+KGEgLSAxKSk7Cit9CisKK3ZvaWQgKnNicmsocHRyZGlmZl90IGluY3JlbWVudCkKK3sKKwljaGFyICpzdGFydCwgKmVuZCwgKm5ld19icms7CisKKwlpZiAoIV9fY3VycmVudF9icmspCisJCV9fY3VycmVudF9icmsgPSBfX2JyayhOVUxMKTsKKworCXN0YXJ0ID0gYWxpZ25fdXAoX19jdXJyZW50X2JyaywgX0tMSUJDX1NCUktfQUxJR05NRU5UKTsKKwllbmQgPSBzdGFydCArIGluY3JlbWVudDsKKworCW5ld19icmsgPSBfX2JyayhlbmQpOworCisJaWYgKG5ld19icmsgPT0gKHZvaWQgKiktMSkKKwkJcmV0dXJuICh2b2lkICopLTE7CisJZWxzZSBpZiAobmV3X2JyayA8IGVuZCkgeworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuICh2b2lkICopLTE7CisJfQorCisJX19jdXJyZW50X2JyayA9IG5ld19icms7CisJcmV0dXJuIHN0YXJ0OworfQorCisjZW5kaWYJCQkJLyogIV9LTElCQ19OT19NTVUgKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zZWVkNDguYyBiL3Vzci9rbGliYy9zZWVkNDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2RmMTgzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NlZWQ0OC5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBzZWVkNDguYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordW5zaWduZWQgc2hvcnQgX19yYW5kNDhfc2VlZFszXTsKKwordW5zaWduZWQgc2hvcnQgKnNlZWQ0OChjb25zdCB1bnNpZ25lZCBzaG9ydCB4c3ViaVszXSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgb2xkc2VlZFszXTsKKwltZW1jcHkob2xkc2VlZCwgX19yYW5kNDhfc2VlZCwgc2l6ZW9mIF9fcmFuZDQ4X3NlZWQpOworCW1lbWNweShfX3JhbmQ0OF9zZWVkLCB4c3ViaSwgc2l6ZW9mIF9fcmFuZDQ4X3NlZWQpOworCisJcmV0dXJuIG9sZHNlZWQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2VuZC5jIGIvdXNyL2tsaWJjL3NlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODY3ZGQxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NlbmQuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogc2VuZC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworaW50IHNlbmQoaW50IHMsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBzZW5kdG8ocywgYnVmLCBsZW4sIGZsYWdzLCBOVUxMLCAwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zZXRlZ2lkLmMgYi91c3Iva2xpYmMvc2V0ZWdpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjk2NmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2V0ZWdpZC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBzZXRlZ2lkLmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBzZXRlZ2lkKGdpZF90IGVnaWQpCit7CisJcmV0dXJuIHNldHJlZ2lkKC0xLCBlZ2lkKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zZXRlbnYuYyBiL3Vzci9rbGliYy9zZXRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWE3YWFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NldGVudi5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBzZXRlbnYuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImVudi5oIgorCitpbnQgc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCwgaW50IG92ZXJ3cml0ZSkKK3sKKwljb25zdCBjaGFyICp6OworCWNoYXIgKnM7CisJc2l6ZV90IGwxLCBsMjsKKworCWlmICghbmFtZSB8fCAhbmFtZVswXSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKworCWwxID0gMDsKKwlmb3IgKHogPSBuYW1lOyAqejsgeisrKSB7CisJCWwxKys7CisJCWlmICgqeiA9PSAnPScpIHsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJbDIgPSBzdHJsZW4odmFsKTsKKworCXMgPSBtYWxsb2MobDEgKyBsMiArIDIpOworCWlmICghcykKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KHMsIG5hbWUsIGwxKTsKKwlzW2wxXSA9ICc9JzsKKwltZW1jcHkocyArIGwxICsgMSwgdmFsLCBsMiArIDEpOworCisJcmV0dXJuIF9fcHV0X2VudihzLCBsMSArIDEsIG92ZXJ3cml0ZSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2V0ZXVpZC5jIGIvdXNyL2tsaWJjL3NldGV1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGRkZGIxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NldGV1aWQuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogc2V0ZXVpZC5jCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgc2V0ZXVpZCh1aWRfdCBldWlkKQoreworCXJldHVybiBzZXRyZXVpZCgtMSwgZXVpZCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2V0cGdycC5jIGIvdXNyL2tsaWJjL3NldHBncnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJiY2M3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NldHBncnAuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogc2V0cGdycC5jCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgc2V0cGdycCh2b2lkKQoreworCXJldHVybiBzZXRwZ2lkKDAsIDApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NoYTFoYXNoLmMgYi91c3Iva2xpYmMvc2hhMWhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjllZWJmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NoYTFoYXNoLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCitTSEEtMSBpbiBDCitCeSBTdGV2ZSBSZWlkIDxzcmVpZEBzZWEtdG8tc2t5Lm5ldD4KKzEwMCUgUHVibGljIERvbWFpbgorCistLS0tLS0tLS0tLS0tLS0tLQorTW9kaWZpZWQgNy85OAorQnkgSmFtZXMgSC4gQnJvd24gPGpicm93bkBidXJnb3luZS5jb20+CitTdGlsbCAxMDAlIFB1YmxpYyBEb21haW4KKworQ29ycmVjdGVkIGEgcHJvYmxlbSB3aGljaCBnZW5lcmF0ZWQgaW1wcm9wZXIgaGFzaCB2YWx1ZXMgb24gMTYgYml0IG1hY2hpbmVzCitSb3V0aW5lIFNIQTFVcGRhdGUgY2hhbmdlZCBmcm9tCisJdm9pZCBTSEExVXBkYXRlKFNIQTFfQ1RYKiBjb250ZXh0LCB1bnNpZ25lZCBjaGFyKiBkYXRhLCB1bnNpZ25lZCBpbnQKK2xlbikKK3RvCisJdm9pZCBTSEExVXBkYXRlKFNIQTFfQ1RYKiBjb250ZXh0LCB1bnNpZ25lZCBjaGFyKiBkYXRhLCB1bnNpZ25lZAorbG9uZyBsZW4pCisKK1RoZSAnbGVuJyBwYXJhbWV0ZXIgd2FzIGRlY2xhcmVkIGFuIGludCB3aGljaCB3b3JrcyBmaW5lIG9uIDMyIGJpdCBtYWNoaW5lcy4KK0hvd2V2ZXIsIG9uIDE2IGJpdCBtYWNoaW5lcyBhbiBpbnQgaXMgdG9vIHNtYWxsIGZvciB0aGUgc2hpZnRzIGJlaW5nIGRvbmUKK2FnYWluc3QKK2l0LiAgVGhpcyBjYXVzZWQgdGhlIGhhc2ggZnVuY3Rpb24gdG8gZ2VuZXJhdGUgaW5jb3JyZWN0IHZhbHVlcyBpZiBsZW4gd2FzCitncmVhdGVyIHRoYW4gODE5MSAoOEsgLSAxKSBkdWUgdG8gdGhlICdsZW4gPDwgMycgb24gbGluZSAzIG9mIFNIQTFVcGRhdGUoKS4KKworU2luY2UgdGhlIGZpbGUgSU8gaW4gbWFpbigpIHJlYWRzIDE2SyBhdCBhIHRpbWUsIGFueSBmaWxlIDhLIG9yIGxhcmdlciB3b3VsZAorYmUgZ3VhcmFudGVlZCB0byBnZW5lcmF0ZSB0aGUgd3JvbmcgaGFzaCAoZS5nLiBUZXN0IFZlY3RvciAjMywgYSBtaWxsaW9uCisiYSJzKS4KKworSSBhbHNvIGNoYW5nZWQgdGhlIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpICYgaiBpbiBTSEExVXBkYXRlIHRvCit1bnNpZ25lZCBsb25nIGZyb20gdW5zaWduZWQgaW50IGZvciB0aGUgc2FtZSByZWFzb24uCisKK1RoZXNlIGNoYW5nZXMgc2hvdWxkIG1ha2Ugbm8gZGlmZmVyZW5jZSB0byBhbnkgMzIgYml0IGltcGxlbWVudGF0aW9ucyBzaW5jZQorYW4KK2ludCBhbmQgYSBsb25nIGFyZSB0aGUgc2FtZSBzaXplIGluIHRob3NlIGVudmlyb25tZW50cy4KKworLS0KK0kgYWxzbyBjb3JyZWN0ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IEJvcmxhbmQgQy4KKzEuIEFkZGVkICNpbmNsdWRlIDxwcm9jZXNzLmg+IGZvciBleGl0KCkgcHJvdG90eXBlCisyLiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSAnaicgaW4gU0hBMUZpbmFsCiszLiBDaGFuZ2VkIGV4aXQoMCkgdG8gcmV0dXJuKDApIGF0IGVuZCBvZiBtYWluLgorCitBTEwgY2hhbmdlcyBJIG1hZGUgY2FuIGJlIGxvY2F0ZWQgYnkgc2VhcmNoaW5nIGZvciBjb21tZW50cyBjb250YWluaW5nICdKSEInCistLS0tLS0tLS0tLS0tLS0tLQorTW9kaWZpZWQgOC85OAorQnkgU3RldmUgUmVpZCA8c3JlaWRAc2VhLXRvLXNreS5uZXQ+CitTdGlsbCAxMDAlIHB1YmxpYyBkb21haW4KKworMS0gUmVtb3ZlZCAjaW5jbHVkZSA8cHJvY2Vzcy5oPiBhbmQgdXNlZCByZXR1cm4oKSBpbnN0ZWFkIG9mIGV4aXQoKQorMi0gRml4ZWQgb3ZlcndyaXRpbmcgb2YgZmluYWxjb3VudCBpbiBTSEExRmluYWwoKSAoZGlzY292ZXJlZCBieSBDaHJpcyBIYWxsKQorMy0gQ2hhbmdlZCBlbWFpbCBhZGRyZXNzIGZyb20gc3RldmVAZWRtd2ViLmNvbSB0byBzcmVpZEBzZWEtdG8tc2t5Lm5ldAorCistLS0tLS0tLS0tLS0tLS0tLQorTW9kaWZpZWQgNC8wMQorQnkgU2F1bCBLcmF2aXR6IDxTYXVsLktyYXZpdHpAY2VsZXJhLmNvbT4KK1N0aWxsIDEwMCUgUEQKK01vZGlmaWVkIHRvIHJ1biBvbiBDb21wYXEgQWxwaGEgaGFyZHdhcmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tCitNb2RpZmllZCAyLzAzCitCeSBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KK1N0aWxsIDEwMCUgUEQKK01vZGlmaWVkIHRvIHJ1biBvbiBhbnkgaGFyZHdhcmUgd2l0aCA8aW50dHlwZXMuaD4gYW5kIDxuZXRpbmV0L2luLmg+CitDaGFuZ2VkIHRoZSBkcml2ZXIgcHJvZ3JhbQorCisqLworCisvKgorVGVzdCBWZWN0b3JzIChmcm9tIEZJUFMgUFVCIDE4MC0xKQorImFiYyIKKyAgQTk5OTNFMzYgNDcwNjgxNkEgQkEzRTI1NzEgNzg1MEMyNkMgOUNEMEQ4OUQKKyJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIKKyAgODQ5ODNFNDQgMUMzQkQyNkUgQkFBRTRBQTEgRjk1MTI5RTUgRTU0NjcwRjEKK0EgbWlsbGlvbiByZXBldGl0aW9ucyBvZiAiYSIKKyAgMzRBQTk3M0MgRDRDNERBQTQgRjYxRUVCMkIgREJBRDI3MzEgNjUzNDAxNkYKKyovCisKKy8qICNkZWZpbmUgU0hBMUhBTkRTT0ZGICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4JCS8qIEZvciBodG9ubC9udG9obC9odG9ucy9udG9ocyAqLworCisvKiAjaW5jbHVkZSA8cHJvY2Vzcy5oPiAqLwkvKiBwcm90b3R5cGUgZm9yIGV4aXQoKSAtIEpIQiAqLworLyogVXNpbmcgcmV0dXJuKCkgaW5zdGVhZCBvZiBleGl0KCkgLSBTV1IgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHN0YXRlWzVdOworICAgIHVpbnQzMl90IGNvdW50WzJdOworICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XTsKK30gU0hBMV9DVFg7CisKK3ZvaWQgU0hBMVRyYW5zZm9ybSh1aW50MzJfdCBzdGF0ZVs1XSwgdW5zaWduZWQgY2hhciBidWZmZXJbNjRdKTsKK3ZvaWQgU0hBMUluaXQoU0hBMV9DVFgqIGNvbnRleHQpOwordm9pZCBTSEExVXBkYXRlKFNIQTFfQ1RYKiBjb250ZXh0LCB1bnNpZ25lZCBjaGFyKiBkYXRhLCB1aW50MzJfdCBsZW4pOwkvKgorSkhCICovCit2b2lkIFNIQTFGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFsyMF0sIFNIQTFfQ1RYKiBjb250ZXh0KTsKKworI2RlZmluZSByb2wodmFsdWUsIGJpdHMpICgoKHZhbHVlKSA8PCAoYml0cykpIHwgKCh2YWx1ZSkgPj4gKDMyIC0gKGJpdHMpKSkpCisKKy8qIGJsazAoKSBhbmQgYmxrKCkgcGVyZm9ybSB0aGUgaW5pdGlhbCBleHBhbmQuICovCisvKiBJIGdvdCB0aGUgaWRlYSBvZiBleHBhbmRpbmcgZHVyaW5nIHRoZSByb3VuZCBmdW5jdGlvbiBmcm9tIFNTTGVheSAqLworI2RlZmluZSBibGswKGkpIChibG9jay0+bFtpXSA9IG50b2hsKGJsb2NrLT5sW2ldKSkKKyNkZWZpbmUgYmxrKGkpIChibG9jay0+bFtpJjE1XSA9IHJvbChibG9jay0+bFsoaSsxMykmMTVdXmJsb2NrLT5sWyhpKzgpJjE1XSBcCisgICAgXmJsb2NrLT5sWyhpKzIpJjE1XV5ibG9jay0+bFtpJjE1XSwxKSkKKworLyogKFIwK1IxKSwgUjIsIFIzLCBSNCBhcmUgdGhlIGRpZmZlcmVudCBvcGVyYXRpb25zIHVzZWQgaW4gU0hBMSAqLworI2RlZmluZSBSMCh2LHcseCx5LHosaSkgeis9KCh3Jih4XnkpKV55KStibGswKGkpKzB4NUE4Mjc5OTkrcm9sKHYsNSk7dz1yb2wodywzMCk7CisjZGVmaW5lIFIxKHYsdyx4LHkseixpKSB6Kz0oKHcmKHheeSkpXnkpK2JsayhpKSsweDVBODI3OTk5K3JvbCh2LDUpO3c9cm9sKHcsMzApOworI2RlZmluZSBSMih2LHcseCx5LHosaSkgeis9KHdeeF55KStibGsoaSkrMHg2RUQ5RUJBMStyb2wodiw1KTt3PXJvbCh3LDMwKTsKKyNkZWZpbmUgUjModix3LHgseSx6LGkpIHorPSgoKHd8eCkmeSl8KHcmeCkpK2JsayhpKSsweDhGMUJCQ0RDK3JvbCh2LDUpO3c9cm9sKHcsMzApOworI2RlZmluZSBSNCh2LHcseCx5LHosaSkgeis9KHdeeF55KStibGsoaSkrMHhDQTYyQzFENityb2wodiw1KTt3PXJvbCh3LDMwKTsKKworCisjaWZkZWYgVkVSQk9TRSAgLyogU0FLICovCit2b2lkIFNIQVByaW50Q29udGV4dChTSEExX0NUWCAqY29udGV4dCwgY2hhciAqbXNnKXsKKyAgcHJpbnRmKCIlcyAoJWQsJWQpICV4ICV4ICV4ICV4ICV4XG4iLAorCSBtc2csCisJIGNvbnRleHQtPmNvdW50WzBdLCBjb250ZXh0LT5jb3VudFsxXSwKKwkgY29udGV4dC0+c3RhdGVbMF0sCisJIGNvbnRleHQtPnN0YXRlWzFdLAorCSBjb250ZXh0LT5zdGF0ZVsyXSwKKwkgY29udGV4dC0+c3RhdGVbM10sCisJIGNvbnRleHQtPnN0YXRlWzRdKTsKK30KKyNlbmRpZgorCisvKiBIYXNoIGEgc2luZ2xlIDUxMi1iaXQgYmxvY2suIFRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gKi8KKwordm9pZCBTSEExVHJhbnNmb3JtKHVpbnQzMl90IHN0YXRlWzVdLCB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF0pCit7Cit1aW50MzJfdCBhLCBiLCBjLCBkLCBlOwordHlwZWRlZiB1bmlvbiB7CisgICAgdW5zaWduZWQgY2hhciBjWzY0XTsKKyAgICB1aW50MzJfdCBsWzE2XTsKK30gQ0hBUjY0TE9ORzE2OworQ0hBUjY0TE9ORzE2KiBibG9jazsKKyNpZmRlZiBTSEExSEFORFNPRkYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdvcmtzcGFjZVs2NF07CisgICAgYmxvY2sgPSAoQ0hBUjY0TE9ORzE2Kil3b3Jrc3BhY2U7CisgICAgbWVtY3B5KGJsb2NrLCBidWZmZXIsIDY0KTsKKyNlbHNlCisgICAgYmxvY2sgPSAoQ0hBUjY0TE9ORzE2KilidWZmZXI7CisjZW5kaWYKKyAgICAvKiBDb3B5IGNvbnRleHQtPnN0YXRlW10gdG8gd29ya2luZyB2YXJzICovCisgICAgYSA9IHN0YXRlWzBdOworICAgIGIgPSBzdGF0ZVsxXTsKKyAgICBjID0gc3RhdGVbMl07CisgICAgZCA9IHN0YXRlWzNdOworICAgIGUgPSBzdGF0ZVs0XTsKKyAgICAvKiA0IHJvdW5kcyBvZiAyMCBvcGVyYXRpb25zIGVhY2guIExvb3AgdW5yb2xsZWQuICovCisgICAgUjAoYSxiLGMsZCxlLCAwKTsgUjAoZSxhLGIsYyxkLCAxKTsgUjAoZCxlLGEsYixjLCAyKTsgUjAoYyxkLGUsYSxiLCAzKTsKKyAgICBSMChiLGMsZCxlLGEsIDQpOyBSMChhLGIsYyxkLGUsIDUpOyBSMChlLGEsYixjLGQsIDYpOyBSMChkLGUsYSxiLGMsIDcpOworICAgIFIwKGMsZCxlLGEsYiwgOCk7IFIwKGIsYyxkLGUsYSwgOSk7IFIwKGEsYixjLGQsZSwxMCk7IFIwKGUsYSxiLGMsZCwxMSk7CisgICAgUjAoZCxlLGEsYixjLDEyKTsgUjAoYyxkLGUsYSxiLDEzKTsgUjAoYixjLGQsZSxhLDE0KTsgUjAoYSxiLGMsZCxlLDE1KTsKKyAgICBSMShlLGEsYixjLGQsMTYpOyBSMShkLGUsYSxiLGMsMTcpOyBSMShjLGQsZSxhLGIsMTgpOyBSMShiLGMsZCxlLGEsMTkpOworICAgIFIyKGEsYixjLGQsZSwyMCk7IFIyKGUsYSxiLGMsZCwyMSk7IFIyKGQsZSxhLGIsYywyMik7IFIyKGMsZCxlLGEsYiwyMyk7CisgICAgUjIoYixjLGQsZSxhLDI0KTsgUjIoYSxiLGMsZCxlLDI1KTsgUjIoZSxhLGIsYyxkLDI2KTsgUjIoZCxlLGEsYixjLDI3KTsKKyAgICBSMihjLGQsZSxhLGIsMjgpOyBSMihiLGMsZCxlLGEsMjkpOyBSMihhLGIsYyxkLGUsMzApOyBSMihlLGEsYixjLGQsMzEpOworICAgIFIyKGQsZSxhLGIsYywzMik7IFIyKGMsZCxlLGEsYiwzMyk7IFIyKGIsYyxkLGUsYSwzNCk7IFIyKGEsYixjLGQsZSwzNSk7CisgICAgUjIoZSxhLGIsYyxkLDM2KTsgUjIoZCxlLGEsYixjLDM3KTsgUjIoYyxkLGUsYSxiLDM4KTsgUjIoYixjLGQsZSxhLDM5KTsKKyAgICBSMyhhLGIsYyxkLGUsNDApOyBSMyhlLGEsYixjLGQsNDEpOyBSMyhkLGUsYSxiLGMsNDIpOyBSMyhjLGQsZSxhLGIsNDMpOworICAgIFIzKGIsYyxkLGUsYSw0NCk7IFIzKGEsYixjLGQsZSw0NSk7IFIzKGUsYSxiLGMsZCw0Nik7IFIzKGQsZSxhLGIsYyw0Nyk7CisgICAgUjMoYyxkLGUsYSxiLDQ4KTsgUjMoYixjLGQsZSxhLDQ5KTsgUjMoYSxiLGMsZCxlLDUwKTsgUjMoZSxhLGIsYyxkLDUxKTsKKyAgICBSMyhkLGUsYSxiLGMsNTIpOyBSMyhjLGQsZSxhLGIsNTMpOyBSMyhiLGMsZCxlLGEsNTQpOyBSMyhhLGIsYyxkLGUsNTUpOworICAgIFIzKGUsYSxiLGMsZCw1Nik7IFIzKGQsZSxhLGIsYyw1Nyk7IFIzKGMsZCxlLGEsYiw1OCk7IFIzKGIsYyxkLGUsYSw1OSk7CisgICAgUjQoYSxiLGMsZCxlLDYwKTsgUjQoZSxhLGIsYyxkLDYxKTsgUjQoZCxlLGEsYixjLDYyKTsgUjQoYyxkLGUsYSxiLDYzKTsKKyAgICBSNChiLGMsZCxlLGEsNjQpOyBSNChhLGIsYyxkLGUsNjUpOyBSNChlLGEsYixjLGQsNjYpOyBSNChkLGUsYSxiLGMsNjcpOworICAgIFI0KGMsZCxlLGEsYiw2OCk7IFI0KGIsYyxkLGUsYSw2OSk7IFI0KGEsYixjLGQsZSw3MCk7IFI0KGUsYSxiLGMsZCw3MSk7CisgICAgUjQoZCxlLGEsYixjLDcyKTsgUjQoYyxkLGUsYSxiLDczKTsgUjQoYixjLGQsZSxhLDc0KTsgUjQoYSxiLGMsZCxlLDc1KTsKKyAgICBSNChlLGEsYixjLGQsNzYpOyBSNChkLGUsYSxiLGMsNzcpOyBSNChjLGQsZSxhLGIsNzgpOyBSNChiLGMsZCxlLGEsNzkpOworICAgIC8qIEFkZCB0aGUgd29ya2luZyB2YXJzIGJhY2sgaW50byBjb250ZXh0LnN0YXRlW10gKi8KKyAgICBzdGF0ZVswXSArPSBhOworICAgIHN0YXRlWzFdICs9IGI7CisgICAgc3RhdGVbMl0gKz0gYzsKKyAgICBzdGF0ZVszXSArPSBkOworICAgIHN0YXRlWzRdICs9IGU7CisgICAgLyogV2lwZSB2YXJpYWJsZXMgKi8KKyAgICBhID0gYiA9IGMgPSBkID0gZSA9IDA7Cit9CisKKworLyogU0hBMUluaXQgLSBJbml0aWFsaXplIG5ldyBjb250ZXh0ICovCisKK3ZvaWQgU0hBMUluaXQoU0hBMV9DVFgqIGNvbnRleHQpCit7CisgICAgLyogU0hBMSBpbml0aWFsaXphdGlvbiBjb25zdGFudHMgKi8KKyAgICBjb250ZXh0LT5zdGF0ZVswXSA9IDB4Njc0NTIzMDE7CisgICAgY29udGV4dC0+c3RhdGVbMV0gPSAweEVGQ0RBQjg5OworICAgIGNvbnRleHQtPnN0YXRlWzJdID0gMHg5OEJBRENGRTsKKyAgICBjb250ZXh0LT5zdGF0ZVszXSA9IDB4MTAzMjU0NzY7CisgICAgY29udGV4dC0+c3RhdGVbNF0gPSAweEMzRDJFMUYwOworICAgIGNvbnRleHQtPmNvdW50WzBdID0gY29udGV4dC0+Y291bnRbMV0gPSAwOworfQorCisKKy8qIFJ1biB5b3VyIGRhdGEgdGhyb3VnaCB0aGlzLiAqLworCit2b2lkIFNIQTFVcGRhdGUoU0hBMV9DVFgqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIHVpbnQzMl90IGxlbikJLyoKK0pIQiAqLworewordWludDMyX3QgaSwgajsJLyogSkhCICovCisKKyNpZmRlZiBWRVJCT1NFCisgICAgU0hBUHJpbnRDb250ZXh0KGNvbnRleHQsICJiZWZvcmUiKTsKKyNlbmRpZgorICAgIGogPSAoY29udGV4dC0+Y291bnRbMF0gPj4gMykgJiA2MzsKKyAgICBpZiAoKGNvbnRleHQtPmNvdW50WzBdICs9IGxlbiA8PCAzKSA8IChsZW4gPDwgMykpIGNvbnRleHQtPmNvdW50WzFdKys7CisgICAgY29udGV4dC0+Y291bnRbMV0gKz0gKGxlbiA+PiAyOSk7CisgICAgaWYgKChqICsgbGVuKSA+IDYzKSB7CisgICAgICAgIG1lbWNweSgmY29udGV4dC0+YnVmZmVyW2pdLCBkYXRhLCAoaSA9IDY0LWopKTsKKyAgICAgICAgU0hBMVRyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKyAgICAgICAgZm9yICggOyBpICsgNjMgPCBsZW47IGkgKz0gNjQpIHsKKyAgICAgICAgICAgIFNIQTFUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsICZkYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICBqID0gMDsKKyAgICB9CisgICAgZWxzZSBpID0gMDsKKyAgICBtZW1jcHkoJmNvbnRleHQtPmJ1ZmZlcltqXSwgJmRhdGFbaV0sIGxlbiAtIGkpOworI2lmZGVmIFZFUkJPU0UKKyAgICBTSEFQcmludENvbnRleHQoY29udGV4dCwgImFmdGVyICIpOworI2VuZGlmCit9CisKKworLyogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QuICovCisKK3ZvaWQgU0hBMUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXSwgU0hBMV9DVFgqIGNvbnRleHQpCit7Cit1aW50MzJfdCBpOwkvKiBKSEIgKi8KK3Vuc2lnbmVkIGNoYXIgZmluYWxjb3VudFs4XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZmluYWxjb3VudFtpXSA9ICh1bnNpZ25lZCBjaGFyKSgoY29udGV4dC0+Y291bnRbKGkgPj0gNCA/IDAgOiAxKV0KKyAgICAgICAgID4+ICgoMy0oaSAmIDMpKSAqIDgpICkgJiAyNTUpOyAgLyogRW5kaWFuIGluZGVwZW5kZW50ICovCisgICAgfQorICAgIFNIQTFVcGRhdGUoY29udGV4dCwgKHVuc2lnbmVkIGNoYXIgKikiXDIwMCIsIDEpOworICAgIHdoaWxlICgoY29udGV4dC0+Y291bnRbMF0gJiA1MDQpICE9IDQ0OCkgeworICAgICAgICBTSEExVXBkYXRlKGNvbnRleHQsICh1bnNpZ25lZCBjaGFyICopIlwwIiwgMSk7CisgICAgfQorICAgIFNIQTFVcGRhdGUoY29udGV4dCwgZmluYWxjb3VudCwgOCk7ICAvKiBTaG91bGQgY2F1c2UgYSBTSEExVHJhbnNmb3JtKCkKKyovCisgICAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgZGlnZXN0W2ldID0gKHVuc2lnbmVkIGNoYXIpCisgICAgICAgICAoKGNvbnRleHQtPnN0YXRlW2k+PjJdID4+ICgoMy0oaSAmIDMpKSAqIDgpICkgJiAyNTUpOworICAgIH0KKyAgICAvKiBXaXBlIHZhcmlhYmxlcyAqLworICAgIGkgPSAwOwkvKiBKSEIgKi8KKyAgICBtZW1zZXQoY29udGV4dC0+YnVmZmVyLCAwLCA2NCk7CisgICAgbWVtc2V0KGNvbnRleHQtPnN0YXRlLCAwLCAyMCk7CisgICAgbWVtc2V0KGNvbnRleHQtPmNvdW50LCAwLCA4KTsKKyAgICBtZW1zZXQoZmluYWxjb3VudCwgMCwgOCk7CS8qIFNXUiAqLworI2lmZGVmIFNIQTFIQU5EU09GRiAgLyogbWFrZSBTSEExVHJhbnNmb3JtIG92ZXJ3cml0ZSBpdCdzIG93biBzdGF0aWMgdmFycyAqLworICAgIFNIQTFUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgbm90IHF1aXRlIHRoZSBNSU1FIGJhc2U2NCBhbGdvcml0aG06IGl0IHVzZXMgXyBpbnN0ZWFkIG9mIC8sCisgICBhbmQgaW5zdGVhZCBvZiBwYWRkaW5nIHRoZSBvdXRwdXQgd2l0aCA9IGNoYXJhY3RlcnMgd2UganVzdCBtYWtlIHRoZQorICAgb3V0cHV0IHNob3J0ZXIuICovCitjaGFyICpteWJhc2U2NCh1aW50OF90IGRpZ2VzdFsyMF0pCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIGNoYXJ6W10gPQorICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIjsKKyAgdWludDhfdCBpbnB1dFsyMV07CisgIHN0YXRpYyBjaGFyIG91dHB1dFsyOF07CisgIGludCBpLCBqOworICB1aW50OF90ICpwOworICBjaGFyICpxOworICB1aW50MzJfdCBidjsKKworICBtZW1jcHkoaW5wdXQsIGRpZ2VzdCwgMjApOworICBpbnB1dFsyMF0gPSAwOwkJLyogUGFkIHRvIG11bHRpcGxlIG9mIDMgYnl0ZXMgKi8KKworICBwID0gaW5wdXQ7ICBxID0gb3V0cHV0OworICBmb3IgKCBpID0gMCA7IGkgPCA3IDsgaSsrICkgeworICAgIGJ2ID0gKHBbMF0gPDwgMTYpIHwgKHBbMV0gPDwgOCkgfCBwWzJdOworICAgIHAgKz0gMzsKKyAgICBmb3IgKCBqID0gMCA7IGogPCA0IDsgaisrICkgeworICAgICAgKnErKyA9IGNoYXJ6WyhidiA+PiAxOCkgJiAweDNmXTsKKyAgICAgIGJ2IDw8PSA2OworICAgIH0KKyAgfQorICAqLS1xID0gJ1wwJzsJCQkvKiBUaGUgbGFzdCBjaGFyYWN0ZXIgaXMgbm90IHNpZ25pZmljYW50ICovCisgIHJldHVybiBvdXRwdXQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgaW50IGk7CisgIFNIQTFfQ1RYIGNvbnRleHQ7CisgIHVpbnQ4X3QgZGlnZXN0WzIwXSwgYnVmZmVyWzE2Mzg0XTsKKyAgRklMRSogZmlsZTsKKworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBmaWxlID0gc3RkaW47CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCEoZmlsZSA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpKSkgeworICAgICAgZnB1dHMoIlVuYWJsZSB0byBvcGVuIGZpbGUuIiwgc3RkZXJyKTsKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorICB9CisgIFNIQTFJbml0KCZjb250ZXh0KTsKKyAgd2hpbGUgKCFmZW9mKGZpbGUpKSB7ICAvKiBub3RlOiB3aGF0IGlmIGZlcnJvcihmaWxlKSAqLworICAgIGkgPSBmcmVhZChidWZmZXIsIDEsIDE2Mzg0LCBmaWxlKTsKKyAgICBTSEExVXBkYXRlKCZjb250ZXh0LCBidWZmZXIsIGkpOworICB9CisgIFNIQTFGaW5hbChkaWdlc3QsICZjb250ZXh0KTsKKyAgZmNsb3NlKGZpbGUpOworCisgIHB1dHMobXliYXNlNjQoZGlnZXN0KSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2htX29wZW4uYyBiL3Vzci9rbGliYy9zaG1fb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTkzYWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2htX29wZW4uYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogc2htX29wZW4uYworICoKKyAqIFBPU0lYIHNoYXJlZCBtZW1vcnkgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisKK2ludCBzaG1fb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgb2ZsYWcsIG1vZGVfdCBtb2RlKQoreworCWludCBsZW4gPSBzdHJsZW4ocGF0aCk7CisJY2hhciAqcGF0aGJ1ZiA9IGFsbG9jYShsZW4rMTApOworCisJbWVtY3B5KHBhdGhidWYsICIvZGV2L3NobS8iLCA5KTsKKwltZW1jcHkocGF0aGJ1Zis5LCBwYXRoLCBsZW4rMSk7CisKKwlyZXR1cm4gb3Blbl9jbG9leGVjKHBhdGgsIG9mbGFnLCBtb2RlKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zaG1fdW5saW5rLmMgYi91c3Iva2xpYmMvc2htX3VubGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTk4YTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2htX3VubGluay5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBzaG1fdW5saW5rLmMKKyAqCisgKiBQT1NJWCBzaGFyZWQgbWVtb3J5IHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworCitpbnQgc2htX3VubGluayhjb25zdCBjaGFyICpwYXRoKQoreworCWludCBsZW4gPSBzdHJsZW4ocGF0aCk7CisJY2hhciAqcGF0aGJ1ZiA9IGFsbG9jYShsZW4rMTApOworCisJbWVtY3B5KHBhdGhidWYsICIvZGV2L3NobS8iLCA5KTsKKwltZW1jcHkocGF0aGJ1Zis5LCBwYXRoLCBsZW4rMSk7CisKKwlyZXR1cm4gdW5saW5rKHBhdGgpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NpZ2FiYnJldi5jIGIvdXNyL2tsaWJjL3NpZ2FiYnJldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTc5OWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2lnYWJicmV2LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBzaWdhYmJyZXYuaAorICoKKyAqIENvbnN0cnVjdCB0aGUgYWJicmV2aWF0ZWQgc2lnbmFsIGxpc3QKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2NvbnN0IGNoYXIgKmNvbnN0IHN5c19zaWdhYmJyZXZbTlNJR10gPSB7CisjaWZkZWYgU0lHQUJSVAorCVtTSUdBQlJUXSA9ICJBQlJUIiwKKyNlbmRpZgorI2lmZGVmIFNJR0FMUk0KKwlbU0lHQUxSTV0gPSAiQUxSTSIsCisjZW5kaWYKKyNpZmRlZiBTSUdCVVMKKwlbU0lHQlVTXSA9ICJCVVMiLAorI2VuZGlmCisjaWZkZWYgU0lHQ0hMRAorCVtTSUdDSExEXSA9ICJDSExEIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHQ0xEKSAmJiAoU0lHQ0hMRCAhPSBTSUdDTEQpCisJW1NJR0NMRF0gPSAiQ0xEIiwKKyNlbmRpZgorI2lmZGVmIFNJR0VNVAorCVtTSUdFTVRdID0gIkVNVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdGUEUKKwlbU0lHRlBFXSA9ICJGUEUiLAorI2VuZGlmCisjaWZkZWYgU0lHSFVQCisJW1NJR0hVUF0gPSAiSFVQIiwKKyNlbmRpZgorI2lmZGVmIFNJR0lMTAorCVtTSUdJTExdID0gIklMTCIsCisjZW5kaWYKKwkvKiBTSUdJTkZPID09IFNJR1BXUiAqLworI2lmZGVmIFNJR0lOVAorCVtTSUdJTlRdID0gIklOVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdJTworCVtTSUdJT10gPSAiSU8iLAorI2VuZGlmCisjaWYgZGVmaW5lZChTSUdJT1QpICYmIChTSUdJT1QgIT0gU0lHQUJSVCkKKwlbU0lHSU9UXSA9ICJJT1QiLAorI2VuZGlmCisjaWZkZWYgU0lHS0lMTAorCVtTSUdLSUxMXSA9ICJLSUxMIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHTE9TVCkgJiYgKFNJR0xPU1QgIT0gU0lHSU8pICYmIChTSUdMT1NUICE9IFNJR1BXUikKKwlbU0lHTE9TVF0gPSAiTE9TVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdQSVBFCisJW1NJR1BJUEVdID0gIlBJUEUiLAorI2VuZGlmCisjaWYgZGVmaW5lZChTSUdQT0xMKSAmJiAoU0lHUE9MTCAhPSBTSUdJTykKKwlbU0lHUE9MTF0gPSAiUE9MTCIsCisjZW5kaWYKKyNpZmRlZiBTSUdQUk9GCisJW1NJR1BST0ZdID0gIlBST0YiLAorI2VuZGlmCisjaWZkZWYgU0lHUFdSCisJW1NJR1BXUl0gPSAiUFdSIiwKKyNlbmRpZgorI2lmZGVmIFNJR1FVSVQKKwlbU0lHUVVJVF0gPSAiUVVJVCIsCisjZW5kaWYKKwkvKiBTSUdSRVNFUlZFID09IFNJR1VOVVNFRCAqLworI2lmZGVmIFNJR1NFR1YKKwlbU0lHU0VHVl0gPSAiU0VHViIsCisjZW5kaWYKKyNpZmRlZiBTSUdTVEtGTFQKKwlbU0lHU1RLRkxUXSA9ICJTVEtGTFQiLAorI2VuZGlmCisjaWZkZWYgU0lHU1RPUAorCVtTSUdTVE9QXSA9ICJTVE9QIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NZUworCVtTSUdTWVNdID0gIlNZUyIsCisjZW5kaWYKKyNpZmRlZiBTSUdURVJNCisJW1NJR1RFUk1dID0gIlRFUk0iLAorI2VuZGlmCisjaWZkZWYgU0lHVFNUUAorCVtTSUdUU1RQXSA9ICJUU1RQIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RUSU4KKwlbU0lHVFRJTl0gPSAiVFRJTiIsCisjZW5kaWYKKyNpZmRlZiBTSUdUVE9VCisJW1NJR1RUT1VdID0gIlRUT1UiLAorI2VuZGlmCisjaWZkZWYgU0lHVVJHCisJW1NJR1VSR10gPSAiVVJHIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjEKKwlbU0lHVVNSMV0gPSAiVVNSMSIsCisjZW5kaWYKKyNpZmRlZiBTSUdVU1IyCisJW1NJR1VTUjJdID0gIlVTUjIiLAorI2VuZGlmCisjaWZkZWYgU0lHVlRBTFJNCisJW1NJR1ZUQUxSTV0gPSAiVlRBTFJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR1dJTkNICisJW1NJR1dJTkNIXSA9ICJXSU5DSCIsCisjZW5kaWYKKyNpZmRlZiBTSUdYQ1BVCisJW1NJR1hDUFVdID0gIlhDUFUiLAorI2VuZGlmCisjaWZkZWYgU0lHWEZTWgorCVtTSUdYRlNaXSA9ICJYRlNaIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RSQVAKKwlbU0lHVFJBUF0gPSAiVFJBUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdDT05UCisJW1NJR0NPTlRdID0gIkNPTlQiLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NpZ2FjdGlvbi5jIGIvdXNyL2tsaWJjL3NpZ2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGMzYWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2lnYWN0aW9uLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIHNpZ2FjdGlvbi5jCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CisKK19fZXh0ZXJuIHZvaWQgX19zaWdyZXR1cm4odm9pZCk7CitfX2V4dGVybiBpbnQgX19zaWdhY3Rpb24oaW50LCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICosIHN0cnVjdCBzaWdhY3Rpb24gKik7CisjaWZkZWYgX19zcGFyY19fCitfX2V4dGVybiBpbnQgX19ydF9zaWdhY3Rpb24oaW50LCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICosIHN0cnVjdCBzaWdhY3Rpb24gKiwKKwkJCSAgICB2b2lkICgqKSh2b2lkKSwgc2l6ZV90KTsKKyNlbHNlCitfX2V4dGVybiBpbnQgX19ydF9zaWdhY3Rpb24oaW50LCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICosIHN0cnVjdCBzaWdhY3Rpb24gKiwKKwkJCSAgICBzaXplX3QpOworI2VuZGlmCisKK2ludCBzaWdhY3Rpb24oaW50IHNpZywgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvYWN0KQoreworCWludCBydjsKKworI2lmIF9LTElCQ19ORUVEU19TQV9SRVNUT1JFUgorCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwlpZiAoYWN0ICYmICEoYWN0LT5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSkgeworCQlzYSA9ICphY3Q7CisJCWFjdCA9ICZzYTsKKworCQkvKiBUaGUga2VybmVsIGNhbid0IGJlIHRydXN0ZWQgdG8gaGF2ZSBhIHZhbGlkIGRlZmF1bHQKKwkJICAgcmVzdG9yZXIgKi8KKwkJc2Euc2FfZmxhZ3MgfD0gU0FfUkVTVE9SRVI7CisJCXNhLnNhX3Jlc3RvcmVyID0gJl9fc2lncmV0dXJuOworCX0KKyNlbmRpZgorCisjaWYgX0tMSUJDX1VTRV9SVF9TSUcKKyMgaWZkZWYgX19zcGFyY19fCisJeworCQl2b2lkICgqcmVzdG9yZXIpKHZvaWQpOworCQlyZXN0b3JlciA9IChhY3QgJiYgYWN0LT5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKQorCQkJPyAodm9pZCAoKikodm9pZCkpKCh1aW50cHRyX3QpYWN0LT5zYV9yZXN0b3JlciAtIDgpCisJCQk6IE5VTEw7CisJCXJ2ID0gX19ydF9zaWdhY3Rpb24oc2lnLCBhY3QsIG9hY3QsIHJlc3RvcmVyLCBzaXplb2Yoc2lnc2V0X3QpKTsKKwl9CisjIGVsc2UKKwlydiA9IF9fcnRfc2lnYWN0aW9uKHNpZywgYWN0LCBvYWN0LCBzaXplb2Yoc2lnc2V0X3QpKTsKKyMgZW5kaWYKKyNlbHNlCisJcnYgPSBfX3NpZ2FjdGlvbihzaWcsIGFjdCwgb2FjdCk7CisjZW5kaWYKKworI2lmIF9LTElCQ19ORUVEU19TQV9SRVNUT1JFUgorCWlmIChvYWN0ICYmIChvYWN0LT5zYV9yZXN0b3JlciA9PSAmX19zaWdyZXR1cm4pKSB7CisJCW9hY3QtPnNhX2ZsYWdzICY9IH5TQV9SRVNUT1JFUjsKKwl9CisjZW5kaWYKKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zaWdsaXN0LmMgYi91c3Iva2xpYmMvc2lnbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTAwNDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2lnbGlzdC5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogc2lnbGlzdC5oCisgKgorICogQ29uc3RydWN0IHRoZSBzaWduYWwgbGlzdAorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworY29uc3QgY2hhciAqY29uc3Qgc3lzX3NpZ2xpc3RbTlNJR10gPSB7CisjaWZkZWYgU0lHQUJSVAorCVtTSUdBQlJUXSA9ICJBYm9ydGVkIiwKKyNlbmRpZgorI2lmZGVmIFNJR0FMUk0KKwlbU0lHQUxSTV0gPSAiQWxhcm0gY2xvY2siLAorI2VuZGlmCisjaWZkZWYgU0lHQlVTCisJW1NJR0JVU10gPSAiQnVzIGVycm9yIiwKKyNlbmRpZgorI2lmZGVmIFNJR0NITEQKKwlbU0lHQ0hMRF0gPSAiQ2hpbGQgZXhpdGVkIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHQ0xEKSAmJiAoU0lHQ0hMRCAhPSBTSUdDTEQpCisJW1NJR0NMRF0gPSAiQ2hpbGQgZXhpdGVkIiwKKyNlbmRpZgorI2lmZGVmIFNJR0VNVAorCVtTSUdFTVRdID0gIkVtdWxhdGlvbiB0cmFwIiwKKyNlbmRpZgorI2lmZGVmIFNJR0ZQRQorCVtTSUdGUEVdID0gIkZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiIsCisjZW5kaWYKKyNpZmRlZiBTSUdIVVAKKwlbU0lHSFVQXSA9ICJIYW5ndXAiLAorI2VuZGlmCisjaWZkZWYgU0lHSUxMCisJW1NJR0lMTF0gPSAiSWxsZWdhbCBpbnN0cnVjdGlvbiIsCisjZW5kaWYKKwkvKiBTSUdJTkZPID09IFNJR1BXUiAqLworI2lmZGVmIFNJR0lOVAorCVtTSUdJTlRdID0gIkludGVycnVwdCIsCisjZW5kaWYKKyNpZmRlZiBTSUdJTworCVtTSUdJT10gPSAiSS9PIHBvc3NpYmxlIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHSU9UKSAmJiAoU0lHSU9UICE9IFNJR0FCUlQpCisJW1NJR0lPVF0gPSAiSS9PIHRyYXAiLAorI2VuZGlmCisjaWZkZWYgU0lHS0lMTAorCVtTSUdLSUxMXSA9ICJLaWxsZWQiLAorI2VuZGlmCisjaWYgZGVmaW5lZChTSUdMT1NUKSAmJiAoU0lHTE9TVCAhPSBTSUdJTykgJiYgKFNJR0xPU1QgIT0gU0lHUFdSKQorCVtTSUdMT1NUXSA9ICJMb2NrIGxvc3QiLAorI2VuZGlmCisjaWZkZWYgU0lHUElQRQorCVtTSUdQSVBFXSA9ICJCcm9rZW4gcGlwZSIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJR1BPTEwpICYmIChTSUdQT0xMICE9IFNJR0lPKQorCVtTSUdQT0xMXSA9ICJQb2xsYWJsZSBldmVudCIsCisjZW5kaWYKKyNpZmRlZiBTSUdQUk9GCisJW1NJR1BST0ZdID0gIlByb2ZpbGluZyB0aW1lciBleHBpcmVkIiwKKyNlbmRpZgorI2lmZGVmIFNJR1BXUgorCVtTSUdQV1JdID0gIlBvd2VyIGZhaWx1cmUiLAorI2VuZGlmCisjaWZkZWYgU0lHUVVJVAorCVtTSUdRVUlUXSA9ICJRdWl0IiwKKyNlbmRpZgorCS8qIFNJR1JFU0VSVkUgPT0gU0lHVU5VU0VEICovCisjaWZkZWYgU0lHU0VHVgorCVtTSUdTRUdWXSA9ICJTZWdtZW50IHZpb2xhdGlvbiIsCisjZW5kaWYKKyNpZmRlZiBTSUdTVEtGTFQKKwlbU0lHU1RLRkxUXSA9ICJTdGFjayBmYXVsdCIsCisjZW5kaWYKKyNpZmRlZiBTSUdTVE9QCisJW1NJR1NUT1BdID0gIlN0b3BwZWQgKHNpZ25hbCkiLAorI2VuZGlmCisjaWZkZWYgU0lHU1lTCisJW1NJR1NZU10gPSAiQmFkIHN5c3RlbSBjYWxsIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RFUk0KKwlbU0lHVEVSTV0gPSAiVGVybWluYXRlZCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUU1RQCisJW1NJR1RTVFBdID0gIlN0b3BwZWQiLAorI2VuZGlmCisjaWZkZWYgU0lHVFRJTgorCVtTSUdUVElOXSA9ICJTdG9wcGVkICh0dHkgaW5wdXQpIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RUT1UKKwlbU0lHVFRPVV0gPSAiU3RvcHBlZCAodHR5IG91dHB1dCkiLAorI2VuZGlmCisjaWZkZWYgU0lHVVJHCisJW1NJR1VSR10gPSAiVXJnZW50IEkvTyBjb25kaXRpb24iLAorI2VuZGlmCisjaWZkZWYgU0lHVVNSMQorCVtTSUdVU1IxXSA9ICJVc2VyIHNpZ25hbCAxIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjIKKwlbU0lHVVNSMl0gPSAiVXNlciBzaWduYWwgMiIsCisjZW5kaWYKKyNpZmRlZiBTSUdWVEFMUk0KKwlbU0lHVlRBTFJNXSA9ICJWaXJ0dWFsIHRpbWVyIGV4cGlyZWQiLAorI2VuZGlmCisjaWZkZWYgU0lHV0lOQ0gKKwlbU0lHV0lOQ0hdID0gIldpbmRvdyBzaXplIGNoYW5nZWQiLAorI2VuZGlmCisjaWZkZWYgU0lHWENQVQorCVtTSUdYQ1BVXSA9ICJDUFUgdGltZSBsaW1pdCBleGNlZWRlZCIsCisjZW5kaWYKKyNpZmRlZiBTSUdYRlNaCisJW1NJR1hGU1pdID0gIkZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUUkFQCisJW1NJR1RSQVBdID0gIlRyYWNlL2JyZWFrcG9pbnQgdHJhcCIsCisjZW5kaWYKKyNpZmRlZiBTSUdDT05UCisJW1NJR0NPTlRdID0gIkNvbnRpbnVlIiwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zaWdsb25nam1wLmMgYi91c3Iva2xpYmMvc2lnbG9uZ2ptcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDQyY2IKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2lnbG9uZ2ptcC5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBzaWdsb25nam1wLmMKKyAqCisgKiBzaWdzZXRqbXAoKSBpcyBhIG1hY3JvLCBieSBuZWNlc3NpdHkgKGl0J3MgZWl0aGVyIHRoYXQgb3Igd3JpdGUKKyAqIGl0IGluIGFzc2VtYmx5KSwgYnV0IHNpZ2xvbmdqbXAoKSBpcyBhIG5vcm1hbCBmdW5jdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK19fbm9yZXR1cm4gc2lnbG9uZ2ptcChzaWdqbXBfYnVmIGJ1ZiwgaW50IHJldHZhbCkKK3sKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmJ1Zi0+X19zaWdzLCBOVUxMKTsKKwlsb25nam1wKGJ1Zi0+X19qbXBidWYsIHJldHZhbCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2lncGVuZGluZy5jIGIvdXNyL2tsaWJjL3NpZ3BlbmRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmZkM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NpZ3BlbmRpbmcuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogc2lncGVuZGluZy5jCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CisKKyNpZiBfS0xJQkNfVVNFX1JUX1NJRworCitfX2V4dGVybiBpbnQgX19ydF9zaWdwZW5kaW5nKHNpZ3NldF90ICosIHNpemVfdCk7CisKK2ludCBzaWdwZW5kaW5nKHNpZ3NldF90ICogc2V0KQoreworCXJldHVybiBfX3J0X3NpZ3BlbmRpbmcoc2V0LCBzaXplb2Yoc2lnc2V0X3QpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2lncHJvY21hc2suYyBiL3Vzci9rbGliYy9zaWdwcm9jbWFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTJjMTMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2lncHJvY21hc2suYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogc2lncHJvY21hc2suYworICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGtsaWJjL3N5c2NvbmZpZy5oPgorCisjaWYgX0tMSUJDX1VTRV9SVF9TSUcKKworX19leHRlcm4gaW50IF9fcnRfc2lncHJvY21hc2soaW50LCBjb25zdCBzaWdzZXRfdCAqLCBzaWdzZXRfdCAqLCBzaXplX3QpOworCitpbnQgc2lncHJvY21hc2soaW50IGhvdywgY29uc3Qgc2lnc2V0X3QgKiBzZXQsIHNpZ3NldF90ICogb3NldCkKK3sKKwlyZXR1cm4gX19ydF9zaWdwcm9jbWFzayhob3csIHNldCwgb3NldCwgc2l6ZW9mKHNpZ3NldF90KSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NpZ3N1c3BlbmQuYyBiL3Vzci9rbGliYy9zaWdzdXNwZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MTBkNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaWdzdXNwZW5kLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHNpZ3N1c3BlbmQuYworICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGtsaWJjL3N5c2NvbmZpZy5oPgorCisjaWYgX0tMSUJDX1VTRV9SVF9TSUcKKworX19leHRlcm4gaW50IF9fcnRfc2lnc3VzcGVuZChjb25zdCBzaWdzZXRfdCAqLCBzaXplX3QpOworCitpbnQgc2lnc3VzcGVuZChjb25zdCBzaWdzZXRfdCAqIG1hc2spCit7CisJcmV0dXJuIF9fcnRfc2lnc3VzcGVuZChtYXNrLCBzaXplb2YgKm1hc2spOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zbGVlcC5jIGIvdXNyL2tsaWJjL3NsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwYzUxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zbGVlcC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBzbGVlcC5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCit1bnNpZ25lZCBpbnQgc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJdHMudHZfc2VjID0gc2Vjb25kczsKKwl0cy50dl9uc2VjID0gMDsKKwlpZiAoIW5hbm9zbGVlcCgmdHMsICZ0cykpCisJCXJldHVybiAwOworCWVsc2UgaWYgKGVycm5vID09IEVJTlRSKQorCQlyZXR1cm4gdHMudHZfc2VjOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NucHJpbnRmLmMgYi91c3Iva2xpYmMvc25wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTNiM2NkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NucHJpbnRmLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIHNucHJpbnRmLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IHNucHJpbnRmKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJ2OworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJcnYgPSB2c25wcmludGYoYnVmZmVyLCBuLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zb2NrZXRjYWxscy5wbCBiL3Vzci9rbGliYy9zb2NrZXRjYWxscy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmY3NWFiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NvY2tldGNhbGxzLnBsCkBAIC0wLDAgKzEsODggQEAKKyMhL3Vzci9iaW4vcGVybAorCiskdiA9ICRFTlZ7J0tCVUlMRF9WRVJCT1NFJ307CiskcXVpZXQgPSBkZWZpbmVkKCR2KSA/ICEkdiA6IDA7CisKK0BhcmdzID0gKCk7Citmb3IgJGFyZyAoIEBBUkdWICkgeworICAgIGlmICggJGFyZyA9fiAvXi0vICkgeworCWlmICggJGFyZyBlcSAnLXEnICkgeworCSAgICAkcXVpZXQgPSAxOworCX0gZWxzZSB7CisJICAgIGRpZSAiJDA6IFVua25vd24gb3B0aW9uOiAkYXJnXG4iOworCX0KKyAgICB9IGVsc2UgeworCXB1c2goQGFyZ3MsICRhcmcpOworICAgIH0KK30KKygkZmlsZSwgJGFyY2gsICRvdXRwdXRkaXIpID0gQGFyZ3M7CisKK2lmICghb3BlbihGSUxFLCAiPCAkZmlsZSIpKSB7CisgICAgZGllICIkZmlsZTogJCFcbiI7Cit9CisKK3ByaW50ICJzb2NrZXRjYWxsLW9ianMgOj0gIjsKK3doaWxlICggZGVmaW5lZCgkbGluZSA9IDxGSUxFPikgKSB7CisgICAgY2hvbXAgJGxpbmU7CisgICAgJGxpbmUgPX4gcy9ccyoofFwjLip8XC9cLy4qKSQvLzsJIyBTdHJpcCBjb21tZW50cyBhbmQgdHJhaWxpbmcgYmxhbmtzCisgICAgbmV4dCB1bmxlc3MgJGxpbmU7CisKKyAgICBpZiAoICRsaW5lID1+IC9eXHMqXDxcP1w+XHMqKC4qKVxzKyhbX2EtekEtWl1bX2EtekEtWjAtOV0rKVxzKlwoKC4qKVwpXHMqXDskLyApIHsKKwkkdHlwZSA9ICQxOworCSRuYW1lID0gJDI7CisJJGFyZ3YgPSAkMzsKKworCUBhcmdzID0gc3BsaXQoL1xzKlwsXHMqLywgJGFyZ3YpOworCUBjYXJncyA9ICgpOworCisJJGkgPSAwOworCWZvciAkYXJnICggQGFyZ3MgKSB7CisJICAgIHB1c2goQGNhcmdzLCAiJGFyZyBhIi4kaSsrKTsKKwl9CisJJG5hcmdzID0gJGk7CisJcHJpbnQgIiBcXFxuXHQke25hbWV9Lm8iOworCisJaWYgKCAkYXJjaCBlcSAnaTM4NicgKSB7CisJICAgIG9wZW4oT1VULCAiPiAke291dHB1dGRpcn0vJHtuYW1lfS5TIikKKwkJb3IgZGllICIkMDogQ2Fubm90IG9wZW4gJHtvdXRwdXRkaXJ9LyR7bmFtZX0uU1xuIjsKKworCSAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxzeXMvc29ja2V0Y2FsbHMuaD5cbiI7CisJICAgIHByaW50IE9VVCAiXG4iOworCSAgICBwcmludCBPVVQgIlx0LnRleHRcbiI7CisJICAgIHByaW50IE9VVCAiXHQuYWxpZ24JNFxuIjsKKwkgICAgcHJpbnQgT1VUICJcdC5nbG9ibAkke25hbWV9XG4iOworCSAgICBwcmludCBPVVQgIlx0LnR5cGUJJHtuYW1lfSxcQGZ1bmN0aW9uXG4iOworCSAgICBwcmludCBPVVQgIiR7bmFtZX06XG4iOworCSAgICBwcmludCBPVVQgIlx0cHVzaGwJXCRTWVNfXFUke25hbWV9XG4iOworCSAgICBwcmludCBPVVQgIlx0am1wCV9fc29ja2V0Y2FsbF9jb21tb25cbiI7CisJICAgIHByaW50IE9VVCAiXHQuc2l6ZSAke25hbWV9LC4tJHtuYW1lfVxuIjsKKwkgICAgY2xvc2UoT1VUKTsKKwl9IGVsc2UgeworCSAgICBvcGVuKE9VVCwgIj4gJHtvdXRwdXRkaXJ9LyR7bmFtZX0uYyIpCisJCW9yIGRpZSAiJDA6IENhbm5vdCBvcGVuICR7b3V0cHV0ZGlyfS8ke25hbWV9LmNcbiI7CisKKwkgICAgcHJpbnQgT1VUICIjaW5jbHVkZSBcInNvY2tldGNvbW1vbi5oXCJcbiI7CisJICAgIHByaW50IE9VVCAiXG4iOworCSAgICBwcmludCBPVVQgIiNpZm5kZWYgX19OUl8ke25hbWV9XG5cbiI7CisKKwkgICAgcHJpbnQgT1VUICJleHRlcm4gbG9uZyBfX3NvY2tldGNhbGwoaW50LCBjb25zdCB1bnNpZ25lZCBsb25nICopO1xuXG4iOworCisJICAgIHByaW50IE9VVCAiJHR5cGUgJG5hbWUgKCIsIGpvaW4oJywgJywgQGNhcmdzKSwgIilcbiI7CisJICAgIHByaW50IE9VVCAie1xuIjsKKwkgICAgcHJpbnQgT1VUICIgICAgdW5zaWduZWQgbG9uZyBhcmdzWyRuYXJnc107XG4iOworCSAgICBmb3IgKCAkaSA9IDAgOyAkaSA8ICRuYXJncyA7ICRpKysgKSB7CisJCXByaW50IE9VVCAiICAgIGFyZ3NbJGldID0gKHVuc2lnbmVkIGxvbmcpYSRpO1xuIjsKKwkgICAgfQorCSAgICBwcmludCBPVVQgIiAgICByZXR1cm4gKCR0eXBlKSBfX3NvY2tldGNhbGwoU1lTX1xVJHtuYW1lfVxFLCBhcmdzKTtcbiI7CisJICAgIHByaW50IE9VVCAifVxuXG4iOworCisJICAgIHByaW50IE9VVCAiI2VuZGlmXG4iOworCisJICAgIGNsb3NlKE9VVCk7CisJfQorICAgIH0gZWxzZSB7CisJZGllICIkZmlsZTokLjogQ291bGQgbm90IHBhcnNlIGlucHV0XG4iOworICAgIH0KK30KKworcHJpbnQgIlxuIjsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zb2NrZXRjYWxscy9LYnVpbGQgYi91c3Iva2xpYmMvc29ja2V0Y2FsbHMvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZmM5YTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc29ja2V0Y2FsbHMvS2J1aWxkCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgR2VuZXJhdGUgc29ja2V0IGNhbGxzIGJhc2VkIG9uIFNPQ0tFVENBTExTLmRlZgorIworCisjIEluY2x1ZGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgTWFrZWZpbGUgZnJhZ21lbnQuCisjIEl0IGNvbnRhaW5zIGRlZmluaXRpb24gb2Ygc29ja2V0Y2FsbC1vYmpzIHNwZWNpZnlpbmcgbmFtZSBvZiBhbGwgLm8gZmlsZXMKK2lmZXEgKCQoY2xlYW4pLCkKKy1pbmNsdWRlICQob2JqKS9zb2NrZXRjYWxscy5taworZW5kaWYKKworIyBMaXN0aW5nIG9mIGFsbCAubyBmaWxlcworYWx3YXlzIDo9IGtsaWIubGlzdAorCisjIyMjIworIyBHZW5lcmF0ZSBzb2NrZXQgY2FsbHMgc3R1YnMKKyMgQmFzZWQgb24gaW5wdXQgZnJvbSBTT0NLRVRDQUxMUy5kZWYgZ2VuZXJhdGUgc29ja2V0IGNhbGwgc3R1YnMKK3RhcmdldHMgICAgIDo9IGtsaWIubGlzdAordGFyZ2V0cyAgICAgKz0gc29ja2V0Y2FsbHMubWsKK3RhcmdldHMJICAgICs9IFNPQ0tFVENBTExTLmkKK3RhcmdldHMgICAgICs9ICQoc29ja2V0Y2FsbC1vYmpzKQorY2xlYW4tZmlsZXMgKz0gKi5TICouYyAqLm8gKi5saXN0CisKK0VYVFJBX0tMSUJDQ0ZMQUdTIDo9IC1JJChzcmN0cmVlKS8kKHNyYykKKworcXVpZXRfY21kX21ha2VsaXN0ID0gTElTVCAgICAkQAorICAgICAgY21kX21ha2VsaXN0ID0gZWNobyAnJChmaWx0ZXItb3V0IEZPUkNFLCReKScgPiAkQAorCisjIENyZWF0ZSBsaXN0IG9mIGFsbCBmaWxlcworJChvYmopL2tsaWIubGlzdDogJChjYWxsIG9iamVjdGlmeSwkKHNvY2tldGNhbGwtb2JqcykpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbWFrZWxpc3QpCisKKyMgR2VuZXJhdGUgYXNzZW1ibGVyIGZpbGUgKC5pKQorIyBXZSBwYXNzIC1hbnNpIHRvIGtlZXAgY3BwIGZyb20gZGVmaW5lIGUuZy4gImkzODYiIGFzIHdlbGwgYXMgIl9faTM4Nl9fIgorcXVpZXRfY21kX3NvY2tldGNhbGwuaSA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9zb2NrZXRjYWxsLmkgPSAkKEtMSUJDQ0MpICQoa2xpYmNjZmxhZ3MpIC1EX19BU1NFTUJMWV9fIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWFuc2kgLXggYyAtRSAtbyAkQCAkPAorJChvYmopL1NPQ0tFVENBTExTLmk6ICQoS0xJQkNTUkMpL1NPQ0tFVENBTExTLmRlZiBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxzb2NrZXRjYWxsLmkpCisKKyMgR2VuZXJhdGUgc29ja2V0Y2FsbCBzdHVicworcXVpZXRfY21kX3NvY2tldGNhbGxzID0gR0VOICAgICAkQAorICAgICAgY21kX3NvY2tldGNhbGxzID0gJChQRVJMKSAkKEtMSUJDU1JDKS9zb2NrZXRjYWxscy5wbCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQob2JqKS9TT0NLRVRDQUxMUy5pCSAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ0FSQ0gpICQob2JqKSA+ICRAIAkgICAgXAorCQkJCXx8ICggcm0gLWYgJEAgOyBleGl0IDEgKQorCiskKG9iaikvc29ja2V0Y2FsbHMubWs6ICQoS0xJQkNTUkMpL3NvY2tldGNhbGxzLnBsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJChvYmopL1NPQ0tFVENBTExTLmkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAkKHNyYykvc29ja2V0Y29tbW9uLmgKKwkkKGNhbGwgY21kLHNvY2tldGNhbGxzKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NvY2tldGNhbGxzL3NvY2tldGNvbW1vbi5oIGIvdXNyL2tsaWJjL3NvY2tldGNhbGxzL3NvY2tldGNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNGIxMWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc29ja2V0Y2FsbHMvc29ja2V0Y29tbW9uLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIHNvY2tldGNvbW1vbi5oCisgKgorICogQ29tbW9uIGhlYWRlciBmaWxlIGZvciBzb2NrZXRjYWxsIHN0dWJzCisgKi8KKworI2RlZmluZSBfX0lOX1NZU19DT01NT04KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Y2FsbHMuaD4KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zcHJpbnRmLmMgYi91c3Iva2xpYmMvc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDg3NTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3ByaW50Zi5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBzcHJpbnRmLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IHNwcmludGYoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCBydjsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCXJ2ID0gdnNucHJpbnRmKGJ1ZmZlciwgfihzaXplX3QpIDAsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3JhbmQ0OC5jIGIvdXNyL2tsaWJjL3NyYW5kNDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM5NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NyYW5kNDguYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogc3JhbmQ0OC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1bnNpZ25lZCBzaG9ydCBfX3JhbmQ0OF9zZWVkWzNdOwkvKiBDb21tb24gd2l0aCBtcmFuZDQ4LmMsIGxyYW5kNDguYyAqLworCit2b2lkIHNyYW5kNDgobG9uZyBzZWVkdmFsKQoreworCV9fcmFuZDQ4X3NlZWRbMF0gPSAweDMzMGU7CisJX19yYW5kNDhfc2VlZFsxXSA9ICh1bnNpZ25lZCBzaG9ydClzZWVkdmFsOworCV9fcmFuZDQ4X3NlZWRbMl0gPSAodW5zaWduZWQgc2hvcnQpKCh1aW50MzJfdCkgc2VlZHZhbCA+PiAxNik7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3NjYW5mLmMgYi91c3Iva2xpYmMvc3NjYW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzYjI3NgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zc2NhbmYuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogc3NjYW5mKCkKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IHNzY2FuZihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJ2OworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJcnYgPSB2c3NjYW5mKHN0ciwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdGF0ZnMuYyBiL3Vzci9rbGliYy9zdGF0ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI4NzAwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0YXRmcy5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBzdGF0ZnMuYworICoKKyAqIE9uIGFyY2hpdGVjdHVyZXMgd2hpY2ggZG8gc3RhdGZzNjQsIHdyYXAgdGhlIHN5c3RlbSBjYWxsCisgKi8KKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCisjaWZkZWYgX19OUl9zdGF0ZnM2NAorCitleHRlcm4gaW50IF9fc3RhdGZzNjQoY29uc3QgY2hhciAqLCBzaXplX3QsIHN0cnVjdCBzdGF0ZnMgKik7CisKK2ludCBzdGF0ZnMoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXRmcyAqYnVmKQoreworCXJldHVybiBfX3N0YXRmczY0KHBhdGgsIHNpemVvZiAqYnVmLCBidWYpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJjYXNlY21wLmMgYi91c3Iva2xpYmMvc3RyY2FzZWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMWYyOGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RyY2FzZWNtcC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzdHJjYXNlY21wLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgZCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQkvKiB0b3VwcGVyKCkgZXhwZWN0cyBhbiB1bnNpZ25lZCBjaGFyIChpbXBsaWNpdGx5IGNhc3QgdG8gaW50KQorCQkgICBhcyBpbnB1dCwgYW5kIHJldHVybnMgYW4gaW50LCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gKi8KKwkJZCA9IHRvdXBwZXIoY2ggPSAqYzErKykgLSB0b3VwcGVyKCpjMisrKTsKKwkJaWYgKGQgfHwgIWNoKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RyY2F0LmMgYi91c3Iva2xpYmMvc3RyY2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1YjY3MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJjYXQuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogc3RyY2F0LmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cmNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwlzdHJjcHkoc3RyY2hyKGRzdCwgJ1wwJyksIHNyYyk7CisJcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJjaHIuYyBiL3Vzci9rbGliYy9zdHJjaHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQwY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cmNoci5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBzdHJjaHIuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCitjaGFyICpzdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCit7CisJd2hpbGUgKCpzICE9IChjaGFyKWMpIHsKKwkJaWYgKCEqcykKKwkJCXJldHVybiBOVUxMOworCQlzKys7CisJfQorCisJcmV0dXJuIChjaGFyICopczsKK30KKworX19BTElBUyhjaGFyICosIGluZGV4LCAoY29uc3QgY2hhciAqLCBpbnQpLCBzdHJjaHIpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RyY21wLmMgYi91c3Iva2xpYmMvc3RyY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiOWY1YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJjbXAuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogc3RyY21wLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBzdHJjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgZCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlkID0gKGludCkoY2ggPSAqYzErKykgLSAoaW50KSpjMisrOworCQlpZiAoZCB8fCAhY2gpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJjcHkuYyBiL3Vzci9rbGliYy9zdHJjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY1NmNmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cmNweS5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBzdHJjcHkuYworICoKKyAqIHN0cmNweSgpCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqcSA9IGRzdDsKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgY2g7CisKKwlkbyB7CisJCSpxKysgPSBjaCA9ICpwKys7CisJfSB3aGlsZSAoY2gpOworCisJcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJjc3BuLmMgYi91c3Iva2xpYmMvc3RyY3Nwbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiM2FjNzIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RyY3Nwbi5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBzdHJjc3BuCisgKi8KKworI2luY2x1ZGUgInN0cnhzcG4uaCIKKworc2l6ZV90IHN0cmNzcG4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcmVqZWN0KQoreworCXJldHVybiBfX3N0cnhzcG4ocywgcmVqZWN0LCAxKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJkdXAuYyBiL3Vzci9rbGliYy9zdHJkdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDViNTFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cmR1cC5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBzdHJkdXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworY2hhciAqc3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGwgPSBzdHJsZW4ocykgKyAxOworCWNoYXIgKmQgPSBtYWxsb2MobCk7CisKKwlpZiAoZCkKKwkJbWVtY3B5KGQsIHMsIGwpOworCisJcmV0dXJuIGQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RyZXJyb3IuYyBiL3Vzci9rbGliYy9zdHJlcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDBlNDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RyZXJyb3IuYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogc3RyZXJyb3IuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3RyZXJyb3IoaW50IGVycm51bSkKK3sKKwlzdGF0aWMgY2hhciBtZXNzYWdlWzMyXSA9ICJlcnJvciAiOwkvKiBlbm91Z2ggZm9yIGVycm9yIDJeNjMtMSAqLworCWNoYXIgbnVtYnVmWzMyXTsKKwljaGFyICpwOworCXVuc2lnbmVkIGludCBlID0gKHVuc2lnbmVkIGludCllcnJudW07CisKKyNpZmRlZiBXSVRIX0VSUkxJU1QKKwlleHRlcm4gY29uc3QgaW50IHN5c19uZXJyOworCWV4dGVybiBjb25zdCBjaGFyICpjb25zdCBzeXNfZXJybGlzdFtdOworCisJaWYgKGUgPCAodW5zaWduZWQgaW50KXN5c19uZXJyICYmIHN5c19lcnJsaXN0W2VdKQorCQlyZXR1cm4gKGNoYXIgKilzeXNfZXJybGlzdFtlXTsKKyNlbmRpZgorCisJcCA9IG51bWJ1ZiArIHNpemVvZiBudW1idWY7CisJKi0tcCA9ICdcMCc7CisKKwlkbyB7CisJCSotLXAgPSAoZSAlIDEwKSArICcwJzsKKwkJZSAvPSAxMDsKKwl9IHdoaWxlIChlKTsKKworCW1lbWNweShtZXNzYWdlICsgNiwgcCwgKG51bWJ1ZiArIHNpemVvZiBudW1idWYpIC0gcCk7CisKKwlyZXR1cm4gbWVzc2FnZTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJsY2F0LmMgYi91c3Iva2xpYmMvc3RybGNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzMzNzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybGNhdC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBzdHJsY2F0LmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworc2l6ZV90IHN0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBieXRlcyA9IDA7CisJY2hhciAqcSA9IGRzdDsKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgY2g7CisKKwl3aGlsZSAoYnl0ZXMgPCBzaXplICYmICpxKSB7CisJCXErKzsKKwkJYnl0ZXMrKzsKKwl9CisJaWYgKGJ5dGVzID09IHNpemUpCisJCXJldHVybiAoYnl0ZXMgKyBzdHJsZW4oc3JjKSk7CisKKwl3aGlsZSAoKGNoID0gKnArKykpIHsKKwkJaWYgKGJ5dGVzICsgMSA8IHNpemUpCisJCQkqcSsrID0gY2g7CisKKwkJYnl0ZXMrKzsKKwl9CisKKwkqcSA9ICdcMCc7CisJcmV0dXJuIGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmxjcHkuYyBiL3Vzci9rbGliYy9zdHJsY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNzJkOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJsY3B5LmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIHN0cmxjcHkuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCitzaXplX3Qgc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGJ5dGVzID0gMDsKKwljaGFyICpxID0gZHN0OworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciBjaDsKKworCXdoaWxlICgoY2ggPSAqcCsrKSkgeworCQlpZiAoYnl0ZXMgKyAxIDwgc2l6ZSkKKwkJCSpxKysgPSBjaDsKKworCQlieXRlcysrOworCX0KKworCS8qIElmIHNpemUgPT0gMCB0aGVyZSBpcyBubyBzcGFjZSBmb3IgYSBmaW5hbCBudWxsLi4uICovCisJaWYgKHNpemUpCisJCSpxID0gJ1wwJzsKKworCXJldHVybiBieXRlczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJsZW4uYyBiL3Vzci9rbGliYy9zdHJsZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjUyNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cmxlbi5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBzdHJsZW4oKQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICpzKQoreworCWNvbnN0IGNoYXIgKnNzID0gczsKKwl3aGlsZSAoKnNzKQorCQlzcysrOworCXJldHVybiBzcyAtIHM7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RybmNhc2VjbXAuYyBiL3Vzci9rbGliYy9zdHJuY2FzZWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NTE5MzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybmNhc2VjbXAuYwpAQCAtMCwwICsxLDI0IEBACisvKgorICogc3RybmNhc2VjbXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCitpbnQgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYzIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMyOworCXVuc2lnbmVkIGNoYXIgY2g7CisJaW50IGQgPSAwOworCisJd2hpbGUgKG4tLSkgeworCQkvKiB0b3VwcGVyKCkgZXhwZWN0cyBhbiB1bnNpZ25lZCBjaGFyIChpbXBsaWNpdGx5IGNhc3QgdG8gaW50KQorCQkgICBhcyBpbnB1dCwgYW5kIHJldHVybnMgYW4gaW50LCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gKi8KKwkJZCA9IHRvdXBwZXIoY2ggPSAqYzErKykgLSB0b3VwcGVyKCpjMisrKTsKKwkJaWYgKGQgfHwgIWNoKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RybmNhdC5jIGIvdXNyL2tsaWJjL3N0cm5jYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIwMjZjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cm5jYXQuYwpAQCAtMCwwICsxLDIyIEBACisvKgorICogc3RybmNhdC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisKK2NoYXIgKnN0cm5jYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKQoreworCWNoYXIgKnEgPSBzdHJjaHIoZHN0LCAnXDAnKTsKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgY2g7CisKKwl3aGlsZSAobi0tKSB7CisJCSpxKysgPSBjaCA9ICpwKys7CisJCWlmICghY2gpCisJCQlyZXR1cm4gZHN0OworCX0KKwkqcSA9ICdcMCc7CisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cm5jbXAuYyBiL3Vzci9rbGliYy9zdHJuY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzNTU0NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJuY21wLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIHN0cm5jbXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IHN0cm5jbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYzIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMyOworCXVuc2lnbmVkIGNoYXIgY2g7CisJaW50IGQgPSAwOworCisJd2hpbGUgKG4tLSkgeworCQlkID0gKGludCkoY2ggPSAqYzErKykgLSAoaW50KSpjMisrOworCQlpZiAoZCB8fCAhY2gpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJuY3B5LmMgYi91c3Iva2xpYmMvc3RybmNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmMxMTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybmNweS5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzdHJuY3B5LmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cm5jcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKQoreworCWNoYXIgKnEgPSBkc3Q7CisJY29uc3QgY2hhciAqcCA9IHNyYzsKKwljaGFyIGNoOworCisJd2hpbGUgKG4pIHsKKwkJbi0tOworCQkqcSsrID0gY2ggPSAqcCsrOworCQlpZiAoIWNoKQorCQkJYnJlYWs7CisJfQorCisJLyogVGhlIHNwZWNzIHNheSBzdHJuY3B5KCkgZmlsbHMgdGhlIGVudGlyZSBidWZmZXIgd2l0aCBOVUwuICBTaWdoLiAqLworCW1lbXNldChxLCAwLCBuKTsKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RybmR1cC5jIGIvdXNyL2tsaWJjL3N0cm5kdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjU5NzRhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cm5kdXAuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogc3RybmR1cC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitjaGFyICpzdHJuZHVwKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreworCWludCBsID0gbiA+IHN0cmxlbihzKSA/IHN0cmxlbihzKSArIDEgOiBuICsgMTsKKwljaGFyICpkID0gbWFsbG9jKGwpOworCisJaWYgKGQpCisJCW1lbWNweShkLCBzLCBsKTsKKwlkW25dID0gJ1wwJzsKKwlyZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJubGVuLmMgYi91c3Iva2xpYmMvc3Rybmxlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzhmNGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3Rybmxlbi5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBzdHJubGVuKCkKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3NpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBtYXhsZW4pCit7CisJY29uc3QgY2hhciAqc3MgPSBzOworCisJLyogSW1wb3J0YW50OiB0aGUgbWF4bGVuIHRlc3QgbXVzdCBwcmVjZWRlIHRoZSByZWZlcmVuY2UgdGhyb3VnaCBzczsKKwkgICBzaW5jZSB0aGUgYnl0ZSBiZXlvbmQgdGhlIG1heGltdW0gbWF5IHNlZ2ZhdWx0ICovCisJd2hpbGUgKChtYXhsZW4gPiAwKSAmJiAqc3MpIHsKKwkJc3MrKzsKKwkJbWF4bGVuLS07CisJfQorCXJldHVybiBzcyAtIHM7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RybnRvaW1heC5jIGIvdXNyL2tsaWJjL3N0cm50b2ltYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlkOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cm50b2ltYXguYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogc3RybnRvaW1heC5jCisgKgorICogc3RybnRvaW1heCgpCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK2ludG1heF90IHN0cm50b2ltYXgoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UsIHNpemVfdCBuKQoreworCXJldHVybiAoaW50bWF4X3QpIHN0cm50b3VtYXgobnB0ciwgZW5kcHRyLCBiYXNlLCBuKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJudG91bWF4LmMgYi91c3Iva2xpYmMvc3RybnRvdW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDA5NjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybnRvdW1heC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBzdHJudG91bWF4LmMKKyAqCisgKiBUaGUgc3RybnRvdW1heCgpIGZ1bmN0aW9uIGFuZCBhc3NvY2lhdGVkCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpZ2l0dmFsKGludCBjaCkKK3sKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworCQlyZXR1cm4gY2ggLSAnMCc7CisJfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB7CisJCXJldHVybiBjaCAtICdBJyArIDEwOworCX0gZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgeworCQlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLTE7CisJfQorfQorCit1aW50bWF4X3Qgc3RybnRvdW1heChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSwgc2l6ZV90IG4pCit7CisJaW50IG1pbnVzID0gMDsKKwl1aW50bWF4X3QgdiA9IDA7CisJaW50IGQ7CisKKwl3aGlsZSAobiAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpucHRyKSkgeworCQlucHRyKys7CisJCW4tLTsKKwl9CisKKwkvKiBTaW5nbGUgb3B0aW9uYWwgKyBvciAtICovCisJaWYgKG4pIHsKKwkJY2hhciBjID0gKm5wdHI7CisJCWlmIChjID09ICctJyB8fCBjID09ICcrJykgeworCQkJbWludXMgPSAoYyA9PSAnLScpOworCQkJbnB0cisrOworCQkJbi0tOworCQl9CisJfQorCisJaWYgKGJhc2UgPT0gMCkgeworCQlpZiAobiA+PSAyICYmIG5wdHJbMF0gPT0gJzAnICYmCisJCSAgICAobnB0clsxXSA9PSAneCcgfHwgbnB0clsxXSA9PSAnWCcpKSB7CisJCQluIC09IDI7CisJCQlucHRyICs9IDI7CisJCQliYXNlID0gMTY7CisJCX0gZWxzZSBpZiAobiA+PSAxICYmIG5wdHJbMF0gPT0gJzAnKSB7CisJCQluLS07CisJCQlucHRyKys7CisJCQliYXNlID0gODsKKwkJfSBlbHNlIHsKKwkJCWJhc2UgPSAxMDsKKwkJfQorCX0gZWxzZSBpZiAoYmFzZSA9PSAxNikgeworCQlpZiAobiA+PSAyICYmIG5wdHJbMF0gPT0gJzAnICYmCisJCSAgICAobnB0clsxXSA9PSAneCcgfHwgbnB0clsxXSA9PSAnWCcpKSB7CisJCQluIC09IDI7CisJCQlucHRyICs9IDI7CisJCX0KKwl9CisKKwl3aGlsZSAobiAmJiAoZCA9IGRpZ2l0dmFsKCpucHRyKSkgPj0gMCAmJiBkIDwgYmFzZSkgeworCQl2ID0gdiAqIGJhc2UgKyBkOworCQluLS07CisJCW5wdHIrKzsKKwl9CisKKwlpZiAoZW5kcHRyKQorCQkqZW5kcHRyID0gKGNoYXIgKilucHRyOworCisJcmV0dXJuIG1pbnVzID8gLXYgOiB2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnBicmsuYyBiL3Vzci9rbGliYy9zdHJwYnJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1M2QwMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJwYnJrLmMKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIHN0cnBicmsKKyAqLworCisjaW5jbHVkZSAic3RyeHNwbi5oIgorCitjaGFyICpzdHJwYnJrKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmFjY2VwdCkKK3sKKwljb25zdCBjaGFyICpzcyA9IHMgKyBfX3N0cnhzcG4ocywgYWNjZXB0LCAxKTsKKworCXJldHVybiAqc3MgPyAoY2hhciAqKXNzIDogTlVMTDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJyY2hyLmMgYi91c3Iva2xpYmMvc3RycmNoci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmQzN2UKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RycmNoci5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBzdHJyY2hyLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworY2hhciAqc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwljb25zdCBjaGFyICpmb3VuZCA9IE5VTEw7CisKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKCpzID09IChjaGFyKWMpCisJCQlmb3VuZCA9IHM7CisJCXMrKzsKKwl9CisKKwlyZXR1cm4gKGNoYXIgKilmb3VuZDsKK30KKworX19BTElBUyhjaGFyICosIHJpbmRleCwgKGNvbnN0IGNoYXIgKiwgaW50KSwgc3RycmNocikKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJzZXAuYyBiL3Vzci9rbGliYy9zdHJzZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGU3NmJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnNlcC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBzdHJzZXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSkKK3sKKwljaGFyICpzID0gKnN0cmluZ3A7CisJY2hhciAqZTsKKworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisKKwllID0gc3RycGJyayhzLCBkZWxpbSk7CisJaWYgKGUpCisJCSplKysgPSAnXDAnOworCisJKnN0cmluZ3AgPSBlOworCXJldHVybiBzOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnNpZ25hbC5jIGIvdXNyL2tsaWJjL3N0cnNpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDVlOWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3Ryc2lnbmFsLmMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIHN0cnNpZ25hbC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2NoYXIgKnN0cnNpZ25hbChpbnQgc2lnKQoreworCXN0YXRpYyBjaGFyIGJ1Zls2NF07CisKKwlpZiAoKHVuc2lnbmVkKXNpZyA8IF9OU0lHICYmIHN5c19zaWdsaXN0W3NpZ10pCisJCXJldHVybiAoY2hhciAqKXN5c19zaWdsaXN0W3NpZ107CisKKyNpZmRlZiBTSUdSVE1JTgorCWlmIChzaWcgPj0gU0lHUlRNSU4gJiYgc2lnIDw9IFNJR1JUTUFYKSB7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIlJlYWwtdGltZSBzaWduYWwgJWQiLAorCQkJIHNpZyAtIFNJR1JUTUlOKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisjZW5kaWYKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIlNpZ25hbCAlZCIsIHNpZyk7CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJzcG4uYyBiL3Vzci9rbGliYy9zdHJzcG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjIyY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnNwbi5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBzdHJzcG4KKyAqLworCisjaW5jbHVkZSAic3RyeHNwbi5oIgorCitzaXplX3Qgc3Ryc3BuKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmFjY2VwdCkKK3sKKwlyZXR1cm4gX19zdHJ4c3BuKHMsIGFjY2VwdCwgMCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3Ryc3RyLmMgYi91c3Iva2xpYmMvc3Ryc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1MDg1OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJzdHIuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogc3Ryc3RyLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cnN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQoreworCXJldHVybiAoY2hhciAqKW1lbW1lbShoYXlzdGFjaywgc3RybGVuKGhheXN0YWNrKSwgbmVlZGxlLAorCQkJICAgICAgc3RybGVuKG5lZWRsZSkpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvaW1heC5jIGIvdXNyL2tsaWJjL3N0cnRvaW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZGQwODgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG9pbWF4LmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgaW50bWF4X3QKKyNkZWZpbmUgTkFNRSBzdHJ0b2ltYXgKKyNpbmNsdWRlICJzdHJ0b3guYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJ0b2suYyBiL3Vzci9rbGliYy9zdHJ0b2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY3MWFmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnRvay5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBzdHJ0b2suYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3RydG9rKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmRlbGltKQoreworCXN0YXRpYyBjaGFyICpob2xkZXI7CisKKwlpZiAocykKKwkJaG9sZGVyID0gczsKKworCWRvIHsKKwkJcyA9IHN0cnNlcCgmaG9sZGVyLCBkZWxpbSk7CisJfSB3aGlsZSAocyAmJiAhKnMpOworCisJcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG9sLmMgYi91c3Iva2xpYmMvc3RydG9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmYzhiOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ0b2wuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSBzaWduZWQgbG9uZworI2RlZmluZSBOQU1FIHN0cnRvbAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvbGwuYyBiL3Vzci9rbGliYy9zdHJ0b2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0MjhjNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ0b2xsLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgc2lnbmVkIGxvbmcgbG9uZworI2RlZmluZSBOQU1FIHN0cnRvbGwKKyNpbmNsdWRlICJzdHJ0b3guYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJ0b3RpbWVzcGVjLmMgYi91c3Iva2xpYmMvc3RydG90aW1lc3BlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjZiZjgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG90aW1lc3BlYy5jCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBOQU1FCSBzdHJ0b3RpbWVzcGVjCisjZGVmaW5lIFRJTUVYCSBzdHJ1Y3QgdGltZXNwZWMKKyNkZWZpbmUgRlNFQwkgdHZfbnNlYworI2RlZmluZSBERUNJTUFMUyA5CisjaW5jbHVkZSAic3RydG90aW1leC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvdGltZXZhbC5jIGIvdXNyL2tsaWJjL3N0cnRvdGltZXZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGQ0YmMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG90aW1ldmFsLmMKQEAgLTAsMCArMSw1IEBACisjZGVmaW5lIE5BTUUJIHN0cnRvdGltZXZhbAorI2RlZmluZSBUSU1FWAkgc3RydWN0IHRpbWV2YWwKKyNkZWZpbmUgRlNFQwkgdHZfdXNlYworI2RlZmluZSBERUNJTUFMUyA2CisjaW5jbHVkZSAic3RydG90aW1leC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvdGltZXguYyBiL3Vzci9rbGliYy9zdHJ0b3RpbWV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1OWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ0b3RpbWV4LmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIHN0cnRvdGltZXguYworICoKKyAqIE5vbnN0YW5kYXJkIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgc3RyaW5nIGFuZCBjb252ZXJ0cyBpdCB0byBhCisgKiBzdHJ1Y3QgdGltZXNwZWMvdGltZXZhbC4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBub24tbnVtZXJpYworICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuCisgKgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworY2hhciAqTkFNRShjb25zdCBjaGFyICpzdHIsIFRJTUVYICogdHMpCit7CisJaW50IG47CisJY2hhciAqcywgKnMwOworCV9fdHlwZW9mX18odHMtPkZTRUMpIGZzOwkvKiBGcmFjdGlvbmFsIHNlY29uZHMgKi8KKworCXRzLT50dl9zZWMgPSBzdHJudG91bWF4KHN0ciwgJnMsIDEwLCB+KHNpemVfdCkgMCk7CisJZnMgPSAwOworCisJaWYgKCpzID09ICcuJykgeworCQlzMCA9IHMgKyAxOworCisJCWZzID0gc3RybnRvdW1heChzMCwgJnMsIDEwLCBERUNJTUFMUyk7CisJCW4gPSBzIC0gczA7CisKKwkJd2hpbGUgKGlzZGlnaXQoKnMpKQorCQkJcysrOworCisJCWZvciAoOyBuIDwgREVDSU1BTFM7IG4rKykKKwkJCWZzICo9IDEwOworCX0KKworCXRzLT5GU0VDID0gZnM7CisJcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG91bC5jIGIvdXNyL2tsaWJjL3N0cnRvdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg5YWFhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnRvdWwuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSB1bnNpZ25lZCBsb25nCisjZGVmaW5lIE5BTUUgc3RydG91bAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvdWxsLmMgYi91c3Iva2xpYmMvc3RydG91bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MxNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnRvdWxsLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIE5BTUUgc3RydG91bGwKKyNpbmNsdWRlICJzdHJ0b3guYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJ0b3VtYXguYyBiL3Vzci9rbGliYy9zdHJ0b3VtYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc5NzEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnRvdW1heC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIHVpbnRtYXhfdAorI2RlZmluZSBOQU1FIHN0cnRvdW1heAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRveC5jIGIvdXNyL2tsaWJjL3N0cnRveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmRlZmMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG94LmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIHN0cnRveC5jCisgKgorICogc3RydG8uLi4oKSBmdW5jdGlvbnMsIGJ5IG1hY3JvIGRlZmluaXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworVFlQRSBOQU1FKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQoreworCXJldHVybiAoVFlQRSkgc3RybnRvdW1heChucHRyLCBlbmRwdHIsIGJhc2UsIH4oc2l6ZV90KSAwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJ4c3BuLmMgYi91c3Iva2xpYmMvc3RyeHNwbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmRiZmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RyeHNwbi5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBzdHJwYnJrCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAic3RyeHNwbi5oIgorCitzaXplX3QgX19zdHJ4c3BuKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKm1hcCwgaW50IHBhcml0eSkKK3sKKwljaGFyIG1hdGNobWFwW1VDSEFSX01BWCArIDFdOworCXNpemVfdCBuID0gMDsKKworCS8qIENyZWF0ZSBiaXRtYXAgKi8KKwltZW1zZXQobWF0Y2htYXAsIDAsIHNpemVvZiBtYXRjaG1hcCk7CisJd2hpbGUgKCptYXApCisJCW1hdGNobWFwWyh1bnNpZ25lZCBjaGFyKSptYXArK10gPSAxOworCisJLyogTWFrZSBzdXJlIHRoZSBudWxsIGNoYXJhY3RlciBuZXZlciBtYXRjaGVzICovCisJbWF0Y2htYXBbMF0gPSBwYXJpdHk7CisKKwkvKiBDYWxjdWxhdGUgc3BhbiBsZW5ndGggKi8KKwl3aGlsZSAobWF0Y2htYXBbKHVuc2lnbmVkIGNoYXIpKnMrK10gXiBwYXJpdHkpCisJCW4rKzsKKworCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnhzcG4uaCBiL3Vzci9rbGliYy9zdHJ4c3BuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1NmZmMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ4c3BuLmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIHN0cnhzcG4uaAorICovCisKKyNpZm5kZWYgU1RSWFNQTl9ICisjZGVmaW5lIFNUUlhTUE5fSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiBzaXplX3QgX19zdHJ4c3BuKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKm1hcCwgaW50IHBhcml0eSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N5c2NhbGxzLnBsIGIvdXNyL2tsaWJjL3N5c2NhbGxzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjAyMjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3lzY2FsbHMucGwKQEAgLTAsMCArMSwyODYgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBTY3JpcHQgdG8gcGFyc2UgdGhlIFNZU0NBTExTIGZpbGUgYW5kIGdlbmVyYXRlIGFwcHJvcHJpYXRlCisjIHN0dWJzLgorIworIyBQYXNzIDE6IGdlbmVyYXRlIHRoZSBDIGFycmF5IG9mIHNpemVzCisjIFBhc3MgMjogZ2VuZXJhdGUgdGhlIHN5c2NhbGwgc3R1YnMgYW5kIG90aGVyIG91dHB1dAorIworCisjCisjIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBDIGFycmF5IG9mIGNoYXJhY3RlcnMsCisjIGUuZy4gZm9vIC0+ICdmJywnbycsJ28nLCdcMCcsCisjCitzdWIgY2hhcmFycmF5KCQpIHsKKyAgICB1c2UgYnl0ZXM7CisKKyAgICBteSgkcykgPSBAXzsKKyAgICBteSgkaSwgJGMpOworICAgIG15KCRhKSA9ICcnOworCisgICAgZm9yICgkaSA9IDA7ICRpIDwgbGVuZ3RoKCRzKTsgJGkrKykgeworCSRjID0gc3Vic3RyKCRzLCAkaSwgMSk7CisJaWYgKG9yZCgkYykgPCAzMiB8fCBvcmQoJGMpID4gMTI2KSB7CisJICAgICRhIC49IHNwcmludGYoIjB4JTAyeCwiLCBvcmQoJGMpKTsKKwl9IGVsc2lmICgkYyBlcSAiXFwiIHx8ICRjIGVxICJcJyIpIHsKKwkgICAgJGEgLj0gIlwnXFwkY1wnLCI7CisJfSBlbHNlIHsKKwkgICAgJGEgLj0gIlwnJGNcJywiOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gJGE7Cit9CisKKyMKKyMgVGhpcyBleHRyYWN0cyBhbiBBU0NJSVogc3RyaW5nIGZvciB0aGUgdHlwZSBhbmQgdGhlIGFkZGl0aW9uYWwKKyMgaW5mb3JtYXRpb24uICBUaGlzIGlzIG9wZW4tY29kZWQsIGJlY2F1c2UgdW5wYWNrKCJaKiIpIGFwcGFyZW50bHkKKyMgaXMgYnJva2VuIGluIFBlcmwgNS42LjEuCisjCitzdWIgZ2V0X29uZV90eXBlKCQpIHsKKyAgICB1c2UgYnl0ZXM7CisKKyAgICBteSgkdHlwZXN0cikgPSBAXzsKKyAgICBteSAkaSwgJGM7CisgICAgbXkgJGwgPSBsZW5ndGgoJHR5cGVzdHIpOworCisgICAgZm9yICgkaSA9IDA7ICRpIDwgJGwtMzsgJGkrKykgeworCSRjID0gc3Vic3RyKCR0eXBlc3RyLCAkaSwgMSk7CisJaWYgKCRjIGVxICJcMCIpIHsKKwkgICAgcmV0dXJuIChzdWJzdHIoJHR5cGVzdHIsIDAsICRpKSwKKwkJICAgIHVucGFjaygiQ0MiLCBzdWJzdHIoJHR5cGVzdHIsICRpKzEsIDIpKSwKKwkJICAgIHN1YnN0cigkdHlwZXN0ciwgJGkrMykpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gKHVuZGVmLCB1bmRlZiwgdW5kZWYsIHVuZGVmKTsKK30KKworJHYgPSAkRU5WeydLQlVJTERfVkVSQk9TRSd9OworJHF1aWV0ID0gZGVmaW5lZCgkdikgJiYgKCR2ID09IDApID8gMSA6IHVuZGVmOworCitAYXJncyA9ICgpOwordW5kZWYgJHBhc3M7Citmb3IgJGFyZyAoIEBBUkdWICkgeworICAgIGlmICggJGFyZyA9fiAvXi0vICkgeworCWlmICggJGFyZyBlcSAnLXEnICkgeworCSAgICAkcXVpZXQgPSAxOworCX0gZWxzaWYgKCAkYXJnIGVxICctdicgKSB7CisJICAgICRxdWlldCA9IDA7CisJfSBlbHNpZiAoICRhcmcgPX4gL1wtKFswLTldKykkLyApIHsKKwkgICAgJHBhc3MgPSAkMSswOworCX0gZWxzZSB7CisJICAgIGRpZSAiJDA6IFVua25vd24gb3B0aW9uOiAkYXJnXG4iOworCX0KKyAgICB9IGVsc2UgeworCXB1c2goQGFyZ3MsICRhcmcpOworICAgIH0KK30KKygkZmlsZSwgJHN5c3N0dWIsICRhcmNoLCAkYml0cywgJHVuaXN0ZCwgJG91dHB1dGRpciwKKyAkaGF2ZXN5c2NhbGwsICR0eXBlc2l6ZSkgPSBAYXJnczsKKworaWYgKCEkcGFzcykgeworICAgIGRpZSAiJDA6IE5lZWQgdG8gc3BlY2lmeSBwYXNzXG4iOworfQorCiskcXVpZXQgPSAoJHBhc3MgIT0gMikgdW5sZXNzIGRlZmluZWQoJHF1aWV0KTsKKworcmVxdWlyZSAiJHN5c3N0dWIiOworCitpZiAoIW9wZW4oVU5JU1RELCAiPCAkdW5pc3RkXDAiKSkgeworICAgIGRpZSAiJDA6ICR1bmlzdGQ6ICQhXG4iOworfQorCit3aGlsZSAoIGRlZmluZWQoJGxpbmUgPSA8VU5JU1REPikgKSB7CisgICAgY2hvbXAgJGxpbmU7CisKKyAgICBpZiAoICRsaW5lID1+IC9eXCNccypkZWZpbmVccytfX05SXyhbQS1aYS16MC05X10rKVxzKyguKlxTKVxzKiQvICkgeworCSRzeXNjYWxsc3skMX0gPSAkMjsKKwlwcmludCBTVERFUlIgIlNZU0NBTEwgRk9VTkQ6ICQxXG4iIHVubGVzcyAoICRxdWlldCApOworICAgIH0KK30KK2Nsb3NlKFVOSVNURCk7CisKK2lmICgkcGFzcyA9PSAyKSB7CisgICAgdXNlIGJ5dGVzOworCisgICAgaWYgKCFvcGVuKFRZUEVTSVpFLCAiPCAkdHlwZXNpemVcMCIpKSB7CisJZGllICIkMDogJHR5cGVzaXplOiAkIVxuIjsKKyAgICB9CisKKyAgICBiaW5tb2RlIFRZUEVTSVpFOworCisgICAgJGxlbiA9IC1zIFRZUEVTSVpFOworICAgIGlmIChyZWFkKFRZUEVTSVpFLCAkdHlwZWJpbiwgJGxlbikgIT0gJGxlbikgeworCWRpZSAiJDA6ICR0eXBlc2l6ZTogc2hvcnQgcmVhZDogJCFcbiI7CisgICAgfQorICAgIGNsb3NlKFRZUEVTSVpFKTsKKworICAgICRpeCA9IGluZGV4KCR0eXBlYmluLCAiXHg3YVx4YzhceGRiXHg0ZVx4OTdceGI0XHg5Y1x4MTkiKTsKKyAgICBpZiAoJGl4IDwgMCkgeworCWRpZSAiJDA6ICR0eXBlc2l6ZTogbWFnaWMgbnVtYmVyIG5vdCBmb3VuZFxuIjsKKyAgICB9CisKKyAgICAjIFJlbW92ZSBtYWdpYyBudW1iZXIgYW5kIGJ5dGVzIGJlZm9yZSBpdAorICAgICR0eXBlYmluID0gc3Vic3RyKCR0eXBlYmluLCAkaXgrOCk7CisKKyAgICAjIEV4cGFuZCB0aGUgdHlwZXMgdW50aWwgYSB0ZXJtaW5hdGluZyBudWxsCisgICAgJXR5cGVzaXplID0gKCk7CisgICAgd2hpbGUgKDEpIHsKKwlteSAkbiwgJHN6LCAkc2k7CisJKCRuLCAkc3osICRzaSwgJHR5cGViaW4pID0gZ2V0X29uZV90eXBlKCR0eXBlYmluKTsKKwlsYXN0IGlmIChsZW5ndGgoJG4pID09IDApOworCSR0eXBlc2l6ZXskbn0gPSAkc3o7CisJJHR5cGVzaWdueyRufSA9ICRzaTsKKwlwcmludCBTVERFUlIgIlRZUEUgJG46IHNpemUgJHN6LCBzaWduICRzaVxuIiB1bmxlc3MgKCRxdWlldCk7CisgICAgfQorfSBlbHNlIHsKKyAgICAjIExpc3QgaGVyZSBhbnkgdHlwZXMgd2hpY2ggc2hvdWxkIGJlIHNpemVkIGV2ZW4gaWYgdGhleSBuZXZlciBvY2N1cgorICAgICMgaW4gYW55IHN5c3RlbSBjYWxscyBhdCBhbGwuCisgICAgJXR5cGVfbGlzdCA9ICgnaW50JyA9PiAxLCAnbG9uZycgPT4gMSwgJ2xvbmcgbG9uZycgPT4gMSwKKwkJICAndm9pZCAqJyA9PiAxLAorCQkgICdpbnRwdHJfdCcgPT4gMSwgJ3VpbnRwdHJfdCcgPT4gMSwKKwkJICAnaW50bWF4X3QnID0+IDEsICd1aW50bWF4X3QnID0+IDEpOworfQorCitpZiAoJHBhc3MgPT0gMikgeworICAgIGlmICghb3BlbihIQVZFU1lTLCAiPiAkaGF2ZXN5c2NhbGxcMCIpKSB7CisJZGllICIkMDogJGhhdmVzeXNjYWxsOiAkIVxuIjsKKyAgICB9CisKKyAgICBwcmludCBIQVZFU1lTICIjaWZuZGVmIF9LTElCQ19IQVZFU1lTQ0FMTF9IXG4iOworICAgIHByaW50IEhBVkVTWVMgIiNkZWZpbmUgX0tMSUJDX0hBVkVTWVNDQUxMX0ggMVxuXG4iOworfQorCitpZiAoIW9wZW4oRklMRSwgIjwgJGZpbGVcMCIpKSB7CisgICAgZGllICIkMDogJGZpbGU6ICQhXG4iOworfQorCisKK2lmICgkcGFzcyA9PSAyKSB7CisgICAgcHJpbnQgInN5c2NhbGwtb2JqcyA6PSAiOworfQorCisKK3doaWxlICggZGVmaW5lZCgkbGluZSA9IDxGSUxFPikgKSB7CisgICAgY2hvbXAgJGxpbmU7CisgICAgJGxpbmUgPX4gcy9ccyoofFwjLip8XC9cLy4qKSQvLzsgIyBTdHJpcCBjb21tZW50cyBhbmQgdHJhaWxpbmcgYmxhbmtzCisgICAgbmV4dCB1bmxlc3MgJGxpbmU7CisKKyAgICBpZiAoICRsaW5lID1+IC9eXHMqKFw8W15cPl0rXD5ccyt8KShbQS1aYS16MC05X1wqXHNdKylccysoW0EtWmEtejAtOV8sXSspKHxcQFtBLVphLXowLTlfXSspKHxcOlw6W0EtWmEtejAtOV9dKylccypcKChbXlw6XCldKilcKVxzKlw7JC8gKSB7CisJJGFyY2hzICA9ICQxOworCSR0eXBlICAgPSAkMjsKKwkkc25hbWVzID0gJDM7CisJJHN0eXBlICA9ICQ0OworCSRmbmFtZSAgPSAkNTsKKwkkYXJndiAgID0gJDY7CisKKwkkZG9pdCAgPSAxOworCSRtYXliZSA9IDA7CisJaWYgKCAkYXJjaHMgbmUgJycgKSB7CisJICAgIGRpZSAiJGZpbGU6JC46IEludmFsaWQgYXJjaGl0ZWN0dXJlIHNwZWM6IDwkYXJjaHM+XG4iCisJCXVubGVzcyAoICRhcmNocyA9fiAvXlw8KHxcPykofFwhKShbXlw+XCFcP10qKVw+LyApOworCSAgICAkbWF5YmUgPSAkMSBuZSAnJzsKKwkgICAgJG5vdCA9ICQyIG5lICcnOworCSAgICAkbGlzdCA9ICQzOworCisJICAgICRkb2l0ID0gJG5vdCB8fCAoJGxpc3QgZXEgJycpOworCisJICAgIEBsaXN0ID0gc3BsaXQoLywvLCAkbGlzdCk7CisJICAgIGZvcmVhY2ggICRhICggQGxpc3QgKSB7CisJCWlmICggJGEgZXEgJGFyY2ggfHwgJGEgZXEgJGJpdHMgKSB7CisJCSAgICAkZG9pdCA9ICEkbm90OworCQkgICAgbGFzdDsKKwkJfQorCSAgICB9CisJfQorCW5leHQgaWYgKCAhICRkb2l0ICk7CisKKwl1bmRlZiAkc25hbWU7CisJZm9yZWFjaCAkc24gKCBzcGxpdCgvLC8sICRzbmFtZXMpICkgeworCSAgICBpZiAoIGRlZmluZWQgJHN5c2NhbGxzeyRzbn0gKSB7CisJCSRzbmFtZSA9ICRzbjsKKwkJbGFzdDsKKwkgICAgfQorCX0KKwlpZiAoICFkZWZpbmVkKCRzbmFtZSkgKSB7CisJICAgIG5leHQgaWYgKCAkbWF5YmUgKTsKKwkgICAgZGllICIkZmlsZTokLjogVW5kZWZpbmVkIHN5c3RlbSBjYWxsOiAkc25hbWVzXG4iOworCX0KKworCSR0eXBlICA9fiBzL1xzKiQvLzsKKwkkc3R5cGUgPX4gcy9eXEAvLzsKKworCWlmICggJGZuYW1lIGVxICcnICkgeworCSAgICAkZm5hbWUgPSAkc25hbWU7CisJfSBlbHNlIHsKKwkgICAgJGZuYW1lID1+IHMvXlw6XDovLzsKKwl9CisKKwkkYXJndiA9fiBzL15ccysvLzsKKwkkYXJndiA9fiBzL1xzKyQvLzsKKworCWlmICgkYXJndiBlcSAndm9pZCcpIHsKKwkgICAgQGFyZ3MgPSAoKTsKKwl9IGVsc2UgeworCSAgICBAYXJncyA9IHNwbGl0KC9ccypcLFxzKi8sICRhcmd2KTsKKwl9CisKKwlpZiAoJHBhc3MgPT0gMSkgeworCSAgICAjIFBhc3MgMTogQWRkIHRoZSB0eXBlcyB0byB0aGUgdHlwZSBsaXN0CisJICAgIGZvcmVhY2ggJGEgKEBhcmdzKSB7CisJCSR0eXBlX2xpc3R7JGF9Kys7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICAjIFBhc3MgMjogbWFrZSBzdXJlIGFsbCB0eXBlcyBkZWZpbmVkLCBhbmQgYWN0dWFsbHkgZ2VuZXJhdGUgc3R1YnMKKworCSAgICBmb3JlYWNoICRhIChAYXJncykgeworCQlpZiAoIWRlZmluZWQoJHR5cGVzaXpleyRhfSkpIHsKKwkJICAgIGRpZSAiJDA6ICR0eXBlc2l6ZTogdHlwZSBuYW1lIG1pc3Npbmc6ICRhXG4iOworCQl9CisJICAgIH0KKworCSAgICBwcmludCBIQVZFU1lTICIjZGVmaW5lIF9LTElCQ19IQVZFX1NZU0NBTExfJHtmbmFtZX0gJHtzbmFtZX1cbiI7CisJICAgIHByaW50ICIgXFxcblx0JHtmbmFtZX0ubyI7CisJICAgIG1ha2Vfc3lzc3R1Yigkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpOworCX0KKyAgICB9IGVsc2UgeworCWRpZSAiJGZpbGU6JC46IENvdWxkIG5vdCBwYXJzZSBpbnB1dDogXCIkbGluZVwiXG4iOworICAgIH0KK30KKworaWYgKCRwYXNzID09IDEpIHsKKyAgICAjIFBhc3MgMTogZ2VuZXJhdGUgdHlwZXNpemUuYworICAgIGlmICghb3BlbihUWVBFU0laRSwgIj4gJHR5cGVzaXplIikpIHsKKwlkaWUgIiQwOiBjYW5ub3QgY3JlYXRlIGZpbGU6ICR0eXBlc2l6ZTogJCFcbiI7CisgICAgfQorCisgICAgcHJpbnQgVFlQRVNJWkUgIiNpbmNsdWRlIFwic3lzY29tbW9uLmhcIlxuIjsKKworICAgICMgVGhpcyBjb21wYXJlcyAtMiA8IDEgaW4gdGhlIGFwcHJvcHJpYXRlIHR5cGUsIHdoaWNoIGlzIHRydWUgZm9yCisgICAgIyBzaWduZWQgdHlwZXMgYW5kIGZhbHNlIGZvciB1bnNpZ25lZCB0eXBlcy4gIFdlIHVzZSAtMiBhbmQgMSBzaW5jZQorICAgICMgZ2NjIGNvbXBsYWlucyBhYm91dCBjb21wYXJpbmcgdW5zaWduZWQgdHlwZXMgd2l0aCB6ZXJvLCBhbmQgbWlnaHQKKyAgICAjIGNvbXBsYWluIGVxdWFsbHkgYWJvdXQgLTEgaW4gdGhlIGZ1dHVyZS4KKyAgICAjCisgICAgIyBUaGlzIHRlc3QgaXMgdmFsaWQgKGFzIGluLCBkb2Vzbid0IGNhdXNlIHRoZSBjb21waWxlciB0byBiYXJmKQorICAgICMgZm9yIHBvaW50ZXJzIGFzIHdlbGwgYXMgZm9yIGludGVncmFsIHR5cGVzOyBpZiB3ZSBldmVyIGFkZCBzeXN0ZW0KKyAgICAjIGNhbGxzIHdoaWNoIHRha2UgYW55IG90aGVyIGtpbmRzIG9mIHR5cGVzIHRoYW4gdGhhdCB0aGVuIHRoaXMgbmVlZHMKKyAgICAjIHRvIGJlIHNtYXJ0ZXIuCisgICAgcHJpbnQgVFlQRVNJWkUgIiNkZWZpbmUgU0lHTkVEKFgpICgoWCktMiA8IChYKTEpXG4iOworCisgICAgcHJpbnQgVFlQRVNJWkUgIlxuIjsKKyAgICBwcmludCBUWVBFU0laRSAiY29uc3QgdW5zaWduZWQgY2hhciB0eXBlX3NpemVzW10gPSB7XG4iOworICAgIHByaW50IFRZUEVTSVpFICJcdDB4N2EsMHhjOCwweGRiLDB4NGUsMHg5NywweGI0LDB4OWMsMHgxOSwgLyogbWFnaWMgKi9cbiI7CisgICAgZm9yZWFjaCAkdCAoc29ydChrZXlzKCV0eXBlX2xpc3QpKSkgeworCXByaW50IFRZUEVTSVpFICJcdCIsIGNoYXJhcnJheSgkdCksICIwLCBzaXplb2YoJHQpLCBTSUdORUQoJHQpLFxuIjsKKyAgICB9CisgICAgcHJpbnQgVFlQRVNJWkUgIlx0MCwgMCxcbiI7CSMgRW5kIHNlbnRpbmVsCisgICAgcHJpbnQgVFlQRVNJWkUgIn07XG4iOworICAgIGNsb3NlKFRZUEVTSVpFKTsKK30gZWxzZSB7CisgICAgIyBQYXNzIDI6IGZpbmFsaXplIG91dHB1dCBmaWxlcworICAgIHByaW50ICJcbiI7CisKKyAgICBwcmludCBIQVZFU1lTICJcbiNlbmRpZlxuIjsKKyAgICBjbG9zZShIQVZFU1lTKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zeXNjYWxscy9LYnVpbGQgYi91c3Iva2xpYmMvc3lzY2FsbHMvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWI5NGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3lzY2FsbHMvS2J1aWxkCkBAIC0wLDAgKzEsOTQgQEAKKyMKKyMga2J1aWxkIGZpbGUgZm9yIGdlbmVyYXRpbmcgc3lzY2FsbCBzdHVicworIworCisjIEluY2x1ZGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgTWFrZWZpbGUgZnJhZ21lbnQuCisjIEl0IGNvbnRhaW5zIGRlZmluaXRpb24gb2Ygc3lzY2FsbC1vYmpzIHNwZWNpZnlpbmcgbmFtZSBvZiBhbGwgLm8gZmlsZXMKK2lmZXEgKCQoY2xlYW4pLCkKKy1pbmNsdWRlICQob2JqKS9zeXNjYWxscy5taworZW5kaWYKKworIyBMaXN0aW5nIG9mIGFsbCAubyBmaWxlcworYWx3YXlzIDo9IGtsaWIubGlzdAorCisKKyMjIyMjCisjIEdlbmVyYXRlIHN5c2NhbGxzIHN0dWJzCisjIEJhc2VkIG9uIGxpc3QgaW4gU1lTQ0FMTFMuZGVmIGdlbmVyYXRlIHN0dWJzIGZvciBzeXMgY2FsbHMuIEFjdHVhbCBhcmNoIGNvZGUKKyMgaXMgZGVmaW5lZCBpbiBhbiBhcmNoIHNwZWNpZmljIHBlcmwgZmlsZQordGFyZ2V0cyArPSBzeXNjYWxscy5tawordGFyZ2V0cyArPSBrbGliLmxpc3QKK3RhcmdldHMgKz0gU1lTQ0FMTFMuaSBzeXNjYWxscy5ucnMKK3RhcmdldHMgKz0gdHlwZXNpemUuYyB0eXBlc2l6ZS5vIHR5cGVzaXplLmJpbgordGFyZ2V0cyArPSAkKHN5c2NhbGwtb2JqcykKKworIyBTaWRlIGVmZmVjdCBvZiBydW5uaW5nIHN5c2NhbGxzLnBsCitjbGVhbi1maWxlcyArPSAkKG9ianRyZWUpLyQoS0xJQkNJTkMpL2tsaWJjL2hhdmVzeXNjYWxsLmgKK2NsZWFuLWZpbGVzICs9ICQoS0xJQkNJTkMpL2tsaWJjL2hhdmVzeXNjYWxsLmgKKyMgQWxsIHRoZSBzeXNjYWxsIHN0dWJzCitjbGVhbi1maWxlcyArPSAqLm8gKi5TICouYyAqLmxpc3QgKi5iaW4KKworRVhUUkFfS0xJQkNDRkxBR1MgOj0gLUkkKHNyY3RyZWUpLyQoc3JjKQorCitxdWlldF9jbWRfbWFrZWxpc3QgPSBMSVNUICAgICRACisgICAgICBjbWRfbWFrZWxpc3QgPSBlY2hvICckKGZpbHRlci1vdXQgRk9SQ0UsJF4pJyA+ICRACisKKyMgQ3JlYXRlIGxpc3Qgb2YgYWxsIGZpbGVzCiskKG9iaikva2xpYi5saXN0OiAkKGNhbGwgb2JqZWN0aWZ5LCQoc3lzY2FsbC1vYmpzKSkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxtYWtlbGlzdCkKKworIyBHZW5lcmF0ZSBhc3NlbWJsZXIgZmlsZSAoLmkpCisjIFdlIHBhc3MgLWFuc2kgdG8ga2VlcCBjcHAgZnJvbSBkZWZpbmUgZS5nLiAiaTM4NiIgYXMgd2VsbCBhcyAiX19pMzg2X18iCitxdWlldF9jbWRfc3lzY2FsbC5pID0gR0VOICAgICAkQAorICAgICAgY21kX3N5c2NhbGwuaSA9ICQoS0xJQkNDQykgJChrbGliY2NmbGFncykgLURfX0FTU0VNQkxZX18gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYW5zaSAteCBjIC1FIC1vICRAICQ8CiskKG9iaikvU1lTQ0FMTFMuaTogJChLTElCQ1NSQykvU1lTQ0FMTFMuZGVmIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLHN5c2NhbGwuaSkKKworIyBHZXQgc3lzY2FsbHMgbnVtYmVycworcXVpZXRfY21kX3N5c2NhbGwubnJzID0gR0VOICAgICAkQAorICAgICAgY21kX3N5c2NhbGwubnJzID0gJChLTElCQ0NDKSAkKGtsaWJjY2ZsYWdzKSAtV3AsLWRNIC14IGMgLUUgLW8gJEAgJDwKKyQob2JqKS9zeXNjYWxscy5ucnM6ICQoS0xJQkNJTkMpL3N5cy9zeXNjYWxsLmggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsc3lzY2FsbC5ucnMpCisKKyMgR2VuZXJhdGUgdHlwZXNpemUuYworcXVpZXRfY21kX3N5c2NhbHN6ID0gR0VOICAgICAkQAorICAgICAgY21kX3N5c2NhbHN6ID0gbWtkaXIgLXAgJChLTElCQ0lOQykva2xpYmMvOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICQoUEVSTCkgJChLTElCQ1NSQykvc3lzY2FsbHMucGwgLTEgJChvYmopL1NZU0NBTExTLmkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNTUkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpL3N5c3N0dWIucGggICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDQVJDSCkgJChLTElCQ0JJVFNJWkUpICQob2JqKS9zeXNjYWxscy5ucnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ0lOQykva2xpYmMvaGF2ZXN5c2NhbGwuaCAJCSAgICBcCisJCQkgICAgICQob2JqKS90eXBlc2l6ZS5jID4gJEAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIHJtIC1mICRAIDsgZXhpdCAxICkKKworJChvYmopL3R5cGVzaXplLmM6ICQoS0xJQkNTUkMpL3N5c2NhbGxzLnBsICQob2JqKS9TWVNDQUxMUy5pIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDU1JDKS9hcmNoLyQoS0xJQkNBUkNIRElSKS9zeXNzdHViLnBoIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKHNyYykvc3lzY29tbW9uLmggJChvYmopL3N5c2NhbGxzLm5ycyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHN5c2NhbHN6KQorCisjIENvbnZlcnQgdHlwZXNpemUubyB0byB0eXBlc2l6ZS5iaW4KK3F1aWV0X2NtZF9ta2JpbiA9IE9CSkNPUFkgJEAKKyAgICAgIGNtZF9ta2JpbiA9ICQoS0xJQkNPQkpDT1BZKSAtTyBiaW5hcnkgJDwgJEAKKworJChvYmopL3R5cGVzaXplLmJpbjogJChvYmopL3R5cGVzaXplLm8gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxta2JpbikKKworIyBHZW5lcmF0ZSAkKEtMSUJJTkMpL2tsaWJjL2hhdmVzeXNjYWxsLmggKyBtYWtlZmlsZSBmcmFnbWVudAorIyBVc2luZyBzeXNzdHViLnBsIGluIGFyY2ggZGlyIGdlbmVyYXRlIGFsbCAuUyBmaWxlcworcXVpZXRfY21kX3N5c2NhbGxzID0gR0VOICAgICAkQAorICAgICAgY21kX3N5c2NhbGxzID0gbWtkaXIgLXAgJChLTElCQ0lOQykva2xpYmMvOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICQoUEVSTCkgJChLTElCQ1NSQykvc3lzY2FsbHMucGwgLTIgJChvYmopL1NZU0NBTExTLmkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNTUkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpL3N5c3N0dWIucGggICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDQVJDSCkgJChLTElCQ0JJVFNJWkUpICQob2JqKS9zeXNjYWxscy5ucnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ0lOQykva2xpYmMvaGF2ZXN5c2NhbGwuaCAJCSAgICBcCisJCQkgICAgICQob2JqKS90eXBlc2l6ZS5iaW4gPiAkQCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIHJtIC1mICRAIDsgZXhpdCAxICkKKworJChvYmopL3N5c2NhbGxzLm1rOiAkKEtMSUJDU1JDKS9zeXNjYWxscy5wbCAkKG9iaikvU1lTQ0FMTFMuaSBcCisgICAgICAgICAgICAgICAgICAgICQoS0xJQkNTUkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpL3N5c3N0dWIucGggXAorICAgICAgICAgICAgICAgICAgICAkKGNhbGwgb2JqZWN0aWZ5LCAkKHN5c2NhbGwtb2Jqczoubz0uUykpIFwKKyAgICAgICAgICAgICAgICAgICAgJChzcmMpL3N5c2NvbW1vbi5oICQob2JqKS9zeXNjYWxscy5ucnMgXAorCQkgICAgJChvYmopL3R5cGVzaXplLmJpbiBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHN5c2NhbGxzKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N5c2NhbGxzL3N5c2NvbW1vbi5oIGIvdXNyL2tsaWJjL3N5c2NhbGxzL3N5c2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2FlMTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3lzY2FsbHMvc3lzY29tbW9uLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIHN5c2NvbW1vbi5oCisgKgorICogQ29tbW9uIGhlYWRlciBmaWxlIGZvciBzeXN0ZW0gY2FsbCBzdHVicworICovCisKKyNkZWZpbmUgX19JTl9TWVNfQ09NTU9OCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorI2luY2x1ZGUgPHN5cy9rbG9nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8c3lzL3V0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9faTM4Nl9fCisjIGluY2x1ZGUgPHN5cy92bTg2Lmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zeXNsb2cuYyBiL3Vzci9rbGliYy9zeXNsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDUyZWFhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N5c2xvZy5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBzeXNsb2cuYworICoKKyAqIElzc3VlIHN5c2xvZyBtZXNzYWdlcyB2aWEgdGhlIGtlcm5lbCBwcmludGsgcXVldWUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLyogTWF4aW11bSBzaXplIGZvciBhIGtlcm5lbCBtZXNzYWdlICovCisjZGVmaW5lIEJVRkxFTiAxMDI0CisKKy8qIExvZ2dpbmcgbm9kZSAqLworI2RlZmluZSBMT0dERVYgIi9kZXYva21zZyIKKworLyogTWF4IGxlbmd0aCBvZiBJRCBzdHJpbmcgKi8KKyNkZWZpbmUgTUFYSUQgMzEJCS8qIE1BWElEKzUgbXVzdCBiZSA8IEJVRkxFTiAqLworCitpbnQgX19zeXNsb2dfZmQgPSAtMTsKK3N0YXRpYyBjaGFyIGlkW01BWElEICsgMV07CitzdGF0aWMgaW50IHN5c2xvZ19mbGFncyA9IDA7CisKK3ZvaWQgb3BlbmxvZyhjb25zdCBjaGFyICppZGVudCwgaW50IG9wdGlvbiwgaW50IGZhY2lsaXR5KQoreworCWludCBmZDsKKworCSh2b2lkKW9wdGlvbjsKKwkodm9pZClmYWNpbGl0eTsJCS8qIFVudXNlZCAqLworCisJaWYgKF9fc3lzbG9nX2ZkID09IC0xKSB7CisJCV9fc3lzbG9nX2ZkID0gZmQgPSBvcGVuKExPR0RFViwgT19XUk9OTFkpOworCQlpZiAoZmQgPT0gLTEpCisJCQlyZXR1cm47CisJCWZjbnRsKGZkLCBGX1NFVEZELCAobG9uZylGRF9DTE9FWEVDKTsKKwl9CisKKwlzeXNsb2dfZmxhZ3MgPSBvcHRpb247CisKKwlzdHJuY3B5KGlkLCBpZGVudCA/IGlkZW50IDogIiIsIE1BWElEKTsKK30KKwordm9pZCB2c3lzbG9nKGludCBwcmlvLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJY2hhciBidWZbQlVGTEVOXTsKKwlpbnQgbGVuOworCWludCBmZDsKKworCWlmIChfX3N5c2xvZ19mZCA9PSAtMSkKKwkJb3BlbmxvZyhOVUxMLCAwLCAwKTsKKworCWJ1ZlswXSA9ICc8JzsKKwlidWZbMV0gPSBMT0dfUFJJKHByaW8pICsgJzAnOworCWJ1ZlsyXSA9ICc+JzsKKwlsZW4gPSAzOworCisJaWYgKHN5c2xvZ19mbGFncyAmIExPR19QSUQpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIDMsICIlc1sldV06ICIsIGlkLCBnZXRwaWQoKSk7CisJZWxzZSBpZiAoKmlkKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyAzLCAiJXM6ICIsIGlkKTsKKworCWxlbiArPSB2c25wcmludGYoYnVmICsgbGVuLCBCVUZMRU4gLSBsZW4sIGZvcm1hdCwgYXApOworCisJaWYgKGxlbiA+IEJVRkxFTiAtIDEpCisJCWxlbiA9IEJVRkxFTiAtIDE7CisJaWYgKGJ1ZltsZW4gLSAxXSAhPSAnXG4nKQorCQlidWZbbGVuKytdID0gJ1xuJzsKKworCWZkID0gX19zeXNsb2dfZmQ7CisJaWYgKGZkID09IC0xKQorCQlmZCA9IDI7CQkvKiBGYWlsZWQgdG8gb3BlbiBsb2csIHdyaXRlIHRvIHN0ZGVyciAqLworCisJd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKworCWlmIChzeXNsb2dfZmxhZ3MgJiBMT0dfUEVSUk9SKQorCQlfZndyaXRlKGJ1ZiArIDMsIGxlbiAtIDMsIHN0ZGVycik7Cit9CisKK3ZvaWQgc3lzbG9nKGludCBwcmlvLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJdnN5c2xvZyhwcmlvLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N5c3RlbS5jIGIvdXNyL2tsaWJjL3N5c3RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NzhiMjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3lzdGVtLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIHN5c3RlbS5jCisgKgorICogVGhlIHN5c3RlbSgpIGZ1bmN0aW9uLiAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYWN0dWFsbHkgYmUgKnVzZWQqLAorICogd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGRldGVjdCB0aGUgdmVyeSBzaW1wbGUgY2FzZXMgKG5vIHNoZWxsIG1hZ2ljKQorICogYW5kIGhhbmRsZSB0aGVtIGludGVybmFsbHksIGluc3RlYWQgb2YgcmVxdWlyaW5nIHRoYXQgL2Jpbi9zaCBiZQorICogcHJlc2VudC4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCitpbnQgc3lzdGVtKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlwaWRfdCBwaWQ7CisJc3RydWN0IHNpZ2FjdGlvbiBpZ25vcmUsIG9sZF9pbnQsIG9sZF9xdWl0OworCXNpZ3NldF90IG1hc2tlZCwgb2xkbWFzazsKKwlzdGF0aWMgY29uc3QgY2hhciAqYXJndltdID0geyAiL2Jpbi9zaCIsICItYyIsIE5VTEwsIE5VTEwgfTsKKwlpbnQgc3RhdHVzOworCisJLyogQmxvY2sgU0lHQ0hMRCBhbmQgaWdub3JlIFNJR0lOVCBhbmQgU0lHUVVJVCAqLworCS8qIERvIHRoaXMgYmVmb3JlIHRoZSBmb3JrKCkgdG8gYXZvaWQgcmFjZXMgKi8KKworCWlnbm9yZS5zYV9oYW5kbGVyID0gU0lHX0lHTjsKKwlzaWdlbXB0eXNldCgmaWdub3JlLnNhX21hc2spOworCWlnbm9yZS5zYV9mbGFncyA9IDA7CisJc2lnYWN0aW9uKFNJR0lOVCwgJmlnbm9yZSwgJm9sZF9pbnQpOworCXNpZ2FjdGlvbihTSUdRVUlULCAmaWdub3JlLCAmb2xkX3F1aXQpOworCisJc2lnZW1wdHlzZXQoJm1hc2tlZCk7CisJc2lnYWRkc2V0KCZtYXNrZWQsIFNJR0NITEQpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm1hc2tlZCwgJm9sZG1hc2spOworCisJcGlkID0gZm9yaygpOworCisJaWYgKHBpZCA8IDApCisJCXJldHVybiAtMTsKKwllbHNlIGlmIChwaWQgPT0gMCkgeworCQlzaWdhY3Rpb24oU0lHSU5ULCAmb2xkX2ludCwgTlVMTCk7CisJCXNpZ2FjdGlvbihTSUdRVUlULCAmb2xkX3F1aXQsIE5VTEwpOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZG1hc2ssIE5VTEwpOworCisJCWFyZ3ZbMl0gPSBzdHJpbmc7CisKKwkJZXhlY3ZlKGFyZ3ZbMF0sIChjaGFyICpjb25zdCAqKWFyZ3YsIChjaGFyICpjb25zdCAqKWVudmlyb24pOworCQlfZXhpdCgxMjcpOworCX0KKworCS8qIGVsc2UuLi4gKi8KKworCXdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKKworCXNpZ2FjdGlvbihTSUdJTlQsICZvbGRfaW50LCBOVUxMKTsKKwlzaWdhY3Rpb24oU0lHUVVJVCwgJm9sZF9xdWl0LCBOVUxMKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZG1hc2ssIE5VTEwpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zeXN2X3NpZ25hbC5jIGIvdXNyL2tsaWJjL3N5c3Zfc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlZTdkNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zeXN2X3NpZ25hbC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBzeXN2X3NpZ25hbC5jCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCitfX3NpZ2hhbmRsZXJfdCBzeXN2X3NpZ25hbChpbnQgc2lnbnVtLCBfX3NpZ2hhbmRsZXJfdCBoYW5kbGVyKQoreworCS8qIExpbnV4L1N5c1Ygc2lnbmFsKCkgc2VtYW50aWNzICovCisJcmV0dXJuIF9fc2lnbmFsKHNpZ251bSwgaGFuZGxlciwgU0FfUkVTRVRIQU5EKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9LYnVpbGQgYi91c3Iva2xpYmMvdGVzdHMvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZThkNjQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvS2J1aWxkCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIGFsbCB0ZXN0IGZpbGVzCisjCisKK3Rlc3QtZmlsZXMgOj0gJCh3aWxkY2FyZCAkKHNyY3RyZWUpLyQoc3JjKS8qLmMpCit0ZXN0LWZpbGVzIDo9ICQobm90ZGlyICQodGVzdC1maWxlcykpCisKKyMgVGhpcyBwYXJ0aWN1bGFyIGZpbGUgdXNlcyBhIGJ1bmNoIG9mIGZvcm1hdHMgZ2NjIGRvbid0IGtub3cgb2YsIGluIG9yZGVyCisjIHRvIHRlc3QgdGhlIGZ1bGwgcmFuZ2Ugb2Ygb3VyIHZzbnByaW50ZigpIGZ1bmN0aW9uLiAgVGhpcyBvdXRwdXRzIGEgYnVuY2gKKyMgb2YgdXNlbGVzcyB3YXJuaW5ncyB1bmxlc3Mgd2UgdGVsbCBpdCBub3QgdG8uCitLTElCQ0NGTEFHU190ZXN0dnNucC5vIDo9IC1Xbm8tZm9ybWF0CisKK3N0YXRpYy15IDo9ICQodGVzdC1maWxlczouYz0pCitzaGFyZWQteSA6PSAkKGFkZHN1ZmZpeCAuc2hhcmVkLCAkKHN0YXRpYy15KSkKKworZW52aXJvbi5zaGFyZWQteQk6PSBlbnZpcm9uLm8KK2ZjbnRsLnNoYXJlZC15CQk6PSBmY250bC5vCitmbm1hdGNoLnNoYXJlZC15CTo9IGZubWF0Y2gubworZ2V0b3B0dGVzdC5zaGFyZWQteQk6PSBnZXRvcHR0ZXN0Lm8KK2dldG9wdGxvbmcuc2hhcmVkLXkJOj0gZ2V0b3B0bG9uZy5vCitnZXRwYWdlc2l6ZS5zaGFyZWQteQk6PSBnZXRwYWdlc2l6ZS5vCitoZWxsby5zaGFyZWQteQkJOj0gaGVsbG8ubworaWR0ZXN0LnNoYXJlZC15CQk6PSBpZHRlc3QubworbWFsbG9jdGVzdC5zaGFyZWQteQk6PSBtYWxsb2N0ZXN0Lm8KK21hbGxvY3Rlc3QyLnNoYXJlZC15CTo9IG1hbGxvY3Rlc3QyLm8KK21lbXN0cnRlc3Quc2hhcmVkLXkJOj0gbWVtc3RydGVzdC5vCittaWNyb2hlbGxvLnNoYXJlZC15CTo9IG1pY3JvaGVsbG8ubworbWluaWhlbGxvLnNoYXJlZC15CTo9IG1pbmloZWxsby5vCittbWFwdGVzdC5zaGFyZWQteQk6PSBtbWFwdGVzdC5vCituZnNfbm9fcnBjLnNoYXJlZC15CTo9IG5mc19ub19ycGMubworb3BlbnRlc3Quc2hhcmVkLXkJOj0gb3BlbnRlc3QubworcGlwZXRlc3Quc2hhcmVkLXkJOj0gcGlwZXRlc3QubworcnRzaWcuc2hhcmVkLXkJCTo9IHJ0c2lnLm8KK3NlbGVjdC5zaGFyZWQteQkJOj0gc2VsZWN0Lm8KK3NldGVudnRlc3Quc2hhcmVkLXkJOj0gc2V0ZW52dGVzdC5vCitzZXRqbXB0ZXN0LnNoYXJlZC15CTo9IHNldGptcHRlc3Qubworc2lnaW50LnNoYXJlZC15CQk6PSBzaWdpbnQubworc3RhdC5zaGFyZWQteQkJOj0gc3RhdC5vCitzdGF0ZnMuc2hhcmVkLXkJCTo9IHN0YXRmcy5vCitzdHJsY3B5Y2F0LnNoYXJlZC15CTo9IHN0cmxjcHljYXQubworc3RydG9pbWF4LnNoYXJlZC15CTo9IHN0cnRvaW1heC5vCitzdHJ0b3RpbWUuc2hhcmVkLXkJOj0gc3RydG90aW1lLm8KK3Rlc3RyYW5kNDguc2hhcmVkLXkJOj0gdGVzdHJhbmQ0OC5vCit0ZXN0dnNucC5zaGFyZWQteQk6PSB0ZXN0dnNucC5vCit2Zm9yay5zaGFyZWQteQkJOj0gdmZvcmsubworCisjIENsZWFuaW5nCitjbGVhbi1maWxlcyA6PSAkKHN0YXRpYy15KSAkKHNoYXJlZC15KSBcCisJJChhZGRzdWZmaXggLmcsICQoc3RhdGljLXkpICQoc2hhcmVkLXkpKSBcCisJJCh0ZXN0LWZpbGVzOi5jPS5vKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL2Vudmlyb24uYyBiL3Vzci9rbGliYy90ZXN0cy9lbnZpcm9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMDgyZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9lbnZpcm9uLmMKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSkKK3sKKwlpbnQgaTsKKworCS8qIFZlcmlmeSBlbnZwID09IGVudmlyb24gKi8KKwlwcmludGYoIlZlcmlmeWluZyBlbnZwID09IGVudmlyb24uLi4gJXNcbiIsCisJICAgICAgIChlbnZwID09IGVudmlyb24pID8gIm9rIiA6ICJFUlJPUiIpOworCisJLyogVGVzdCBhcmdjL2FyZ3YgKi8KKwlwcmludGYoImFyZ2MgPSAlZCwgYXJndiA9ICVwXG4iLCBhcmdjLCBhcmd2KTsKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCXByaW50ZigiYXJndlslMmRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOworCX0KKworCS8qIFRlc3QgZW52aXJvbiAqLworCWZvciAoaSA9IDA7IGVudnBbaV07IGkrKykKKwkJcHJpbnRmKCIlc1xuIiwgZW52cFtpXSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9mY250bC5jIGIvdXNyL2tsaWJjL3Rlc3RzL2ZjbnRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhYTNhNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9mY250bC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBTaW1wbGUgdGVzdCBvZiBmY250bAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmQgPSBvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKwlzdHJ1Y3QgZmxvY2sgbDsKKwlsb25nIGZsYWdzOworCisJKHZvaWQpYXJnYzsKKworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJvcGVuIik7CisJCWV4aXQoMSk7CisJfQorCisJLyogR2V0IHRoZSBmbGFncyBvbiB0aGlzIEZEICovCisKKwlpZiAoKGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwpKSA9PSAtMSkgeworCQlwZXJyb3IoIkZfR0VURkwiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoZmxhZ3MgIT0gKE9fUkRPTkxZIHwgT19MQVJHRUZJTEUpKQorCQlmcHJpbnRmKHN0ZGVyciwgImZsYWdzID0gJSNseFxuIiwgZmxhZ3MpOworCisJLyogU2V0IGEgbG9jayBvbiB0aGlzIEZEICovCisJbWVtc2V0KCZsLCAwLCBzaXplb2YgbCk7CisJbC5sX3R5cGUgPSBGX1JETENLOworCWwubF93aGVuY2UgPSBTRUVLX1NFVDsKKwlsLmxfc3RhcnQgPSAxMjM7CisJbC5sX2xlbiA9IDQ1NjsKKworCWlmIChmY250bChmZCwgRl9TRVRMSywgJmwpID09IC0xKSB7CisJCXBlcnJvcigiRl9TRVRMSyIpOworCQlleGl0KDEpOworCX0KKworCS8qIEV2ZW50dWFsbHksIGZvcmsgYW5kIHRyeSB0byBjb25mbGljdCB3aXRoIHRoaXMgbG9jay4uLiAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvZm5tYXRjaC5jIGIvdXNyL2tsaWJjL3Rlc3RzL2ZubWF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTUwODU3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL2ZubWF0Y2guYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGZsYWdzID0gYXRvaShhcmd2WzNdKTsKKwlpbnQgbWF0Y2ggPSBmbm1hdGNoKGFyZ3ZbMV0sIGFyZ3ZbMl0sIGZsYWdzKTsKKworCXByaW50ZigiXCIlc1wiIG1hdGNoZXMgXCIlc1wiOiAlZFxuIiwgYXJndlsxXSwgYXJndlsyXSwgbWF0Y2gpOworCisJcmV0dXJuIG1hdGNoOworfQorCisJCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvZ2V0b3B0bG9uZy5jIGIvdXNyL2tsaWJjL3Rlc3RzL2dldG9wdGxvbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE3NGFiYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9nZXRvcHRsb25nLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIGdldG9wdGxvbmcuYworICoKKyAqIFNpbXBsZSB0ZXN0IGZvciBnZXRvcHRfbG9uZywgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRVRPUFRURVNUCisgKiB0byBnaXZlIHRoZSBhcmd1bWVudCBzdHJpbmcgdG8gZ2V0b3B0KCkKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworc3RhdGljIGludCBmb28gPSAwOworCQorc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJeyAiZmlyc3QiLCAgIDEsIE5VTEwsICdmJyB9LAorCXsgInNlY29uZCIsICAwLCBOVUxMLCAncycgfSwKKwl7ICJ0aGlyZCIsICAgMiwgTlVMTCwgJzMnIH0sCisJeyAiZm91cnRoIiwgIDAsIE5VTEwsICA0IH0sCisJeyAic2V0LWZvbyIsIDAsICZmb28sICAxIH0sCisJeyBOVUxMLCAwLCBOVUxMLCAwIH0KK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKK3sKKwljb25zdCBjaGFyICpwYXJzZXI7CisJY29uc3QgY2hhciAqc2hvd2NoYXI7CisJY2hhciBvbmVfY2hhcltdID0gIlwnP1wnIjsKKwljaGFyIG51bV9idWZbMTZdOworCWludCBjOworCWludCBsb25naW5kZXg7CisKKwlwYXJzZXIgPSBnZXRlbnYoIkdFVE9QVFRFU1QiKTsKKwlpZiAoIXBhcnNlcikKKwkJcGFyc2VyID0gImFiemY6bzoiOworCisJZG8geworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgcGFyc2VyLCBsb25nX29wdGlvbnMsICZsb25naW5kZXgpOworCisJCWlmIChjID09IEVPRikgeworCQkJc2hvd2NoYXIgPSAiRU9GIjsKKwkJfSBlbHNlIGlmIChjID49IDMyICYmIGMgPD0gMTI2KSB7CisJCQlvbmVfY2hhclsxXSA9IGM7CisJCQlzaG93Y2hhciA9IG9uZV9jaGFyOworCQl9IGVsc2UgeworCQkJc25wcmludGYobnVtX2J1Ziwgc2l6ZW9mIG51bV9idWYsICIlZCIsIGMpOworCQkJc2hvd2NoYXIgPSBudW1fYnVmOworCQl9CisKKwkJcHJpbnRmKCJjID0gJXMsIG9wdGluZCA9ICVkIChcIiVzXCIpLCBvcHRhcmcgPSBcIiVzXCIsICIKKwkJICAgICAgICJvcHRvcHQgPSBcJyVjXCcsIGZvbyA9ICVkLCBsb25naW5kZXggPSAlZFxuIiwKKwkJICAgICAgIHNob3djaGFyLCBvcHRpbmQsIGFyZ3Zbb3B0aW5kXSwKKwkJICAgICAgIG9wdGFyZywgb3B0b3B0LCBmb28sIGxvbmdpbmRleCk7CisJfSB3aGlsZSAoYyAhPSAtMSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9nZXRvcHR0ZXN0LmMgYi91c3Iva2xpYmMvdGVzdHMvZ2V0b3B0dGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjE5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvZ2V0b3B0dGVzdC5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBnZXRvcHR0ZXN0LmMKKyAqCisgKiBTaW1wbGUgdGVzdCBmb3IgZ2V0b3B0LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdFVE9QVFRFU1QKKyAqIHRvIGdpdmUgdGhlIGFyZ3VtZW50IHN0cmluZyB0byBnZXRvcHQoKQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcGFyc2VyOworCWNoYXIgc2hvd2NoYXJbXSA9ICJcJz9cJyI7CisJaW50IGM7CisKKwlwYXJzZXIgPSBnZXRlbnYoIkdFVE9QVFRFU1QiKTsKKwlpZiAoIXBhcnNlcikKKwkJcGFyc2VyID0gImFiemY6bzoiOworCisJZG8geworCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIHBhcnNlcik7CisJCXNob3djaGFyWzFdID0gYzsKKwkJcHJpbnRmCisJCSAgICAoImMgPSAlcywgb3B0aW5kID0gJWQgKCVzKSwgb3B0YXJnID0gXCIlc1wiLCBvcHRvcHQgPSBcJyVjXCdcbiIsCisJCSAgICAgKGMgPT0gRU9GKSA/ICJFT0YiIDogc2hvd2NoYXIsIG9wdGluZCwgYXJndltvcHRpbmRdLAorCQkgICAgIG9wdGFyZywgb3B0b3B0KTsKKwl9IHdoaWxlIChjICE9IC0xKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL2dldHBhZ2VzaXplLmMgYi91c3Iva2xpYmMvdGVzdHMvZ2V0cGFnZXNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWU5NDZhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL2dldHBhZ2VzaXplLmMKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJcHJpbnRmKCJnZXRwYWdlc2l6ZSgpICAgID0gJWRcbiIKKwkgICAgICAgIl9fZ2V0cGFnZXNoaWZ0KCkgPSAlZFxuIiwgZ2V0cGFnZXNpemUoKSwgX19nZXRwYWdlc2hpZnQoKSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9oZWxsby5jIGIvdXNyL2tsaWJjL3Rlc3RzL2hlbGxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4NTliZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9oZWxsby5jCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJcHJpbnRmKCJIZWxsbywgV29ybGQhXG4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9pZHRlc3QuYyBiL3Vzci9rbGliYy90ZXN0cy9pZHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M0NDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL2lkdGVzdC5jCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgbWFpbih2b2lkKQoreworCXByaW50ZigicGlkICAgPSAldVxuIiwgZ2V0cGlkKCkpOworCXByaW50ZigicHBpZCAgPSAldVxuIiwgZ2V0cHBpZCgpKTsKKwlwcmludGYoInVpZCAgID0gJXVcbiIsIGdldHVpZCgpKTsKKwlwcmludGYoImV1aWQgID0gJXVcbiIsIGdldGV1aWQoKSk7CisJcHJpbnRmKCJnaWQgICA9ICV1XG4iLCBnZXRnaWQoKSk7CisJcHJpbnRmKCJlZ2lkICA9ICV1XG4iLCBnZXRlZ2lkKCkpOworCXNsZWVwKDEwKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9tYWxsb2N0ZXN0LmMgYi91c3Iva2xpYmMvdGVzdHMvbWFsbG9jdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTE4NGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvbWFsbG9jdGVzdC5jCkBAIC0wLDAgKzEsNDE0NiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTkNZQ0xFUyA0MDk2CisKK2ludCBzaXplc1tOQ1lDTEVTXSA9IHsKKwkxMTk4NiwKKwkyNzc4MDYsCisJMjY1OSwKKwk0NiwKKwkwLAorCTc3NTU1MywKKwkxOTkxLAorCTIxLAorCTc2MzgsCisJMjUwMTk3LAorCTE1NTgyOCwKKwk1Nzc3LAorCTksCisJMzE1MDA2LAorCTkwMDc4OCwKKwkwLAorCTI0ODkzLAorCTExOTk5NiwKKwk3MjI5OSwKKwkxNzEyNjYsCisJMzU3LAorCTU2MCwKKwkzNjgsCisJMjI5NTIsCisJNTQwNTgsCisJMTI2MzgsCisJMzkxNTUsCisJMjczOCwKKwkyMTc1NjMsCisJMjY4NTMsCisJNDcsCisJNzUsCisJMTE2NywKKwkxNjkxNywKKwkxODk5LAorCTI5MDUsCisJOTMzNywKKwk2MjI0MywKKwkxNDIxNCwKKwkyNzA1MjMsCisJNDAyNCwKKwkyMSwKKwkzMiwKKwkxNDg5MiwKKwk2MjUxNDQsCisJMTMsCisJMjE3MDAsCisJODgwNCwKKwkyNTQxNDcsCisJMCwKKwk2LAorCTgzNjAwNCwKKwkxNzE4LAorCTIyODksCisJMTU1NTQsCisJNDEyODU3LAorCTE4NTA5NywKKwk4MDY3MDksCisJNjQsCisJMTg2MDIsCisJMTcwNjQsCisJMTc3OSwKKwk3ODE1MywKKwkxNzA2MDAsCisJMTk5MTAwLAorCTU0NjUyOCwKKwkwLAorCTIxLAorCTIwNjA5LAorCTE2NTE0LAorCTU0ODE5NiwKKwkzMTE0NDYsCisJNTM0ODQsCisJMCwKKwk1NTEsCisJMjIyMjUsCisJMjQsCisJMTUzOTg5LAorCTQ1NzMwOSwKKwk1MjY4MzMsCisJMjI3OTc5LAorCTc1NzE2NywKKwk0Mjk1NjAsCisJMCwKKwk4MzUsCisJMTcwMiwKKwk0NzUyNzUsCisJNzk4NDE2LAorCTc1MywKKwkwLAorCTExMTI2LAorCTE0NTc3OSwKKwkyMDA2LAorCTAsCisJODE4MiwKKwkwLAorCTU2OTQzMiwKKwk5NjcxLAorCTM2LAorCTU1MjMsCisJNDA3MzI1LAorCTAsCisJNjUsCisJOTI5MywKKwkwLAorCTY3OTMsCisJNDY4NzAxLAorCTczLAorCTAsCisJMTg2MjM2LAorCTAsCisJMzI4NDA1LAorCTEyNTYxNiwKKwk1MDgwMTMsCisJMzgwNTE5LAorCTU5OTUxOCwKKwk4MywKKwkxNTE5NzMsCisJNDY2OTA2LAorCTkwMjksCisJMTU5NzI1LAorCTEzMTYsCisJMSwKKwk5MTE1MzIsCisJMTUwOCwKKwkxOTA1MCwKKwk5NzI4NTAsCisJMTI2LAorCTQzOTM3NywKKwkyOSwKKwkzNzkyOCwKKwkxNDk2MjgsCisJNTQsCisJMTMwMjQ4LAorCTIsCisJMTQzLAorCTAsCisJNzE2ODczLAorCTMzMjcsCisJNSwKKwkxMTYxMzEsCisJNTEyNCwKKwk1NTk2MjEsCisJMjg4NiwKKwk1MzQsCisJMTg2NDMyLAorCTQ0MSwKKwk3MzQ4LAorCTEwMzMxLAorCTEsCisJMjYwOTM1LAorCTcsCisJNDM3MCwKKwk0MDU0MTUsCisJMiwKKwk4NDUxOCwKKwkxOTcwLAorCTEsCisJMjgxOTEwLAorCTQ2LAorCTI3NCwKKwkyMjczLAorCTM3MDU2NSwKKwk0MTkwLAorCTgyMDY0MSwKKwk1Nzc5NzAsCisJMzI4MDksCisJOTc0ODkzLAorCTM5ODA2NywKKwkzODA2OTgsCisJNCwKKwkyNTk3OCwKKwkxNTMsCisJODgyNjY4LAorCTMxMjM2NSwKKwk5NTIzLAorCTE1NjQyMSwKKwkwLAorCTI2ODE0MywKKwk2LAorCTIsCisJNDI5ODcsCisJMjEyLAorCTEyMzAzLAorCTY3MjMsCisJMTE3OSwKKwkwLAorCTEyMDkyNCwKKwkzODc3LAorCTMzMDQyMSwKKwkzMTA0NDUsCisJMzkyNjQsCisJOCwKKwk4NTM4MCwKKwk0NjQ3MTYsCisJMCwKKwkzMzY1NywKKwk2Mjg1LAorCTAsCisJNDQ5MSwKKwkyMjksCisJNTAsCisJMzczMTk3LAorCTYwMjksCisJMTksCisJODY4ODQsCisJMjQzNzQ1LAorCTMzNTY1NiwKKwk5MDk0NSwKKwkzODk3MywKKwk1NzI5NTAsCisJMTY0MTI5LAorCTAsCisJMywKKwkxNywKKwkxMzU3OSwKKwk0NDQ4LAorCTQ3LAorCTMsCisJMTMyOTY2LAorCTcyNjI0OSwKKwk0OTg1MDMsCisJMjU2LAorCTAsCisJMjU4NDEsCisJMCwKKwk3LAorCTk0NTM4MCwKKwkxMTg3MiwKKwk2OSwKKwkzNzk5LAorCTc3MjIzLAorCTE5MTQsCisJNzMsCisJODEwOTY4LAorCTEwMjIzLAorCTI1NzkxOCwKKwkxODQyNTIsCisJMzUwLAorCTgxMDEsCisJNzI1LAorCTksCisJMiwKKwkyMDg5LAorCTE3NSwKKwkyNDcsCisJMTg1OTY0LAorCTM2NTE3LAorCTM3MjMsCisJMzEzNDY1LAorCTIwOSwKKwkxMzAwLAorCTEyODA3MSwKKwk3NDI1LAorCTI0MzYsCisJNjIsCisJMTM3NTMsCisJOTUxNCwKKwk0MSwKKwk0MDkxNDEsCisJNDY2NDMsCisJMjA4NjYsCisJMTU2NjQsCisJMzg4NTQ4LAorCTg0NjkyLAorCTk1NDksCisJNjEwLAorCTcyMTMsCisJMTQsCisJMTQ5MzAsCisJMjQ0NzE5LAorCTQ3NDgsCisJNDE2ODIsCisJNDAxMDk4LAorCTEwMjUwNiwKKwkxNzY1MzUsCisJMCwKKwk1MTMzLAorCTU0OCwKKwk1MjM0LAorCTU2LAorCTExMTAxLAorCTg3NjM4LAorCTMzNjU3OSwKKwkyOTE3MDUsCisJNjQwMjUwLAorCTc2ODE2NSwKKwkzNzAsCisJMjgwOSwKKwkzLAorCTAsCisJNDQ1MTIyLAorCTQ3MTkwLAorCTI0ODg1LAorCTE0MzU1NiwKKwk4NCwKKwk1MDQ3MjYsCisJNjEwMDIwLAorCTQwMzU1LAorCTkwMjIzMCwKKwk0MzYwLAorCTE3NDcsCisJMzQ5NiwKKwk0ODk1MDEsCisJMTksCisJODAxNjAxLAorCTYyMTg5LAorCTQ4LAorCTI2NDUsCisJMzIwNjAxLAorCTI3MzA0LAorCTE3NzQwLAorCTM0NCwKKwkxMCwKKwk5OTEsCisJOTI1NTAzLAorCTAsCisJMzE1LAorCTI1MSwKKwkzNjExLAorCTE3NTYsCisJNjgzLAorCTE2NSwKKwkzODAxMzIsCisJMTgxMTAxLAorCTQ1MzA0MSwKKwk4OTIwNTYsCisJNjcxOTEsCisJMjUyNTkyLAorCTMyNDA3LAorCTU2MjQyLAorCTgsCisJMjk3MTczLAorCTU0MjkwMywKKwk4MzAzMzQsCisJNTg1MjM2LAorCTQyMjU1NSwKKwk0NDc2OSwKKwkwLAorCTY4LAorCTQxNDMsCisJMzg3NTQsCisJNzM1MzksCisJNDQ1NzksCisJOTQwMDEsCisJNDI4NTM3LAorCTM4NTU0LAorCTEwNjYxMiwKKwkwLAorCTE4Mjk4NywKKwk4MzE3MzEsCisJMzYwNSwKKwk3NTI4NTEsCisJNTIsCisJNzIsCisJMTIwODcyLAorCTk2Mzc1NCwKKwkzMSwKKwk3NjQsCisJMjQwNTkyLAorCTk5MTAxLAorCTMyODUzOCwKKwk0NDAzMjUsCisJMTIyMTEsCisJMTUxMjgyLAorCTM1MzQzNiwKKwkyOTkxLAorCTQwNzEwLAorCTUyMTIsCisJNTEwNiwKKwkxMzkxMjIsCisJMTQ4OTE1LAorCTQ5ODUwNSwKKwkxMzY2LAorCTUxNiwKKwkyOTE5MCwKKwkxNywKKwkyMjQyMDgsCisJNDAsCisJODksCisJMTkxOTAsCisJOCwKKwkyNTM3NywKKwkxMDAyOSwKKwk3MjAsCisJOTc5NjMsCisJMCwKKwk2MTQsCisJMjQ0NTY3LAorCTIxMTMsCisJOTAzNjc1LAorCTgzODgsCisJNiwKKwkzOTA3MDUsCisJMzI1MDA2LAorCTI4NDI3MiwKKwkxMDgwODYsCisJMTcsCisJMjYyOCwKKwk5NTI1MzAsCisJMjA0NzQsCisJODk4Mjc2LAorCTEzODY2MSwKKwkzODgzLAorCTkwMywKKwk1Njk5OTMsCisJMzc2OTE4LAorCTU4NDksCisJMTAzNDA0LAorCTc5NDQ5OSwKKwkzNTM4OCwKKwk1LAorCTAsCisJOTYxNjI2LAorCTI3NDE1LAorCTE5MjcsCisJOTIwMzYsCisJNDYyNDEsCisJMzU5NzgsCisJNzQyNiwKKwkzOTk4ODQsCisJMjk0OTAsCisJMjUyNjU1LAorCTY3NTk3MSwKKwkzNTA5LAorCTU0MTcwLAorCTE3MDc5MCwKKwk4MzEzNDEsCisJMTM0NTc5LAorCTAsCisJNzkwNDIyLAorCTM1LAorCTkzMDgzMCwKKwk5NzM5NCwKKwkyMDI2NSwKKwk2NzAsCisJMzg0OTcsCisJMTc1OSwKKwk3MTIwOSwKKwk5MywKKwk3MzYsCisJMTEsCisJODg2LAorCTE5NjEsCisJNywKKwkyMTA2MDcsCisJNjIyMjYsCisJMTg2NzM2LAorCTE1MTgsCisJNSwKKwk1LAorCTEzLAorCTY2OTg5LAorCTQ0MjMyMSwKKwkwLAorCTYwNzkzOSwKKwkxMTI1MywKKwkyMTA4NzUsCisJNDk1NTMwLAorCTIsCisJMjIxMTM2LAorCTM3NzY2MywKKwkzNzIsCisJMjAwNjU4LAorCTE4NTkxLAorCTEyOTc4MywKKwk4MDM0MTEsCisJODY3NTA2LAorCTc1NzQ0NiwKKwk0ODgzNiwKKwkzNCwKKwkyMDAsCisJMTE0OTgzLAorCTcyODcsCisJMjI4NDksCisJMjI2NjY5LAorCTEzLAorCTAsCisJMjAxNjQsCisJNzgyOCwKKwkzOSwKKwk0OTQ0OCwKKwkyNjc0MCwKKwkxODU1NjYsCisJOTkyNywKKwkzNjE5MiwKKwk5MTA2OCwKKwkzMzgzNjgsCisJOTI2LAorCTI3NzQ2LAorCTUzNDc5NCwKKwk5MzYxMzIsCisJMjkyMiwKKwk1LAorCTE4MzE2MiwKKwkyNTY4NDYsCisJMjQyNTUxLAorCTEzNDMxOCwKKwkyMTI5NTksCisJMTY3MTYyLAorCTQ3MCwKKwk0NzcwNDUsCisJNTMyMTE2LAorCTQ4Mzc5NCwKKwk3MzMsCisJNTMzNSwKKwk4MzA3NCwKKwk0Njg2LAorCTk1NjcsCisJMSwKKwkxOTUxMDAsCisJNDAzNTQsCisJODczMzgsCisJMzY5LAorCTgwMCwKKwkwLAorCTE5NDUwNCwKKwk0NjkwNTEsCisJMzYzNTMyLAorCTg1MDU3NCwKKwk1MDg1LAorCTE2NzAyNywKKwk3OTQ1MTEsCisJMTI0MzIwLAorCTMwMzIzMSwKKwkxMzIxOTUsCisJMTMyMjUsCisJNDYzMzMsCisJNDMxMywKKwk4OSwKKwk3OTksCisJNTE0ODIsCisJMCwKKwkyNiwKKwkxMjY1OSwKKwkxMDQ1LAorCTIzNjIxLAorCTAsCisJNzQ5MjYsCisJNDkwOTc5LAorCTYsCisJMzE4OCwKKwk5NDQ4LAorCTE3NDczMCwKKwkzODk4MiwKKwkxMDIzMTcsCisJMTg5NjIxLAorCTg1MywKKwkyOTIyNywKKwk0MzM3NCwKKwk0MjMsCisJNDIwOTUxLAorCTY4NiwKKwkxMjgsCisJMzEyOTEsCisJMCwKKwk0MDI4MTksCisJNjYzMTQzLAorCTU1OTAzLAorCTE0MiwKKwkyLAorCTMzMTU4NCwKKwkxOTcxNjQsCisJNywKKwk2NzE5ODMsCisJNTMsCisJNTAyMCwKKwk5NzgyLAorCTEyMywKKwk3NDM0MDcsCisJMTI3NiwKKwkxMTE1LAorCTExNjksCisJMTIyNzUyLAorCTgyNDY5MCwKKwkyOTIwMzAsCisJMjA5NCwKKwkxNDQ2MjYsCisJMCwKKwkyOTcyNzgsCisJNDQwLAorCTc0MiwKKwk5NTg3OSwKKwkxNzY4MiwKKwkxMDY1NCwKKwkzMSwKKwkyMjE4MywKKwk3NDYsCisJMCwKKwkwLAorCTExMTg1LAorCTI4LAorCTM5NDk4NywKKwkzNiwKKwk0NzQsCisJMjQzNzQ5LAorCTE0MzEsCisJNTY3MDIsCisJNzYsCisJMTU2MTksCisJMzMwNzEsCisJMTIxODEsCisJMTU4NjQ3LAorCTI2MTc4NiwKKwkxLAorCTExOTc4MywKKwk0ODgxNiwKKwk2Mjc4LAorCTQxMjEsCisJNjExMjIsCisJNjksCisJNDg3OTAsCisJMzQ1MzM1LAorCTI3NTkxNywKKwk5NjQzOTMsCisJNDI0LAorCTU4NjQzMywKKwkyMDUxOSwKKwkxODE1NiwKKwk3NTY0MDAsCisJMjc3MzYsCisJNDU4NzA2LAorCTEsCisJMzI4NiwKKwk5Mjk2MjQsCisJMTg4MywKKwkyLAorCTEwODYsCisJNDM5NTAxLAorCTU1MiwKKwkxNTcxMzIsCisJNTU2NSwKKwkxMDUwNjEsCisJODE5OSwKKwkyMywKKwkxNzg3OTcsCisJMCwKKwkxMzA2NDQsCisJMSwKKwk2OTUyLAorCTc1NCwKKwk1MDAsCisJNjQ3NjgzLAorCTAsCisJOTU5MDc5LAorCTYyMjU2MSwKKwkxMTMxLAorCTU1OTc4MywKKwk2ODYyLAorCTE3NTQyMCwKKwk0MDg2NzEsCisJNDYzNDYxLAorCTU1OTA4LAorCTYwNjQ5NiwKKwkxNjksCisJNDkwNjAsCisJMjQ3LAorCTk1MywKKwkzMzMwMzAsCisJMCwKKwkyMzM5OSwKKwkyOTE5MywKKwk5MzAzLAorCTE1LAorCTUxNTQwMiwKKwkzNDk2MSwKKwkzNjU4NTYsCisJNjMzMDQzLAorCTE3MywKKwk1NTYwODksCisJMTgwOSwKKwkxMjIxNSwKKwkxNCwKKwkzMTYsCisJMjA2NDIsCisJOSwKKwkxNSwKKwkxOTAzOTEsCisJOTUxNDYzLAorCTI1MDU5LAorCTEzNjU0LAorCTM4NTA0MCwKKwk0MjcyLAorCTkyOTAzMywKKwkyMDg4MTMsCisJMzUxNjYsCisJNDI4NDksCisJNjYyNjQ4LAorCTI1NDgxMSwKKwk0MjMwLAorCTgxMjQ1OSwKKwk2ODEsCisJMzkwMTY4LAorCTUzODEsCisJNDY2MiwKKwkxNzMyNTcsCisJNDc4ODYzLAorCTEwMywKKwk4OTMzMiwKKwkwLAorCTAsCisJNTg5NDg0LAorCTE5MzY5LAorCTk0LAorCTksCisJNjM5OTE3LAorCTExMTAsCisJMzkzLAorCTEwMTA0MCwKKwk5MTEsCisJMTUyODk5LAorCTAsCisJMiwKKwkwLAorCTAsCisJMzM1NjkxLAorCTQzNjk0LAorCTYyMjczLAorCTIwMDEyMSwKKwkyMjUwLAorCTYyMTAwNCwKKwkxNDk5MTgsCisJNDEwNjMsCisJMjE4MjI5LAorCTAsCisJNDk3OTI0LAorCTE2ODMyLAorCTU4NzA3MSwKKwkwLAorCTAsCisJNzI5OTE4LAorCTIsCisJODA4NTEzLAorCTk0MTcsCisJNzE4LAorCTAsCisJMjc2OSwKKwkyODcwNCwKKwkxMzM1LAorCTczNDcyNiwKKwkyMTkxNTcsCisJNzg2MjMwLAorCTk4MTAwNCwKKwkzNTA3ODgsCisJODg0NTI5LAorCTAsCisJODc4NzIsCisJMzQ2NDcsCisJODU0NjksCisJNDUyNCwKKwkzMzk4MzgsCisJMzgyMjgsCisJMCwKKwk0MTUxLAorCTExNDUsCisJMCwKKwkzNTEsCisJMTY3OTU2LAorCTgxMDA3NSwKKwk2ODksCisJMjUxMjEyLAorCTU4MzA2OCwKKwkyOTI5LAorCTE4OTQ1NiwKKwkyMDg5LAorCTQ4NzQ5LAorCTI3ODk1MiwKKwk3NzEzNCwKKwkwLAorCTAsCisJNDU1OTUsCisJMjgxODI5LAorCTk2OTYwMiwKKwk0Mzk5OSwKKwk2OTgyNCwKKwk4NTY5ODIsCisJNjE3MzIsCisJMzM2LAorCTI1NDg4LAorCTIxMywKKwk0NjY4MywKKwkxOTA5LAorCTE3NDA5NywKKwk1NzkzMCwKKwk5MTQ2NiwKKwk4Mjg0MTgsCisJOTU3NDAsCisJMzc4ODI4LAorCTEyODA2NSwKKwk2ODA2OCwKKwkwLAorCTEzMzEyLAorCTI2MDA2LAorCTY3NjAsCisJNTEsCisJMjc2MDgxLAorCTY0MDA2OCwKKwk2MzQ5ODUsCisJNzEzMSwKKwk3ODQ4ODIsCisJNzkwMTI2LAorCTYyODU4NSwKKwkyMDU4MjQsCisJNzY0OTY1LAorCTE3NzkzLAorCTMxNTksCisJNjQ5OTI0LAorCTAsCisJMzczODMsCisJOTkxOSwKKwkzNTMsCisJMCwKKwkxNDkwMDMsCisJNjIwNjI5LAorCTk1OTI4LAorCTI1NjAsCisJNTA0MzQzLAorCTEwMDAsCisJMzIsCisJNDM4MzYsCisJNDA3MDMxLAorCTIwNywKKwk4MDA4OTQsCisJMzIyMiwKKwk1MTAyOCwKKwk3LAorCTYsCisJMjIwMTAsCisJMCwKKwkyMTE3NCwKKwkxMjg5MywKKwk4MjQ5MzIsCisJNzMwNSwKKwk3MCwKKwk2MjQyNTgsCisJMzcyMTM5LAorCTIxNTA0LAorCTM4Nzk5NiwKKwk0MTg5MzEsCisJOTE0MjY4LAorCTU3NiwKKwkwLAorCTAsCisJNjE4MjI0LAorCTc4NzUxNiwKKwkxMzMwMTQsCisJNDIyLAorCTM4MzEyNCwKKwk2NTYzMTgsCisJNDQyMCwKKwk2MDgyLAorCTI0NDgxMywKKwkzODU4NSwKKwkzMjAwLAorCTEsCisJMiwKKwkxMTg4MiwKKwkxMTMsCisJNDU1ODEsCisJMTMxMjEsCisJOTU0NzUsCisJODA3MjE5LAorCTgxOTUsCisJOTk1MTE2LAorCTEzLAorCTIxNDYsCisJMzY5OTI1LAorCTYwMTAzLAorCTI1LAorCTEyNTE2NSwKKwk1MTMwMCwKKwk0ODk0LAorCTE3MzI2MSwKKwk3NDE4NiwKKwkxMDQ0LAorCTEyMjk5MiwKKwkxMjQzLAorCTIxNzAzLAorCTI2Mjk0LAorCTE5NywKKwkzMzM4MjUsCisJNDI2ODcyLAorCTcxOTU4MCwKKwkzNTk4LAorCTEwNiwKKwkwLAorCTk5MzIsCisJNjE1MDksCisJMTQ2LAorCTcyMTQyOCwKKwk5NjQ3ODEsCisJMzE5ODUwLAorCTU3MzgwMiwKKwk3NDU4LAorCTMxNzg4OSwKKwkwLAorCTEzMzA4NiwKKwk4NzgzNiwKKwk2MDQ5NiwKKwkzMDQyNDksCisJMTU2NSwKKwkyNywKKwk0MiwKKwk4OTkzMjQsCisJMTg5NjM3LAorCTg2NDgsCisJMTA0NTcwLAorCTkwMTU5OCwKKwk0NDc3NjUsCisJMjQsCisJMTA4LAorCTEyMDEyNywKKwk4Mjg2MjYsCisJOCwKKwk4OTk1MTQsCisJMjgsCisJMTMsCisJNzU3NiwKKwkxNjMzOTAsCisJMTYyNSwKKwkzMDIzLAorCTE1NTE3NSwKKwkyLAorCTM5MSwKKwkxLAorCTQ5MzA3MywKKwkzOTgsCisJMjEwNzcxLAorCTI2MjY2LAorCTI4Nzk5OSwKKwkzODI1NSwKKwkyNDk2NjYsCisJNTk4MjAyLAorCTExOTYwMSwKKwkyMTY5MzMsCisJOTEyMDUsCisJMCwKKwk3MjQ3LAorCTc3MDc3LAorCTU2NTM4MywKKwkyOTEwMiwKKwkyNTM2NDEsCisJNDg4NTUsCisJMTk3MjIsCisJNDYzNTM2LAorCTQwMTgyLAorCTY1MzkzLAorCTgyOTQ0NCwKKwk1OTg0MDIsCisJMTU5MCwKKwk3OTgsCisJNDY3LAorCTgzNDg0NywKKwkzMDA3LAorCTEzNzExLAorCTAsCisJMTk1LAorCTEwMTY2MiwKKwkyNTU3NDksCisJMTI5MjAxLAorCTExOTY1LAorCTE3ODEsCisJMTMzNDksCisJMzEwMCwKKwk3MTgwNjYsCisJOTksCisJNzEyNDUwLAorCTg4ODIxNSwKKwk0MjUwMywKKwk0MzE3MSwKKwk0OTQ5NDYsCisJMCwKKwkyMTc1LAorCTEyMzg3LAorCTI1NjYyLAorCTc4LAorCTczOTAzMCwKKwkwLAorCTE5LAorCTQyNzUyNiwKKwk0Mjc1LAorCTU1ODMsCisJMCwKKwkyNDQ3LAorCTEzMjM5OCwKKwkyNjQzNywKKwkzODczLAorCTQ0MDAzNSwKKwkyMSwKKwk2LAorCTM1NDMyLAorCTQxNTIzLAorCTcxNzksCisJNzEyNzAzLAorCTQyODg2OCwKKwkyNzkzLAorCTYsCisJMjg2Mjc3LAorCTE4ODIsCisJOTUxMTYsCisJMjk1OSwKKwk4NiwKKwkxMTU0MjUsCisJODEzODYsCisJNTk4MzYsCisJMzcsCisJMjQ3NTk4LAorCTM0NzMyLAorCTI0OSwKKwk1MDAxMTAsCisJNTU4OSwKKwk0MDMxOSwKKwk1NzUsCisJMTIxNDUsCisJMzg1ODI5LAorCTU2NTYwMCwKKwk1ODIxNTAsCisJOTIsCisJMjIzMjA5LAorCTAsCisJOTEwLAorCTEwNDgsCisJNDczMjksCisJOTA5NDQsCisJMjM1LAorCTg3MzksCisJNjg2Njg1LAorCTE3NTMsCisJMTI2LAorCTQzNCwKKwk2MDk0NzcsCisJMjUwMjEsCisJNjYxMCwKKwk1MjY3NSwKKwk0LAorCTcxNzg0NiwKKwkxNTA4NjQsCisJNDE4NTgzLAorCTE3NzUxLAorCTUxMzc5NCwKKwkxODEzNjIsCisJMzI5NTU2LAorCTEwNDI2LAorCTcxNzAxOSwKKwk0NTcsCisJNjE2LAorCTM4ODk4NCwKKwkxNywKKwk4MzM4LAorCTU5NTMxLAorCTMyLAorCTk5NTY1LAorCTM3NjE0NiwKKwkxMzQ1NzgsCisJOTY2LAorCTAsCisJMCwKKwkxNzQsCisJMjEwNSwKKwk1NTUsCisJODk5MCwKKwkyOTgsCisJMTY5OTMyLAorCTI0NzI4MSwKKwkyNDA5MTgsCisJMjk4NjU1LAorCTE1ODc0MywKKwkxNTk5NCwKKwk5NTcwOCwKKwk1MSwKKwkyOTg1LAorCTQyOTQsCisJNzMxOTM0LAorCTE4NTY0MCwKKwkxNDgzLAorCTg3LAorCTc0MjAzMywKKwk5LAorCTEzNDUsCisJMzY4MCwKKwkxMzM1MzAsCisJOTM1NSwKKwk4MDAxMTEsCisJMjg1MDgsCisJMCwKKwkzNjksCisJMzE2ODEsCisJMjQsCisJODIzNywKKwkzMTMzODAsCisJNDczMiwKKwkyNzU0MjMsCisJOTUxNTkyLAorCTAsCisJNDEzODEsCisJMjI1NTE1LAorCTM5MzAwNCwKKwk1MjYsCisJMTg3LAorCTE5NTE1LAorCTYwMDYsCisJMjg5MjMsCisJMzEwMTUxLAorCTIzOTAsCisJMzc0LAorCTAsCisJMTkxNDIsCisJNzIsCisJMTE0LAorCTE5MzMwNSwKKwkyNDAzNSwKKwkzOTcwNjcsCisJMTgsCisJMTQ4MzksCisJMzQ3MywKKwkxNjQsCisJMTA0NjIyLAorCTM3ODk1OCwKKwkyMjE4LAorCTAsCisJODkwNTMsCisJMTA1MTgzLAorCTMxMjI2NSwKKwk4MjE0NiwKKwkxNDcyMTAsCisJMzQxOSwKKwk1MTc4LAorCTM0OTQ4LAorCTQ2ODM2LAorCTQxMzE5LAorCTg0MjgyNSwKKwk1OTU5NzIsCisJMCwKKwkyNDk2MjUsCisJMzI1LAorCTYwOCwKKwkzNzIzMjgsCisJMTE5NjM0LAorCTc1MDQsCisJOTIwMjE0LAorCTczMDIsCisJNDQ0NTMyLAorCTM1OTIxMywKKwkyNzI2NSwKKwkxNzU1LAorCTQ4LAorCTEyNjc5OSwKKwk2NTEyNzAsCisJODE4MjIwLAorCTc5OTQ5MywKKwk3MjQwMjQsCisJNjQwNDcsCisJNzM2OTksCisJMjA2OTk5LAorCTIwOSwKKwkxNTgxLAorCTAsCisJNDI5MzcsCisJMzAxMTQ0LAorCTczNDE2LAorCTAsCisJMjQyMDU4LAorCTI5NjYwLAorCTMsCisJMzQ3MDksCisJMTYyNzE5LAorCTI4NjMsCisJMzk5MiwKKwk1MjEyLAorCTE1MTgxNCwKKwkzMDkyLAorCTE5ODAwMSwKKwk0NDMzMSwKKwkzNiwKKwk0MDcsCisJMzY0NzcxLAorCTEzNDksCisJNTAyNzcyLAorCTIxNDcyNiwKKwk2MDcsCisJMzg4NTgzLAorCTEzNzY2MCwKKwkzMzcxMjQsCisJMTMyNzksCisJMTA1NDksCisJOTQzMDc1LAorCTE2NDA2OCwKKwkxOTE1NywKKwkzODQ0MywKKwkyNjM1MSwKKwkwLAorCTY3MTY3LAorCTczNSwKKwk0NjQ4NiwKKwkxMzAzMDUsCisJMjMyMzMwLAorCTc0NCwKKwk4ODIzMzcsCisJMiwKKwk2OTI3NSwKKwkxMjYzNTQsCisJOTM3MCwKKwkyODQ1LAorCTI5OSwKKwkzODk4OCwKKwkzNzgzNCwKKwkwLAorCTMwNjQzMywKKwk5MTM5LAorCTIzNzEzMiwKKwkwLAorCTUwMCwKKwkxMzQ2MiwKKwkzNzM2ODQsCisJMTA3NDUzLAorCTM4MTkyNCwKKwkzNDc5MTUsCisJNDMyOSwKKwkxNjY4LAorCTM5NjAsCisJMzcwNjYxLAorCTM2MTQsCisJNjM2MDQ4LAorCTAsCisJNDg3NDQ5LAorCTY0OTI1LAorCTMzMzg5NCwKKwkxMSwKKwk1MjE5MiwKKwk1MzEyMDAsCisJMTU1NTU0LAorCTQ2MSwKKwkxNTQ3LAorCTk5NDM2MSwKKwkxMTk1NSwKKwkzMjEwNTYsCisJMzc0MjUsCisJMTQyNDksCisJNjkxNTEsCisJNjIxODYyLAorCTE3NCwKKwk3OTYwNywKKwkzNCwKKwk3NzU3NywKKwkxMzcyMywKKwkyNjc1NTAsCisJMTM4MDEsCisJNjk4LAorCTEyLAorCTE3MTU1NiwKKwk1NzM1NCwKKwk2NzY4NDUsCisJMCwKKwkyNDk2NSwKKwk5MDg5NTUsCisJNTcwNDgzLAorCTAsCisJMjk2Mzg3LAorCTk4Mzk2NiwKKwk4NTAxMiwKKwkxMzAyOTgsCisJMTUxOTQ2LAorCTM4NDQ3NCwKKwk3MzE0NTUsCisJMTUwNjk5LAorCTc3MiwKKwkyMTYxMzEsCisJMzQ2LAorCTEzMDkzNSwKKwkzNDcyLAorCTE4LAorCTQyNjA0NSwKKwk2NzcyNjIsCisJODA4LAorCTE3MDMwLAorCTUxODgsCisJMCwKKwk0OTExNTMsCisJNjcyOTksCisJMTksCisJNjAzNDIsCisJNjksCisJMCwKKwk3NjQ3OCwKKwk5NTc2MywKKwkwLAorCTI4Nzc4LAorCTE0Nzg2OSwKKwkzMzU5MjcsCisJMjc4NDYsCisJMjE2MywKKwkyMjc1MCwKKwkxNjIsCisJMjMsCisJMTEzOTEsCisJNDY5MDk5LAorCTU4NTIsCisJNjMsCisJMCwKKwkwLAorCTIyMTkzLAorCTE2NSwKKwk0ODkwMDcsCisJOTI0OSwKKwkxMjQ3NywKKwkyODQxLAorCTIyMzUzMiwKKwkxMzg3NywKKwkxNzMsCisJMzU3MCwKKwk0NTQ3NywKKwkyMzMwNzMsCisJMjMyOTYsCisJNjQzNzcsCisJNDkxMCwKKwk4LAorCTc2MjQ2LAorCTQxMTE0NywKKwkyODc0MTEsCisJMTA0NTAsCisJMzY2NywKKwkxLAorCTUwMDkzMywKKwkzMTM2MywKKwkyNTcsCisJMTcwNSwKKwk2MDM2LAorCTQ5OTM0LAorCTEzNzM4LAorCTEzNDg1LAorCTYxNjA4LAorCTU2MTk3OCwKKwk3NjQ5MywKKwkxNjM3NywKKwkxODE3LAorCTAsCisJMjM1NjAwLAorCTAsCisJMTYzNDcsCisJNjgwNDc4LAorCTUxMTUsCisJODk1NjA3LAorCTEzODI3MCwKKwkzNjk5MTIsCisJNTMxMTAsCisJMCwKKwk2NDcwODMsCisJODUsCisJNDU4NjgxLAorCTE2MzIyNywKKwk1Mjc2NywKKwkxOTYsCisJMjY3NzE5LAorCTE0MDQ3LAorCTE0NzI5MywKKwk4MTQ0NTcsCisJMTc0ODk2LAorCTAsCisJMzQxMzgsCisJMzYsCisJMjE1NzUsCisJMywKKwkwLAorCTAsCisJMzgzOTEsCisJMjU5NywKKwkyLAorCTE0MzMsCisJMzgwNywKKwkzNjQ3NiwKKwkyODcsCisJMTQxNTMwLAorCTI5Mzg5LAorCTQ5NTY1NSwKKwkzMDAxNCwKKwkwLAorCTU1MDc2NiwKKwkxMTk1OCwKKwkzNDgsCisJMjI2NzYwLAorCTE1LAorCTI1MTM1MywKKwk2NzU3ODgsCisJNTE4MzA4LAorCTIxNSwKKwk4MTk4NywKKwk0MDk4NjIsCisJNTU5NTk2LAorCTExNDI4MywKKwk0OTI1LAorCTAsCisJMTcsCisJMTQyMjEsCisJMCwKKwkxNjIsCisJNzY2MzcwLAorCTQ4OTgsCisJOTk4LAorCTQ5MywKKwkxMzg0MTgsCisJMjY1MTU5LAorCTEyMTUyLAorCTUyMjksCisJMTIwNCwKKwkxODE0LAorCTQzMjUzMCwKKwkyODg5LAorCTE0NCwKKwkxMTQ5LAorCTM1ODg2LAorCTYzNjkzMSwKKwk2NjQwLAorCTE1MDgsCisJNDE0MTE4LAorCTg1OCwKKwkyMDAzOSwKKwkxNzM5OCwKKwkzLAorCTUwOTQsCisJNiwKKwkxMzk5NiwKKwk2NzU0LAorCTM2MiwKKwk0NTE0ODcsCisJMTE0NzEsCisJNzg5NiwKKwkzMzAwMDksCisJMjQ0MjY5LAorCTk5OTI4LAorCTAsCisJMTQzMTEsCisJOTk0OSwKKwkxNTI1MSwKKwkyODM5MjMsCisJMTIzNzU0LAorCTE4ODM2MCwKKwk5MzkwMiwKKwk4NTQzODQsCisJNTQ4MDAxLAorCTUzMTc4OCwKKwkyNjI5OCwKKwkzMjg0NzksCisJOTQxLAorCTI0NjUzNSwKKwkxMDYzMjAsCisJMjg3NjksCisJNDQwLAorCTQsCisJNjEyNjIsCisJNTU2MTUsCisJMTcwLAorCTk4OTMyNywKKwk2OTI1MzQsCisJODA2MywKKwk0NDU4NDIsCisJNDQzNCwKKwkyNTUzNDksCisJMTE3NzgxLAorCTYsCisJOTI0OSwKKwkxMzYyMTYsCisJMzgxNjUsCisJMzA3MDEyLAorCTEyLAorCTIzNDEsCisJMTgwNjIsCisJMzcxODgyLAorCTY2MjE1NCwKKwkxMjYyMywKKwkxNzY4NDcsCisJMzMyMjIwLAorCTU5MDkzNSwKKwkzMzY4MiwKKwkwLAorCTEyMTM3NCwKKwk2NywKKwk0Njg0MSwKKwk0OTU4OTAsCisJNjQwLAorCTE5LAorCTE0NzM3LAorCTExMDMyLAorCTE3LAorCTU5OTMsCisJMzAyNTYyLAorCTgyNzcxMCwKKwkxNjUzNDYsCisJNDk2MDcsCisJODc4NjMsCisJMzA4NTEzLAorCTczNTMwMCwKKwkxOTE0LAorCTI5MDAsCisJMjA3MzA4LAorCTkwNjgsCisJODM0OTQsCisJMTc5LAorCTQxNywKKwk0MTYwNSwKKwk3NDY4MSwKKwk2NTIxNzEsCisJNDAxMywKKwkyOTgxMSwKKwkxMzk2NiwKKwk4MTM2LAorCTc4LAorCTYxMTgyLAorCTY3NDE4NywKKwkwLAorCTMzMTEyMSwKKwkwLAorCTE4NTU5LAorCTM4NiwKKwk3NywKKwkzNDg0MzksCisJOTc1MzU4LAorCTE4LAorCTMzNzAwLAorCTQ3Mzk2LAorCTIwNDc1MSwKKwkyMzUwLAorCTI2NTAzLAorCTAsCisJODM2NTMsCisJNDQ2LAorCTEwODQ0LAorCTQ4NSwKKwk5MjQxLAorCTg4MzQ3LAorCTIzMjQxOSwKKwk5MzY5MDAsCisJNDMyNTAsCisJMiwKKwkyNjExMiwKKwk4MTE5NTUsCisJMjA3MjMsCisJMTAyMDY5LAorCTQyMjU1LAorCTg0MzEsCisJMTE5NTA4LAorCTQwODAsCisJMTM1NjUsCisJMTIsCisJNDYxMTAsCisJNjIwOTYsCisJNjM4Nzc3LAorCTQ0MDI1LAorCTE1Mjk4NSwKKwkxMzM2MiwKKwkzLAorCTEyMzMxLAorCTE5MzMzNywKKwk1NjQxOSwKKwkxNDU5MywKKwkzODM3LAorCTI4MjMxNCwKKwk0MDM0NTQsCisJNDg1ODksCisJMTM1LAorCTE4MzUwLAorCTIxNjAsCisJOTAsCisJOTE4MjE2LAorCTcwODMsCisJMTA1NTM0LAorCTc0MjgyNiwKKwkzOTkwMjgsCisJMTQ3MCwKKwkyMzc3MCwKKwk0ODAsCisJNjc3ODg0LAorCTM0MDQ3MiwKKwkxMDc0MDYsCisJMCwKKwk1MDAyLAorCTQ0NSwKKwk3NDg5NDgsCisJNTM0MDEyLAorCTU5MjQ2NCwKKwk2NTM5LAorCTgxOTYzMiwKKwkzMTM4LAorCTQsCisJMzkzOTcsCisJMjI5NjgzLAorCTEyMjA0LAorCTI0MzksCisJNjUxMzEsCisJODE3MjI2LAorCTIyNTk2LAorCTAsCisJMTA0NiwKKwk5NDYzOCwKKwkwLAorCTk1NDAzLAorCTEyMzAsCisJNzkwMDU2LAorCTE5OTc2LAorCTQzMDg1LAorCTE0MjUxLAorCTEzOTE4NywKKwkyMDIzMiwKKwk2OTMsCisJMzA1OCwKKwkyNzY1NCwKKwk2NTY5MCwKKwk0MDk0OCwKKwkxNTAwMSwKKwkyMTA4OSwKKwkxNDQyNSwKKwkzMjI0NTksCisJMTM1NzEsCisJMjI4MTU0LAorCTUzNjgxNCwKKwk3NjEyMjEsCisJMjgwMzAsCisJMjMyMiwKKwk5MjEsCisJMSwKKwkxMTM3LAorCTE4NzgxNSwKKwk4LAorCTM0OTExLAorCTQ1MjcsCisJMTUsCisJNDYsCisJNzg4MDEsCisJMCwKKwk3MzYwNSwKKwk0NCwKKwkyODIzMywKKwkxMzcwLAorCTczNDA5LAorCTE5ODE1OSwKKwk2NjU4NiwKKwkzLAorCTI1NzYsCisJMTUsCisJMzU0NjAsCisJMjYzMjM3LAorCTQ0OTk3LAorCTI4NzMsCisJMjQwLAorCTE3ODEsCisJMjY5LAorCTQ2LAorCTI3Mjc3OCwKKwkyODQwNCwKKwk4MjMyLAorCTQxNzA3MywKKwkyMzQ1OTEsCisJOSwKKwk3MjAzNDksCisJMTE3NiwKKwkxNjE5NSwKKwkwLAorCTk3MDUsCisJMCwKKwkxNCwKKwk5NDcwNDgsCisJMTYzLAorCTc2Mjg4LAorCTExMTUsCisJMjY3MDIwLAorCTM0MTYsCisJNDE0MjE3LAorCTQ0MTAwNCwKKwk5NTEzMSwKKwk3NjUwMDIsCisJNjE5NiwKKwk5MDY5LAorCTI3MDE3LAorCTEzNzAzOSwKKwk2NTI0NywKKwkyNjY0ODksCisJNDg0OTQ1LAorCTE4NzAwOCwKKwk0NTQwNSwKKwk1NzAwLAorCTksCisJNzc1MSwKKwkxMiwKKwkyOTQsCisJMzA5MywKKwk2MzUwLAorCTEwMzMwMywKKwk2MDQ1LAorCTI1MjM0NSwKKwkxNDAyMDcsCisJMjIzOTAsCisJMjM0ODY3LAorCTQ0MzMyNiwKKwkxLAorCTAsCisJODk5NzIsCisJODYzNywKKwk0MjcxNTAsCisJMjIxNDYsCisJMCwKKwkzMTA0MzIsCisJMzkwMzMzLAorCTEwNDYxLAorCTE2MzIsCisJMzE0MDMsCisJOTA4NjUzLAorCTAsCisJNjU0MywKKwkxNjM0NzksCisJNjc2MDgsCisJMTk1NTQzLAorCTMxNTg4OSwKKwk4MjI5NjQsCisJMzgzNTM2LAorCTk1NDk1NCwKKwkxNjE5LAorCTI0MSwKKwk5NjA1MywKKwkxMDQ1NTYsCisJNzY3MzAyLAorCTI0NjksCisJMTIsCisJMTY0MzMwLAorCTc4LAorCTE0MSwKKwkxNzA1MTksCisJMjY4MjE0LAorCTUzMzM4LAorCTQ4MzQyLAorCTcyMSwKKwk1ODk4MCwKKwk0MzQ1LAorCTEsCisJODU2MjY1LAorCTg3Mjg5LAorCTU3MjE5LAorCTc3NTY3OSwKKwkxMjM5OTIsCisJNjk1ODA0LAorCTExMzAyNSwKKwk4MzIsCisJMTE3NDIwLAorCTE2NjM0LAorCTM1MiwKKwkyNDcyOSwKKwkxNDk3MywKKwkyNTYyMiwKKwkxMzEyOTAsCisJMCwKKwkyMiwKKwk4Nzc0MCwKKwk1OTE3LAorCTUzMywKKwkyOTM0LAorCTM0MjYxLAorCTkxNzQsCisJMCwKKwkxNjU2LAorCTc2NDU4NywKKwk1NDY1MiwKKwkzNTU5NywKKwkzNjM4OSwKKwk1Nzc4ODksCisJNjM5NTcsCisJMjY4MDgsCisJMzQ1NTYsCisJNTYsCisJMTU2NDEsCisJMTM3LAorCTEsCisJMywKKwkxMTcyNCwKKwkxOTczOTcsCisJMzkwMjcsCisJODc5MDIsCisJMzIwLAorCTc5MTQ3OSwKKwk3LAorCTQ4Nzg2NCwKKwkwLAorCTQzMywKKwkyNTczMywKKwk2OTU2LAorCTE1NDA3LAorCTMxMjU1NywKKwk1MjYzMDIsCisJMzgzMDE5LAorCTM0MDIxNSwKKwk5NiwKKwkyNzYxNTgsCisJNjQ5MywKKwkxMzU2MTMsCisJMjAwMCwKKwkxMjE4LAorCTkzMCwKKwkyNzY4MDgsCisJMjczMjQ5LAorCTg4OTYsCisJMzk3LAorCTczNTA5NSwKKwkyMDY0OCwKKwkyMDc5LAorCTUzNDksCisJMjA1LAorCTM1NjMxMywKKwk4NDE5NTQsCisJODI1NSwKKwkyNjY4NzQsCisJMCwKKwk5NjUsCisJMjg3OTkzLAorCTE1NDksCisJMjA3ODMzLAorCTc1LAorCTE3ODE4MCwKKwkzOTA3MiwKKwkwLAorCTQzMjU0LAorCTM4NDcsCisJMjI3LAorCTI3MTIsCisJMTYxMDQzLAorCTQ2MzI2NCwKKwk3NDcyMCwKKwk3OTU3ODksCisJMTIsCisJNjgxMiwKKwkyMDI4MDQsCisJMjkzNzksCisJNjQyNDEsCisJMTMyMTIxLAorCTc5MDYyMiwKKwk0OTM1ODgsCisJMCwKKwk0OCwKKwkxNDczNTIsCisJOTI1MTk3LAorCTM4MTQ5LAorCTE4MzgwLAorCTAsCisJMjcwMjgwLAorCTYzMywKKwkzMzczLAorCTMxMjk0LAorCTc4MzAsCisJMCwKKwkwLAorCTExMzcxLAorCTU2MTQzLAorCTUzOTMsCisJNzQ3MjQsCisJNDk1MTA5LAorCTAsCisJMTg5OTMsCisJMjE1MjQsCisJMCwKKwk1Mzg4OSwKKwk0MDA1MDksCisJMjA0NTYzLAorCTAsCisJMTE2MjUsCisJOTYzNSwKKwkwLAorCTE2NzgsCisJMTIwOTYsCisJNTksCisJODE3MTEyLAorCTEwMDAyLAorCTEyODIwOSwKKwkxMTU5MywKKwkxNzMxMywKKwkxNTIwMCwKKwkxMDY3OTYsCisJMjYxNDAxLAorCTcwNzA3NywKKwkwLAorCTMxNDAzMCwKKwk3OTg1OTEsCisJMTQxNzUsCisJNTY2OCwKKwkyNzY2LAorCTAsCisJNTY2LAorCTU1NDMsCisJMjQxMTIsCisJMTU0NDgyLAorCTU2NDIsCisJMCwKKwkzODQxMCwKKwkzLAorCTQsCisJNzAwNzI0LAorCTI1MDI0LAorCTUsCisJNDA3LAorCTU2NDE1MCwKKwk2NzIsCisJMTQzLAorCTIwNDksCisJNTc0NzA4LAorCTY1ODU4LAorCTIxMzQxMiwKKwkzNzk3LAorCTUxMSwKKwkzMDkwNywKKwkxMjEyLAorCTc2NSwKKwkyMTI3LAorCTQ4MSwKKwkxMzAwNDgsCisJMTEzODE2LAorCTM5ODYxLAorCTE1MzE2OSwKKwk1MDMzNzgsCisJNTIzOTQ0LAorCTExMSwKKwk1NTA4MywKKwk2OTgsCisJMjc1LAorCTMsCisJMzE5NSwKKwkxNjU3LAorCTAsCisJMzE3ODgxLAorCTY2NzIsCisJNTQzLAorCTE1MzAxMSwKKwk3NzI0MCwKKwk5MzM4LAorCTg4OTg1MCwKKwkyOTUxOCwKKwk4NzI0ODUsCisJMTgxOTI3LAorCTM3NjA4NiwKKwkyNjYsCisJNDA5LAorCTQsCisJMTQ4NTYsCisJMzE5NDMsCisJMjQ0OCwKKwk4LAorCTc1LAorCTM4MzA5NywKKwkyOTQzNjYsCisJMCwKKwkxNzMwODQsCisJNzUzMTYwLAorCTY2NDU3LAorCTcyNTc4MywKKwk1MSwKKwkxMjc2NTEsCisJMTA3MywKKwkxMjU5OCwKKwkxNDAwODAsCisJMCwKKwkyOTYzNzUsCisJNTgxNzIwLAorCTIxNzM0NiwKKwk4MjcyLAorCTIwNTEsCisJMTg1MzkwLAorCTUyMDY0NSwKKwkxMjYwLAorCTEzODczLAorCTE2ODA0MCwKKwkxOTY5MCwKKwkxMDMzNDcsCisJMjk1MDExLAorCTU0ODQwNCwKKwk0OCwKKwk0LAorCTkxNjQxNywKKwkxOTQ4LAorCTYyMTM2NSwKKwkyNjMyNDUsCisJMjc5MiwKKwk4NjgwMywKKwkxODExOTMsCisJNTU4MDgxLAorCTUwOTA3LAorCTQ0Mjc3MCwKKwk1MTQ0OCwKKwkzNDAyNzYsCisJMTM0NiwKKwk2MDcsCisJNDU5NjI3LAorCTAsCisJMzAsCisJNzMyOTgsCisJMTUzODksCisJMTIyNjQsCisJMjcxOSwKKwkyOTM2LAorCTE0MzA0MywKKwkyMDk5NzAsCisJMCwKKwk0MiwKKwk2NjU3LAorCTMxNzQxOSwKKwkwLAorCTMyNjIyLAorCTUyNDAwMCwKKwkwLAorCTMxMDMzMSwKKwkzMDM3NzgsCisJMjY4NzEwLAorCTksCisJMTA0MTAsCisJMjUzNDMsCisJOTQ5NTA2LAorCTc4NDM1MywKKwkzODYxLAorCTQ2ODIzLAorCTI1MTI5MiwKKwk3NTAwOCwKKwkyNjk3OTgsCisJODc3MzEsCisJMTEyODEzLAorCTU3MTY3OSwKKwkzODUsCisJMywKKwkyODExLAorCTM2MDI1LAorCTkyNDMsCisJOTM1MTI4LAorCTkwNiwKKwkxMDY4OCwKKwkyNSwKKwk4Njc1NywKKwkzMDcsCisJNTUsCisJMjIsCisJMiwKKwk2MSwKKwk2MjA0MjYsCisJNDg0NTMwLAorCTYzMzgwNiwKKwkwLAorCTEzNDIsCisJOTI5MywKKwk5OTIxODEsCisJNTAzLAorCTE5NTQzMywKKwk0NjE1MCwKKwk4OTMwOTEsCisJMzIwNywKKwkyODY1LAorCTcyODk0LAorCTgzMDI5OSwKKwkzNTUsCisJMzI3NDc5LAorCTAsCisJMzU1NzMsCisJMzA2OCwKKwkxNTY5OSwKKwkzMTE4NywKKwk1NTM3OCwKKwk0MTYwNjcsCisJOTE3MjEsCisJMTU5LAorCTAsCisJMjU1MTM5LAorCTIxMDQsCisJMTksCisJNjA2NzU3LAorCTMyMywKKwk5MDI2NTksCisJMzY1NjU1LAorCTQwMCwKKwk5MDMsCisJNDA4LAorCTM4NSwKKwkyMTc3NCwKKwk3MDEyOTAsCisJMjM0NDI2LAorCTE3MDIwLAorCTk1MCwKKwkwLAorCTAsCisJNDI5LAorCTEyNDUsCisJNDA1ODcxLAorCTEwOTcsCisJMjgwNjM0LAorCTc0LAorCTE1ODIzMywKKwkxNTgzLAorCTE4MDMzMywKKwk0MjExNCwKKwk1NzU5NzMsCisJNTM5MzI3LAorCTU5MjUyLAorCTEyMTkyOCwKKwkxNjUsCisJMTQ4NTAxLAorCTU1NzU3LAorCTc0OTQsCisJMTI3NzI4LAorCTc4MzIsCisJNjg1MDQsCisJNjE5NzcwLAorCTcwOTk1LAorCTMxMjgxNiwKKwk3MzA3LAorCTM4MjY1LAorCTQ2MjQ4LAorCTM2MzMwNCwKKwkyNjk0NDIsCisJNzcxMTIsCisJNDQ4MzMxLAorCTkxMDQ0MiwKKwk0NzQ0MTgsCisJMTUyNzUyLAorCTc1MiwKKwkxMDQ5MTIsCisJNDA4NDkyLAorCTY5MTcwOSwKKwk2MzIzODEsCisJNDg1MTksCisJMjA1MjQsCisJMzQ0Mjk0LAorCTE0NjcwLAorCTAsCisJMjE2MDcsCisJODExNjIsCisJMTgxNDU4LAorCTAsCisJOTA4MzIyLAorCTcyNjEsCisJMTA4ODgsCisJNTgwNTQsCisJMTc4OCwKKwk5NzA5MzMsCisJNTkyNSwKKwkxMjE1NTMsCisJMzYxNTIsCisJNTg4MjY3LAorCTIzNjE1LAorCTE4NTAsCisJMzA3MjgsCisJMzU5OSwKKwkxMzE5LAorCTYwMjcsCisJMCwKKwkzMjE0MSwKKwk5ODQxNTYsCisJNDM2NzgxLAorCTE1MDAzLAorCTYyMTQwNywKKwk5NDEyLAorCTU2MjkxMSwKKwkxODk3NDAsCisJMzc3ODk1LAorCTY1NjgwMCwKKwkxOTcsCisJMTQ0MTMsCisJOTkzODIsCisJMzg0LAorCTExNDgwLAorCTAsCisJODYxMTgsCisJODgxOTYxLAorCTE5MDUsCisJODIwNjEsCisJNDE0MCwKKwk3NDExNTMsCisJMjYsCisJNjg3LAorCTEyMjUxLAorCTEwOTQ1LAorCTIwOTI2NywKKwkyMjA2MDIsCisJMTM1ODgxLAorCTYsCisJMjM3OTQ1LAorCTE1OCwKKwk1LAorCTc2MzAzLAorCTgxMzQ0LAorCTk4NjA0MiwKKwk5NTYwNjMsCisJMzAyODIsCisJMTg2MDU1LAorCTM1NzgwMiwKKwkxMjQ5MiwKKwk1Nzc0NzYsCisJODM4LAorCTAsCisJMTEsCisJMTE3NjAyLAorCTAsCisJMTg3OTI4LAorCTk2ODYwLAorCTQyNjgsCisJMzQ3OCwKKwk4MTgyNjQsCisJMTY0OSwKKwkxNzE3NSwKKwkyNzIsCisJMTU4OTUxLAorCTQ0MDk4NywKKwk2Nzc1OTQsCisJMTQ5MzUsCisJMzc5NTMsCisJMCwKKwkxOTgsCisJMTYwNDA0LAorCTEyLAorCTI4NzgwMywKKwkyMzg2LAorCTEwLAorCTI3MTY2MywKKwkzMTkxNTIsCisJMzYxMzIyLAorCTY4MzcwLAorCTQyOCwKKwkxODI3MDcsCisJMzg3NDI5LAorCTExNTIsCisJMzYwMDY1LAorCTI1MjE4LAorCTI3OTAsCisJNDIyMjgsCisJMTMsCisJMTEwOTQyLAorCTQ1MjQ5MSwKKwkxLAorCTY2NTYzOCwKKwkyMzA4LAorCTExOTYsCisJODczMDYsCisJNjYsCisJMjE5LAorCTAsCisJMTMwNzM2LAorCTMzNCwKKwk2MDUsCisJNTk3OSwKKwkyNjgxLAorCTAsCisJMTIzNDYzLAorCTExMjE5LAorCTI4MzY4MSwKKwkxOTI2OSwKKwk1NTMsCisJNjIxNywKKwkxMzA5NjUsCisJNzE0NDA5LAorCTI0MiwKKwk2NzQ4MzMsCisJMjM3NTgxLAorCTEzMzI4NCwKKwk2ODMsCisJMTc1OCwKKwkyNzgxOTMsCisJNTE4NzI2LAorCTQ0LAorCTQyMDM2MSwKKwkzMjUyMjgsCisJMTQ5NTUsCisJMTAsCisJMTE5OTQsCisJNjQxNTcsCisJMTkzNywKKwkyMDIxNCwKKwk4NDgsCisJMjc4MDQsCisJMTUxMzQxLAorCTc5MjM2LAorCTMxNjM5MywKKwkxNTg4ODMsCisJMTE5NiwKKwkzMzQsCisJMjI3OTcsCisJMTg1OTU1LAorCTEzODU3LAorCTM5NzM1NywKKwk3OTQ4LAorCTYwMzgsCisJMCwKKwkyNjIxLAorCTE2LAorCTE1NTI2NywKKwk0NDgwOSwKKwk5MTcxLAorCTIxMzI4LAorCTEyMjEyLAorCTQwMjAwLAorCTI2MDAsCisJNDM5LAorCTgwNDAxNCwKKwkxMDkzOCwKKwk5NjEzNSwKKwk0MzY5NiwKKwkxNTg3MTUsCisJNCwKKwkyODQ1NTgsCisJMTkxLAorCTI3MDI1NCwKKwk3OTIzLAorCTg4MDYwMywKKwkyMTAzMiwKKwkxMDc3MDAsCisJMTcyLAorCTcwMDgyMywKKwk1NjEzLAorCTc4ODE2LAorCTI1ODI5MCwKKwkyMTQzOTgsCisJODIxODU2LAorCTI5NTMyNSwKKwkwLAorCTEsCisJMjM1NTksCisJNjM4OTUsCisJMjEyNDksCisJNzE3NDkwLAorCTk1Njk1MiwKKwk5NDQ4MTksCisJNzkzLAorCTM1NiwKKwk3NTc3MTYsCisJMTExNzczLAorCTM5NDgyNiwKKwkyNTY2NSwKKwk0MzU4LAorCTY0MDIxNiwKKwkxMTUyLAorCTM3MTc1LAorCTE1MDE5MiwKKwkxMDYwNzEsCisJMjg5OTIsCisJNjcsCisJMTY4NSwKKwkxMzQyNDIsCisJMiwKKwkxMDIwNDUsCisJMTQ1NywKKwk0MTk1ODksCisJNjc4OSwKKwk2NzcsCisJOTQ2NzUsCisJMTEzMDAsCisJMjU5NSwKKwk4LAorCTkyNjUzNSwKKwkyNjUxOTQsCisJMCwKKwk4ODYwNDgsCisJMjQ2MjQyLAorCTE0OTQsCisJMTkxLAorCTE2OTk4NSwKKwk2NDk3NjUsCisJMCwKKwkyMDEsCisJMTA2OSwKKwk2NzkxNjMsCisJMTY2MjcsCisJMjc0NjM5LAorCTg0NDM4LAorCTMsCisJMTMwMSwKKwkyNDc0OTYsCisJNTg3OSwKKwk3MTA5MDQsCisJNDAzNjUyLAorCTk1ODI0MSwKKwkzNjEsCisJMTM5NzMyLAorCTYwNDIsCisJMTU5ODUsCisJMjM3OCwKKwkyNjcwMzEsCisJMjIzNzY3LAorCTk2NTYsCisJMjQxNzE3LAorCTMzODYzLAorCTE0MzE0LAorCTIwNTY5NywKKwkxMjc0LAorCTE2ODAwMCwKKwk2MjE3NzcsCisJODM3OTEzLAorCTg5NjU0LAorCTY1OTgyOSwKKwk2OSwKKwk1MDM4ODQsCisJNDMyNzE3LAorCTcwNDQzLAorCTExMDg5MSwKKwkxOTY1NSwKKwkxMzI0MzIsCisJNjIwNDAxLAorCTQyOCwKKwkwLAorCTQyNTY2MiwKKwkwLAorCTAsCisJMCwKKwkxOTQ0ODksCisJNzYwMSwKKwkyNjg3MCwKKwkwLAorCTYzLAorCTU5NCwKKwkxMjI3OCwKKwk1ODI0NzksCisJMjEzNzIzLAorCTQyNDQ4OSwKKwk5NjQ0NiwKKwk5OTA2NjQsCisJNDY5NjYsCisJNDQxMzcsCisJODI5ODEwLAorCTEwNCwKKwkxOTcwNywKKwkxNiwKKwkwLAorCTI0OTksCisJMTY3MDc1LAorCTE0MDk3MiwKKwkyNDkyODMsCisJNjYyMCwKKwk2ODM2OCwKKwk4NTY0MTQsCisJOTI1NSwKKwkxNDMxNSwKKwkwLAorCTExNDMyLAorCTI0MzI5LAorCTIxNjQ2MywKKwkyOTk1NTYsCisJODE4NDAxLAorCTI0NjYwNywKKwk2OTc3MzMsCisJMjI5LAorCTE0NCwKKwkzODkzOTQsCisJNjY0NjM0LAorCTAsCisJMTkzOTMsCisJNjU3OTAzLAorCTUyOTEyLAorCTk1MjE3NywKKwk1MzY5MzEsCisJMTg3MjcxLAorCTE3Njg3LAorCTk3MDE1NSwKKwkyMzI1NzEsCisJMjM0MDE2LAorCTE1OTk4MCwKKwkxMzUxMCwKKwkzMjk1MiwKKwkwLAorCTAsCisJMjQxMzIsCisJMTg4MDYsCisJMTU2MjQsCisJMjgzNjQsCisJNDcyMTI2LAorCTYyNjk3OCwKKwk1OTksCisJMTEyODQzLAorCTUwMjkzMywKKwk5MTU2NjAsCisJNjM5MjAsCisJMCwKKwk4NCwKKwkxMDg5OSwKKwk5MDQ4MjMsCisJMTI2LAorCTQ2OTEzMiwKKwk1OTAwNTIsCisJMTk1ODMxLAorCTQ0MzExMywKKwkyOTQxNDksCisJMTU5NDQsCisJMjI3MSwKKwkyODI5NzQsCisJMjExLAorCTAsCisJMjI5MzQsCisJODIyODMsCisJNDk5NzMsCisJNDE3MDcsCisJODc1MzAsCisJMCwKKwk5MTA1MjgsCisJMCwKKwkzNjAyOSwKKwk0MjMzMzcsCisJODE3NTEyLAorCTIyMzY3MSwKKwkyNzgwMCwKKwkzOTg4NDcsCisJMTk4NTI4LAorCTEsCisJNTYwNjc5LAorCTUxODI3MCwKKwkyMzAzMywKKwk1MDEwNTksCisJMCwKKwkzOTA5LAorCTI3MjA2MiwKKwkyNjE1ODEsCisJMTg3LAorCTUyMDQzLAorCTMzNCwKKwkyNDM1NCwKKwkzOTQ3LAorCTg1NDksCisJMzc4NjMsCisJMzI4ODUxLAorCTk2Mzc3MSwKKwkxLAorCTM5MzAsCisJODI0MTYsCisJNiwKKwkyOTQzLAorCTEyMjEwMSwKKwk4MjU3NywKKwk4NSwKKwk4OTU0MCwKKwk1MTM1LAorCTEwOTIzNiwKKwkxODI5NywKKwkxLAorCTE3NzM3MSwKKwk0NTQxLAorCTc2OTU3NywKKwkxNzgsCisJNDE3LAorCTk2MDU2NiwKKwkzMzgwMywKKwk5MTE2NTEsCisJMjQ4MTYwLAorCTE1MzcyNSwKKwk0Mzk4MSwKKwk4MDkxNzQsCisJMTE2LAorCTQ4NjkwMCwKKwk0ODQyLAorCTE0ODQ5MCwKKwkxMzE1MzQsCisJNDM0NywKKwkyMzk5NDksCisJOTg0MDk2LAorCTc0OTc1NiwKKwk0Mjk0OTksCisJMjc5NCwKKwk3ODIwOSwKKwkxODgxMiwKKwkyMTExMSwKKwk0OTAsCisJMzI4MDQyLAorCTEyLAorCTEzMjExOSwKKwk1MDUxMDMsCisJMzUzMTQ4LAorCTAsCisJMzczNjU2LAorCTk1MTI0NCwKKwk0OTEsCisJMzU1Nzc4LAorCTMwNjIwLAorCTMxNywKKwk2MDE3NSwKKwkyMjAsCisJMjE0NDk2LAorCTQxMjQ5LAorCTUxNjksCisJNzgzNjcsCisJNTA2ODA0LAorCTAsCisJMTM2OCwKKwk0MDcsCisJMjk1MTI2LAorCTEyODgsCisJODYsCisJOTc2MTQsCisJNjE2NDAsCisJMjQ0NzIzLAorCTMsCisJMCwKKwk4Njk4MjcsCisJNTI3MjQ2LAorCTUyLAorCTEwNzAzNiwKKwkyNDA3MzksCisJNzgwMjgxLAorCTExMzA4NCwKKwk2MjAwOSwKKwk3NDAzNDMsCisJNDgzMjAxLAorCTg2NDksCisJMTY0MTksCisJMSwKKwk4MDE1NzQsCisJOTU1MjQsCisJMzI2MTI2LAorCTI2OTEyLAorCTg3NzA0MCwKKwkxMDI2MiwKKwk1ODk1LAorCTAsCisJMTMyNjMzLAorCTU5MTcxLAorCTMwNjM0NywKKwk3MDI3MDEsCisJMTk2MjQ1LAorCTEyNjQyLAorCTMyNzIzLAorCTI0NjA4LAorCTMwMjg3LAorCTQ1Nzc1LAorCTE4MjgxLAorCTc1ODcsCisJMTQ0NTMyLAorCTUsCisJMzUsCisJOTk4NjIsCisJMjE1MTI3LAorCTE3MDg3NSwKKwk2MTQ2MSwKKwk3Nzc5MCwKKwk1LAorCTAsCisJMTI5MzU4LAorCTAsCisJMTA1MDg0LAorCTIxMzk5LAorCTQyMjMzLAorCTg1Mzk3LAorCTQ4MDY1NCwKKwk1NTU5ODgsCisJODk1NzUsCisJNDIzNDYsCisJMjAwMDQsCisJMTExMDIsCisJMjEzMjEsCisJMTg1LAorCTM3OTI2NywKKwk4NDkxNDcsCisJMTIxNTE0LAorCTMzODgsCisJMzM2NjIsCisJMTIsCisJMTY0ODk4LAorCTIyNiwKKwkyNzQsCisJMzg1MDAzLAorCTM2NTA1MiwKKwk2OTMzNzYsCisJNDEyNDUsCisJOTAxMCwKKwk0MTU5NCwKKwk4OTgzNSwKKwkxMDQ5MCwKKwkyNzIsCisJMTI4NDM3LAorCTAsCisJMTIyNjQ4LAorCTI3NywKKwkxMTY1MDUsCisJMzgzNzIsCisJNCwKKwkxMzc2LAorCTAsCisJNDYzMTcsCisJMTM5MzY4LAorCTM2Mzk4LAorCTE5Mzg5OSwKKwkzMDYzMiwKKwkyNjM3MSwKKwk3NTQ4LAorCTM2NzY0MywKKwk5NTQ4NDksCisJMjU4ODksCisJMzY1NjcsCisJMTc2LAorCTE0MDYzMSwKKwk0NjkwLAorCTk3NTAzMSwKKwk4MDk2NSwKKwk1MDA0NzEsCisJODQ0MiwKKwk0MywKKwkyNzc1OCwKKwkzMDE1MDEsCisJMzc5NywKKwk4MCwKKwkzODQ0NDAsCisJOTI4NDc3LAorCTQ5NjAsCisJMjQ1NjYsCisJMzMyNDUsCisJMTQ2MzgsCisJMjI4MzU0LAorCTU0MzQ3LAorCTg2MTI4NSwKKwkxMjg0MSwKKwkyLAorCTE1NzQwMiwKKwk2NDY3NDcsCisJNTM3NjMsCisJMSwKKwkyMTQ3MzIsCisJNDk0NzEsCisJNDk3NTcsCisJOTk4LAorCTIwMTEzNSwKKwk1NjYsCisJNzM1MTIsCisJMTk0MjQwLAorCTM5MTc3MywKKwkyMTUxMCwKKwkxMywKKwk4Mjk4OTQsCisJNzgzMjAwLAorCTU2NTMyOSwKKwkyMTAxLAorCTEyLAorCTE5MTA0MywKKwkxNjIxLAorCTE4NDQzLAorCTI3OSwKKwkyOTQxMzUsCisJNTI2NTAzLAorCTcyOTczNSwKKwk0NjM5LAorCTQ0NDEzOCwKKwk1ODM1LAorCTEyMzcyLAorCTQ2MzYyLAorCTE1NDMsCisJODcwOTA3LAorCTgzMjYyLAorCTAsCisJMzgzMzEsCisJOTUsCisJMTE5NCwKKwk5MDksCisJODA1MywKKwk0NTMwNjYsCisJODQ1NTYxLAorCTQxMSwKKwkzMjI5LAorCTEsCisJMTU4LAorCTE0MzEsCisJODM1MTM3LAorCTIxNzc0LAorCTcyOTgsCisJMTQ4Mzg4LAorCTIyNDY0OSwKKwkzNzkzMTgsCisJNTIwMTM4LAorCTM5NzgxLAorCTE3MjEzMCwKKwkzNjI2MzQsCisJNDg3NDk1LAorCTUxOTU3LAorCTE1OCwKKwkxNzcwLAorCTcsCisJMTgwMTAsCisJMTA2MywKKwkxNzE0ODQsCisJMTk5MjQsCisJMjc5ODY3LAorCTQ2OTk1NiwKKwkxODk3ODUsCisJMCwKKwk4MTQsCisJNjA1ODAsCisJOTQ0MzQ5LAorCTE4NzQzLAorCTU1MzIzNSwKKwkwLAorCTk1NDc1LAorCTk5LAorCTAsCisJNSwKKwk0MjYyMywKKwkxNzg0MTgsCisJMzk4OTQwLAorCTU3MDAsCisJNjkwMjMsCisJNTc4NiwKKwkwLAorCTEwNTMxLAorCTU1MSwKKwk4NjMwOCwKKwk2MzQ1MSwKKwkzMjcwNCwKKwkxNzY5MDMsCisJMCwKKwkyNTE2ODksCisJMTE1ODksCisJMjU3MTEsCisJNDM0MzcsCisJMTQzMSwKKwkzMDQsCisJNTI5NjUsCisJMzQ4MTYsCisJMjY4Njg4LAorCTQ3NzU2LAorCTgyNTMyMywKKwkxMjI2MDgsCisJODEyNDYsCisJNjk5NzQsCisJMzYwNTE1LAorCTk5OTczLAorCTE0MzAxNSwKKwk1MDYzLAorCTQ0OTksCisJMzQ0NTksCisJMTcxOTgyLAorCTY3Nzk0MywKKwk0ODkwODIsCisJMjU3NTE1LAorCTM3NjUsCisJNSwKKwk3NDE2LAorCTYwMjIwNiwKKwk3NDEyMiwKKwkzLAorCTY4NjIwNCwKKwk1NDkzLAorCTI4OTAxLAorCTExMzQ5LAorCTU0OTY2OCwKKwkyNTcwODIsCisJODIwMDAsCisJMTcwMzEsCisJMTUxNywKKwk3NDQyLAorCTkzNzE2MCwKKwk3MjIsCisJMCwKKwk3Mjk1MiwKKwkzNzcxOTIsCisJNDM4MjY2LAorCTU1NSwKKwkzMTQzNiwKKwkyODQsCisJNTYzOTAsCisJMCwKKwk1ODU4NTYsCisJMjc2MzUsCisJNTE5MzQ0LAorCTEyNjEzMSwKKwkzNjAyNzMsCisJODQ1MDczLAorCTAsCisJMTkxOTY1LAorCTU1NjUyLAorCTIzLAorCTExMjc3MywKKwk2MzkwMjUsCisJODQ3NDksCisJMCwKKwkzMzA4MjIsCisJNzE3MywKKwkxMjYyMTcsCisJODcxLAorCTExMjExMiwKKwkwLAorCTY2NCwKKwk1MzA0NzQsCisJMSwKKwkzNzk1NjQsCisJMTcyNjE3LAorCTY0NzMwOCwKKwkwLAorCTM1NiwKKwkxNywKKwk4NDM0NSwKKwk0NTcsCisJMCwKKwk4LAorCTYsCisJMTM2NjAyLAorCTYzNDQyNCwKKwkwLAorCTE3NzI5OCwKKwkxMDA3MjYsCisJOTE2NjEsCisJMzgzNzkyLAorCTE2NjUsCisJNDM1ODMsCisJMTU3NzUsCisJNDA4MywKKwk0Mjc3LAorCTM0NTc0OSwKKwk5Njk1OTksCisJNjU4MDQsCisJMTkzMjcsCisJMCwKKwkzNTI1MTQsCisJNDIyNSwKKwk5LAorCTEwMzc2NywKKwkwLAorCTAsCisJMTQ4NDM2LAorCTg1MCwKKwkzMywKKwkyMTQ2LAorCTIwMTUzLAorCTUwLAorCTkwNjMsCisJNTAzMjksCisJMzQ4Mzc5LAorCTI1NjksCisJODM2OTcsCisJMzcwNzMsCisJNzE1NDg2LAorCTYyOSwKKwk0NzUzLAorCTQ0MiwKKwkyNTkyMDMsCisJMjg3MjIzLAorCTQ4NjI1LAorCTksCisJNzAxODQsCisJNDU5NDYsCisJMTQ0OTQ3LAorCTAsCisJNjAyODUsCisJMjg2NDAsCisJNzYyNiwKKwkxMzQxNTksCisJMzMsCisJMTI0NTIsCisJMTUwNTY2LAorCTM0ODI5MywKKwkxMjQ0MjYsCisJMzUzOTUyLAorCTExLAorCTIyLAorCTc3Njc0MiwKKwkyOTA3MiwKKwkxMzIxNjgsCisJMjU0NTMzLAorCTMxOTk1NywKKwkxNjAyLAorCTE2NTksCisJMjA5MzQxLAorCTMyODQ3LAorCTkyMzkyLAorCTc1MzAwNSwKKwkxMzkyLAorCTEwMjcxLAorCTI4NTU3LAorCTY3MTcsCisJOTQxNzQ1LAorCTAsCisJMCwKKwkwLAorCTc4NjQ1LAorCTQ1MzIwLAorCTExMTkzLAorCTE0NDgsCisJMTMwNjI2LAorCTM3NzkwNywKKwk3OTU1MzUsCisJMjQyODUsCisJMjYwOTQsCisJMjY2NjkxLAorCTY0NDQ5LAorCTc3NDAwLAorCTE5MTQxMCwKKwkxLAorCTEzNDYsCisJMjUyMjQsCisJNDg5NjM3LAorCTQ3MDUyLAorCTI0ODU5MiwKKwk3NjY4OSwKKwkwLAorCTc3MjIsCisJNDcyODUsCisJMzE1MiwKKwkyODU1NzcsCisJMCwKKwkxNDkzNjYsCisJMjY0MzQ2LAorCTEsCisJMjA4NjAyLAorCTMyMDQ1OSwKKwkxMzE3NzEsCisJMTQyMSwKKwkzNTAsCisJNzIzMjgzLAorCTcxNDkzNCwKKwkwLAorCTU2NjQzOSwKKwkxMTY1NiwKKwkzNDE4OSwKKwkxMjU0ODQsCisJOTQzMjczLAorCTE1LAorCTc3ODksCisJMCwKKwk3NDI3LAorCTQ2NDI3OCwKKwk2ODA5MjQsCisJNjUxMTAyLAorCTg3Nzk0LAorCTM5NjQwLAorCTgzODY0NCwKKwk5NjQ1MDAsCisJMSwKKwkxNzY1LAorCTI3MjYwNCwKKwkxMCwKKwk4MzczNDcsCisJNDQ4NDUsCisJMTMwLAorCTE2MzM1NywKKwk0MTUwLAorCTQwMzMzMSwKKwk4MzkxMzIsCisJNDQ4NzYsCisJMjcyNzkyLAorCTU5MjUyNywKKwk1NzIyNSwKKwkxMjg4MjYsCisJMjkxNSwKKwkyLAorCTM1NzAsCisJMjQxMCwKKwkxOTksCisJMTcxMzU4LAorCTU5MzEsCisJNTM2MjAsCisJNTUyOTksCisJMTg2OCwKKwkyNDEyMywKKwkxNjUsCisJMzQ2NTEzLAorCTE2NTI3LAorCTEzMywKKwk1MTc0MTIsCisJMTk1NzAwLAorCTczMDM2NSwKKwk4OTYyMDksCisJMTUyNzYwLAorCTI0NTc3LAorCTY1LAorCTgyMTgsCisJMzQ5NjQyLAorCTkwMTM0NSwKKwk1MTI3LAorCTUxMDIsCisJMjM4MzE4LAorCTk1NSwKKwk2MzE5MjEsCisJMTIyMTgsCisJNTUxMDEsCisJOTMwMzgxLAorCTIxOTUwMywKKwk0NjkyMzcsCisJMTMyLAorCTE2NzAxLAorCTQ5NCwKKwkxOTk3MjksCisJMCwKKwkzMjEzOSwKKwkzMTQsCisJMTcyLAorCTI5NDcsCisJMTA2OTk3LAorCTQ4NzEsCisJMjM2LAorCTYxNDYsCisJMTg0MywKKwkxMjgsCisJMCwKKwkyNTQyNDAsCisJMjk2NCwKKwkxNDgyNSwKKwk2MDYyNCwKKwkyMTA4LAorCTI4Njk1MywKKwk2NTQ5MzEsCisJMCwKKwkwLAorCTM5NjU4NywKKwkxOTg1MiwKKwk3MDMxMSwKKwkzNjM1NjEsCisJMjgyLAorCTE3OTY2LAorCTkyNDI1NCwKKwkxMDQxNzMsCisJMTMwODE2LAorCTE3OTA5NiwKKwkxMDU0NjYsCisJMTM2LAorCTYxODI2MSwKKwkzNTg0MzMsCisJMjU1ODcsCisJNDkzNTcsCisJMTAyLAorCTEzMzc0NiwKKwk2MjA3NzYsCisJMTcwODQsCisJNDA2ODgxLAorCTgwMjY3NSwKKwkzNDksCisJNjksCisJODc2MSwKKwkyNzg0ODIsCisJMTYzMzYsCisJMTI4LAorCTE2MDA5NiwKKwkyNTg1NywKKwkyODAsCisJMzk2MzksCisJNzI2Mjk5LAorCTI5MzkwNSwKKwk0NjIxLAorCTQxLAorCTY0OSwKKwkzNjU1LAorCTI2OTI4NiwKKwk1NzgwMjYsCisJMCwKKwkxMTE1NiwKKwkxLAorCTc0NDg1OCwKKwk1MzEsCisJNDgxNTUsCisJMjg0MzUsCisJNzk5MSwKKwk0NDcsCisJMTAyMDEsCisJMzc5MzQxLAorCTAsCisJNTc3MywKKwkwLAorCTI5NSwKKwkyMjg1OTIsCisJMzMxMTU1LAorCTEwNDA4OSwKKwk2MjgwNjksCisJMjk2OTMsCisJMjIsCisJMTMsCisJMCwKKwkwLAorCTU1NDM0OSwKKwk2MDgyLAorCTIzOCwKKwkyMywKKwkxNTE4NzMsCisJODA1OTM3LAorCTAsCisJMTk0MDc2LAorCTY0NTAsCisJMywKKwkxMjgzMjIsCisJNjkxNDksCisJOTU1MTEsCisJODYsCisJODQ0MzY4LAorCTQxNTk2NCwKKwk1MTk4NSwKKwkzMDg2ODYsCisJNTUzNDAzLAorCTYyNDk0MywKKwkzNjU4MDAsCisJNCwKKwkxMjAyNjMsCisJOTEyMzksCisJMTk1MjQ4LAorCTU4MDEwLAorCTE5LAorCTQxNTExMiwKKwkxMzY4MDYsCisJNDIsCisJNTcxODQ4LAorCTU1MzA2LAorCTI5NDU0LAorCTMsCisJMTQ0OTI2LAorCTE4OSwKKwkwLAorCTE2MTk0MywKKwk1OTIxNTUsCisJMTA5MzAsCisJMjc5Mjk3LAorCTU2OTMyLAorCTk1NzQzMCwKKwkxMDI0NCwKKwkxOTAyOTYsCisJODA3MjA5LAorCTc4MSwKKwkxNDY2LAorCTIzNTA1NSwKKwkzMywKKwkxOTYsCisJNTgyODAsCisJNDM2LAorCTQwODY0OSwKKwkyMjEsCisJNzExMTQzLAorCTEwNDk1LAorCTI0NDEsCisJMjc1NzIwLAorCTIsCisJMTUzOTEsCisJMTMyMTA3LAorCTEwMjYxMCwKKwk2ODg1NDksCisJMjM3MTQyLAorCTMwNDEsCisJMTQsCisJMzA4NjIzLAorCTAsCisJMCwKKwkyODcsCisJMjk1MTQ3LAorCTYxNDQzLAorCTIyOSwKKwkyMDcsCisJMjA1MSwKKwk2NCwKKwkxMzQ3OSwKKwk1NTY1NiwKKwk1NzAxMzQsCisJNTAzODcsCisJMjI1ODY5LAorCTIwNjE1LAorCTI1ODQ2NSwKKwk2NDkzMiwKKwkxMTI0NjEsCisJMTY0NTIxLAorCTkwNzI2OSwKKwk3NTg1NjMsCisJMjI5MDEsCisJMCwKKwk3OTQ0LAorCTQ4LAorCTE1NDkyMSwKKwkyNzg0LAorCTU0ODYwOCwKKwkwLAorCTEyNTI0LAorCTE0MjU1NiwKKwkwLAorCTEzODgyLAorCTUwNzIyNywKKwkzMTY1OTgsCisJOTg3NTUxLAorCTAsCisJODk0Njg3LAorCTE5NjQsCisJMzY0LAorCTEwMzE2LAorCTQ0MDI2OSwKKwk5LAorCTc3NjcyMywKKwk3MjI4OCwKKwk1NDYwNCwKKwkxODUxMDEsCisJMTQyLAorCTM2MiwKKwkxMTY3OSwKKwk3NywKKwk3OSwKKwk1MjkzMjEsCisJMzY0LAorCTQyMzg3LAorCTAsCisJNTcwODc5LAorCTQxNzUwMywKKwk2MDQ4NzEsCisJNTc4ODA2LAorCTExMDIsCisJNjY1ODQsCisJNjE1NDQwLAorCTE0Njc0NCwKKwkxOTQ0MSwKKwkxNzA0NzgsCisJMTQ0MDY5LAorCTM2MTcwLAorCTE0NTM3NiwKKwk4NDIyODMsCisJMTkzNjEyLAorCTMsCisJMzU5NDI5LAorCTM2ODU5NiwKKwkwLAorCTExMDY0LAorCTc3MjYsCisJMjI5NDEwLAorCTYzNTY5LAorCTY3NDAyLAorCTkxLAorCTIwMzIwMSwKKwkyMTM1MTMsCisJMCwKKwk3MDQ0NzksCisJMTMyNSwKKwkwLAorCTM4NTE1NCwKKwkxMywKKwk4MDY3NjMsCisJMTk3MTMyLAorCTYxODMsCisJNDU3NjAsCisJOTkzNzcsCisJMCwKKwk5NzIwNzcsCisJNDA0MywKKwkxOTU3MDAsCisJMzQyMjksCisJMCwKKwkxNTQwMjcsCisJNjMzLAorCTYsCisJMzIxNDIsCisJMCwKKwkyOSwKKwk2MjA4NDIsCisJMTQwOTksCisJNDk1NDY1LAorCTI2OTM3LAorCTAsCisJMCwKKwk0MzIsCisJMjI3NzA0LAorCTAsCisJNjMsCisJMCwKKwkxOSwKKwk4NjM0OTEsCisJMjAsCisJMSwKKwkxNjA3MTMsCisJMjQ2MDcsCisJODU4MDAsCisJMzU2NiwKKwkzNzg1NCwKKwk4MTkxMywKKwkxMjE1NzMsCisJODE2LAorCTIwLAorCTEzMzI1MywKKwk2OTIyMzEsCisJNDg2OSwKKwkyNTUxNzUsCisJMTUwMjgsCisJOTM4MywKKwk1NDI4NzcsCisJNDYwOCwKKwkzNjk2MTAsCisJMjQzNjM1LAorCTM4NTI4NSwKKwkzOTE1NjUsCisJMjg2MDA5LAorCTAsCisJNjE2ODUsCisJNDE2MzE4LAorCTIwOCwKKwk2NzAxOSwKKwk3ODg0MTYsCisJODgsCisJMTY1MDU2LAorCTAsCisJNDM5NTg5LAorCTE2MCwKKwkxMDU1MjgsCisJMTUyLAorCTE2MDYyNCwKKwk4NjUsCisJMzkwMjI5LAorCTcxNDA4NiwKKwk2MDA3LAorCTMwMjI5LAorCTQ4MTMwNiwKKwkxNzMyNjYsCisJMTEzNSwKKwkyMjY2LAorCTgsCisJNTksCisJMTA0NzIyLAorCTY0Nzg4NSwKKwk1Nzk0NzEsCisJMjEzMDksCisJMjMwODM0LAorCTE0MDI3OCwKKwkzMTg1OCwKKwkzMjg4LAorCTM2MDExLAorCTE1MTM4NywKKwk1OTQyMTcsCisJMjI0MzksCisJNDE4NjM4LAorCTc2ODU5LAorCTI5MzYzLAorCTE1NDgwOSwKKwkyNzU1MzMsCisJMzksCisJNDcyOTk2LAorCTIyMDc2LAorCTc0ODEsCisJMTU1NzA1LAorCTEwNDA2LAorCTIxNDc3OSwKKwkyMjMsCisJMTMxMiwKKwkxNjM5MSwKKwkxNzIwMywKKwk1NTYwNSwKKwk0NDU3OSwKKwk2OTMzMiwKKwkzMDMsCisJMTkyMTcsCisJMjYyODgsCisJMTI2MjEyLAorCTMxNiwKKwk5OCwKKwkxMTQsCisJMzczODIsCisJMTM3NTkxLAorCTQzOTc0OSwKKwkxMjk3MiwKKwk1NCwKKwkxNTQ4NzksCisJMCwKKwkxMDI2ODAsCisJNzYzOSwKKwkzMDkxMTksCisJMjYzNTUwLAorCTc2NiwKKwkxMTI0LAorCTU2LAorCTY4NjYwOCwKKwkxMjM3NjcsCisJNTE4MDU0LAorCTE4LAorCTY3MjM4NSwKKwkzMTYxLAorCTUzNzkxLAorCTI2NzY5LAorCTQ1MTY3MCwKKwk2MSwKKwkxNDgyNDUsCisJMjcxMywKKwk5NjcyNSwKKwk0Nzk0LAorCTMzMjQ3LAorCTI5Nzk0NiwKKwkzMzM4MCwKKwkwLAorCTIwMDM0LAorCTU2NDcsCisJMTcyMjcsCisJNzY0NDQsCisJMCwKKwkyMTAxMSwKKwk2NzUsCisJMTMyMjYsCisJMTAyNywKKwk5OTA4NDIsCisJMTI0NDU5LAorCTM0NDA2LAorCTUzLAorCTY5NTQwLAorCTEzNCwKKwkwLAorCTE2ODUyMSwKKwk2LAorCTQwNzUsCisJMTEzNywKKwk2Mzc0MCwKKwkyMjAsCisJMTA0MzQsCisJMTE3MSwKKwkyODk1MCwKKwkwLAorCTc5NjgwLAorCTk5MzI2OSwKKwkzNTU2MjIsCisJMTUsCisJMCwKKwkxNDUyLAorCTIxNjY3LAorCTIyMjA4LAorCTQ5NDQ4NCwKKwkzMzk4NCwKKwk2OTEzMDgsCisJMTAsCisJNjkzNjg2LAorCTE5NiwKKwk5LAorCTcwNjc2LAorCTE1NzY2MCwKKwk3NzUsCisJMTY1LAorCTQ2ODQzMiwKKwkxMDgzLAorCTUxNTE1NCwKKwk3NzgzNDQsCisJNzAyNDEsCisJNDIsCisJNDA5MzEsCisJMjc3MTI1LAorCTQzODM3LAorCTMwMTg4MSwKKwkxMzMyLAorCTU2NzEyLAorCTkwMTMsCisJMTI5OSwKKwk3NTY0LAorCTMxMDkyLAorCTE5NzUsCisJMTEzNTE3LAorCTgzMzI5NSwKKwkyNDUwMjEsCisJMzY1MDMsCisJMjM1ODYsCisJMTQ5MzI3LAorCTg5MTc1LAorCTEwNTEyLAorCTQ4NDM0OCwKKwkxODc3OTMsCisJOTU0NjA5LAorCTUzMTk5LAorCTc5MjE3NSwKKwkxMjYsCisJMTIzNjksCisJNDA1LAorCTAsCisJNjYxNCwKKwkzMjI4NTcsCisJMTY2LAorCTU3MTg3NCwKKwk2MDgzOSwKKwkxODA5NzUsCisJMTQ2NzIyLAorCTQxMTU2NSwKKwkxNTM2LAorCTEsCisJMTEsCisJMTE2MjMwLAorCTYwNTE0LAorCTkwMDMsCisJMjMyNSwKKwk0Mzc2MywKKwk2MywKKwkzNTU1NTMsCisJMCwKKwkzODk4NzYsCisJMTQ2NzIsCisJMTE1MjYsCisJMTYwMjA5LAorCTY1LAorCTEwMjgzLAorCTk2NiwKKwkxMCwKKwk1ODMzMywKKwkxMjk5MjAsCisJMjg1MCwKKwk4MzM0NiwKKwkwLAorCTE0LAorCTI5NTgxOSwKKwk2Nzk1NTAsCisJMTQzOTI4LAorCTI5NDg5LAorCTgyMzI0LAorCTM2NTU4LAorCTI2NzExOCwKKwkxNDMzMTMsCisJOTAxMDcsCisJMTI3ODksCisJOTUxLAorCTAsCisJMTg3NjE5LAorCTI5NTMxNywKKwk4MiwKKwk0MTMyNiwKKwkzMDk2ODIsCisJOTA3MzI3LAorCTgwOTM1OCwKKwkzMjQsCisJMTM5MTU3LAorCTEyLAorCTc4MzY2LAorCTY3MTgxMSwKKwkzNTQsCisJMTMxLAorCTcwNTI1LAorCTM1ODMwLAorCTI4MTAxOCwKKwk5MTQ1NiwKKwk5MjUyMywKKwk1NDg3NCwKKwk0ODI3MywKKwkyNDIzLAorCTAsCisJODEsCisJMzYxMzE0LAorCTM3NDgxMSwKKwkzOTQ3NTgsCisJMTUzNTAsCisJNzk1LAorCTMsCisJMTY3NzksCisJNzk2Njg0LAorCTQ3NzU1NiwKKwk3MzkyNywKKwkyNjY0MywKKwkxMTkyODEsCisJNjI2OTIsCisJMTcwMzksCisJNDU0Nzc4LAorCTk1MiwKKwk0ODk3MywKKwkxOTUyOSwKKwkxNTEsCisJMjM5MTIxLAorCTkzNTA5LAorCTI1NDcwMiwKKwkxMzA3LAorCTEwMDI5LAorCTc5NzMsCisJNTQ2NzA2LAorCTgwNjY0NCwKKwk2ODA1MTcsCisJMjIzLAorCTAsCisJMiwKKwkwLAorCTQwMjQyMSwKKwk2MTkxOTMsCisJMTU2ODUsCisJMiwKKwk5Mzk3MTUsCisJNTE5MTk4LAorCTAsCisJNDQ0MzEyLAorCTIzMjA0LAorCTM1NjY5LAorCTMyNDY3LAorCTAsCisJNzk5NzI1LAorCTU4ODMsCisJMjIxNywKKwkzMjI5MiwKKwkzNTU1NTcsCisJMjIxNzksCisJMTA2NiwKKwkxNTcwNCwKKwk2MTAsCisJMzc4MTksCisJNDAzNjI2LAorCTgzMTAxLAorCTEwOTg5LAorCTMxMTYwNywKKwk0MzM5NCwKKwk3MjU3NiwKKwkzMzU0NTAsCisJODU5NjQsCisJNzM3MzQsCisJMTA1MTQyLAorCTM4MjkyLAorCTAsCisJMTgxNTE2LAorCTMzOTU5LAorCTYxMTc5NywKKwkyMjE4MzgsCisJNTkzMSwKKwk3NjY2LAorCTEwNDQsCisJNDc3MTczLAorCTEzNTkxLAorCTQwNSwKKwk1MjEsCisJMTkwNjUzLAorCTE4NDE5MSwKKwkwLAorCTIxNSwKKwk4NDcxOTUsCisJMjI3ODIsCisJMTE5MTIsCisJMjczNDUsCisJMjU3MiwKKwkwLAorCTU2NjM1MCwKKwk3LAorCTUyMzAyLAorCTI2NjQxLAorCTU4NzgyNiwKKwkxMjcsCisJMiwKKwk0NDQ0OSwKKwkxNTMxOTgsCisJMTQsCisJOTI2LAorCTI4NSwKKwkwLAorCTkzODE5NiwKKwk1MjI1NSwKKwk5MTUzLAorCTgwNywKKwkxMjU0OCwKKwkzNTgzMjQsCisJMTg1MjEsCisJMTA0OTU2LAorCTQyNzM4LAorCTExNiwKKwkxMzU3NzIsCisJMTg5NTU0LAorCTM4LAorCTU0LAorCTM2LAorCTg5NzY4LAorCTE3MTcwLAorCTc1LAorCTM0NTAyLAorCTQ1NDg5LAorCTE3Mjc5NiwKKwk5NzE4MTAsCisJMTYxNTMsCisJNDk5MjgwLAorCTEsCisJODc5NjYzLAorCTUzODMwLAorCTE4NiwKKwk1MzksCisJMjQyMDU5LAorCTI2OCwKKwk0MDIsCisJMjczMiwKKwk2ODA1NywKKwkxODQ2MywKKwkxOTg1NjAsCisJMTAwNjgsCisJNTkxNzUzLAorCTYxMTYsCisJNjk5MjgwLAorCTEsCisJMCwKKwkxMTQyNTgsCisJMjc3LAorCTE0OSwKKwkyODM4MjEsCisJMzUyNTYxLAorCTg4MTcyLAorCTY4NDQ3NiwKKwkzNDUwLAorCTg3LAorCTk5OTM2LAorCTMxNTUsCisJNzI5ODMsCisJMzE2MTksCisJODgzMiwKKwk1ODY2NiwKKwkwLAorCTU5MDIzLAorCTMwNjA5MSwKKwkzNTIxNTAsCisJMjU1MDYzLAorCTk5MjcwOCwKKwkyMywKKwk0ODk2LAorCTE4MTY1LAorCTQyNDQwMSwKKwkyMjc2MTMsCisJNTE3NSwKKwkzNDcsCisJMTM5ODQ2LAorCTExOTYyLAorCTcxNCwKKwkzNTAxLAorCTgyMzY3LAorCTExMTEwLAorCTEwLAorCTEyODc0LAorCTAsCisJMCwKKwkyMjI3MTIsCisJMTY5LAorCTEyMzI4MSwKKwkwLAorCTI2ODE0OSwKKwkxMDEsCisJMTc0NDYsCisJNDI2MiwKKwk0ODksCisJMCwKKwkzMCwKKwkwLAorCTI3NzIzNSwKKwkyOCwKKwk3MSwKKwkyMywKKwk2MTIxOSwKKwk5NTM2MzEsCisJNDc3NTQ4LAorCTY2MjQ5MSwKKwkyNzMsCisJNDQ3ODcsCisJNDEzMCwKKwkxNDQ4MywKKwk0NzA1NzEsCisJNzM1OTc3LAorCTQwNjY0OCwKKwk4MTU4OTgsCisJNTk4NSwKKwk0NjI2OTYsCisJOTM3NTEwLAorCTksCisJMCwKKwkxMTE3MjcsCisJOTMsCisJMzMxNDM1LAorCTMzNjQwMiwKKwk3ODY5MCwKKwk0OSwKKwkwLAorCTg3NDIyLAorCTEyNDIsCisJMCwKKwk4NzgzLAorCTg1NDAsCisJMzE0LAorCTMzNDExLAorCTgwNTcxOCwKKwkyNDcsCisJNjg3MCwKKwk1MjM3NDMsCisJODMyMywKKwk2MTI1OTMsCisJNDMwLAorCTM1NDA0OCwKKwkyNjQ5MTMsCisJODMsCisJMTE0MDYzLAorCTIwMjgyNSwKKwkzNTIwMiwKKwkzMjgyMywKKwkxODU1NTQsCisJODU3NjAsCisJNDUxNTksCisJNTk3MSwKKwkyNjc3MzMsCisJNDU0NSwKKwkxMTYsCisJNjkxMCwKKwkyNDgzMywKKwkyMTgsCisJOTIyMzYyLAorCTIyMTczNSwKKwk3NDAsCisJNzExMiwKKwkzMSwKKwkxNTczOSwKKwk1MjM1ODksCisJNCwKKwk5NTk5NiwKKwk5MzYsCisJODIzOTUxLAorCTAsCisJODgsCisJMTYwLAorCTM3NTQxOSwKKwk2NjM2MjcsCisJMzc0MSwKKwkyMjg5NiwKKwkxMTQzMjYsCisJNDE1OTYyLAorCTg4MDEwMCwKKwk2MjIyLAorCTE4NjUwLAorCTM1NTI0LAorCTE5NTA3NiwKKwk1MDYsCisJNDUxNjQwLAorCTU0MTMzNiwKKwk3MDkwMywKKwkzOTQ2LAorCTEsCisJNjE3NjUsCisJMSwKKwkyNjk2LAorCTc1MzEyOSwKKwkyODksCisJMjI1MjM0LAorCTM3ODY5MiwKKwkxNzAzLAorCTY3NTEsCisJMSwKKwk4MjAsCisJNzY3NywKKwk1ODksCisJMTI0MTIsCisJMzE3LAorCTY5LAorCTIyNjAzMSwKKwkxMzQ1MjMsCisJMzE4MjUzLAorCTY2Njc3LAorCTExMTAyNSwKKwk5NiwKKwkwLAorCTk2LAorCTUyMzUyOCwKKwkxMDE3LAorCTAsCisJMjU4NzQwLAorCTQyMDk0NywKKwk0NjAwLAorCTQwMDY4NCwKKwkxMjE3NCwKKwkxMTc3MCwKKwk1MiwKKwk1OTU5LAorCTgyNjU4LAorCTUzMTc4NywKKwkyMDIsCisJNTQ4NDMwLAorCTk2NCwKKwkxMDU0LAorCTM0LAorCTk2ODk3LAorCTI1NDQ1LAorCTQ3NjA5LAorCTM4NjA1MiwKKwk5NzAwNCwKKwkxOTM1LAorCTMwMDc0LAorCTEzNDU4LAorCTQ5NDEwNSwKKwk1NCwKKwk2NTU3NSwKKwk1OTQ2OTgsCisJMjM0MCwKKwkyMDI1OSwKKwk4NCwKKwkyNzc0LAorCTUzNCwKKwk5NzI1MzQsCisJMTE1MDU3LAorCTAsCisJMTEzNzksCisJMCwKKwkyNzEsCisJMjY2MzA1LAorCTEzMjU5NSwKKwkyLAorCTc3MzU2MSwKKwk1MjM2NSwKKwkzNTg1LAorCTM1MSwKKwkxNDgyMDYsCisJNzc4OTY0LAorCTE0OTM3OSwKKwk1OTYsCisJMjg0OTE0LAorCTI5MDAsCisJMzU1OTYsCisJMTU0NywKKwkyMTIwMjcsCisJODEwMCwKKwkxMjI0OCwKKwkzMDEzLAorCTE4MTQsCisJMTgzNDE1LAorCTI3MzYzMywKKwkxNTgxMiwKKwkwLAorCTk2NjY4MCwKKwkxNDgzMCwKKwkxMzQzMDksCisJMCwKKwk0MTY0NTAsCisJMjA2NjExLAorCTgxNiwKKwk4MjI1OCwKKwk5ODczLAorCTMxNTUsCisJNTM0ODUsCisJNzc5ODA1LAorCTEwNzY5MCwKKwkyNTQ0NzUsCisJMTAyNTA0LAorCTcyNDk1LAorCTE3MzAxLAorCTQ3MjEzMCwKKwk2ODk1LAorCTI0NTQyMCwKKwk3Mjk5LAorCTExMDUwOCwKKwkyNzc3NiwKKwkyNDYxMzQsCisJMCwKKwkzMzA4NTMsCisJMCwKKwkyNzE3NjcsCisJNjE4ODYsCisJMjQxMjMsCisJMzA5NjgxLAorCTU4MzI1LAorCTYwODg2NSwKKwkyMDY2NiwKKwk4NzM0OSwKKwkyMjkyMjgsCisJMjQ2LAorCTQ1Nzc2OCwKKwk1Mzc0LAorCTY5NjQzLAorCTE0OCwKKwk2MTgzNzUsCisJNDUyMzYsCisJMzUyNTY1LAorCTEzMzkwNCwKKwkxNTIsCisJMTA2ODgsCisJMTgsCisJMCwKKwkyNzYwMzYsCisJNDkzMjgxLAorCTExMTU2LAorCTEyNTY2LAorCTU3NjIsCisJMTEzLAorCTI0MTc5LAorCTk4LAorCTMyNywKKwk4OTMsCisJMjA5MTgwLAorCTE0MDgwNSwKKwkwLAorCTIzNDEsCisJNjYzMDksCisJMzAzMDUsCisJNjMwNTU5LAorCTM2ODIsCisJMTUyNzY3LAorCTI2NTgyMiwKKwkxNDI4NjgsCisJMTUzNSwKKwk3Mjg2MDMsCisJNjkwODEsCisJMzUzMTUxLAorCTIzNzk5NSwKKwkxMDc1LAorCTkyNTA3MSwKKwk4NiwKKwk2NzQ4LAorCTAsCisJNjg0MTg2LAorCTczNSwKKwkxMzc5MywKKwk0NzkwLAorCTczMTc1LAorCTY5Njc3LAorCTM2NzYyNywKKwkyMzg2NTAsCisJMzAzNTQzLAorCTEsCisJMjYwNTksCisJMjEzOTIsCisJMTAsCisJMjg4NjA5LAorCTAsCisJNzYzNDUsCisJMTU4NDk2LAorCTcwMDAsCisJMTg2NSwKKwkyMDM4NSwKKwkwLAorCTU0MjEzLAorCTk5NDgsCisJMTAyNjY3LAorCTY5NjMsCisJNzEsCisJNTU1NzQ0LAorCTU2MjYsCisJMjUxMiwKKwkxMTI0LAorCTcxNzEsCisJNjI4LAorCTI5MjI1LAorCTMyMTY4NywKKwk2MTUxOSwKKwk0LAorCTgzNTIsCisJOTE1NiwKK307CisKK2NoYXIgKnBvaW50ZXJzW05DWUNMRVNdOworCitpbnQgbWFpbih2b2lkKQoreworCWludCByLCBpLCBqLCBzcCwgc3E7CisJY2hhciAqcCwgKnEsICplcCwgKmVxOworCWludCBvazsKKwlpbnQgZXJyID0gMDsKKworCWZvciAociA9IDA7IHIgPCA0OyByKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IE5DWUNMRVM7IGkrKykgeworCQkJcG9pbnRlcnNbaV0gPSBwID0gbWFsbG9jKHNwID0gc2l6ZXNbaV0pOworCQkJZXAgPSBwICsgc3A7CisJCQlvayA9IDE7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJcSA9IHBvaW50ZXJzW2pdOworCQkJCXNxID0gc2l6ZXNbal07CisJCQkJZXEgPSBxICsgc3E7CisKKwkJCQlpZiAoKHAgPCBxICYmIGVwID4gcSkgfHwgKHAgPj0gcSAmJiBwIDwgZXEpKSB7CisJCQkJCW9rID0gMDsKKwkJCQkJZXJyID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcHJpbnRmKCJBbGxvY2F0ZWQgJTZkIGJ5dGVzIGF0ICVwLCBvayA9ICVkXG4iLCBzcCwgcCwKKwkJCSAgICAgICBvayk7CisKKwkJCWlmIChwKQorCQkJCW1lbXNldChwLCAweGVlLCBzcCk7CS8qIFBvaXNvbiB0aGlzIG1lbW9yeSAqLworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IE5DWUNMRVM7IGkrKykgeworCQkJZnJlZShwb2ludGVyc1tpXSk7CisJCQlwcmludGYoIkZyZWVkICU2ZCBieXRlcyBhdCAlcFxuIiwgc2l6ZXNbaV0sCisJCQkgICAgICAgcG9pbnRlcnNbaV0pOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9tYWxsb2N0ZXN0Mi5jIGIvdXNyL2tsaWJjL3Rlc3RzL21hbGxvY3Rlc3QyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0NTA3MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9tYWxsb2N0ZXN0Mi5jCkBAIC0wLDAgKzEsNjIgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIE5DWUNMRVMgMzI3NjgKKyNkZWZpbmUgTlNMT1RTICA0MDk2CisKK3N0cnVjdCBzbG90IHsKKwljaGFyICpwdHI7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3Qgc2xvdCBzW05TTE9UU107CisKK2ludCBtYWluKHZvaWQpCit7CisJc2l6ZV90IHNwLCBzcTsKKwljaGFyICpwLCAqZXAsICpxLCAqZXE7CisJaW50IHIsIGksIGo7CisJaW50IG9rOworCWludCBlcnIgPSAwOworCisJZm9yIChyID0gMDsgciA8IE5DWUNMRVM7IHIrKykgeworCQlpID0gbHJhbmQ0OCgpICUgTlNMT1RTOworCisJCWlmIChzW2ldLnB0cikgeworCQkJZnJlZShzW2ldLnB0cik7CisJCQlwcmludGYoIkZyZWVkICAgICAlOHp1IGJ5dGVzIGF0ICVwXG4iLCBzW2ldLnNpemUsCisJCQkgICAgICAgc1tpXS5wdHIpOworCQkJc1tpXS5wdHIgPSBOVUxMOworCQkJc1tpXS5zaXplID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNwID0gbHJhbmQ0OCgpOwkvKiAzMi1iaXQgcmFuZG9tIG51bWJlciAqLworCQkJc3AgPj49IDEyICsgKGxyYW5kNDgoKSAlIDIwKTsKKworCQkJc1tpXS5zaXplID0gc3A7CisJCQlzW2ldLnB0ciA9IHAgPSBtYWxsb2Moc3ApOworCQkJZXAgPSBwICsgc3A7CisJCQlvayA9IDE7CisJCQlmb3IgKGogPSAwOyBqIDwgTlNMT1RTOyBqKyspIHsKKwkJCQlxID0gc1tqXS5wdHI7CisJCQkJaWYgKGkgIT0gaiAmJiBxKSB7CisJCQkJCXNxID0gc1tqXS5zaXplOworCQkJCQllcSA9IHEgKyBzcTsKKworCQkJCQlpZiAoKHAgPCBxICYmIGVwID4gcSkKKwkJCQkJICAgIHx8IChwID49IHEgJiYgcCA8IGVxKSkgeworCQkJCQkJb2sgPSAwOworCQkJCQkJZXJyID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcHJpbnRmKCJBbGxvY2F0ZWQgJTh6dSBieXRlcyBhdCAlcCwgb2sgPSAlZFxuIiwgc3AsIHAsCisJCQkgICAgICAgb2spOworCisJCQlpZiAocCkKKwkJCQltZW1zZXQocCwgMHhlZSwgc3ApOwkvKiBQb2lzb24gdGhpcyBtZW1vcnkgKi8KKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL21lbXN0cnRlc3QuYyBiL3Vzci9rbGliYy90ZXN0cy9tZW1zdHJ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NzNmYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9tZW1zdHJ0ZXN0LmMKQEAgLTAsMCArMSwyOCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB0MVsyNTZdLCB0MlsyNTZdOworCWludCBpOworCWludCByOworCisJZm9yIChpID0gMDsgaSA8IChpbnQpc2l6ZW9mKHQxKTsgaSsrKQorCQl0MVtpXSA9IHQyW2ldID0gKHVuc2lnbmVkIGNoYXIpaTsKKworCXIgPSBtZW1jbXAodDEsIHQyLCBzaXplb2YodDEpKTsKKwlwcmludGYoIm1lbWNtcCByID0gJWRcbiIsIHIpOworCXIgPSBtZW1jbXAodDEsIHQyLCBzaXplb2YodDEpIC8gMik7CisJcHJpbnRmKCJtZW1jbXAgciA9ICVkXG4iLCByKTsKKwl0MVsyNTVdID0gMDsKKwlyID0gbWVtY21wKHQxLCB0Miwgc2l6ZW9mKHQxKSk7CisJcHJpbnRmKCJtZW1jbXAgciA9ICVkXG4iLCByKTsKKworCWZvciAoaSA9IDA7IGkgPCAoaW50KXNpemVvZih0MSk7IGkrKykKKwkJdDFbaV0gPSAweGFhOworCW1lbXNldCh0MiwgMHhhYSwgc2l6ZW9mKHQyKSk7CisJciA9IG1lbWNtcCh0MSwgdDIsIHNpemVvZih0MSkpOworCXByaW50ZigibWVtY21wIHIgPSAlZFxuIiwgcik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvbWljcm9oZWxsby5jIGIvdXNyL2tsaWJjL3Rlc3RzL21pY3JvaGVsbG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTk5ZDExCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL21pY3JvaGVsbG8uYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgbWFpbih2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGhlbGxvW10gPSAiSGVsbG8sIFdvcmxkIVxuIjsKKwlfZndyaXRlKGhlbGxvLCBzaXplb2YgaGVsbG8gLSAxLCBzdGRvdXQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL21pbmloZWxsby5jIGIvdXNyL2tsaWJjL3Rlc3RzL21pbmloZWxsby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTA3MmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvbWluaWhlbGxvLmMKQEAgLTAsMCArMSw3IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKwlmcHV0cygiSGVsbG8sIFdvcmxkIVxuIiwgc3Rkb3V0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9tbWFwdGVzdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL21tYXB0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMDRlOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9tbWFwdGVzdC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBtbWFwdGVzdC5jCisgKgorICogVGVzdCBzb21lIHNpbXBsZSBjYXNlcyBvZiBtbWFwKCkKKyAqLworCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworc3RhdGljIHZvaWQgbWFrZV90ZXN0X2ZpbGUoaW50IGZkKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwlGSUxFICpmID0gZmRvcGVuKGZkLCAid2IiKTsKKworCWZvciAodiA9IDA7IHYgPCAyNjIxNDQ7IHYgKz0gc2l6ZW9mKHYpKQorCQlfZndyaXRlKCZ2LCBzaXplb2YodiksIGYpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXZvaWQgKmZvbzsKKwljaGFyICp0ZXN0X2ZpbGUgPSAoYXJnYyA+IDEpID8gYXJndlsxXSA6ICIvdG1wL21tYXB0ZXN0LnRtcCI7CisJaW50IHJ2LCBmZDsKKworCS8qIEltcG9ydGFudCBjYXNlLCB0aGlzIGlzIGhvdyB3ZSBnZXQgbWVtb3J5IGZvciBtYWxsb2MoKSAqLworCWVycm5vID0gMDsKKwlmb28gPSBtbWFwKE5VTEwsIDY1NTM2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIDAsIDApOworCisJcHJpbnRmKCJtbWFwKCkgcmV0dXJuZWQgJXAsIGVycm5vID0gJWRcbiIsIGZvbywgZXJybm8pOworCWlmIChmb28gPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIDE7CisKKwlydiA9IG11bm1hcChmb28sIDY1NTM2KTsKKwlwcmludGYoIm11bm1hcCgpIHJldHVybmVkICVkLCBlcnJubyA9ICVkXG4iLCBydiwgZXJybm8pOworCWlmIChydikKKwkJcmV0dXJuIDE7CisKKwkvKiBDcmVhdGUgdGVzdCBmaWxlICovCisJZmQgPSBvcGVuKHRlc3RfZmlsZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NjYpOworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKHRlc3RfZmlsZSk7CisJCXJldHVybiAxOworCX0KKworCW1ha2VfdGVzdF9maWxlKGZkKTsKKworCS8qIE1hcCB0ZXN0IGZpbGUgKi8KKwlmb28gPSBtbWFwKE5VTEwsIDY1NTM2LCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAxMzEwNzIpOworCXByaW50ZigibW1hcCgpIHJldHVybmVkICVwLCBlcnJubyA9ICVkXG4iLCBmb28sIGVycm5vKTsKKwlpZiAoZm9vID09IE1BUF9GQUlMRUQpCisJCXJldHVybiAxOworCisJaWYgKCoodW5zaWduZWQgbG9uZyAqKWZvbyAhPSAxMzEwNzIpIHsKKwkJcHJpbnRmKCJtbWFwKCkgd2l0aCBvZmZzZXQgcmV0dXJuZWQgdGhlIHdyb25nIG9mZnNldCAlbGQhXG4iLAorCQkgICAgICAgKih1bnNpZ25lZCBsb25nICopZm9vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG11bm1hcChmb28sIDY1NTM2KSkgeworCQlwcmludGYoIm11bm1hcCgpIHJldHVybmVkIG5vbnplcm8sIGVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY2xvc2UoZmQpOworCXVubGluayh0ZXN0X2ZpbGUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvb3BlbnRlc3QuYyBiL3Vzci9rbGliYy90ZXN0cy9vcGVudGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTdiM2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvb3BlbnRlc3QuYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKwljaGFyIGJ1ZmZlclsxMDI0XTsKKwlGSUxFICpmOworCisJZiA9IGZvcGVuKCIvZXRjL3Bhc3N3ZCIsICJyIik7CisJZmdldHMoYnVmZmVyLCAxMDI0LCBmKTsKKwlmY2xvc2UoZik7CisKKwlwcmludGYoIkxpbmUgMSA9ICVzIiwgYnVmZmVyKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL3BpcGV0ZXN0LmMgYi91c3Iva2xpYmMvdGVzdHMvcGlwZXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQ5NzIxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3BpcGV0ZXN0LmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQgbWFpbih2b2lkKQoreworCS8qIFNpemUgb2YgbWVzc2FnZSBtdXN0IGJlIDw9IFBJUEVfQlVGICovCisJY29uc3QgY2hhciBtc2dbXSA9ICJIZWxsbywgV29ybGQhIjsKKwljaGFyIGJ1Zls1MTJdOworCWludCBydjsKKwlpbnQgcGZkWzJdOworCisJaWYgKHBpcGUocGZkKSkgeworCQlwZXJyb3IoInBpcGUiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHdyaXRlKHBmZFsxXSwgbXNnLCBzaXplb2YgbXNnKSAhPSBzaXplb2YgbXNnKSB7CisJCXBlcnJvcigid3JpdGUiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKChydiA9IHJlYWQocGZkWzBdLCBidWYsIHNpemVvZiBidWYpKSA8IHNpemVvZiBtc2cpIHsKKwkJaWYgKHJ2ID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisJCXBlcnJvcigicmVhZCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobWVtY21wKG1zZywgYnVmLCBzaXplb2YgbXNnKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk1lc3NhZ2UgbWlzY29tcGFyZSFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9ydHNpZy5jIGIvdXNyL2tsaWJjL3Rlc3RzL3J0c2lnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmOGVlZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9ydHNpZy5jCkBAIC0wLDAgKzEsMTIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitpbnQgbWFpbih2b2lkKQoreworI2lmZGVmIFNJR1JUTUlOCisJcHJpbnRmKCJzaWdydG1pbiA9ICVkLCBzaWdydG1heCA9ICVkXG4iLCBTSUdSVE1JTiwgU0lHUlRNQVgpOworI2Vsc2UKKwlwcmludGYoIk5vIHJlYWx0aW1lIHNpZ25hbHNcbiIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvc2VsZWN0LmMgYi91c3Iva2xpYmMvdGVzdHMvc2VsZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3NWM1NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9zZWxlY3QuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogU2ltcGxlIHRlc3Qgb2Ygc2VsZWN0KCkKKyAqLworCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBmZG4sIGZkeiwgcGZkWzJdLCBydjsKKwlmZF9zZXQgcmVhZHNldDsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworCWludCBlcnIgPSAwOworCisJLyogV2UgY2FuIGFsd2F5cyByZWFkIGZyb20gL2Rldi96ZXJvOyBvcGVuIGEgcGlwZSB0aGF0IGlzIG5ldmVyCisJICAgcmVhZHkgZm9yIGEgIm5ldmVyIHJlYWRhYmxlIiBmaWxlIGRlc2NyaXB0b3IgKi8KKwlmZHogPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JET05MWSk7CisJcGlwZShwZmQpOworCWZkbiA9IHBmZFswXTsKKworCUZEX1pFUk8oJnJlYWRzZXQpOworCUZEX1NFVChmZG4sICZyZWFkc2V0KTsKKworCXRpbWVvdXQudHZfc2VjID0gMDsKKwl0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDA7CisKKwlydiA9IHNlbGVjdChGRF9TRVRTSVpFLCAmcmVhZHNldCwgTlVMTCwgTlVMTCwgJnRpbWVvdXQpOworCisJaWYgKHJ2ICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkic2VsZWN0IHdpdGggdGltZW91dCBmYWlsZWQgKHJ2ID0gJWQsIGVycm5vID0gJXMpXG4iLAorCQkJcnYsIHN0cmVycm9yKGVycm5vKSk7CisJCWVycisrOworCX0KKworCUZEX1pFUk8oJnJlYWRzZXQpOworCUZEX1NFVChmZG4sICZyZWFkc2V0KTsKKwlGRF9TRVQoZmR6LCAmcmVhZHNldCk7CisKKwlydiA9IHNlbGVjdChGRF9TRVRTSVpFLCAmcmVhZHNldCwgTlVMTCwgTlVMTCwgJnRpbWVvdXQpOworCQorCWlmIChydiAhPSAxIHx8ICFGRF9JU1NFVChmZHosICZyZWFkc2V0KSB8fAorCSAgICBGRF9JU1NFVChmZG4sICZyZWFkc2V0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJzZWxlY3Qgd2l0aCAvZGV2L3plcm8gZmFpbGVkIChydiA9ICVkLCBlcnJubyA9ICVzKVxuIiwKKwkJCXJ2LCBzdHJlcnJvcihlcnJubykpOworCQllcnIrKzsKKwl9CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL3NldGVudnRlc3QuYyBiL3Vzci9rbGliYy90ZXN0cy9zZXRlbnZ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwNzE5OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9zZXRlbnZ0ZXN0LmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJKHZvaWQpYXJnYzsKKwkodm9pZClhcmd2OworCisJLyogU2V0IFNFVEVOViAqLworCXNldGVudigiU0VURU5WIiwgInNldGVudiIsIDEpOworCisJLyogU2V0IFBVVEVOViAqLworCXB1dGVudigiUFVURU5WPXB1dGVudiIpOworCisJLyogUHJpbnQgdGhlIHJlc3VsdHMuLi4gKi8KKwlwcmludGYoIlNFVEVOViA9ICVzXG4iLCBnZXRlbnYoIlNFVEVOViIpKTsKKwlwcmludGYoIlBVVEVOViA9ICVzXG4iLCBnZXRlbnYoIlBVVEVOViIpKTsKKworCS8qIE92ZXJyaWRlIHRlc3RzICovCisJc2V0ZW52KCJTRVRFTlYiLCAic2V0ZW52X2dvb2QiLCAxKTsKKwlwdXRlbnYoIlBVVEVOVj1wdXRlbnZfZ29vZCIpOworCXByaW50ZigiU0VURU5WID0gJXNcbiIsIGdldGVudigiU0VURU5WIikpOworCXByaW50ZigiUFVURU5WID0gJXNcbiIsIGdldGVudigiUFVURU5WIikpOworCisJLyogTm9uLW92ZXJyaWRlIHRlc3QgKi8KKwlzZXRlbnYoIlNFVEVOViIsICJzZXRlbnZfYmFkIiwgMCk7CisJc2V0ZW52KCJORVdFTlYiLCAibmV3ZW52X2dvb2QiLCAwKTsKKwlwcmludGYoIlNFVEVOViA9ICVzXG4iLCBnZXRlbnYoIlNFVEVOViIpKTsKKwlwcmludGYoIk5FV0VOViA9ICVzXG4iLCBnZXRlbnYoIk5FV0VOViIpKTsKKworCS8qIFVuZGVmIHRlc3QgKi8KKwl1bnNldGVudigiU0VURU5WIik7CisJdW5zZXRlbnYoIk5FV0VOViIpOworCXByaW50ZigiU0VURU5WID0gJXNcbiIsIGdldGVudigiU0VURU5WIikpOworCXByaW50ZigiTkVXRU5WID0gJXNcbiIsIGdldGVudigiTkVXRU5WIikpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvc2V0am1wdGVzdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL3NldGptcHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM0ZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3NldGptcHRlc3QuYwpAQCAtMCwwICsxLDM4IEBACisvKgorICogc2V0am1wdGVzdC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisKK3N0YXRpYyBqbXBfYnVmIGJ1ZjsKKwordm9pZCBkb19zdHVmZihpbnQgdikKK3sKKwlwcmludGYoImNhbGxpbmcgbG9uZ2ptcCB3aXRoICVkLi4uICIsIHYgKyAxKTsKKwlsb25nam1wKGJ1ZiwgdiArIDEpOworfQorCit2b2lkIHJlY3Vyc2UoaW50IGN0ciwgaW50IHYpCit7CisJaWYgKGN0ci0tKSB7CisJCXJlY3Vyc2UoY3RyLCB2KTsKKwl9IGVsc2UgeworCQlkb19zdHVmZih2KTsKKwl9CisKKwlwcmludGYoIkVSUk9SIVxuIik7CS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLiAqLworfQorCitpbnQgbWFpbih2b2lkKQoreworCWludCB2OworCisJdiA9IHNldGptcChidWYpOworCXByaW50Zigic2V0am1wIHJldHVybmVkICVkXG4iLCB2KTsKKworCWlmICh2IDwgMjU2KQorCQlyZWN1cnNlKHYsIHYpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvc2lnaW50LmMgYi91c3Iva2xpYmMvdGVzdHMvc2lnaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExYWUxZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9zaWdpbnQuYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworc3RhdGljIHNpZ19hdG9taWNfdCBjb3VudGVyID0gMDsKKworc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZ251bSkKK3sKKwlzdGF0aWMgY2hhciBtc2dbXSA9ICJTaWduYWwgaGFuZGxlclxuIjsKKworCSh2b2lkKXNpZ251bTsKKworCXdyaXRlKDEsIG1zZywgc2l6ZW9mIG1zZyAtIDEpOworCWNvdW50ZXIrKzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdCwgb2FjdDsKKwlwaWRfdCBmOworCXNpZ3NldF90IHNldDsKKworCSh2b2lkKWFyZ2M7CisKKwltZW1zZXQoJmFjdCwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzaWdhY3Rpb24pKTsKKwlhY3Quc2FfaGFuZGxlciA9IHNpZ19oYW5kbGVyOworCXNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7CisJYWN0LnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKworCS8qIG9hY3QgaXMgdGhlcmUgZm9yIHRoZSBiZW5lZml0IG9mIHN0cmFjZSgpICovCisJc2lnYWN0aW9uKFNJR0lOVCwgJmFjdCwgJm9hY3QpOworCXNpZ2FjdGlvbihTSUdURVJNLCAmYWN0LCAmb2FjdCk7CisKKwlzaWdlbXB0eXNldCgmc2V0KTsKKwlzaWdhZGRzZXQoJnNldCwgU0lHSU5UKTsKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzZXQsIE5VTEwpOworCisJZiA9IGZvcmsoKTsKKworCWlmIChmIDwgMCkgeworCQlwZXJyb3IoYXJndlswXSk7CisJCWV4aXQoMjU1KTsKKwl9IGVsc2UgaWYgKGYgPiAwKSB7CisJCXNsZWVwKDMpOworCQlpZiAoY291bnRlcikgeworCQkJZnByaW50ZihzdGRlcnIsICJTaWduYWwgcmVjZWl2ZWQgd2hpbGUgbWFza2VkIVxuIik7CisJCQlleGl0KDEpOworCQl9CisJCXNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAmc2V0LCBOVUxMKTsKKwkJc2xlZXAoMyk7CisJCWlmICghY291bnRlcikgeworCQkJZnByaW50ZihzdGRlcnIsICJObyBzaWduYWwgcmVjZWl2ZWQhXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIlNpZ25hbCByZWNlaXZlZCBPS1xuIik7CisJCQlleGl0KDApOworCQl9CisJfSBlbHNlIHsKKwkJc2xlZXAoMSk7CisJCWtpbGwoZ2V0cHBpZCgpLCBTSUdJTlQpOworCQlfZXhpdCgwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvc3RhdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDIyM2NmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3N0YXQuYwpAQCAtMCwwICsxLDYzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitzdGF0aWMgdm9pZCBkb19zdGF0KGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RhdChwYXRoLCAmc3QpKSB7CisJCXBlcnJvcihwYXRoKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwcmludGYoIlBhdGggPSAlc1xuIgorCSAgICAgICAiICAgc3RfZGV2ICAgICAgID0gJSNqeCAoJXUsJXUpXG4iCisJICAgICAgICIgICBzdF9pbm8gICAgICAgPSAlanVcbiIKKwkgICAgICAgIiAgIHN0X21vZGUgICAgICA9ICUjam9cbiIKKwkgICAgICAgIiAgIHN0X25saW5rICAgICA9ICVqdVxuIgorCSAgICAgICAiICAgc3RfdWlkICAgICAgID0gJWp1XG4iCisJICAgICAgICIgICBzdF9naWQgICAgICAgPSAlanVcbiIKKwkgICAgICAgIiAgIHN0X3JkZXYgICAgICA9ICUjanggKCV1LCV1KVxuIgorCSAgICAgICAiICAgc3Rfc2l6ZSAgICAgID0gJWp1XG4iCisJICAgICAgICIgICBzdF9ibGtzaXplICAgPSAlanVcbiIKKwkgICAgICAgIiAgIHN0X2Jsb2NrcyAgICA9ICVqdVxuIiwKKwkgICAgICAgcGF0aCwKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfZGV2LCBtYWpvcihzdC5zdF9kZXYpLCBtaW5vcihzdC5zdF9kZXYpLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9pbm8sCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X21vZGUsCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X25saW5rLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF91aWQsCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X2dpZCwKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfcmRldiwgbWFqb3Ioc3Quc3RfcmRldiksIG1pbm9yKHN0LnN0X3JkZXYpLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9zaXplLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9ibGtzaXplLCAodWludG1heF90KSBzdC5zdF9ibG9ja3MpOworCisjaWZkZWYgX1NUQVRCVUZfU1RfTlNFQworCXByaW50ZigiICAgc3RfYXRpbSAgICAgID0gJWpkLiUwOXVcbiIKKwkgICAgICAgIiAgIHN0Lm10aW0gICAgICA9ICVqZC4lMDl1XG4iCisJICAgICAgICIgICBzdC5jdGltICAgICAgPSAlamQuJTA5dVxuIiwKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfYXRpbS50dl9zZWMsICh1bnNpZ25lZCBpbnQpc3Quc3RfYXRpbS50dl9uc2VjLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9tdGltLnR2X3NlYywgKHVuc2lnbmVkIGludClzdC5zdF9tdGltLnR2X25zZWMsCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X2N0aW0udHZfc2VjLCAodW5zaWduZWQgaW50KXN0LnN0X2N0aW0udHZfbnNlYyk7CisjZWxzZQorCXByaW50ZigiICAgc3RfYXRpbWUgICAgID0gJWpkXG4iCisJICAgICAgICIgICBzdC5tdGltZSAgICAgPSAlamRcbiIKKwkgICAgICAgIiAgIHN0LmN0aW1lICAgICA9ICVqZFxuIiwKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfYXRpbWUsCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X210aW1lLCAodWludG1heF90KSBzdC5zdF9jdGltZSk7CisjZW5kaWYKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisJCWRvX3N0YXQoYXJndltpXSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zdGF0ZnMuYyBiL3Vzci9rbGliYy90ZXN0cy9zdGF0ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Y5OWYxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3N0YXRmcy5jCkBAIC0wLDAgKzEsNDIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCitzdGF0aWMgdm9pZCBkb19zdGF0ZnMoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdGZzIHNmczsKKworCWlmIChzdGF0ZnMocGF0aCwgJnNmcykpIHsKKwkJcGVycm9yKHBhdGgpOworCQlleGl0KDEpOworCX0KKworCXByaW50ZigiUGF0aCA9ICVzXG4iCisJICAgICAgICIgICBmX3R5cGUgICAgID0gJSNqeFxuIgorCSAgICAgICAiICAgZl9ic2l6ZSAgICA9ICVqZFxuIgorCSAgICAgICAiICAgZl9ibG9ja3MgICA9ICVqZFxuIgorCSAgICAgICAiICAgZl9iZnJlZSAgICA9ICVqZFxuIgorCSAgICAgICAiICAgZl9iYXZhaWwgICA9ICVqZFxuIgorCSAgICAgICAiICAgZl9maWxlcyAgICA9ICVqZFxuIgorCSAgICAgICAiICAgZl9mZnJlZSAgICA9ICVqZFxuIgorCSAgICAgICAiICAgZl9uYW1lbGVuICA9ICVqZFxuIiwKKwkgICAgICAgcGF0aCwKKwkgICAgICAgKHVpbnRtYXhfdCkgc2ZzLmZfdHlwZSwKKwkgICAgICAgKGludG1heF90KSBzZnMuZl9ic2l6ZSwKKwkgICAgICAgKGludG1heF90KSBzZnMuZl9ibG9ja3MsCisJICAgICAgIChpbnRtYXhfdCkgc2ZzLmZfYmZyZWUsCisJICAgICAgIChpbnRtYXhfdCkgc2ZzLmZfYmF2YWlsLAorCSAgICAgICAoaW50bWF4X3QpIHNmcy5mX2ZpbGVzLAorCSAgICAgICAoaW50bWF4X3QpIHNmcy5mX2ZmcmVlLCAoaW50bWF4X3QpIHNmcy5mX25hbWVsZW4pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJZG9fc3RhdGZzKGFyZ3ZbaV0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvc3RybGNweWNhdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL3N0cmxjcHljYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRmMGNkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3N0cmxjcHljYXQuYwpAQCAtMCwwICsxLDExMSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJY2hhciB0ZW1wWzhdOworCXNpemVfdCBsZW47CisKKwlwcmludGYoInN0cmxjcHk6XG4iKTsKKwlsZW4gPSBzdHJsY3B5KHRlbXAsICIxMjMiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIjEyMyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlsZW4gPSBzdHJsY3B5KHRlbXAsICIiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIiIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlsZW4gPSBzdHJsY3B5KHRlbXAsICIxMjM0NTY3ODkwIiwgc2l6ZW9mKHRlbXApKTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICIxMjM0NTY3IikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWxlbiA9IHN0cmxjcHkodGVtcCwgIjEyMyIsIDEpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIiIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlsZW4gPSBzdHJsY3B5KHRlbXAsICIxMjM0NTY3ODkwIiwgMSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWxlbiA9IHN0cmxjcHkodGVtcCwgIjEyMyIsIDApOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIiIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlsZW4gPSBzdHJsY3B5KHRlbXAsICIxMjM0NTY3ODkwIiwgMCk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWxlbiA9IHN0cmxjcHkodGVtcCwgIjEyMzQ1NjciLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIjEyMzQ1NjciKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJbGVuID0gc3RybGNweSh0ZW1wLCAiMTIzNDU2NzgiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIjEyMzQ1NjciKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJcHJpbnRmKCJcbiIpOworCXByaW50Zigic3RybGNhdDpcbiIpOworCXN0cmNweSh0ZW1wLCAiIik7CisJbGVuID0gc3RybGNhdCh0ZW1wLCAiMTIzIiwgc2l6ZW9mKHRlbXApKTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICIxMjMiKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJc3RyY3B5KHRlbXAsICJBQkMiKTsKKwlsZW4gPSBzdHJsY2F0KHRlbXAsICIiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIkFCQyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdHJjcHkodGVtcCwgIiIpOworCWxlbiA9IHN0cmxjYXQodGVtcCwgIiIsIHNpemVvZih0ZW1wKSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweSh0ZW1wLCAiQUJDIik7CisJbGVuID0gc3RybGNhdCh0ZW1wLCAiMTIzIiwgc2l6ZW9mKHRlbXApKTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICJBQkMxMjMiKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJc3RyY3B5KHRlbXAsICJBQkMiKTsKKwlsZW4gPSBzdHJsY2F0KHRlbXAsICIxMjM0NTY3ODkwIiwgc2l6ZW9mKHRlbXApKTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICJBQkMxMjM0IikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweSh0ZW1wLCAiQUJDIik7CisJbGVuID0gc3RybGNhdCh0ZW1wLCAiMTIzIiwgNSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiQUJDMSIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdHJjcHkodGVtcCwgIkFCQyIpOworCWxlbiA9IHN0cmxjYXQodGVtcCwgIjEyMyIsIDEpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIkFCQyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdHJjcHkodGVtcCwgIkFCQyIpOworCWxlbiA9IHN0cmxjYXQodGVtcCwgIjEyMyIsIDApOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIkFCQyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlleGl0KDApOworZXJyb3I6CisJcHJpbnRmKCJ1bmV4cGVjdGVkIHJlc3VsdFxuIik7CisJZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zdHJ0b2ltYXguYyBiL3Vzci9rbGliYy90ZXN0cy9zdHJ0b2ltYXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThmMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3N0cnRvaW1heC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBzdHJ0b2ltYXh0ZXN0LmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpOworCWNoYXIgKmVwOworCWludG1heF90IGl2OworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpdiA9IHN0cnRvaW1heChhcmd2W2ldLCAmZXAsIDApOworCQlwcmludGYoInN0cnRvaW1heChcIiVzXCIpID0gJWpkXG4iLCBhcmd2W2ldLCBpdik7CisJCWlmICgqZXApCisJCQlwcmludGYoIiAgIGVwID0gXCIlc1wiXG4iLCBlcCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvc3RydG90aW1lLmMgYi91c3Iva2xpYmMvdGVzdHMvc3RydG90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMmUwZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9zdHJ0b3RpbWUuYwpAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWludCBpOworCWNvbnN0IGNoYXIgKnJ2LCAqcnM7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCXJzID0gc3RydG90aW1lc3BlYyhhcmd2W2ldLCAmdHMpOworCQlydiA9IHN0cnRvdGltZXZhbChhcmd2W2ldLCAmdHYpOworCQlwcmludGYoIlN0cmluZzogICBcIiVzXCJcbiIKKwkJICAgICAgICJUaW1lc3BlYzogJWxkLiUwOWxkXG4iCisJCSAgICAgICAiUmVzaWR1YWw6IFwiJXNcIlxuIgorCQkgICAgICAgIlRpbWV2YWw6ICAlbGQuJTA2bGRcbiIKKwkJICAgICAgICJSZXNpZHVhbDogXCIlc1wiXG4iLAorCQkgICAgICAgYXJndltpXSwKKwkJICAgICAgIChsb25nKXRzLnR2X3NlYywgKGxvbmcpdHMudHZfbnNlYywgcnMsCisJCSAgICAgICAobG9uZyl0di50dl9zZWMsIChsb25nKXR2LnR2X3VzZWMsIHJ2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy90ZXN0cmFuZDQ4LmMgYi91c3Iva2xpYmMvdGVzdHMvdGVzdHJhbmQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODY4YzcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvdGVzdHJhbmQ0OC5jCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbih2b2lkKQoreworCXVuc2lnbmVkIHNob3J0IHNlZWQxW10gPSB7IDB4MTIzNCwgMHg1Njc4LCAweDlhYmMgfTsKKwl1bnNpZ25lZCBzaG9ydCAqb2xkc2VlZDsKKworCW9sZHNlZWQgPSBzZWVkNDgoc2VlZDEpOworCXByaW50ZigiSW5pdGlhbCBzZWVkOiAlIzA2eCAlIzA2eCAlIzA2eFxuIiwKKwkgICAgICAgb2xkc2VlZFswXSwgb2xkc2VlZFsxXSwgb2xkc2VlZFsyXSk7CisKKwlwcmludGYoImxyYW5kNDgoKSA9ICVsZFxuIiwgbHJhbmQ0OCgpKTsKKworCXNlZWQ0OChzZWVkMSk7CisJcHJpbnRmKCJtcmFuZDQ4KCkgPSAlbGRcbiIsIG1yYW5kNDgoKSk7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy90ZXN0dnNucC5jIGIvdXNyL2tsaWJjL3Rlc3RzL3Rlc3R2c25wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4YjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy90ZXN0dnNucC5jCkBAIC0wLDAgKzEsMTE5IEBACisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKwlpbnQgciwgaTsKKwljaGFyIGJ1ZmZlcls1MTJdOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICVkIiwgMzcpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJSdkIiwgMzczNzM3MzcpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJSd4IiwgMHhkZWFkYmVlZik7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyNYIiwgMHhkZWFkYmVlZik7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyNsbG8iLCAwMTIzNDU2NzAxMjM0NTY3VUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJLyogTWFrZSBzdXJlIG92ZXJmbG93IHdvcmtzIGNvcnJlY3RseSAqLworCW1lbXNldChidWZmZXIsICdceGZmJywgNTEyKTsKKwlyID0gc25wcmludGYoYnVmZmVyLCAxNiwgIkhlbGxvLCAlJyNsbG8iLCAwMTIzNDU2NzAxMjM0NTY3VUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCWZvciAoaSA9IDE2OyBpIDwgNTEyOyBpKyspCisJCWFzc2VydChidWZmZXJbaV0gPT0gJ1x4ZmYnKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyM0MC4yMGxsbyIsIDAxMjM0NTY3MDEyMzQ1NjdVTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJScjLTQwLjIwbGxvIiwgMDEyMzQ1NjcwMTIzNDU2N1VMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyMqLipsbG8iLCA0MCwgMjAsCisJCSAgICAgMDEyMzQ1NjcwMTIzNDU2N1VMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyMqLipsbG8iLCAtNDAsIDIwLAorCQkgICAgIDAxMjM0NTY3MDEyMzQ1NjdVTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJScjKi4qbGxvIiwgLTQwLCAtMjAsCisJCSAgICAgMDEyMzQ1NjcwMTIzNDU2N1VMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyMqLipsbHgiLCAtNDAsIC0yMCwKKwkJICAgICAwMTIzNDU2NzAxMjM0NTY3VUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICVwIiwgJmJ1ZmZlcik7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlUCIsICZidWZmZXIpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJTIwcCIsICZidWZmZXIpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJS0yMHAiLCAmYnVmZmVyKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICUtMjBwIiwgTlVMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDIwLCAiSGVsbG8sICUnLTIwcCIsIE5VTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCAxNSwgIkhlbGxvLCAlJy0yMHAiLCBOVUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgMywgIkhlbGxvLCAlJy0yMHAiLCBOVUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJLyogVGhpcyBzaG91bGRuJ3QgY2hhbmdlIGJ1ZmZlciBpbiBhbnkgd2F5ISAqLworCXIgPSBzbnByaW50ZihidWZmZXIsIDAsICJIZWxsbywgJSctMjBwIiwgTlVMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCWZvciAoaSA9IC0zMDsgaSA8PSAzMDsgaSsrKSB7CisJCXIgPSBzbnByaW50ZihidWZmZXIsIDQwLCAiSGVsbG8sICUnKnAiLCBpLCBOVUxMKTsKKwkJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLAorCQkgICAgICAgcik7CisJfQorCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJSctMjBzIiwgIlN0cmluZyIpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA0MCwgIkhlbGxvLCAlJzIwcyIsICJTdHJpbmciKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJScwMjBzIiwgIlN0cmluZyIpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA0MCwgIkhlbGxvLCAlJy0yMHMiLCBOVUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJScyMHMiLCBOVUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJScwMjBzIiwgTlVMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDQwLCAiSGVsbG8sICUnLTIwYyIsICcqJyk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDQwLCAiSGVsbG8sICUnMjBjIiwgJyonKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJScwMjBjIiwgJyonKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvdmZvcmsuYyBiL3Vzci9rbGliYy90ZXN0cy92Zm9yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGMwMzYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvdmZvcmsuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogdXNyL2tsaWJjL3Rlc3RzL3Zmb3JrLmMKKyAqCisgKiB2Zm9yayBpcyBtZXNzeSBvbiBtb3N0IGFyY2hpdGVjdHVyZXMuICBEbyBvdXIgYmVzdCB0byB0ZXN0IGl0IG91dC4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJcGlkX3QgZiwgcnY7CisJaW50IHN0YXR1czsKKworCWYgPSB2Zm9yaygpOworCisJaWYgKGYgPT0gMCkgeworCQlwcmludGYoIkNoaWxkICglZCkuLi5cbiIsIChpbnQpZ2V0cGlkKCkpOworCQlfZXhpdCgxMjMpOworCX0gZWxzZSBpZiAoZiA+IDApIHsKKwkJaW50IGVyciA9IDA7CisKKwkJcHJpbnRmKCJQYXJlbnQgKGNoaWxkID0gJWQpXG4iLCAoaW50KWYpOworCisJCXJ2ID0gd2FpdHBpZChmLCAmc3RhdHVzLCAwKTsKKwkJaWYgKHJ2ICE9IGYpIHsKKwkJCXByaW50Zigid2FpdHBpZCByZXR1cm5lZCAlZCwgZXJybm8gPSAlZFxuIiwKKwkJCSAgICAgICAoaW50KXJ2LCBlcnJubyk7CisJCQllcnIrKzsKKwkJfQorCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMTIzKSB7CisJCQlwcmludGYoIkNoaWxkIHByb2Nlc3MgZXhpc3RlZCB3aXRoIHdyb25nIHN0YXR1cyAlZFxuIiwKKwkJCSAgICAgICBzdGF0dXMpOworCQkJZXJyKys7CisJCX0KKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlwcmludGYoInZmb3JrIHJldHVybmVkICVkLCBlcnJubyA9ICVkXG4iLAorCQkgICAgICAgKGludClmLCBlcnJubyk7CisJCXJldHVybiAxMjc7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3RpbWUuYyBiL3Vzci9rbGliYy90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjMzY2YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90aW1lLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIHRpbWUuYworICovCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWZuZGVmIF9fTlJfdGltZQorCit0aW1lX3QgdGltZSh0aW1lX3QgKiB0KQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKwlpZiAodCkKKwkJKnQgPSAodGltZV90KSB0di50dl9zZWM7CisKKwlyZXR1cm4gKHRpbWVfdCkgdHYudHZfc2VjOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy91bW91bnQuYyBiL3Vzci9rbGliYy91bW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFhMzAwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Vtb3VudC5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiB1bW91bnQuYworICoKKyAqIFNpbmdsZS1hcmd1bWVudCBmb3JtIG9mIHVtb3VudAorICovCisKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKworaW50IHVtb3VudChjb25zdCBjaGFyICpkaXIpCit7CisJcmV0dXJuIHVtb3VudDIoZGlyLCAwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy91bnNldGVudi5jIGIvdXNyL2tsaWJjL3Vuc2V0ZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjYzk1YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy91bnNldGVudi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiB1bnNldGVudi5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZW52LmgiCisKK2ludCB1bnNldGVudihjb25zdCBjaGFyICpuYW1lKQoreworCXNpemVfdCBsZW47CisJY2hhciAqKnAsICpxOworCWNvbnN0IGNoYXIgKno7CisKKwlpZiAoIW5hbWUgfHwgIW5hbWVbMF0pIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gPSAwOworCWZvciAoeiA9IG5hbWU7ICp6OyB6KyspIHsKKwkJbGVuKys7CisJCWlmICgqeiA9PSAnPScpIHsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKCFlbnZpcm9uKQorCQlyZXR1cm4gMDsKKworCWZvciAocCA9IGVudmlyb247IChxID0gKnApOyBwKyspIHsKKwkJaWYgKCFzdHJuY21wKG5hbWUsIHEsIGxlbikgJiYgcVtsZW5dID09ICc9JykKKwkJCWJyZWFrOworCX0KKworCWZvciAoOyAocSA9ICpwKTsgcCsrKSB7CisJCXBbMF0gPSBwWzFdOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3VzZXJkYi9nZXRncmdpZC5jIGIvdXNyL2tsaWJjL3VzZXJkYi9nZXRncmdpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTNhNDcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNlcmRiL2dldGdyZ2lkLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGdldGdyZ2lkLmMKKyAqCisgKiBEdW1teSBnZXRncmdpZCgpIHRvIHN1cHBvcnQgdWRldgorICovCisKKyNpbmNsdWRlICJ1c2VyZGIuaCIKKworc3RydWN0IGdyb3VwICpnZXRncmdpZChnaWRfdCBnaWQpCit7CisJaWYgKCFnaWQpCisJCXJldHVybiAoc3RydWN0IGdyb3VwICopJl9fcm9vdF9ncm91cDsKKworCWVycm5vID0gRU5PRU5UOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3VzZXJkYi9nZXRncm5hbS5jIGIvdXNyL2tsaWJjL3VzZXJkYi9nZXRncm5hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjdiOGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNlcmRiL2dldGdybmFtLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGdldGdybmFtLmMKKyAqCisgKiBEdW1teSBnZXRncm5hbSgpIHRvIHN1cHBvcnQgdWRldgorICovCisKKyNpbmNsdWRlICJ1c2VyZGIuaCIKKworc3RydWN0IGdyb3VwICpnZXRncm5hbShjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghc3RyY21wKG5hbWUsICJyb290IikpCisJCXJldHVybiAoc3RydWN0IGdyb3VwICopJl9fcm9vdF9ncm91cDsKKworCWVycm5vID0gRU5PRU5UOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3VzZXJkYi9nZXRwd25hbS5jIGIvdXNyL2tsaWJjL3VzZXJkYi9nZXRwd25hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMTM1OWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNlcmRiL2dldHB3bmFtLmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGdldHB3bmFtLmMKKyAqCisgKiBEdW1teSBnZXRwd25hbSgpIHRvIHN1cHBvcnQgdWRldgorICovCisKKyNpbmNsdWRlICJ1c2VyZGIuaCIKKworCitzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbShjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghc3RyY21wKG5hbWUsICJyb290IikpCisJCXJldHVybiAoc3RydWN0IHBhc3N3ZCAqKSZfX3Jvb3RfdXNlcjsKKworCWVycm5vID0gRU5PRU5UOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3VzZXJkYi9nZXRwd3VpZC5jIGIvdXNyL2tsaWJjL3VzZXJkYi9nZXRwd3VpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjRmMjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNlcmRiL2dldHB3dWlkLmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGdldHB3dWlkLmMKKyAqCisgKiBEdW1teSBnZXRwd3VpZCgpIHRvIHN1cHBvcnQgdWRldgorICovCisKKyNpbmNsdWRlICJ1c2VyZGIuaCIKKworCitzdHJ1Y3QgcGFzc3dkICpnZXRwd3VpZCh1aWRfdCB1aWQpCit7CisJaWYgKCF1aWQpCisJCXJldHVybiAoc3RydWN0IHBhc3N3ZCAqKSZfX3Jvb3RfdXNlcjsKKworCWVycm5vID0gRU5PRU5UOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3VzZXJkYi9yb290X2dyb3VwLmMgYi91c3Iva2xpYmMvdXNlcmRiL3Jvb3RfZ3JvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM2ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3VzZXJkYi9yb290X2dyb3VwLmMKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIHJvb3RfZ3JvdXAuYworICovCisKKyNpbmNsdWRlICJ1c2VyZGIuaCIKKworY29uc3Qgc3RydWN0IGdyb3VwIF9fcm9vdF9ncm91cCA9IHsKKwkuZ3JfbmFtZSAgID0gInJvb3QiLAorCS5ncl9wYXNzd2QgPSAiIiwKKwkuZ3JfZ2lkICAgID0gMCwKKwkuZ3JfbWVtICAgID0gTlVMTAorfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy91c2VyZGIvcm9vdF91c2VyLmMgYi91c3Iva2xpYmMvdXNlcmRiL3Jvb3RfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMmU5OWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNlcmRiL3Jvb3RfdXNlci5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiByb290X3VzZXIuYworICoKKyAqLworCisjaW5jbHVkZSAidXNlcmRiLmgiCisjaW5jbHVkZSA8cGF0aHMuaD4KKworY29uc3Qgc3RydWN0IHBhc3N3ZCBfX3Jvb3RfdXNlciA9IHsKKwkucHdfbmFtZSAgICA9ICJyb290IiwKKwkucHdfcGFzc3dkICA9ICIiLAorCS5wd191aWQgICAgID0gMCwKKwkucHdfZ2lkICAgICA9IDAsCisJLnB3X2dlY29zICAgPSAicm9vdCIsCisJLnB3X2RpciAgICAgPSAiLyIsCisJLnB3X3NoZWxsICAgPSBfUEFUSF9CU0hFTEwKK307CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdXNlcmRiL3VzZXJkYi5oIGIvdXNyL2tsaWJjL3VzZXJkYi91c2VyZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGEwOTNmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3VzZXJkYi91c2VyZGIuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogdXNlcmRiLmgKKyAqCisgKiBDb21tb24gaGVhZGVyIGZpbGUKKyAqLworCisjaWZuZGVmIFVTRVJEQl9ICisjZGVmaW5lIFVTRVJEQl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitleHRlcm4gY29uc3Qgc3RydWN0IHBhc3N3ZCBfX3Jvb3RfdXNlcjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZ3JvdXAgX19yb290X2dyb3VwOworCisjZW5kaWYgLyogVVNFUkRCX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy91c2xlZXAuYyBiL3Vzci9rbGliYy91c2xlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2JmYWJlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3VzbGVlcC5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiB1c2xlZXAuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKwordm9pZCB1c2xlZXAodW5zaWduZWQgbG9uZyB1c2VjKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCXRzLnR2X3NlYyA9IHVzZWMgLyAxMDAwMDAwVUw7CisJdHMudHZfbnNlYyA9ICh1c2VjICUgMTAwMDAwMFVMKSAqIDEwMDA7CisJd2hpbGUgKG5hbm9zbGVlcCgmdHMsICZ0cykgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy91dGltZS5jIGIvdXNyL2tsaWJjL3V0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4ZjUwYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy91dGltZS5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiB1dGltZS5jCisgKi8KKworI2luY2x1ZGUgPHV0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWZuZGVmIF9fTlJfdXRpbWUKKworaW50IHV0aW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBzdHJ1Y3QgdXRpbWJ1ZiAqYnVmKQoreworCXN0cnVjdCB0aW1ldmFsIHR2cFsyXTsKKworCXR2cFswXS50dl9zZWMgPSBidWYtPmFjdGltZTsKKwl0dnBbMF0udHZfdXNlYyA9IDA7CisJdHZwWzFdLnR2X3NlYyA9IGJ1Zi0+bW9kdGltZTsKKwl0dnBbMV0udHZfdXNlYyA9IDA7CisKKwlyZXR1cm4gdXRpbWVzKGZpbGVuYW1lLCB0dnApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy92YXNwcmludGYuYyBiL3Vzci9rbGliYy92YXNwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGMzMDJmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Zhc3ByaW50Zi5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiB2YXNwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgdmFzcHJpbnRmKGNoYXIgKipidWZwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJdmFfbGlzdCBhcDE7CisJaW50IGJ5dGVzOworCWNoYXIgKnA7CisKKwl2YV9jb3B5KGFwMSwgYXApOworCisJYnl0ZXMgPSB2c25wcmludGYoTlVMTCwgMCwgZm9ybWF0LCBhcDEpICsgMTsKKwl2YV9lbmQoYXAxKTsKKworCSpidWZwID0gcCA9IG1hbGxvYyhieXRlcyk7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gdnNucHJpbnRmKHAsIGJ5dGVzLCBmb3JtYXQsIGFwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy92ZXJzaW9uIGIvdXNyL2tsaWJjL3ZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzOWM2MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy92ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKzEuNQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Zmb3JrLmMgYi91c3Iva2xpYmMvdmZvcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIxYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Zmb3JrLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIHZmb3JrLmMKKyAqCisgKiBFbXVsYXRlIHZmb3JrKCkgd2l0aCBmb3JrKCkgaWYgbmVjZXNzYXJ5CisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CisKKyNpZiAhX0tMSUJDX05PX01NVSAmJiAhX0tMSUJDX1JFQUxfVkZPUksKK2ludCB2Zm9yayh2b2lkKQoreworCXJldHVybiBmb3JrKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy92ZnByaW50Zi5jIGIvdXNyL2tsaWJjL3ZmcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1NjYzYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy92ZnByaW50Zi5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiB2ZnByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgQlVGRkVSX1NJWkUJMzI3NjgKKworaW50IHZmcHJpbnRmKEZJTEUgKiBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJaW50IHJ2OworCWNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKKworCXJ2ID0gdnNucHJpbnRmKGJ1ZmZlciwgQlVGRkVSX1NJWkUsIGZvcm1hdCwgYXApOworCisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIHJ2OworCisJaWYgKHJ2ID4gQlVGRkVSX1NJWkUgLSAxKQorCQlydiA9IEJVRkZFUl9TSVpFIC0gMTsKKworCXJldHVybiBfZndyaXRlKGJ1ZmZlciwgcnYsIGZpbGUpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3ZwcmludGYuYyBiL3Vzci9rbGliYy92cHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiZmVhZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy92cHJpbnRmLmMKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIHZwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgdnByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJcmV0dXJuIHZmcHJpbnRmKHN0ZG91dCwgZm9ybWF0LCBhcCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdnNucHJpbnRmLmMgYi91c3Iva2xpYmMvdnNucHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiZTcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy92c25wcmludGYuYwpAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIHZzbnByaW50Zi5jCisgKgorICogdnNucHJpbnRmKCksIGZyb20gd2hpY2ggdGhlIHJlc3Qgb2YgdGhlIHByaW50ZigpCisgKiBmYW1pbHkgaXMgYnVpbHQKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitlbnVtIGZsYWdzIHsKKwlGTF9aRVJPCQk9IDB4MDEsCS8qIFplcm8gbW9kaWZpZXIgKi8KKwlGTF9NSU5VUwk9IDB4MDIsCS8qIE1pbnVzIG1vZGlmaWVyICovCisJRkxfUExVUwkJPSAweDA0LAkvKiBQbHVzIG1vZGlmaWVyICovCisJRkxfVElDSwkJPSAweDA4LAkvKiAnIG1vZGlmaWVyICovCisJRkxfU1BBQ0UJPSAweDEwLAkvKiBTcGFjZSBtb2RpZmllciAqLworCUZMX0hBU0gJCT0gMHgyMCwJLyogIyBtb2RpZmllciAqLworCUZMX1NJR05FRAk9IDB4NDAsCS8qIE51bWJlciBpcyBzaWduZWQgKi8KKwlGTF9VUFBFUgk9IDB4ODAJLyogVXBwZXIgY2FzZSBkaWdpdHMgKi8KK307CisKKy8qIFRoZXNlIG1heSBoYXZlIHRvIGJlIGFkanVzdGVkIG9uIGNlcnRhaW4gaW1wbGVtZW50YXRpb25zICovCitlbnVtIHJhbmtzIHsKKwlyYW5rX2NoYXIJPSAtMiwKKwlyYW5rX3Nob3J0CT0gLTEsCisJcmFua19pbnQJPSAgMCwKKwlyYW5rX2xvbmcJPSAgMSwKKwlyYW5rX2xvbmdsb25nCT0gIDIKK307CisKKyNkZWZpbmUgTUlOX1JBTksJcmFua19jaGFyCisjZGVmaW5lIE1BWF9SQU5LCXJhbmtfbG9uZ2xvbmcKKworI2RlZmluZSBJTlRNQVhfUkFOSwlyYW5rX2xvbmdsb25nCisjZGVmaW5lIFNJWkVfVF9SQU5LCXJhbmtfbG9uZworI2RlZmluZSBQVFJESUZGX1RfUkFOSwlyYW5rX2xvbmcKKworI2RlZmluZSBFTUlUKHgpICh7IGlmIChvPG4peypxKysgPSAoeCk7fSBvKys7IH0pCisKK3N0YXRpYyBzaXplX3QKK2Zvcm1hdF9pbnQoY2hhciAqcSwgc2l6ZV90IG4sIHVpbnRtYXhfdCB2YWwsIGVudW0gZmxhZ3MgZmxhZ3MsCisJICAgaW50IGJhc2UsIGludCB3aWR0aCwgaW50IHByZWMpCit7CisJY2hhciAqcXE7CisJc2l6ZV90IG8gPSAwLCBvbzsKKwlzdGF0aWMgY29uc3QgY2hhciBsY2RpZ2l0c1tdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXN0YXRpYyBjb25zdCBjaGFyIHVjZGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisJY29uc3QgY2hhciAqZGlnaXRzOworCXVpbnRtYXhfdCB0bXB2YWw7CisJaW50IG1pbnVzID0gMDsKKwlpbnQgbmRpZ2l0cyA9IDAsIG5jaGFyczsKKwlpbnQgdGlja3NraXAsIGI0dGljazsKKworCS8qIFNlbGVjdCB0eXBlIG9mIGRpZ2l0cyAqLworCWRpZ2l0cyA9IChmbGFncyAmIEZMX1VQUEVSKSA/IHVjZGlnaXRzIDogbGNkaWdpdHM7CisKKwkvKiBJZiBzaWduZWQsIHNlcGFyYXRlIG91dCB0aGUgbWludXMgKi8KKwlpZiAoZmxhZ3MgJiBGTF9TSUdORUQgJiYgKGludG1heF90KSB2YWwgPCAwKSB7CisJCW1pbnVzID0gMTsKKwkJdmFsID0gKHVpbnRtYXhfdCkgKC0oaW50bWF4X3QpIHZhbCk7CisJfQorCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBkaWdpdHMgbmVlZGVkLiAgVGhpcyByZXR1cm5zIHplcm8gZm9yIDAuICovCisJdG1wdmFsID0gdmFsOworCXdoaWxlICh0bXB2YWwpIHsKKwkJdG1wdmFsIC89IGJhc2U7CisJCW5kaWdpdHMrKzsKKwl9CisKKwkvKiBBZGp1c3QgbmRpZ2l0cyBmb3Igc2l6ZSBvZiBvdXRwdXQgKi8KKworCWlmIChmbGFncyAmIEZMX0hBU0ggJiYgYmFzZSA9PSA4KSB7CisJCWlmIChwcmVjIDwgbmRpZ2l0cyArIDEpCisJCQlwcmVjID0gbmRpZ2l0cyArIDE7CisJfQorCisJaWYgKG5kaWdpdHMgPCBwcmVjKSB7CisJCW5kaWdpdHMgPSBwcmVjOwkvKiBNYW5kYXRvcnkgbnVtYmVyIHBhZGRpbmcgKi8KKwl9IGVsc2UgaWYgKHZhbCA9PSAwKSB7CisJCW5kaWdpdHMgPSAxOwkvKiBaZXJvIHN0aWxsIHJlcXVpcmVzIHNwYWNlICovCisJfQorCisJLyogRm9yICcsIGZpZ3VyZSBvdXQgd2hhdCB0aGUgc2tpcCBzaG91bGQgYmUgKi8KKwlpZiAoZmxhZ3MgJiBGTF9USUNLKSB7CisJCXRpY2tza2lwID0gKGJhc2UgPT0gMTYpID8gNCA6IDM7CisJfSBlbHNlIHsKKwkJdGlja3NraXAgPSBuZGlnaXRzOwkvKiBObyB0aWNrIG1hcmtzICovCisJfQorCisJLyogVGljayBtYXJrcyBhcmVuJ3QgZGlnaXRzLCBidXQgZ2VuZXJhdGVkIGJ5IHRoZSBudW1iZXIgY29udmVydGVyICovCisJbmRpZ2l0cyArPSAobmRpZ2l0cyAtIDEpIC8gdGlja3NraXA7CisKKwkvKiBOb3cgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIG5vbmRpZ2l0cyAqLworCW5jaGFycyA9IG5kaWdpdHM7CisKKwlpZiAobWludXMgfHwgKGZsYWdzICYgKEZMX1BMVVMgfCBGTF9TUEFDRSkpKQorCQluY2hhcnMrKzsJLyogTmVlZCBzcGFjZSBmb3Igc2lnbiAqLworCWlmICgoZmxhZ3MgJiBGTF9IQVNIKSAmJiBiYXNlID09IDE2KSB7CisJCW5jaGFycyArPSAyOwkvKiBBZGQgMHggZm9yIGhleCAqLworCX0KKworCS8qIEVtaXQgZWFybHkgc3BhY2UgcGFkZGluZyAqLworCWlmICghKGZsYWdzICYgKEZMX01JTlVTIHwgRkxfWkVSTykpICYmIHdpZHRoID4gbmNoYXJzKSB7CisJCXdoaWxlICh3aWR0aCA+IG5jaGFycykgeworCQkJRU1JVCgnICcpOworCQkJd2lkdGgtLTsKKwkJfQorCX0KKworCS8qIEVtaXQgbm9uZGlnaXRzICovCisJaWYgKG1pbnVzKQorCQlFTUlUKCctJyk7CisJZWxzZSBpZiAoZmxhZ3MgJiBGTF9QTFVTKQorCQlFTUlUKCcrJyk7CisJZWxzZSBpZiAoZmxhZ3MgJiBGTF9TUEFDRSkKKwkJRU1JVCgnICcpOworCisJaWYgKChmbGFncyAmIEZMX0hBU0gpICYmIGJhc2UgPT0gMTYpIHsKKwkJRU1JVCgnMCcpOworCQlFTUlUKChmbGFncyAmIEZMX1VQUEVSKSA/ICdYJyA6ICd4Jyk7CisJfQorCisJLyogRW1pdCB6ZXJvIHBhZGRpbmcgKi8KKwlpZiAoKGZsYWdzICYgKEZMX01JTlVTIHwgRkxfWkVSTykpID09IEZMX1pFUk8gJiYgd2lkdGggPiBuZGlnaXRzKSB7CisJCXdoaWxlICh3aWR0aCA+IG5jaGFycykgeworCQkJRU1JVCgnMCcpOworCQkJd2lkdGgtLTsKKwkJfQorCX0KKworCS8qIEdlbmVyYXRlIHRoZSBudW1iZXIuICBUaGlzIGlzIGRvbmUgZnJvbSByaWdodCB0byBsZWZ0LiAqLworCXEgKz0gbmRpZ2l0czsJCS8qIEFkdmFuY2UgdGhlIHBvaW50ZXIgdG8gZW5kIG9mIG51bWJlciAqLworCW8gKz0gbmRpZ2l0czsKKwlxcSA9IHE7CisJb28gPSBvOwkJCS8qIFRlbXBvcmFyeSB2YWx1ZXMgKi8KKworCWI0dGljayA9IHRpY2tza2lwOworCXdoaWxlIChuZGlnaXRzID4gMCkgeworCQlpZiAoIWI0dGljay0tKSB7CisJCQlxcS0tOworCQkJb28tLTsKKwkJCW5kaWdpdHMtLTsKKwkJCWlmIChvbyA8IG4pCisJCQkJKnFxID0gJ18nOworCQkJYjR0aWNrID0gdGlja3NraXAgLSAxOworCQl9CisJCXFxLS07CisJCW9vLS07CisJCW5kaWdpdHMtLTsKKwkJaWYgKG9vIDwgbikKKwkJCSpxcSA9IGRpZ2l0c1t2YWwgJSBiYXNlXTsKKwkJdmFsIC89IGJhc2U7CisJfQorCisJLyogRW1pdCBsYXRlIHNwYWNlIHBhZGRpbmcgKi8KKwl3aGlsZSAoKGZsYWdzICYgRkxfTUlOVVMpICYmIHdpZHRoID4gbmNoYXJzKSB7CisJCUVNSVQoJyAnKTsKKwkJd2lkdGgtLTsKKwl9CisKKwlyZXR1cm4gbzsKK30KKworaW50IHZzbnByaW50ZihjaGFyICpidWZmZXIsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKKwljaGFyIGNoOworCWNoYXIgKnEgPSBidWZmZXI7CisJc2l6ZV90IG8gPSAwOwkJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgb3V0cHV0ICovCisJdWludG1heF90IHZhbCA9IDA7CisJaW50IHJhbmsgPSByYW5rX2ludDsJLyogRGVmYXVsdCByYW5rICovCisJaW50IHdpZHRoID0gMDsKKwlpbnQgcHJlYyA9IC0xOworCWludCBiYXNlOworCXNpemVfdCBzejsKKwllbnVtIGZsYWdzIGZsYWdzID0gMDsKKwllbnVtIHsKKwkJc3Rfbm9ybWFsLAkvKiBHcm91bmQgc3RhdGUgKi8KKwkJc3RfZmxhZ3MsCS8qIFNwZWNpYWwgZmxhZ3MgKi8KKwkJc3Rfd2lkdGgsCS8qIEZpZWxkIHdpZHRoICovCisJCXN0X3ByZWMsCS8qIEZpZWxkIHByZWNpc2lvbiAqLworCQlzdF9tb2RpZmllcnMJLyogTGVuZ3RoIG9yIGNvbnZlcnNpb24gbW9kaWZpZXJzICovCisJfSBzdGF0ZSA9IHN0X25vcm1hbDsKKwljb25zdCBjaGFyICpzYXJnOwkvKiAlcyBzdHJpbmcgYXJndW1lbnQgKi8KKwljaGFyIGNhcmc7CQkvKiAlYyBjaGFyIGFyZ3VtZW50ICovCisJaW50IHNsZW47CQkvKiBTdHJpbmcgbGVuZ3RoICovCisKKwl3aGlsZSAoKGNoID0gKnArKykpIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIHN0X25vcm1hbDoKKwkJCWlmIChjaCA9PSAnJScpIHsKKwkJCQlzdGF0ZSA9IHN0X2ZsYWdzOworCQkJCWZsYWdzID0gMDsKKwkJCQlyYW5rID0gcmFua19pbnQ7CisJCQkJd2lkdGggPSAwOworCQkJCXByZWMgPSAtMTsKKwkJCX0gZWxzZSB7CisJCQkJRU1JVChjaCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHN0X2ZsYWdzOgorCQkJc3dpdGNoIChjaCkgeworCQkJY2FzZSAnLSc6CisJCQkJZmxhZ3MgfD0gRkxfTUlOVVM7CisJCQkJYnJlYWs7CisJCQljYXNlICcrJzoKKwkJCQlmbGFncyB8PSBGTF9QTFVTOworCQkJCWJyZWFrOworCQkJY2FzZSAnXCcnOgorCQkJCWZsYWdzIHw9IEZMX1RJQ0s7CisJCQkJYnJlYWs7CisJCQljYXNlICcgJzoKKwkJCQlmbGFncyB8PSBGTF9TUEFDRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyMnOgorCQkJCWZsYWdzIHw9IEZMX0hBU0g7CisJCQkJYnJlYWs7CisJCQljYXNlICcwJzoKKwkJCQlmbGFncyB8PSBGTF9aRVJPOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzdGF0ZSA9IHN0X3dpZHRoOworCQkJCXAtLTsJLyogUHJvY2VzcyB0aGlzIGNoYXJhY3RlciBhZ2FpbiAqLworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBzdF93aWR0aDoKKwkJCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJCQkJd2lkdGggPSB3aWR0aCAqIDEwICsgKGNoIC0gJzAnKTsKKwkJCX0gZWxzZSBpZiAoY2ggPT0gJyonKSB7CisJCQkJd2lkdGggPSB2YV9hcmcoYXAsIGludCk7CisJCQkJaWYgKHdpZHRoIDwgMCkgeworCQkJCQl3aWR0aCA9IC13aWR0aDsKKwkJCQkJZmxhZ3MgfD0gRkxfTUlOVVM7CisJCQkJfQorCQkJfSBlbHNlIGlmIChjaCA9PSAnLicpIHsKKwkJCQlwcmVjID0gMDsJLyogUHJlY2lzaW9uIGdpdmVuICovCisJCQkJc3RhdGUgPSBzdF9wcmVjOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZSA9IHN0X21vZGlmaWVyczsKKwkJCQlwLS07CS8qIFByb2Nlc3MgdGhpcyBjaGFyYWN0ZXIgYWdhaW4gKi8KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Ugc3RfcHJlYzoKKwkJCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJCQkJcHJlYyA9IHByZWMgKiAxMCArIChjaCAtICcwJyk7CisJCQl9IGVsc2UgaWYgKGNoID09ICcqJykgeworCQkJCXByZWMgPSB2YV9hcmcoYXAsIGludCk7CisJCQkJaWYgKHByZWMgPCAwKQorCQkJCQlwcmVjID0gLTE7CisJCQl9IGVsc2UgeworCQkJCXN0YXRlID0gc3RfbW9kaWZpZXJzOworCQkJCXAtLTsJLyogUHJvY2VzcyB0aGlzIGNoYXJhY3RlciBhZ2FpbiAqLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBzdF9tb2RpZmllcnM6CisJCQlzd2l0Y2ggKGNoKSB7CisJCQkJLyogTGVuZ3RoIG1vZGlmaWVycyAtIG5vbnRlcm1pbmFsIHNlcXVlbmNlcyAqLworCQkJY2FzZSAnaCc6CisJCQkJcmFuay0tOwkvKiBTaG9ydGVyIHJhbmsgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCXJhbmsrKzsJLyogTG9uZ2VyIHJhbmsgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2onOgorCQkJCXJhbmsgPSBJTlRNQVhfUkFOSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3onOgorCQkJCXJhbmsgPSBTSVpFX1RfUkFOSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCXJhbmsgPSBQVFJESUZGX1RfUkFOSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0wnOgorCQkJY2FzZSAncSc6CisJCQkJcmFuayArPSAyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBPdXRwdXQgbW9kaWZpZXJzIC0gdGVybWluYWwgc2VxdWVuY2VzICovCisKKwkJCQkvKiBOZXh0IHN0YXRlIHdpbGwgYmUgbm9ybWFsICovCisJCQkJc3RhdGUgPSBzdF9ub3JtYWw7CisKKwkJCQkvKiBDYW5vbmljYWxpemUgcmFuayAqLworCQkJCWlmIChyYW5rIDwgTUlOX1JBTkspCisJCQkJCXJhbmsgPSBNSU5fUkFOSzsKKwkJCQllbHNlIGlmIChyYW5rID4gTUFYX1JBTkspCisJCQkJCXJhbmsgPSBNQVhfUkFOSzsKKworCQkJCXN3aXRjaCAoY2gpIHsKKwkJCQljYXNlICdQJzoJLyogVXBwZXIgY2FzZSBwb2ludGVyICovCisJCQkJCWZsYWdzIHw9IEZMX1VQUEVSOworCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCQljYXNlICdwJzoJLyogUG9pbnRlciAqLworCQkJCQliYXNlID0gMTY7CisJCQkJCXByZWMgPSAoQ0hBUl9CSVQqc2l6ZW9mKHZvaWQgKikrMykvNDsKKwkJCQkJZmxhZ3MgfD0gRkxfSEFTSDsKKwkJCQkJdmFsID0gKHVpbnRtYXhfdCkodWludHB0cl90KQorCQkJCQkJdmFfYXJnKGFwLCB2b2lkICopOworCQkJCQlnb3RvIGlzX2ludGVnZXI7CisKKwkJCQljYXNlICdkJzoJLyogU2lnbmVkIGRlY2ltYWwgb3V0cHV0ICovCisJCQkJY2FzZSAnaSc6CisJCQkJCWJhc2UgPSAxMDsKKwkJCQkJZmxhZ3MgfD0gRkxfU0lHTkVEOworCQkJCQlzd2l0Y2ggKHJhbmspIHsKKwkJCQkJY2FzZSByYW5rX2NoYXI6CisJCQkJCQkvKiBZZXMsIGFsbCB0aGVzZSBjYXN0cyBhcmUKKwkJCQkJCSAgIG5lZWRlZC4uLiAqLworCQkJCQkJdmFsID0gKHVpbnRtYXhfdCkoaW50bWF4X3QpCisJCQkJCQkJKHNpZ25lZCBjaGFyKQorCQkJCQkJCXZhX2FyZyhhcCwgc2lnbmVkIGludCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSByYW5rX3Nob3J0OgorCQkJCQkJdmFsID0gKHVpbnRtYXhfdCkoaW50bWF4X3QpCisJCQkJCQkJKHNpZ25lZCBzaG9ydCkKKwkJCQkJCQl2YV9hcmcoYXAsIHNpZ25lZCBpbnQpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFua19pbnQ6CisJCQkJCQl2YWwgPSAodWludG1heF90KShpbnRtYXhfdCkKKwkJCQkJCSAgICB2YV9hcmcoYXAsIHNpZ25lZCBpbnQpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFua19sb25nOgorCQkJCQkJdmFsID0gKHVpbnRtYXhfdCkoaW50bWF4X3QpCisJCQkJCQkgICAgdmFfYXJnKGFwLCBzaWduZWQgbG9uZyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSByYW5rX2xvbmdsb25nOgorCQkJCQkJdmFsID0gKHVpbnRtYXhfdCkoaW50bWF4X3QpCisJCQkJCQkgICAgdmFfYXJnKGFwLAorCQkJCQkJCSAgIHNpZ25lZCBsb25nIGxvbmcpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZ290byBpc19pbnRlZ2VyOworCQkJCWNhc2UgJ28nOgkvKiBPY3RhbCAqLworCQkJCQliYXNlID0gODsKKwkJCQkJZ290byBpc191bnNpZ25lZDsKKwkJCQljYXNlICd1JzoJLyogVW5zaWduZWQgZGVjaW1hbCAqLworCQkJCQliYXNlID0gMTA7CisJCQkJCWdvdG8gaXNfdW5zaWduZWQ7CisJCQkJY2FzZSAnWCc6CS8qIFVwcGVyIGNhc2UgaGV4YWRlY2ltYWwgKi8KKwkJCQkJZmxhZ3MgfD0gRkxfVVBQRVI7CisJCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJCWNhc2UgJ3gnOgkvKiBIZXhhZGVjaW1hbCAqLworCQkJCQliYXNlID0gMTY7CisJCQkJCWdvdG8gaXNfdW5zaWduZWQ7CisKKwkJCQlpc191bnNpZ25lZDoKKwkJCQkJc3dpdGNoIChyYW5rKSB7CisJCQkJCWNhc2UgcmFua19jaGFyOgorCQkJCQkJdmFsID0gKHVpbnRtYXhfdCkKKwkJCQkJCQkodW5zaWduZWQgY2hhcikKKwkJCQkJCQl2YV9hcmcoYXAsIHVuc2lnbmVkCisJCQkJCQkJICAgICAgIGludCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSByYW5rX3Nob3J0OgorCQkJCQkJdmFsID0gKHVpbnRtYXhfdCkKKwkJCQkJCQkodW5zaWduZWQgc2hvcnQpCisJCQkJCQkJdmFfYXJnKGFwLCB1bnNpZ25lZAorCQkJCQkJCSAgICAgICBpbnQpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFua19pbnQ6CisJCQkJCQl2YWwgPSAodWludG1heF90KQorCQkJCQkJCXZhX2FyZyhhcCwgdW5zaWduZWQKKwkJCQkJCQkgICAgICAgaW50KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJhbmtfbG9uZzoKKwkJCQkJCXZhbCA9ICh1aW50bWF4X3QpCisJCQkJCQkJdmFfYXJnKGFwLCB1bnNpZ25lZAorCQkJCQkJCSAgICAgICBsb25nKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJhbmtfbG9uZ2xvbmc6CisJCQkJCQl2YWwgPSAodWludG1heF90KQorCQkJCQkJCXZhX2FyZyhhcCwgdW5zaWduZWQKKwkJCQkJCQkgICAgICAgbG9uZyBsb25nKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCQkJaXNfaW50ZWdlcjoKKwkJCQkJc3ogPSBmb3JtYXRfaW50KHEsIChvIDwgbikgPyBuIC0gbyA6IDAsCisJCQkJCQkJdmFsLCBmbGFncywgYmFzZSwKKwkJCQkJCQl3aWR0aCwgcHJlYyk7CisJCQkJCXEgKz0gc3o7CisJCQkJCW8gKz0gc3o7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnYyc6CS8qIENoYXJhY3RlciAqLworCQkJCQljYXJnID0gKGNoYXIpdmFfYXJnKGFwLCBpbnQpOworCQkJCQlzYXJnID0gJmNhcmc7CisJCQkJCXNsZW4gPSAxOworCQkJCQlnb3RvIGlzX3N0cmluZzsKKwkJCQljYXNlICdzJzoJLyogU3RyaW5nICovCisJCQkJCXNhcmcgPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKik7CisJCQkJCXNhcmcgPSBzYXJnID8gc2FyZyA6ICIobnVsbCkiOworCQkJCQlzbGVuID0gc3RybGVuKHNhcmcpOworCQkJCQlnb3RvIGlzX3N0cmluZzsKKworCQkJCWlzX3N0cmluZzoKKwkJCQkJeworCQkJCQkJY2hhciBzY2g7CisJCQkJCQlpbnQgaTsKKworCQkJCQkJaWYgKHByZWMgIT0gLTEgJiYgc2xlbiA+IHByZWMpCisJCQkJCQkJc2xlbiA9IHByZWM7CisKKwkJCQkJCWlmICh3aWR0aCA+IHNsZW4KKwkJCQkJCSAgICAmJiAhKGZsYWdzICYgRkxfTUlOVVMpKSB7CisJCQkJCQkJY2hhciBwYWQgPQorCQkJCQkJCSAgICAoZmxhZ3MgJiBGTF9aRVJPKSA/CisJCQkJCQkJICAgICcwJyA6ICcgJzsKKwkJCQkJCQl3aGlsZSAod2lkdGggPiBzbGVuKSB7CisJCQkJCQkJCUVNSVQocGFkKTsKKwkJCQkJCQkJd2lkdGgtLTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlmb3IgKGkgPSBzbGVuOyBpOyBpLS0pIHsKKwkJCQkJCQlzY2ggPSAqc2FyZysrOworCQkJCQkJCUVNSVQoc2NoKTsKKwkJCQkJCX0KKwkJCQkJCWlmICh3aWR0aCA+IHNsZW4KKwkJCQkJCSAgICAmJiAoZmxhZ3MgJiBGTF9NSU5VUykpIHsKKwkJCQkJCQl3aGlsZSAod2lkdGggPiBzbGVuKSB7CisJCQkJCQkJCUVNSVQoJyAnKTsKKwkJCQkJCQkJd2lkdGgtLTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICduJzoKKwkJCQkJeworCQkJCQkJLyogT3V0cHV0IHRoZSBudW1iZXIgb2YKKwkJCQkJCSAgIGNoYXJhY3RlcnMgd3JpdHRlbiAqLworCisJCQkJCQlzd2l0Y2ggKHJhbmspIHsKKwkJCQkJCWNhc2UgcmFua19jaGFyOgorCQkJCQkJCSp2YV9hcmcoYXAsCisJCQkJCQkJCXNpZ25lZCBjaGFyICopCisJCQkJCQkJCT0gbzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgcmFua19zaG9ydDoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQlzaWduZWQgc2hvcnQgKikKKwkJCQkJCQkJPSBvOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX2ludDoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQlzaWduZWQgaW50ICopCisJCQkJCQkJCT0gbzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgcmFua19sb25nOgorCQkJCQkJCSp2YV9hcmcoYXAsCisJCQkJCQkJCXNpZ25lZCBsb25nICopCisJCQkJCQkJCT0gbzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgcmFua19sb25nbG9uZzoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQlzaWduZWQgbG9uZyBsb25nICopCisJCQkJCQkJCT0gbzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CS8qIEFueXRoaW5nIGVsc2UsIGluY2x1ZGluZyAlICovCisJCQkJCUVNSVQoY2gpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBOdWxsLXRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJaWYgKG8gPCBuKQorCQkqcSA9ICdcMCc7CS8qIE5vIG92ZXJmbG93ICovCisJZWxzZSBpZiAobiA+IDApCisJCWJ1ZmZlcltuIC0gMV0gPSAnXDAnOwkvKiBPdmVyZmxvdyAtIHRlcm1pbmF0ZSBhdCBlbmQgb2YgYnVmZmVyICovCisKKwlyZXR1cm4gbzsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy92c3ByaW50Zi5jIGIvdXNyL2tsaWJjL3ZzcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmNWQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy92c3ByaW50Zi5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiB2c3ByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCB2c3ByaW50ZihjaGFyICpidWZmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwlyZXR1cm4gdnNucHJpbnRmKGJ1ZmZlciwgfihzaXplX3QpIDAsIGZvcm1hdCwgYXApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Zzc2NhbmYuYyBiL3Vzci9rbGliYy92c3NjYW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlNTBmNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy92c3NjYW5mLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiB2c3NjYW5mLmMKKyAqCisgKiB2c3NjYW5mKCksIGZyb20gd2hpY2ggdGhlIHJlc3Qgb2YgdGhlIHNjYW5mKCkKKyAqIGZhbWlseSBpcyBidWlsdAorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBMT05HX0JJVAorI2RlZmluZSBMT05HX0JJVCAoQ0hBUl9CSVQqc2l6ZW9mKGxvbmcpKQorI2VuZGlmCisKK2VudW0gZmxhZ3MgeworCUZMX1NQTEFUID0gMHgwMSwJLyogRHJvcCB0aGUgdmFsdWUsIGRvIG5vdCBhc3NpZ24gKi8KKwlGTF9JTlYgICA9IDB4MDIsCS8qIENoYXJhY3Rlci1zZXQgd2l0aCBpbnZlcnNlICovCisJRkxfV0lEVEggPSAweDA0LAkvKiBGaWVsZCB3aWR0aCBzcGVjaWZpZWQgKi8KKwlGTF9NSU5VUyA9IDB4MDgsCS8qIE5lZ2F0aXZlIG51bWJlciAqLworfTsKKworZW51bSByYW5rcyB7CisJcmFua19jaGFyICAgICA9IC0yLAorCXJhbmtfc2hvcnQgICAgPSAtMSwKKwlyYW5rX2ludCAgICAgID0gMCwKKwlyYW5rX2xvbmcgICAgID0gMSwKKwlyYW5rX2xvbmdsb25nID0gMiwKKwlyYW5rX3B0ciAgICAgID0gSU5UX01BWAkvKiBTcGVjaWFsIHZhbHVlIHVzZWQgZm9yIHBvaW50ZXJzICovCit9OworCisjZGVmaW5lIE1JTl9SQU5LCXJhbmtfY2hhcgorI2RlZmluZSBNQVhfUkFOSwlyYW5rX2xvbmdsb25nCisKKyNkZWZpbmUgSU5UTUFYX1JBTksJcmFua19sb25nbG9uZworI2RlZmluZSBTSVpFX1RfUkFOSwlyYW5rX2xvbmcKKyNkZWZpbmUgUFRSRElGRl9UX1JBTksJcmFua19sb25nCisKK2VudW0gYmFpbCB7CisJYmFpbF9ub25lID0gMCwJCS8qIE5vIGVycm9yIGNvbmRpdGlvbiAqLworCWJhaWxfZW9mLAkJLyogSGl0IEVPRiAqLworCWJhaWxfZXJyCQkvKiBDb252ZXJzaW9uIG1pc21hdGNoICovCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnNraXBzcGFjZShjb25zdCBjaGFyICpwKQoreworCXdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpwKSkKKwkJcCsrOworCXJldHVybiBwOworfQorCisjdW5kZWYgc2V0X2JpdAorc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQodW5zaWduZWQgbG9uZyAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYml0KQoreworCWJpdG1hcFtiaXQgLyBMT05HX0JJVF0gfD0gMVVMIDw8IChiaXQgJSBMT05HX0JJVCk7Cit9CisKKyN1bmRlZiB0ZXN0X2JpdAorc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXQodW5zaWduZWQgbG9uZyAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYml0KQoreworCXJldHVybiAoaW50KShiaXRtYXBbYml0IC8gTE9OR19CSVRdID4+IChiaXQgJSBMT05HX0JJVCkpICYgMTsKK30KKworaW50IHZzc2NhbmYoY29uc3QgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJY29uc3QgY2hhciAqcCA9IGZvcm1hdDsKKwljaGFyIGNoOworCXVuc2lnbmVkIGNoYXIgdWM7CisJY29uc3QgY2hhciAqcSA9IGJ1ZmZlcjsKKwljb25zdCBjaGFyICpxcTsKKwl1aW50bWF4X3QgdmFsID0gMDsKKwlpbnQgcmFuayA9IHJhbmtfaW50OwkvKiBEZWZhdWx0IHJhbmsgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGggPSBVSU5UX01BWDsKKwlpbnQgYmFzZTsKKwllbnVtIGZsYWdzIGZsYWdzID0gMDsKKwllbnVtIHsKKwkJc3Rfbm9ybWFsLAkvKiBHcm91bmQgc3RhdGUgKi8KKwkJc3RfZmxhZ3MsCS8qIFNwZWNpYWwgZmxhZ3MgKi8KKwkJc3Rfd2lkdGgsCS8qIEZpZWxkIHdpZHRoICovCisJCXN0X21vZGlmaWVycywJLyogTGVuZ3RoIG9yIGNvbnZlcnNpb24gbW9kaWZpZXJzICovCisJCXN0X21hdGNoX2luaXQsCS8qIEluaXRpYWwgc3RhdGUgb2YgJVsgc2VxdWVuY2UgKi8KKwkJc3RfbWF0Y2gsCS8qIE1haW4gc3RhdGUgb2YgJVsgc2VxdWVuY2UgKi8KKwkJc3RfbWF0Y2hfcmFuZ2UsCS8qIEFmdGVyIC0gaW4gYSAlWyBzZXF1ZW5jZSAqLworCX0gc3RhdGUgPSBzdF9ub3JtYWw7CisJY2hhciAqc2FyZyA9IE5VTEw7CS8qICVzICVjIG9yICVbIHN0cmluZyBhcmd1bWVudCAqLworCWVudW0gYmFpbCBiYWlsID0gYmFpbF9ub25lOworCWludCBzaWduOworCWludCBjb252ZXJ0ZWQgPSAwOwkvKiBTdWNjZXNzZnVsIGNvbnZlcnNpb25zICovCisJdW5zaWduZWQgbG9uZyBtYXRjaG1hcFsoKDEgPDwgQ0hBUl9CSVQpICsgKExPTkdfQklUIC0gMSkpIC8gTE9OR19CSVRdOworCWludCBtYXRjaGludiA9IDA7CS8qIElzIG1hdGNoIG1hcCBpbnZlcnRlZD8gKi8KKwl1bnNpZ25lZCBjaGFyIHJhbmdlX3N0YXJ0ID0gMDsKKworCXdoaWxlICgoY2ggPSAqcCsrKSAmJiAhYmFpbCkgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2Ugc3Rfbm9ybWFsOgorCQkJaWYgKGNoID09ICclJykgeworCQkJCXN0YXRlID0gc3RfZmxhZ3M7CisJCQkJZmxhZ3MgPSAwOworCQkJCXJhbmsgPSByYW5rX2ludDsKKwkJCQl3aWR0aCA9IFVJTlRfTUFYOworCQkJfSBlbHNlIGlmIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKWNoKSkgeworCQkJCXEgPSBza2lwc3BhY2UocSk7CisJCQl9IGVsc2UgeworCQkJCWlmICgqcSA9PSBjaCkKKwkJCQkJcSsrOworCQkJCWVsc2UKKwkJCQkJYmFpbCA9IGJhaWxfZXJyOyAvKiBNYXRjaCBmYWlsdXJlICovCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHN0X2ZsYWdzOgorCQkJc3dpdGNoIChjaCkgeworCQkJY2FzZSAnKic6CisJCQkJZmxhZ3MgfD0gRkxfU1BMQVQ7CisJCQkJYnJlYWs7CisJCQljYXNlICcwJy4uLic5JzoKKwkJCQl3aWR0aCA9IChjaCAtICcwJyk7CisJCQkJc3RhdGUgPSBzdF93aWR0aDsKKwkJCQlmbGFncyB8PSBGTF9XSURUSDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc3RhdGUgPSBzdF9tb2RpZmllcnM7CisJCQkJcC0tOwkvKiBQcm9jZXNzIHRoaXMgY2hhcmFjdGVyIGFnYWluICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHN0X3dpZHRoOgorCQkJaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwkJCQl3aWR0aCA9IHdpZHRoICogMTAgKyAoY2ggLSAnMCcpOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZSA9IHN0X21vZGlmaWVyczsKKwkJCQlwLS07CS8qIFByb2Nlc3MgdGhpcyBjaGFyYWN0ZXIgYWdhaW4gKi8KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Ugc3RfbW9kaWZpZXJzOgorCQkJc3dpdGNoIChjaCkgeworCQkJCS8qIExlbmd0aCBtb2RpZmllcnMgLSBub250ZXJtaW5hbCBzZXF1ZW5jZXMgKi8KKwkJCWNhc2UgJ2gnOgorCQkJCXJhbmstLTsJLyogU2hvcnRlciByYW5rICovCisJCQkJYnJlYWs7CisJCQljYXNlICdsJzoKKwkJCQlyYW5rKys7CS8qIExvbmdlciByYW5rICovCisJCQkJYnJlYWs7CisJCQljYXNlICdqJzoKKwkJCQlyYW5rID0gSU5UTUFYX1JBTks7CisJCQkJYnJlYWs7CisJCQljYXNlICd6JzoKKwkJCQlyYW5rID0gU0laRV9UX1JBTks7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzoKKwkJCQlyYW5rID0gUFRSRElGRl9UX1JBTks7CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCWNhc2UgJ3EnOgorCQkJCXJhbmsgPSByYW5rX2xvbmdsb25nOwkvKiBsb25nIGRvdWJsZS9sb25nIGxvbmcgKi8KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKiBPdXRwdXQgbW9kaWZpZXJzIC0gdGVybWluYWwgc2VxdWVuY2VzICovCisJCQkJLyogTmV4dCBzdGF0ZSB3aWxsIGJlIG5vcm1hbCAqLworCQkJCXN0YXRlID0gc3Rfbm9ybWFsOworCisJCQkJLyogQ2Fub25pY2FsaXplIHJhbmsgKi8KKwkJCQlpZiAocmFuayA8IE1JTl9SQU5LKQorCQkJCQlyYW5rID0gTUlOX1JBTks7CisJCQkJZWxzZSBpZiAocmFuayA+IE1BWF9SQU5LKQorCQkJCQlyYW5rID0gTUFYX1JBTks7CisKKwkJCQlzd2l0Y2ggKGNoKSB7CisJCQkJY2FzZSAnUCc6CS8qIFVwcGVyIGNhc2UgcG9pbnRlciAqLworCQkJCWNhc2UgJ3AnOgkvKiBQb2ludGVyICovCisJCQkJCXJhbmsgPSByYW5rX3B0cjsKKwkJCQkJYmFzZSA9IDA7CisJCQkJCXNpZ24gPSAwOworCQkJCQlnb3RvIHNjYW5faW50OworCisJCQkJY2FzZSAnaSc6CS8qIEJhc2UtaW5kZXBlbmRlbnQgaW50ZWdlciAqLworCQkJCQliYXNlID0gMDsKKwkJCQkJc2lnbiA9IDE7CisJCQkJCWdvdG8gc2Nhbl9pbnQ7CisKKwkJCQljYXNlICdkJzoJLyogRGVjaW1hbCBpbnRlZ2VyICovCisJCQkJCWJhc2UgPSAxMDsKKwkJCQkJc2lnbiA9IDE7CisJCQkJCWdvdG8gc2Nhbl9pbnQ7CisKKwkJCQljYXNlICdvJzoJLyogT2N0YWwgaW50ZWdlciAqLworCQkJCQliYXNlID0gODsKKwkJCQkJc2lnbiA9IDA7CisJCQkJCWdvdG8gc2Nhbl9pbnQ7CisKKwkJCQljYXNlICd1JzoJLyogVW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyICovCisJCQkJCWJhc2UgPSAxMDsKKwkJCQkJc2lnbiA9IDA7CisJCQkJCWdvdG8gc2Nhbl9pbnQ7CisKKwkJCQljYXNlICd4JzoJLyogSGV4YWRlY2ltYWwgaW50ZWdlciAqLworCQkJCWNhc2UgJ1gnOgorCQkJCQliYXNlID0gMTY7CisJCQkJCXNpZ24gPSAwOworCQkJCQlnb3RvIHNjYW5faW50OworCisJCQkJY2FzZSAnbic6CS8qICMgb2YgY2hhcmFjdGVycyBjb25zdW1lZCAqLworCQkJCQl2YWwgPSAocSAtIGJ1ZmZlcik7CisJCQkJCWdvdG8gc2V0X2ludGVnZXI7CisKKwkJCQkgICAgICBzY2FuX2ludDoKKwkJCQkJcSA9IHNraXBzcGFjZShxKTsKKwkJCQkJaWYgKCEqcSkgeworCQkJCQkJYmFpbCA9IGJhaWxfZW9mOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJdmFsID0KKwkJCQkJICAgIHN0cm50b3VtYXgocSwgKGNoYXIgKiopJnFxLCBiYXNlLAorCQkJCQkJICAgICAgIHdpZHRoKTsKKwkJCQkJaWYgKHFxID09IHEpIHsKKwkJCQkJCWJhaWwgPSBiYWlsX2VycjsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXEgPSBxcTsKKwkJCQkJaWYgKCEoZmxhZ3MgJiBGTF9TUExBVCkpCisJCQkJCQljb252ZXJ0ZWQrKzsKKwkJCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJCQkgICAgICBzZXRfaW50ZWdlcjoKKwkJCQkJaWYgKCEoZmxhZ3MgJiBGTF9TUExBVCkpIHsKKwkJCQkJCXN3aXRjaCAocmFuaykgeworCQkJCQkJY2FzZSByYW5rX2NoYXI6CisJCQkJCQkJKnZhX2FyZyhhcCwKKwkJCQkJCQkJdW5zaWduZWQgY2hhciAqKQorCQkJCQkJCQk9IHZhbDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgcmFua19zaG9ydDoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQl1bnNpZ25lZCBzaG9ydAorCQkJCQkJCQkqKSA9IHZhbDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgcmFua19pbnQ6CisJCQkJCQkJKnZhX2FyZyhhcCwKKwkJCQkJCQkJdW5zaWduZWQgaW50ICopCisJCQkJCQkJICAgID0gdmFsOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX2xvbmc6CisJCQkJCQkJKnZhX2FyZyhhcCwKKwkJCQkJCQkJdW5zaWduZWQgbG9uZyAqKQorCQkJCQkJCQk9IHZhbDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgcmFua19sb25nbG9uZzoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQl1bnNpZ25lZCBsb25nCisJCQkJCQkJCWxvbmcgKikgPSB2YWw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIHJhbmtfcHRyOgorCQkJCQkJCSp2YV9hcmcoYXAsIHZvaWQgKiopID0KKwkJCQkJCQkJKHZvaWQgKikKKwkJCQkJCQkJKHVpbnRwdHJfdCl2YWw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdjJzoJLyogQ2hhcmFjdGVyICovCisJCQkJCS8qIERlZmF1bHQgd2lkdGggPT0gMSAqLworCQkJCQl3aWR0aCA9IChmbGFncyAmIEZMX1dJRFRIKSA/IHdpZHRoIDogMTsKKwkJCQkJaWYgKGZsYWdzICYgRkxfU1BMQVQpIHsKKwkJCQkJCXdoaWxlICh3aWR0aC0tKSB7CisJCQkJCQkJaWYgKCEqcSkgeworCQkJCQkJCQliYWlsID0gYmFpbF9lb2Y7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNhcmcgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisJCQkJCQl3aGlsZSAod2lkdGgtLSkgeworCQkJCQkJCWlmICghKnEpIHsKKwkJCQkJCQkJYmFpbCA9IGJhaWxfZW9mOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJKnNhcmcrKyA9ICpxKys7CisJCQkJCQl9CisJCQkJCQlpZiAoIWJhaWwpCisJCQkJCQkJY29udmVydGVkKys7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdzJzoJLyogU3RyaW5nICovCisJCQkJCXVjID0gMTsJLyogQW55dGhpbmcgbm9uemVybyAqLworCQkJCQlpZiAoZmxhZ3MgJiBGTF9TUExBVCkgeworCQkJCQkJd2hpbGUgKHdpZHRoLS0gJiYgKHVjID0gKnEpICYmCisJCQkJCQkgICAgICAgIWlzc3BhY2UodWMpKSB7CisJCQkJCQkJcSsrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJY2hhciAqc3A7CisJCQkJCQlzcCA9IHNhcmcgPSB2YV9hcmcoYXAsIGNoYXIgKik7CisJCQkJCQl3aGlsZSAod2lkdGgtLSAmJiAodWMgPSAqcSkgJiYKKwkJCQkJCSAgICAgICAhaXNzcGFjZSh1YykpIHsKKwkJCQkJCQkqc3ArKyA9IHVjOworCQkJCQkJCXErKzsKKwkJCQkJCX0KKwkJCQkJCWlmIChzYXJnICE9IHNwKSB7CisJCQkJCQkJLyogVGVybWluYXRlIG91dHB1dCAqLworCQkJCQkJCSpzcCA9ICdcMCc7CisJCQkJCQkJY29udmVydGVkKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKCF1YykKKwkJCQkJCWJhaWwgPSBiYWlsX2VvZjsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdbJzoJLyogQ2hhcmFjdGVyIHJhbmdlICovCisJCQkJCXNhcmcgPSAoZmxhZ3MgJiBGTF9TUExBVCkgPyBOVUxMCisJCQkJCQk6IHZhX2FyZyhhcCwgY2hhciAqKTsKKwkJCQkJc3RhdGUgPSBzdF9tYXRjaF9pbml0OworCQkJCQltYXRjaGludiA9IDA7CisJCQkJCW1lbXNldChtYXRjaG1hcCwgMCwgc2l6ZW9mIG1hdGNobWFwKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICclJzoJLyogJSUgc2VxdWVuY2UgKi8KKwkJCQkJaWYgKCpxID09ICclJykKKwkJCQkJCXErKzsKKwkJCQkJZWxzZQorCQkJCQkJYmFpbCA9IGJhaWxfZXJyOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CS8qIEFueXRoaW5nIGVsc2UgKi8KKwkJCQkJLyogVW5rbm93biBzZXF1ZW5jZSAqLworCQkJCQliYWlsID0gYmFpbF9lcnI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Ugc3RfbWF0Y2hfaW5pdDoJLyogSW5pdGlhbCBzdGF0ZSBmb3IgJVsgbWF0Y2ggKi8KKwkJCWlmIChjaCA9PSAnXicgJiYgIShmbGFncyAmIEZMX0lOVikpIHsKKwkJCQltYXRjaGludiA9IDE7CisJCQl9IGVsc2UgeworCQkJCXNldF9iaXQobWF0Y2htYXAsICh1bnNpZ25lZCBjaGFyKWNoKTsKKwkJCQlzdGF0ZSA9IHN0X21hdGNoOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBzdF9tYXRjaDoJLyogTWFpbiBzdGF0ZSBmb3IgJVsgbWF0Y2ggKi8KKwkJCWlmIChjaCA9PSAnXScpIHsKKwkJCQlnb3RvIG1hdGNoX3J1bjsKKwkJCX0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisJCQkJcmFuZ2Vfc3RhcnQgPSAodW5zaWduZWQgY2hhciljaDsKKwkJCQlzdGF0ZSA9IHN0X21hdGNoX3JhbmdlOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfYml0KG1hdGNobWFwLCAodW5zaWduZWQgY2hhciljaCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHN0X21hdGNoX3JhbmdlOgkvKiAlWyBtYXRjaCBhZnRlciAtICovCisJCQlpZiAoY2ggPT0gJ10nKSB7CisJCQkJLyogLSB3YXMgbGFzdCBjaGFyYWN0ZXIgKi8KKwkJCQlzZXRfYml0KG1hdGNobWFwLCAodW5zaWduZWQgY2hhciknLScpOworCQkJCWdvdG8gbWF0Y2hfcnVuOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgaTsKKwkJCQlmb3IgKGkgPSByYW5nZV9zdGFydDsgaSA8ICh1bnNpZ25lZCBjaGFyKWNoOworCQkJCSAgICAgaSsrKQorCQkJCQlzZXRfYml0KG1hdGNobWFwLCBpKTsKKwkJCQlzdGF0ZSA9IHN0X21hdGNoOworCQkJfQorCQkJYnJlYWs7CisKKwkJICAgICAgbWF0Y2hfcnVuOgkvKiBNYXRjaCBleHByZXNzaW9uIGZpbmlzaGVkICovCisJCQlxcSA9IHE7CisJCQl1YyA9IDE7CS8qIEFueXRoaW5nIG5vbnplcm8gKi8KKwkJCXdoaWxlICh3aWR0aCAmJiAodWMgPSAqcSkKKwkJCSAgICAgICAmJiB0ZXN0X2JpdChtYXRjaG1hcCwgdWMpXm1hdGNoaW52KSB7CisJCQkJaWYgKHNhcmcpCisJCQkJCSpzYXJnKysgPSB1YzsKKwkJCQlxKys7CisJCQl9CisJCQlpZiAocSAhPSBxcSAmJiBzYXJnKSB7CisJCQkJKnNhcmcgPSAnXDAnOworCQkJCWNvbnZlcnRlZCsrOworCQkJfSBlbHNlIHsKKwkJCQliYWlsID0gYmFpbF9lcnI7CisJCQl9CisJCQlpZiAoIXVjKQorCQkJCWJhaWwgPSBiYWlsX2VvZjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJhaWwgPT0gYmFpbF9lb2YgJiYgIWNvbnZlcnRlZCkKKwkJY29udmVydGVkID0gLTE7CS8qIFJldHVybiBFT0YgKC0xKSAqLworCisJcmV0dXJuIGNvbnZlcnRlZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy93YWl0LmMgYi91c3Iva2xpYmMvd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYmIxYTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvd2FpdC5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiB3YWl0LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworcGlkX3Qgd2FpdChpbnQgKnN0YXR1cykKK3sKKwlyZXR1cm4gd2FpdDQoKHBpZF90KSAtIDEsIHN0YXR1cywgMCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvd2FpdDMuYyBiL3Vzci9rbGliYy93YWl0My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvd2FpdDMuYwpAQCAtMCwwICsxLDEyIEBACisvKgorICogd2FpdDMuYworICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCitwaWRfdCB3YWl0MyhpbnQgKnN0YXR1cywgaW50IG9wdGlvbnMsIHN0cnVjdCBydXNhZ2UgKiBydXNhZ2UpCit7CisJcmV0dXJuIHdhaXQ0KChwaWRfdCkgLSAxLCBzdGF0dXMsIG9wdGlvbnMsIHJ1c2FnZSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvd2FpdHBpZC5jIGIvdXNyL2tsaWJjL3dhaXRwaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTU3MTIyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3dhaXRwaWQuYwpAQCAtMCwwICsxLDEyIEBACisvKgorICogd2FpdHBpZC5jCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKK3BpZF90IHdhaXRwaWQocGlkX3QgcGlkLCBpbnQgKnN0YXR1cywgaW50IG9wdGlvbnMpCit7CisJcmV0dXJuIHdhaXQ0KHBpZCwgc3RhdHVzLCBvcHRpb25zLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL0ZBUSBiL3Vzci9rbGliYy96bGliL0ZBUQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDFkOTEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvRkFRCkBAIC0wLDAgKzEsMzM5IEBACisKKyAgICAgICAgICAgICAgICBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB6bGliCisKKworSWYgeW91ciBxdWVzdGlvbiBpcyBub3QgdGhlcmUsIHBsZWFzZSBjaGVjayB0aGUgemxpYiBob21lIHBhZ2UKK2h0dHA6Ly93d3cuemxpYi5vcmcgd2hpY2ggbWF5IGhhdmUgbW9yZSByZWNlbnQgaW5mb3JtYXRpb24uCitUaGUgbGFzdGVzdCB6bGliIEZBUSBpcyBhdCBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvemxpYl9mYXEuaHRtbAorCisKKyAxLiBJcyB6bGliIFkySy1jb21wbGlhbnQ/CisKKyAgICBZZXMuIHpsaWIgZG9lc24ndCBoYW5kbGUgZGF0ZXMuCisKKyAyLiBXaGVyZSBjYW4gSSBnZXQgYSBXaW5kb3dzIERMTCB2ZXJzaW9uPworCisgICAgVGhlIHpsaWIgc291cmNlcyBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCBjaGFuZ2UgdG8gcHJvZHVjZSBhIERMTC4KKyAgICBTZWUgdGhlIGZpbGUgd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgorICAgIFBvaW50ZXJzIHRvIHRoZSBwcmVjb21waWxlZCBETEwgYXJlIGZvdW5kIGluIHRoZSB6bGliIHdlYiBzaXRlIGF0CisgICAgaHR0cDovL3d3dy56bGliLm9yZy4KKworIDMuIFdoZXJlIGNhbiBJIGdldCBhIFZpc3VhbCBCYXNpYyBpbnRlcmZhY2UgdG8gemxpYj8KKworICAgIFNlZQorICAgICAgICAqIGh0dHA6Ly93d3cuZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQorICAgICAgICAqIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24KKyAgICAgICAgKiB3aW4zMi9ETExfRkFRLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24KKworIDQuIGNvbXByZXNzKCkgcmV0dXJucyBaX0JVRl9FUlJPUi4KKworICAgIE1ha2Ugc3VyZSB0aGF0IGJlZm9yZSB0aGUgY2FsbCBvZiBjb21wcmVzcywgdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZAorICAgIGJ1ZmZlciBpcyBlcXVhbCB0byB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIgYW5kIG5vdAorICAgIHplcm8uIEZvciBWaXN1YWwgQmFzaWMsIGNoZWNrIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZQorICAgICgiYXMgYW55IiksIG5vdCBieSB2YWx1ZSAoImFzIGxvbmciKS4KKworIDUuIGRlZmxhdGUoKSBvciBpbmZsYXRlKCkgcmV0dXJucyBaX0JVRl9FUlJPUi4KKworICAgIEJlZm9yZSBtYWtpbmcgdGhlIGNhbGwsIG1ha2Ugc3VyZSB0aGF0IGF2YWlsX2luIGFuZCBhdmFpbF9vdXQgYXJlIG5vdAorICAgIHplcm8uIFdoZW4gc2V0dGluZyB0aGUgcGFyYW1ldGVyIGZsdXNoIGVxdWFsIHRvIFpfRklOSVNILCBhbHNvIG1ha2Ugc3VyZQorICAgIHRoYXQgYXZhaWxfb3V0IGlzIGJpZyBlbm91Z2ggdG8gYWxsb3cgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBpbnB1dC4KKyAgICBOb3RlIHRoYXQgYSBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwtLWFub3RoZXIgY2FsbCB0byBkZWZsYXRlKCkgb3IKKyAgICBpbmZsYXRlKCkgY2FuIGJlIG1hZGUgd2l0aCBtb3JlIGlucHV0IG9yIG91dHB1dCBzcGFjZS4gQSBaX0JVRl9FUlJPUgorICAgIG1heSBpbiBmYWN0IGJlIHVuYXZvaWRhYmxlIGRlcGVuZGluZyBvbiBob3cgdGhlIGZ1bmN0aW9ucyBhcmUgdXNlZCwgc2luY2UKKyAgICBpdCBpcyBub3QgcG9zc2libGUgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBtb3JlIG91dHB1dCBwZW5kaW5nCisgICAgd2hlbiBzdHJtLmF2YWlsX291dCByZXR1cm5zIHdpdGggemVyby4KKworIDYuIFdoZXJlJ3MgdGhlIHpsaWIgZG9jdW1lbnRhdGlvbiAobWFuIHBhZ2VzLCBldGMuKT8KKworICAgIEl0J3MgaW4gemxpYi5oIGZvciB0aGUgbW9tZW50LCBhbmQgRnJhbmNpcyBTLiBMaW4gaGFzIGNvbnZlcnRlZCBpdCB0byBhCisgICAgd2ViIHBhZ2UgemxpYi5odG1sLiBWb2x1bnRlZXJzIHRvIHRyYW5zZm9ybSB0aGlzIHRvIFVuaXgtc3R5bGUgbWFuIHBhZ2VzLAorICAgIHBsZWFzZSBjb250YWN0IHVzICh6bGliQGd6aXAub3JnKS4gRXhhbXBsZXMgb2YgemxpYiB1c2FnZSBhcmUgaW4gdGhlIGZpbGVzCisgICAgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jLgorCisgNy4gV2h5IGRvbid0IHlvdSB1c2UgR05VIGF1dG9jb25mIG9yIGxpYnRvb2wgb3IgLi4uPworCisgICAgQmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIGtlZXAgemxpYiBhcyBhIHZlcnkgc21hbGwgYW5kIHNpbXBsZQorICAgIHBhY2thZ2UuIHpsaWIgaXMgcmF0aGVyIHBvcnRhYmxlIGFuZCBkb2Vzbid0IG5lZWQgbXVjaCBjb25maWd1cmF0aW9uLgorCisgOC4gSSBmb3VuZCBhIGJ1ZyBpbiB6bGliLgorCisgICAgTW9zdCBvZiB0aGUgdGltZSwgc3VjaCBwcm9ibGVtcyBhcmUgZHVlIHRvIGFuIGluY29ycmVjdCB1c2FnZSBvZgorICAgIHpsaWIuIFBsZWFzZSB0cnkgdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtIHdpdGggYSBzbWFsbCBwcm9ncmFtIGFuZCBzZW5kCisgICAgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIHRvIHVzIGF0IHpsaWJAZ3ppcC5vcmcgLiBEbyBub3Qgc2VuZAorICAgIG11bHRpLW1lZ2FieXRlIGRhdGEgZmlsZXMgd2l0aG91dCBwcmlvciBhZ3JlZW1lbnQuCisKKyA5LiBXaHkgZG8gSSBnZXQgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gZ3pwdXRjIj8KKworICAgIElmICJtYWtlIHRlc3QiIHByb2R1Y2VzIHNvbWV0aGluZyBsaWtlCisKKyAgICAgICBleGFtcGxlLm8oLnRleHQrMHgxNTQpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBnenB1dGMnCisKKyAgICBjaGVjayB0aGF0IHlvdSBkb24ndCBoYXZlIG9sZCBmaWxlcyBsaWJ6LiogaW4gL3Vzci9saWIsIC91c3IvbG9jYWwvbGliIG9yCisgICAgL3Vzci9YMTFSNi9saWIuIFJlbW92ZSBhbnkgb2xkIHZlcnNpb25zLCB0aGVuIGRvICJtYWtlIGluc3RhbGwiLgorCisxMC4gSSBuZWVkIGEgRGVscGhpIGludGVyZmFjZSB0byB6bGliLgorCisgICAgU2VlIHRoZSBjb250cmliL2RlbHBoaSBkaXJlY3RvcnkgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgorCisxMS4gQ2FuIHpsaWIgaGFuZGxlIC56aXAgYXJjaGl2ZXM/CisKKyAgICBOb3QgYnkgaXRzZWxmLCBuby4gIFNlZSB0aGUgZGlyZWN0b3J5IGNvbnRyaWIvbWluaXppcCBpbiB0aGUgemxpYgorICAgIGRpc3RyaWJ1dGlvbi4KKworMTIuIENhbiB6bGliIGhhbmRsZSAuWiBmaWxlcz8KKworICAgIE5vLCBzb3JyeS4gWW91IGhhdmUgdG8gc3Bhd24gYW4gdW5jb21wcmVzcyBvciBndW56aXAgc3VicHJvY2Vzcywgb3IgYWRhcHQKKyAgICB0aGUgY29kZSBvZiB1bmNvbXByZXNzIG9uIHlvdXIgb3duLgorCisxMy4gSG93IGNhbiBJIG1ha2UgYSBVbml4IHNoYXJlZCBsaWJyYXJ5PworCisgICAgbWFrZSBjbGVhbgorICAgIC4vY29uZmlndXJlIC1zCisgICAgbWFrZQorCisxNC4gSG93IGRvIEkgaW5zdGFsbCBhIHNoYXJlZCB6bGliIGxpYnJhcnkgb24gVW5peD8KKworICAgIEFmdGVyIHRoZSBhYm92ZSwgdGhlbjoKKworICAgIG1ha2UgaW5zdGFsbAorCisgICAgSG93ZXZlciwgbWFueSBmbGF2b3JzIG9mIFVuaXggY29tZSB3aXRoIGEgc2hhcmVkIHpsaWIgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgQmVmb3JlIGdvaW5nIHRvIHRoZSB0cm91YmxlIG9mIGNvbXBpbGluZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIHpsaWIgYW5kCisgICAgdHJ5aW5nIHRvIGluc3RhbGwgaXQsIHlvdSBtYXkgd2FudCB0byBjaGVjayBpZiBpdCdzIGFscmVhZHkgdGhlcmUhIElmIHlvdQorICAgIGNhbiAjaW5jbHVkZSA8emxpYi5oPiwgaXQncyB0aGVyZS4gVGhlIC1seiBvcHRpb24gd2lsbCBwcm9iYWJseSBsaW5rIHRvIGl0LgorCisxNS4gSSBoYXZlIGEgcXVlc3Rpb24gYWJvdXQgT3R0b1BERi4KKworICAgIFdlIGFyZSBub3QgdGhlIGF1dGhvcnMgb2YgT3R0b1BERi4gVGhlIHJlYWwgYXV0aG9yIGlzIG9uIHRoZSBPdHRvUERGIHdlYgorICAgIHNpdGU6IEpvZWwgSGFpbmxleSwgamhhaW5sZXlAbXluZGtyeW1lLmNvbS4KKworMTYuIENhbiB6bGliIGRlY29kZSBGbGF0ZSBkYXRhIGluIGFuIEFkb2JlIFBERiBmaWxlPworCisgICAgWWVzLiBTZWUgaHR0cDovL3d3dy5mYXN0aW8uY29tLyAoQ2xpYlBERiksIG9yIGh0dHA6Ly93d3cucGRmbGliLmNvbS8gLgorICAgIFRvIG1vZGlmeSBQREYgZm9ybXMsIHNlZSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Fjcm9mb3JtdG9vbC8gLgorCisxNy4gV2h5IGFtIEkgZ2V0dGluZyB0aGlzICJyZWdpc3Rlcl9mcmFtZV9pbmZvIG5vdCBmb3VuZCIgZXJyb3Igb24gU29sYXJpcz8KKworICAgIEFmdGVyIGluc3RhbGxpbmcgemxpYiAxLjEuNCBvbiBTb2xhcmlzIDIuNiwgcnVubmluZyBhcHBsaWNhdGlvbnMgdXNpbmcgemxpYgorICAgIGdlbmVyYXRlcyBhbiBlcnJvciBzdWNoIGFzOgorCisgICAgICAgIGxkLnNvLjE6IHJwbTogZmF0YWw6IHJlbG9jYXRpb24gZXJyb3I6IGZpbGUgL3Vzci9sb2NhbC9saWIvbGliei5zbzoKKyAgICAgICAgc3ltYm9sIF9fcmVnaXN0ZXJfZnJhbWVfaW5mbzogcmVmZXJlbmNlZCBzeW1ib2wgbm90IGZvdW5kCisKKyAgICBUaGUgc3ltYm9sIF9fcmVnaXN0ZXJfZnJhbWVfaW5mbyBpcyBub3QgcGFydCBvZiB6bGliLCBpdCBpcyBnZW5lcmF0ZWQgYnkKKyAgICB0aGUgQyBjb21waWxlciAoY2Mgb3IgZ2NjKS4gWW91IG11c3QgcmVjb21waWxlIGFwcGxpY2F0aW9ucyB1c2luZyB6bGliCisgICAgd2hpY2ggaGF2ZSB0aGlzIHByb2JsZW0uIFRoaXMgcHJvYmxlbSBpcyBzcGVjaWZpYyB0byBTb2xhcmlzLiBTZWUKKyAgICBodHRwOi8vd3d3LnN1bmZyZWV3YXJlLmNvbSBmb3IgU29sYXJpcyB2ZXJzaW9ucyBvZiB6bGliIGFuZCBhcHBsaWNhdGlvbnMKKyAgICB1c2luZyB6bGliLgorCisxOC4gV2h5IGRvZXMgZ3ppcCBnaXZlIGFuIGVycm9yIG9uIGEgZmlsZSBJIG1ha2Ugd2l0aCBjb21wcmVzcy9kZWZsYXRlPworCisgICAgVGhlIGNvbXByZXNzIGFuZCBkZWZsYXRlIGZ1bmN0aW9ucyBwcm9kdWNlIGRhdGEgaW4gdGhlIHpsaWIgZm9ybWF0LCB3aGljaAorICAgIGlzIGRpZmZlcmVudCBhbmQgaW5jb21wYXRpYmxlIHdpdGggdGhlIGd6aXAgZm9ybWF0LiBUaGUgZ3oqIGZ1bmN0aW9ucyBpbgorICAgIHpsaWIgb24gdGhlIG90aGVyIGhhbmQgdXNlIHRoZSBnemlwIGZvcm1hdC4gQm90aCB0aGUgemxpYiBhbmQgZ3ppcAorICAgIGZvcm1hdHMgdXNlIHRoZSBzYW1lIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgaW50ZXJuYWxseSwgYnV0IGhhdmUgZGlmZmVyZW50CisgICAgaGVhZGVycyBhbmQgdHJhaWxlcnMgYXJvdW5kIHRoZSBjb21wcmVzc2VkIGRhdGEuCisKKzE5LiBPaywgc28gd2h5IGFyZSB0aGVyZSB0d28gZGlmZmVyZW50IGZvcm1hdHM/CisKKyAgICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIHJldGFpbiB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGFib3V0CisgICAgYSBzaW5nbGUgZmlsZSwgc3VjaCBhcyB0aGUgbmFtZSBhbmQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4gVGhlIHpsaWIKKyAgICBmb3JtYXQgb24gdGhlIG90aGVyIGhhbmQgd2FzIGRlc2lnbmVkIGZvciBpbi1tZW1vcnkgYW5kIGNvbW11bmljYXRpb24KKyAgICBjaGFubmVsIGFwcGxpY2F0aW9ucywgYW5kIGhhcyBhIG11Y2ggbW9yZSBjb21wYWN0IGhlYWRlciBhbmQgdHJhaWxlciBhbmQKKyAgICB1c2VzIGEgZmFzdGVyIGludGVncml0eSBjaGVjayB0aGFuIGd6aXAuCisKKzIwLiBXZWxsIHRoYXQncyBuaWNlLCBidXQgaG93IGRvIEkgbWFrZSBhIGd6aXAgZmlsZSBpbiBtZW1vcnk/CisKKyAgICBZb3UgY2FuIHJlcXVlc3QgdGhhdCBkZWZsYXRlIHdyaXRlIHRoZSBnemlwIGZvcm1hdCBpbnN0ZWFkIG9mIHRoZSB6bGliCisgICAgZm9ybWF0IHVzaW5nIGRlZmxhdGVJbml0MigpLiBZb3UgY2FuIGFsc28gcmVxdWVzdCB0aGF0IGluZmxhdGUgZGVjb2RlCisgICAgdGhlIGd6aXAgZm9ybWF0IHVzaW5nIGluZmxhdGVJbml0MigpLiBSZWFkIHpsaWIuaCBmb3IgbW9yZSBkZXRhaWxzLgorCisyMS4gSXMgemxpYiB0aHJlYWQtc2FmZT8KKworICAgIFllcy4gSG93ZXZlciBhbnkgbGlicmFyeSByb3V0aW5lcyB0aGF0IHpsaWIgdXNlcyBhbmQgYW55IGFwcGxpY2F0aW9uLQorICAgIHByb3ZpZGVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIG11c3QgYWxzbyBiZSB0aHJlYWQtc2FmZS4gemxpYidzIGd6KgorICAgIGZ1bmN0aW9ucyB1c2Ugc3RkaW8gbGlicmFyeSByb3V0aW5lcywgYW5kIG1vc3Qgb2YgemxpYidzIGZ1bmN0aW9ucyB1c2UgdGhlCisgICAgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBieSBkZWZhdWx0LiB6bGliJ3MgSW5pdCBmdW5jdGlvbnMgYWxsb3cKKyAgICBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorCisgICAgT2YgY291cnNlLCB5b3Ugc2hvdWxkIG9ubHkgb3BlcmF0ZSBvbiBhbnkgZ2l2ZW4gemxpYiBvciBnemlwIHN0cmVhbSBmcm9tIGEKKyAgICBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KKworMjIuIENhbiBJIHVzZSB6bGliIGluIG15IGNvbW1lcmNpYWwgYXBwbGljYXRpb24/CisKKyAgICBZZXMuIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KKworMjMuIElzIHpsaWIgdW5kZXIgdGhlIEdOVSBsaWNlbnNlPworCisgICAgTm8uIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KKworMjQuIFRoZSBsaWNlbnNlIHNheXMgdGhhdCBhbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlICJwbGFpbmx5IG1hcmtlZCIuIFNvCisgICAgd2hhdCBleGFjdGx5IGRvIEkgbmVlZCB0byBkbyB0byBtZWV0IHRoYXQgcmVxdWlyZW1lbnQ/CisKKyAgICBZb3UgbmVlZCB0byBjaGFuZ2UgdGhlIFpMSUJfVkVSU0lPTiBhbmQgWkxJQl9WRVJOVU0gI2RlZmluZXMgaW4gemxpYi5oLiBJbgorICAgIHBhcnRpY3VsYXIsIHRoZSBmaW5hbCB2ZXJzaW9uIG51bWJlciBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvICJmIiwgYW5kIGFuCisgICAgaWRlbnRpZmljYXRpb24gc3RyaW5nIHNob3VsZCBiZSBhcHBlbmRlZCB0byBaTElCX1ZFUlNJT04uIFZlcnNpb24gbnVtYmVycworICAgIHgueC54LmYgYXJlIHJlc2VydmVkIGZvciBtb2RpZmljYXRpb25zIHRvIHpsaWIgYnkgb3RoZXJzIHRoYW4gdGhlIHpsaWIKKyAgICBtYWludGFpbmVycy4gRm9yIGV4YW1wbGUsIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBiYXNlIHpsaWIgeW91IGFyZSBhbHRlcmluZworICAgIGlzICIxLjIuMy40IiwgdGhlbiBpbiB6bGliLmggeW91IHNob3VsZCBjaGFuZ2UgWkxJQl9WRVJOVU0gdG8gMHgxMjNmLCBhbmQKKyAgICBaTElCX1ZFUlNJT04gdG8gc29tZXRoaW5nIGxpa2UgIjEuMi4zLmYtemFjaGFyeS1tb2RzLXYzIi4gWW91IGNhbiBhbHNvCisgICAgdXBkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZ3MgaW4gZGVmbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jLgorCisgICAgRm9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbnMsIHlvdSBzaG91bGQgYWxzbyBub3RlIHRoZSBvcmlnaW4gYW5kCisgICAgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzIGluIHpsaWIuaCwgYXMgd2VsbCBhcyBpbiBDaGFuZ2VMb2cgYW5kIFJFQURNRSwgYWxvbmcKKyAgICB3aXRoIHRoZSBkYXRlcyBvZiB0aGUgYWx0ZXJhdGlvbnMuIFRoZSBvcmlnaW4gc2hvdWxkIGluY2x1ZGUgYXQgbGVhc3QgeW91cgorICAgIG5hbWUgKG9yIHlvdXIgY29tcGFueSdzIG5hbWUpLCBhbmQgYW4gZW1haWwgYWRkcmVzcyB0byBjb250YWN0IGZvciBoZWxwIG9yCisgICAgaXNzdWVzIHdpdGggdGhlIGxpYnJhcnkuCisKKyAgICBOb3RlIHRoYXQgZGlzdHJpYnV0aW5nIGEgY29tcGlsZWQgemxpYiBsaWJyYXJ5IGFsb25nIHdpdGggemxpYi5oIGFuZAorICAgIHpjb25mLmggaXMgYWxzbyBhIHNvdXJjZSBkaXN0cmlidXRpb24sIGFuZCBzbyB5b3Ugc2hvdWxkIGNoYW5nZQorICAgIFpMSUJfVkVSU0lPTiBhbmQgWkxJQl9WRVJOVU0gYW5kIG5vdGUgdGhlIG9yaWdpbiBhbmQgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzCisgICAgaW4gemxpYi5oIGFzIHlvdSB3b3VsZCBmb3IgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uCisKKzI1LiBXaWxsIHpsaWIgd29yayBvbiBhIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBhcmNoaXRlY3R1cmUsIGFuZCBjYW4gSQorICAgIGV4Y2hhbmdlIGNvbXByZXNzZWQgZGF0YSBiZXR3ZWVuIHRoZW0/CisKKyAgICBZZXMgYW5kIHllcy4KKworMjYuIFdpbGwgemxpYiB3b3JrIG9uIGEgNjQtYml0IG1hY2hpbmU/CisKKyAgICBJdCBzaG91bGQuIEl0IGhhcyBiZWVuIHRlc3RlZCBvbiA2NC1iaXQgbWFjaGluZXMsIGFuZCBoYXMgbm8gZGVwZW5kZW5jZQorICAgIG9uIGFueSBkYXRhIHR5cGVzIGJlaW5nIGxpbWl0ZWQgdG8gMzItYml0cyBpbiBsZW5ndGguIElmIHlvdSBoYXZlIGFueQorICAgIGRpZmZpY3VsdGllcywgcGxlYXNlIHByb3ZpZGUgYSBjb21wbGV0ZSBwcm9ibGVtIHJlcG9ydCB0byB6bGliQGd6aXAub3JnCisKKzI3LiBXaWxsIHpsaWIgZGVjb21wcmVzcyBkYXRhIGZyb20gdGhlIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnk/CisKKyAgICBOby4gVGhlIFBLV2FyZSBEQ0wgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGNvbXByZXNzZWQgZGF0YSBmb3JtYXQKKyAgICB0aGFuIGRvZXMgUEtaSVAgYW5kIHpsaWIuIEhvd2V2ZXIsIHlvdSBjYW4gbG9vayBpbiB6bGliJ3MgY29udHJpYi9ibGFzdAorICAgIGRpcmVjdG9yeSBmb3IgYSBwb3NzaWJsZSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0uCisKKzI4LiBDYW4gSSBhY2Nlc3MgZGF0YSByYW5kb21seSBpbiBhIGNvbXByZXNzZWQgc3RyZWFtPworCisgICAgTm8sIG5vdCB3aXRob3V0IHNvbWUgcHJlcGFyYXRpb24uIElmIHdoZW4gY29tcHJlc3NpbmcgeW91IHBlcmlvZGljYWxseQorICAgIHVzZSBaX0ZVTExfRkxVU0gsIGNhcmVmdWxseSB3cml0ZSBhbGwgdGhlIHBlbmRpbmcgZGF0YSBhdCB0aG9zZSBwb2ludHMsCisgICAgYW5kIGtlZXAgYW4gaW5kZXggb2YgdGhvc2UgbG9jYXRpb25zLCB0aGVuIHlvdSBjYW4gc3RhcnQgZGVjb21wcmVzc2lvbgorICAgIGF0IHRob3NlIHBvaW50cy4gWW91IGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBub3QgdXNlIFpfRlVMTF9GTFVTSCB0b28KKyAgICBvZnRlbiwgc2luY2UgaXQgY2FuIHNpZ25pZmljYW50bHkgZGVncmFkZSBjb21wcmVzc2lvbi4KKworMjkuIERvZXMgemxpYiB3b3JrIG9uIE1WUywgT1MvMzkwLCBDSUNTLCBldGMuPworCisgICAgV2UgZG9uJ3Qga25vdyBmb3Igc3VyZS4gV2UgaGF2ZSBoZWFyZCBvY2Nhc2lvbmFsIHJlcG9ydHMgb2Ygc3VjY2VzcyBvbgorICAgIHRoZXNlIHN5c3RlbXMuIElmIHlvdSBkbyB1c2UgaXQgb24gb25lIG9mIHRoZXNlLCBwbGVhc2UgcHJvdmlkZSB1cyB3aXRoCisgICAgYSByZXBvcnQsIGluc3RydWN0aW9ucywgYW5kIHBhdGNoZXMgdGhhdCB3ZSBjYW4gcmVmZXJlbmNlIHdoZW4gd2UgZ2V0CisgICAgdGhlc2UgcXVlc3Rpb25zLiBUaGFua3MuCisKKzMwLiBJcyB0aGVyZSBzb21lIHNpbXBsZXIsIGVhc2llciB0byByZWFkIHZlcnNpb24gb2YgaW5mbGF0ZSBJIGNhbiBsb29rIGF0CisgICAgdG8gdW5kZXJzdGFuZCB0aGUgZGVmbGF0ZSBmb3JtYXQ/CisKKyAgICBGaXJzdCBvZmYsIHlvdSBzaG91bGQgcmVhZCBSRkMgMTk1MS4gU2Vjb25kLCB5ZXMuIExvb2sgaW4gemxpYidzCisgICAgY29udHJpYi9wdWZmIGRpcmVjdG9yeS4KKworMzEuIERvZXMgemxpYiBpbmZyaW5nZSBvbiBhbnkgcGF0ZW50cz8KKworICAgIEFzIGZhciBhcyB3ZSBrbm93LCBuby4gSW4gZmFjdCwgdGhhdCB3YXMgb3JpZ2luYWxseSB0aGUgd2hvbGUgcG9pbnQgYmVoaW5kCisgICAgemxpYi4gTG9vayBoZXJlIGZvciBzb21lIG1vcmUgaW5mb3JtYXRpb246CisKKyAgICBodHRwOi8vd3d3Lmd6aXAub3JnLyNmYXExMQorCiszMi4gQ2FuIHpsaWIgd29yayB3aXRoIGdyZWF0ZXIgdGhhbiA0IEdCIG9mIGRhdGE/CisKKyAgICBZZXMuIGluZmxhdGUoKSBhbmQgZGVmbGF0ZSgpIHdpbGwgcHJvY2VzcyBhbnkgYW1vdW50IG9mIGRhdGEgY29ycmVjdGx5LgorICAgIEVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIGlzIGxpbWl0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCBjaHVua3MKKyAgICBvZiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIGNvbXBpbGVyJ3MgInVuc2lnbmVkIGludCIKKyAgICB0eXBlLCBidXQgdGhlcmUgaXMgbm8gbGltaXQgdG8gdGhlIG51bWJlciBvZiBjaHVua3MuIE5vdGUgaG93ZXZlciB0aGF0IHRoZQorICAgIHN0cm0udG90YWxfaW4gYW5kIHN0cm1fdG90YWxfb3V0IGNvdW50ZXJzIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IuIFRoZXNlCisgICAgY291bnRlcnMgYXJlIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgYW5kIGFyZSBub3QgdXNlZCBpbnRlcm5hbGx5IGJ5CisgICAgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKS4gVGhlIGFwcGxpY2F0aW9uIGNhbiBlYXNpbHkgc2V0IHVwIGl0cyBvd24gY291bnRlcnMKKyAgICB1cGRhdGVkIGFmdGVyIGVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIHRvIGNvdW50IGJleW9uZCA0IEdCLgorICAgIGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCLCBzaW5jZSB0aGV5IG9wZXJhdGUgaW4gYQorICAgIHNpbmdsZSBjYWxsLiBnenNlZWsoKSBhbmQgZ3p0ZWxsKCkgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQiBkZXBlbmRpbmcgb24gaG93CisgICAgemxpYiBpcyBjb21waWxlZC4gU2VlIHRoZSB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gaW4gemxpYi5oLgorCisgICAgVGhlIHdvcmQgIm1heSIgYXBwZWFycyBzZXZlcmFsIHRpbWVzIGFib3ZlIHNpbmNlIHRoZXJlIGlzIGEgNCBHQiBsaW1pdAorICAgIG9ubHkgaWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciIHR5cGUgaXMgMzIgYml0cy4gSWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciCisgICAgdHlwZSBpcyA2NCBiaXRzLCB0aGVuIHRoZSBsaW1pdCBpcyAxNiBleGFieXRlcy4KKworMzMuIERvZXMgemxpYiBoYXZlIGFueSBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/CisKKyAgICBUaGUgb25seSBvbmUgdGhhdCB3ZSBhcmUgYXdhcmUgb2YgaXMgcG90ZW50aWFsbHkgaW4gZ3pwcmludGYoKS4gSWYgemxpYgorICAgIGlzIGNvbXBpbGVkIHRvIHVzZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSwgdGhlbiB0aGVyZSBpcyBubyBwcm90ZWN0aW9uCisgICAgYWdhaW5zdCBhIGJ1ZmZlciBvdmVyZmxvdyBvZiBhIDRLIHN0cmluZyBzcGFjZSwgb3RoZXIgdGhhbiB0aGUgY2FsbGVyIG9mCisgICAgZ3pwcmludGYoKSBhc3N1cmluZyB0aGF0IHRoZSBvdXRwdXQgd2lsbCBub3QgZXhjZWVkIDRLLiBPbiB0aGUgb3RoZXIKKyAgICBoYW5kLCBpZiB6bGliIGlzIGNvbXBpbGVkIHRvIHVzZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpLCB3aGljaCBzaG91bGQKKyAgICBub3JtYWxseSBiZSB0aGUgY2FzZSwgdGhlbiB0aGVyZSBpcyBubyB2dWxuZXJhYmlsaXR5LiBUaGUgLi9jb25maWd1cmUKKyAgICBzY3JpcHQgd2lsbCBkaXNwbGF5IHdhcm5pbmdzIGlmIGFuIGluc2VjdXJlIHZhcmlhdGlvbiBvZiBzcHJpbnRmKCkgd2lsbAorICAgIGJlIHVzZWQgYnkgZ3pwcmludGYoKS4gQWxzbyB0aGUgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisgICAgaW5mb3JtYXRpb24gb24gd2hhdCB2YXJpYW50IG9mIHNwcmludGYoKSBpcyB1c2VkIGJ5IGd6cHJpbnRmKCkuCisKKyAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpIGFuZCB3b3VsZCBsaWtlIG9uZSwgeW91IGNhbgorICAgIGZpbmQgYSBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBoZXJlOgorCisgICAgICAgIGh0dHA6Ly93d3cuaWpzLnNpL3NvZnR3YXJlL3NucHJpbnRmLworCisgICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgemxpYi4gVmVyc2lvbnMKKyAgICAxLjEuMyBhbmQgYmVmb3JlIHdlcmUgc3ViamVjdCB0byBhIGRvdWJsZS1mcmVlIHZ1bG5lcmFiaWxpdHkuCisKKzM0LiBJcyB0aGVyZSBhIEphdmEgdmVyc2lvbiBvZiB6bGliPworCisgICAgUHJvYmFibHkgd2hhdCB5b3Ugd2FudCBpcyB0byB1c2UgemxpYiBpbiBKYXZhLiB6bGliIGlzIGFscmVhZHkgaW5jbHVkZWQKKyAgICBhcyBwYXJ0IG9mIHRoZSBKYXZhIFNESyBpbiB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlLiBJZiB5b3UgcmVhbGx5IHdhbnQKKyAgICBhIHZlcnNpb24gb2YgemxpYiB3cml0dGVuIGluIHRoZSBKYXZhIGxhbmd1YWdlLCBsb29rIG9uIHRoZSB6bGliIGhvbWUKKyAgICBwYWdlIGZvciBsaW5rczogaHR0cDovL3d3dy56bGliLm9yZy8KKworMzUuIEkgZ2V0IHRoaXMgb3IgdGhhdCBjb21waWxlciBvciBzb3VyY2UtY29kZSBzY2FubmVyIHdhcm5pbmcgd2hlbiBJIGNyYW5rIGl0CisgICAgdXAgdG8gbWF4aW1hbGx5LXBlZGFudGljLiBDYW4ndCB5b3UgZ3V5cyB3cml0ZSBwcm9wZXIgY29kZT8KKworICAgIE1hbnkgeWVhcnMgYWdvLCB3ZSBnYXZlIHVwIGF0dGVtcHRpbmcgdG8gYXZvaWQgd2FybmluZ3Mgb24gZXZlcnkgY29tcGlsZXIKKyAgICBpbiB0aGUgdW5pdmVyc2UuIEl0IGp1c3QgZ290IHRvIGJlIGEgd2FzdGUgb2YgdGltZSwgYW5kIHNvbWUgY29tcGlsZXJzCisgICAgd2VyZSBkb3ducmlnaHQgc2lsbHkuIFNvIG5vdywgd2Ugc2ltcGx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlIGFsd2F5cworICAgIHdvcmtzLgorCiszNi4gVmFsZ3JpbmQgKG9yIHNvbWUgc2ltaWxhciBtZW1vcnkgYWNjZXNzIGNoZWNrZXIpIHNheXMgdGhhdCBkZWZsYXRlIGlzCisgICAgcGVyZm9ybWluZyBhIGNvbmRpdGlvbmFsIGp1bXAgdGhhdCBkZXBlbmRzIG9uIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuCisgICAgSXNuJ3QgdGhhdCBhIGJ1Zz8KKworICAgIE5vLiAgVGhhdCBpcyBpbnRlbnRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYW5kIHRoZSBvdXRwdXQgb2YKKyAgICBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZC4gIFRoaXMgb25seSBzdGFydGVkIHNob3dpbmcgdXAgcmVjZW50bHkgc2luY2UKKyAgICB6bGliIDEuMi54IHVzZXMgbWFsbG9jKCkgYnkgZGVmYXVsdCBmb3IgYWxsb2NhdGlvbnMsIHdoZXJlYXMgZWFybGllcgorICAgIHZlcnNpb25zIHVzZWQgY2FsbG9jKCksIHdoaWNoIHplcm9zIG91dCB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKworMzcuIFdpbGwgemxpYiByZWFkIHRoZSAoaW5zZXJ0IGFueSBhbmNpZW50IG9yIGFyY2FuZSBmb3JtYXQgaGVyZSkgY29tcHJlc3NlZAorICAgIGRhdGEgZm9ybWF0PworCisgICAgUHJvYmFibHkgbm90LiBMb29rIGluIHRoZSBjb21wLmNvbXByZXNzaW9uIEZBUSBmb3IgcG9pbnRlcnMgdG8gdmFyaW91cworICAgIGZvcm1hdHMgYW5kIGFzc29jaWF0ZWQgc29mdHdhcmUuCisKKzM4LiBIb3cgY2FuIEkgZW5jcnlwdC9kZWNyeXB0IHppcCBmaWxlcyB3aXRoIHpsaWI/CisKKyAgICB6bGliIGRvZXNuJ3Qgc3VwcG9ydCBlbmNyeXB0aW9uLiBUaGUgb3JpZ2luYWwgUEtaSVAgZW5jcnlwdGlvbiBpcyB2ZXJ5IHdlYWsKKyAgICBhbmQgY2FuIGJlIGJyb2tlbiB3aXRoIGZyZWVseSBhdmFpbGFibGUgcHJvZ3JhbXMuIFRvIGdldCBzdHJvbmcgZW5jcnlwdGlvbiwKKyAgICB1c2UgR251UEcsIGh0dHA6Ly93d3cuZ251cGcub3JnLyAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgemxpYiBjb21wcmVzc2lvbi4KKyAgICBGb3IgUEtaSVAgY29tcGF0aWJsZSAiZW5jcnlwdGlvbiIsIGxvb2sgYXQgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvCisKKzM5LiBXaGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgImd6aXAiIGFuZCAiZGVmbGF0ZSIgSFRUUCAxLjEgZW5jb2RpbmdzPworCisgICAgImd6aXAiIGlzIHRoZSBnemlwIGZvcm1hdCwgYW5kICJkZWZsYXRlIiBpcyB0aGUgemxpYiBmb3JtYXQuIFRoZXkgc2hvdWxkCisgICAgcHJvYmFibHkgaGF2ZSBjYWxsZWQgdGhlIHNlY29uZCBvbmUgInpsaWIiIGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW9uCisgICAgd2l0aCB0aGUgcmF3IGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdC4gV2hpbGUgdGhlIEhUVFAgMS4xIFJGQyAyNjE2CisgICAgY29ycmVjdGx5IHBvaW50cyB0byB0aGUgemxpYiBzcGVjaWZpY2F0aW9uIGluIFJGQyAxOTUwIGZvciB0aGUgImRlZmxhdGUiCisgICAgdHJhbnNmZXIgZW5jb2RpbmcsIHRoZXJlIGhhdmUgYmVlbiByZXBvcnRzIG9mIHNlcnZlcnMgYW5kIGJyb3dzZXJzIHRoYXQKKyAgICBpbmNvcnJlY3RseSBwcm9kdWNlIG9yIGV4cGVjdCByYXcgZGVmbGF0ZSBkYXRhIHBlciB0aGUgZGVmbGF0ZQorICAgIHNwZWNmaWNpYXRpb24gaW4gUkZDIDE5NTEsIG1vc3Qgbm90YWJseSBNaWNyb3NvZnQuIFNvIGV2ZW4gdGhvdWdoIHRoZQorICAgICJkZWZsYXRlIiB0cmFuc2ZlciBlbmNvZGluZyB1c2luZyB0aGUgemxpYiBmb3JtYXQgd291bGQgYmUgdGhlIG1vcmUKKyAgICBlZmZpY2llbnQgYXBwcm9hY2ggKGFuZCBpbiBmYWN0IGV4YWN0bHkgd2hhdCB0aGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkCisgICAgZm9yKSwgdXNpbmcgdGhlICJnemlwIiB0cmFuc2ZlciBlbmNvZGluZyBpcyBwcm9iYWJseSBtb3JlIHJlbGlhYmxlIGR1ZSB0bworICAgIGFuIHVuZm9ydHVuYXRlIGNob2ljZSBvZiBuYW1lIG9uIHRoZSBwYXJ0IG9mIHRoZSBIVFRQIDEuMSBhdXRob3JzLgorCisgICAgQm90dG9tIGxpbmU6IHVzZSB0aGUgZ3ppcCBmb3JtYXQgZm9yIEhUVFAgMS4xIGVuY29kaW5nLgorCis0MC4gRG9lcyB6bGliIHN1cHBvcnQgdGhlIG5ldyAiRGVmbGF0ZTY0IiBmb3JtYXQgaW50cm9kdWNlZCBieSBQS1dhcmU/CisKKyAgICBOby4gUEtXYXJlIGhhcyBhcHBhcmVudGx5IGRlY2lkZWQgdG8ga2VlcCB0aGF0IGZvcm1hdCBwcm9wcmlldGFyeSwgc2luY2UKKyAgICB0aGV5IGhhdmUgbm90IGRvY3VtZW50ZWQgaXQgYXMgdGhleSBoYXZlIHByZXZpb3VzIGNvbXByZXNzaW9uIGZvcm1hdHMuCisgICAgSW4gYW55IGNhc2UsIHRoZSBjb21wcmVzc2lvbiBpbXByb3ZlbWVudHMgYXJlIHNvIG1vZGVzdCBjb21wYXJlZCB0byBvdGhlcgorICAgIG1vcmUgbW9kZXJuIGFwcHJvYWNoZXMsIHRoYXQgaXQncyBub3Qgd29ydGggdGhlIGVmZm9ydCB0byBpbXBsZW1lbnQuCisKKzQxLiBDYW4geW91IHBsZWFzZSBzaWduIHRoZXNlIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIGFuZCBmYXggdGhlbSBiYWNrIHRvIHVzCisgICAgc28gdGhhdCB3ZSBjYW4gdXNlIHlvdXIgc29mdHdhcmUgaW4gb3VyIHByb2R1Y3Q/CisKKyAgICBOby4gR28gYXdheS4gU2hvby4KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL0lOREVYIGIvdXNyL2tsaWJjL3psaWIvSU5ERVgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4N2U1OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL0lOREVYCkBAIC0wLDAgKzEsNTEgQEAKK0NoYW5nZUxvZyAgICAgICBoaXN0b3J5IG9mIGNoYW5nZXMKK0ZBUSAgICAgICAgICAgICBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB6bGliCitJTkRFWCAgICAgICAgICAgdGhpcyBmaWxlCitNYWtlZmlsZSAgICAgICAgbWFrZWZpbGUgZm9yIFVuaXggKGdlbmVyYXRlZCBieSBjb25maWd1cmUpCitNYWtlZmlsZS5pbiAgICAgbWFrZWZpbGUgZm9yIFVuaXggKHRlbXBsYXRlIGZvciBjb25maWd1cmUpCitSRUFETUUgICAgICAgICAgZ3Vlc3Mgd2hhdAorYWxnb3JpdGhtLnR4dCAgIGRlc2NyaXB0aW9uIG9mIHRoZSAoZGUpY29tcHJlc3Npb24gYWxnb3JpdGhtCitjb25maWd1cmUgICAgICAgY29uZmlndXJlIHNjcmlwdCBmb3IgVW5peAoremNvbmYuaW4uaCAgICAgIHRlbXBsYXRlIGZvciB6Y29uZi5oICh1c2VkIGJ5IGNvbmZpZ3VyZSkKKworYW1pZ2EvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgQW1pZ2EgU0FTIEMKK2FzNDAwLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIElCTSBBUy80MDAKK21zZG9zLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIE1TRE9TCitvbGQvICAgICAgICAgICAgbWFrZWZpbGVzIGZvciB2YXJpb3VzIGFyY2hpdGVjdHVyZXMgYW5kIHpsaWIgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIGZpbGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdXBkYXRlZCBmb3IgemxpYiAxLjIueAorcHJvamVjdHMvICAgICAgIHByb2plY3RzIGZvciB2YXJpb3VzIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnRzCitxbngvICAgICAgICAgICAgbWFrZWZpbGVzIGZvciBRTlgKK3dpbjMyLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIFdpbmRvd3MKKworICAgICAgICAgICAgICAgIHpsaWIgcHVibGljIGhlYWRlciBmaWxlcyAobXVzdCBiZSBrZXB0KToKK3pjb25mLmgKK3psaWIuaAorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgemxpYiBsaWJyYXJ5OgorYWRsZXIzMi5jCitjb21wcmVzcy5jCitjcmMzMi5jCitjcmMzMi5oCitkZWZsYXRlLmMKK2RlZmxhdGUuaAorZ3ppby5jCitpbmZiYWNrLmMKK2luZmZhc3QuYworaW5mZmFzdC5oCitpbmZmaXhlZC5oCitpbmZsYXRlLmMKK2luZmxhdGUuaAoraW5mdHJlZXMuYworaW5mdHJlZXMuaAordHJlZXMuYwordHJlZXMuaAordW5jb21wci5jCit6dXRpbC5jCit6dXRpbC5oCisKKyAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtczoKK2V4YW1wbGUuYworbWluaWd6aXAuYworCisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgY29udHJpYnV0aW9uIGJ5IHRoaXJkIHBhcnRpZXMKK1NlZSBjb250cmliL1JFQURNRS5jb250cmliCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9LYnVpbGQgYi91c3Iva2xpYmMvemxpYi9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlMWJmMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL0tidWlsZApAQCAtMCwwICsxLDggQEAKKyMgemxpYgorCitrbGliLXkgOj0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8KK2tsaWIteSArPSB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8genV0aWwubwora2xpYi15ICs9IGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KKworIyB6bGliIHNwZWNpZmljIGZsYWcKK0VYVFJBX0tMSUJDQ0ZMQUdTIDo9IC1ERFlOQU1JQ19DUkNfVEFCTEUKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL1JFQURNRSBiL3Vzci9rbGliYy96bGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NThjYzUwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvUkVBRE1FCkBAIC0wLDAgKzEsMTI1IEBACitaTElCIERBVEEgQ09NUFJFU1NJT04gTElCUkFSWQorCit6bGliIDEuMi4zIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZSBpcwordGhyZWFkIHNhZmUuICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzCisoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMKK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0ICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkKK2FuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLiBUaGVzZSBkb2N1bWVudHMgYXJlIGFsc28gYXZhaWxhYmxlIGluIG90aGVyCitmb3JtYXRzIGZyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sCisKK0FsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgemxpYi5oCisodm9sdW50ZWVyIHRvIHdyaXRlIG1hbiBwYWdlcyB3ZWxjb21lLCBjb250YWN0IHpsaWJAZ3ppcC5vcmcpLiBBIHVzYWdlIGV4YW1wbGUKK29mIHRoZSBsaWJyYXJ5IGlzIGdpdmVuIGluIHRoZSBmaWxlIGV4YW1wbGUuYyB3aGljaCBhbHNvIHRlc3RzIHRoYXQgdGhlIGxpYnJhcnkKK2lzIHdvcmtpbmcgY29ycmVjdGx5LiBBbm90aGVyIGV4YW1wbGUgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUgbWluaWd6aXAuYy4gVGhlCitjb21wcmVzc2lvbiBsaWJyYXJ5IGl0c2VsZiBpcyBjb21wb3NlZCBvZiBhbGwgc291cmNlIGZpbGVzIGV4Y2VwdCBleGFtcGxlLmMgYW5kCittaW5pZ3ppcC5jLgorCitUbyBjb21waWxlIGFsbCBmaWxlcyBhbmQgcnVuIHRoZSB0ZXN0IHByb2dyYW0sIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGdpdmVuIGF0Cit0aGUgdG9wIG9mIE1ha2VmaWxlLiBJbiBzaG9ydCAibWFrZSB0ZXN0OyBtYWtlIGluc3RhbGwiIHNob3VsZCB3b3JrIGZvciBtb3N0CittYWNoaW5lcy4gRm9yIFVuaXg6ICIuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0OyBtYWtlIGluc3RhbGwiLiBGb3IgTVNET1MsIHVzZSBvbmUKK29mIHRoZSBzcGVjaWFsIG1ha2VmaWxlcyBzdWNoIGFzIE1ha2VmaWxlLm1zYy4gRm9yIFZNUywgdXNlIG1ha2Vfdm1zLmNvbS4KKworUXVlc3Rpb25zIGFib3V0IHpsaWIgc2hvdWxkIGJlIHNlbnQgdG8gPHpsaWJAZ3ppcC5vcmc+LCBvciB0byBHaWxsZXMgVm9sbGFudAorPGluZm9Ad2luaW1hZ2UuY29tPiBmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24uIFRoZSB6bGliIGhvbWUgcGFnZSBpcworaHR0cDovL3d3dy56bGliLm9yZyBvciBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvIEJlZm9yZSByZXBvcnRpbmcgYSBwcm9ibGVtLAorcGxlYXNlIGNoZWNrIHRoaXMgc2l0ZSB0byB2ZXJpZnkgdGhhdCB5b3UgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgemxpYjsKK290aGVyd2lzZSBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cyBvcgorbm90LgorCitQTEVBU0UgcmVhZCB0aGUgemxpYiBGQVEgaHR0cDovL3d3dy5nemlwLm9yZy96bGliL3psaWJfZmFxLmh0bWwgYmVmb3JlIGFza2luZworZm9yIGhlbHAuCisKK01hcmsgTmVsc29uIDxtYXJrbkBpZWVlLm9yZz4gd3JvdGUgYW4gYXJ0aWNsZSBhYm91dCB6bGliIGZvciB0aGUgSmFuLiAxOTk3Citpc3N1ZSBvZiAgRHIuIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGluCitodHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQorCitUaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4yLjMgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgorCitVbnN1cHBvcnRlZCB0aGlyZCBwYXJ0eSBjb250cmlidXRpb25zIGFyZSBwcm92aWRlZCBpbiBkaXJlY3RvcnkgImNvbnRyaWIiLgorCitBIEphdmEgaW1wbGVtZW50YXRpb24gb2YgemxpYiBpcyBhdmFpbGFibGUgaW4gdGhlIEphdmEgRGV2ZWxvcG1lbnQgS2l0CitodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL3ppcC9wYWNrYWdlLXN1bW1hcnkuaHRtbAorU2VlIHRoZSB6bGliIGhvbWUgcGFnZSBodHRwOi8vd3d3LnpsaWIub3JnIGZvciBkZXRhaWxzLgorCitBIFBlcmwgaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIDxwbXFzQGNwYW4ub3JnPiBpcyBpbiB0aGUKK0NQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzCitodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL0NvbXByZXNzLworCitBIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgPGFta0BhbWsuY2E+IGlzCithdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnMsIHNlZQoraHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9saWIvbW9kdWxlLXpsaWIuaHRtbAorCitBIHpsaWIgYmluZGluZyBmb3IgVENMIHdyaXR0ZW4gYnkgQW5kcmVhcyBLdXByaWVzIDxhLmt1cHJpZXNAd2VzdGVuZC5jb20+IGlzCithdmFpbGxhYmxlIGF0IGh0dHA6Ly93d3cub2NoZS5kZS9+YWt1cHJpZXMvc29mdC90cmYvdHJmX3ppcC5odG1sCisKK0FuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LCB3cml0dGVuIG9uIHRvcAorb2YgemxpYiBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LCBpcyBhdmFpbGFibGUgaW4gdGhlCitjb250cmliL21pbml6aXAgZGlyZWN0b3J5IG9mIHpsaWIuCisKKworTm90ZXMgZm9yIHNvbWUgdGFyZ2V0czoKKworLSBGb3IgV2luZG93cyBETEwgdmVyc2lvbnMsIHBsZWFzZSBzZWUgd2luMzIvRExMX0ZBUS50eHQKKworLSBGb3IgNjQtYml0IElyaXgsIGRlZmxhdGUuYyBtdXN0IGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IG9wdGltaXphdGlvbi4gV2l0aAorICAtTywgb25lIGxpYnBuZyB0ZXN0IGZhaWxzLiBUaGUgdGVzdCB3b3JrcyBpbiAzMiBiaXQgbW9kZSAod2l0aCB0aGUgLW4zMgorICBjb21waWxlciBmbGFnKS4gVGhlIGNvbXBpbGVyIGJ1ZyBoYXMgYmVlbiByZXBvcnRlZCB0byBTR0kuCisKKy0gemxpYiBkb2Vzbid0IHdvcmsgd2l0aCBnY2MgMi42LjMgb24gYSBERUMgMzAwMC8zMDBMWCB1bmRlciBPU0YvMSAyLjEgaXQgd29ya3MKKyAgd2hlbiBjb21waWxlZCB3aXRoIGNjLgorCistIE9uIERpZ2l0YWwgVW5peCA0LjBEIChmb3JtZWx5IE9TRi8xKSBvbiBBbHBoYVNlcnZlciwgdGhlIGNjIG9wdGlvbiAtc3RkMSBpcworICBuZWNlc3NhcnkgdG8gZ2V0IGd6cHJpbnRmIHdvcmtpbmcgY29ycmVjdGx5LiBUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJlLgorCistIHpsaWIgZG9lc24ndCB3b3JrIG9uIEhQLVVYIDkuMDUgd2l0aCBzb21lIHZlcnNpb25zIG9mIC9iaW4vY2MuIEl0IHdvcmtzIHdpdGgKKyAgb3RoZXIgY29tcGlsZXJzLiBVc2UgIm1ha2UgdGVzdCIgdG8gY2hlY2sgeW91ciBjb21waWxlci4KKworLSBnemRvcGVuIGlzIG5vdCBzdXBwb3J0ZWQgb24gUklTQ09TLCBCRU9TIGFuZCBieSBzb21lIE1hYyBjb21waWxlcnMuCisKKy0gRm9yIFBhbG1Pcywgc2VlIGh0dHA6Ly9wYWxtemxpYi5zb3VyY2Vmb3JnZS5uZXQvCisKKy0gV2hlbiBidWlsZGluZyBhIHNoYXJlZCwgaS5lLiBkeW5hbWljIGxpYnJhcnkgb24gTWFjIE9TIFgsIHRoZSBsaWJyYXJ5IG11c3QgYmUKKyAgaW5zdGFsbGVkIGJlZm9yZSB0ZXN0aW5nIChkbyAibWFrZSBpbnN0YWxsIiBiZWZvcmUgIm1ha2UgdGVzdCIpLCBzaW5jZSB0aGUKKyAgbGlicmFyeSBsb2NhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIGxpYnJhcnkuCisKKworQWNrbm93bGVkZ21lbnRzOgorCisgIFRoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5IHpsaWIgd2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LiBUaGUgZGVmbGF0ZQorICBhbmQgemxpYiBzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gUGV0ZXIgRGV1dHNjaC4gVGhhbmtzIHRvIGFsbCB0aGUKKyAgcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIHpsaWI7CisgIHRoZXkgYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCisKK0NvcHlyaWdodCBub3RpY2U6CisKKyAoQykgMTk5NS0yMDA0IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKK0lmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIHdlIHdvdWxkIGFwcHJlY2lhdGUgKm5vdCoKK3JlY2VpdmluZyBsZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyB0byBzaWduLiBUaGUgc291cmNlcyBhcmUgcHJvdmlkZWQKK2ZvciBmcmVlIGJ1dCB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLiAgVGhlIGxpYnJhcnkgaGFzIGJlZW4KK2VudGlyZWx5IHdyaXR0ZW4gYnkgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcjsgaXQgZG9lcyBub3QKK2luY2x1ZGUgdGhpcmQtcGFydHkgY29kZS4KKworSWYgeW91IHJlZGlzdHJpYnV0ZSBtb2RpZmllZCBzb3VyY2VzLCB3ZSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGluY2x1ZGUKK2luIHRoZSBmaWxlIENoYW5nZUxvZyBoaXN0b3J5IGluZm9ybWF0aW9uIGRvY3VtZW50aW5nIHlvdXIgY2hhbmdlcy4gUGxlYXNlCityZWFkIHRoZSBGQVEgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RpZmllZCBzb3VyY2UKK3ZlcnNpb25zLgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvYWRsZXIzMi5jIGIvdXNyL2tsaWJjL3psaWIvYWRsZXIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTExNTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9hZGxlcjMyLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qIGFkbGVyMzIuYyAtLSBjb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGRhdGEgc3RyZWFtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQ6IGFkbGVyMzIuYyx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNpbmNsdWRlICJ6bGliLmgiCisKKyNkZWZpbmUgQkFTRSA2NTUyMVVMICAgIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCisjZGVmaW5lIE5NQVggNTU1MgorLyogTk1BWCBpcyB0aGUgbGFyZ2VzdCBuIHN1Y2ggdGhhdCAyNTVuKG4rMSkvMiArIChuKzEpKEJBU0UtMSkgPD0gMl4zMi0xICovCisKKyNkZWZpbmUgRE8xKGJ1ZixpKSAge2FkbGVyICs9IChidWYpW2ldOyBzdW0yICs9IGFkbGVyO30KKyNkZWZpbmUgRE8yKGJ1ZixpKSAgRE8xKGJ1ZixpKTsgRE8xKGJ1ZixpKzEpOworI2RlZmluZSBETzQoYnVmLGkpICBETzIoYnVmLGkpOyBETzIoYnVmLGkrMik7CisjZGVmaW5lIERPOChidWYsaSkgIERPNChidWYsaSk7IERPNChidWYsaSs0KTsKKyNkZWZpbmUgRE8xNihidWYpICAgRE84KGJ1ZiwwKTsgRE84KGJ1Ziw4KTsKKworLyogdXNlIE5PX0RJVklERSBpZiB5b3VyIHByb2Nlc3NvciBkb2VzIG5vdCBkbyBkaXZpc2lvbiBpbiBoYXJkd2FyZSAqLworI2lmZGVmIE5PX0RJVklERQorIyAgZGVmaW5lIE1PRChhKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChhID49IChCQVNFIDw8IDE2KSkgYSAtPSAoQkFTRSA8PCAxNik7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTUpKSBhIC09IChCQVNFIDw8IDE1KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxNCkpIGEgLT0gKEJBU0UgPDwgMTQpOyBcCisgICAgICAgIGlmIChhID49IChCQVNFIDw8IDEzKSkgYSAtPSAoQkFTRSA8PCAxMyk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTIpKSBhIC09IChCQVNFIDw8IDEyKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxMSkpIGEgLT0gKEJBU0UgPDwgMTEpOyBcCisgICAgICAgIGlmIChhID49IChCQVNFIDw8IDEwKSkgYSAtPSAoQkFTRSA8PCAxMCk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgOSkpIGEgLT0gKEJBU0UgPDwgOSk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgOCkpIGEgLT0gKEJBU0UgPDwgOCk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNykpIGEgLT0gKEJBU0UgPDwgNyk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNikpIGEgLT0gKEJBU0UgPDwgNik7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNSkpIGEgLT0gKEJBU0UgPDwgNSk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNCkpIGEgLT0gKEJBU0UgPDwgNCk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMykpIGEgLT0gKEJBU0UgPDwgMyk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMikpIGEgLT0gKEJBU0UgPDwgMik7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMSkpIGEgLT0gKEJBU0UgPDwgMSk7IFwKKyAgICAgICAgaWYgKGEgPj0gQkFTRSkgYSAtPSBCQVNFOyBcCisgICAgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBNT0Q0KGEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNCkpIGEgLT0gKEJBU0UgPDwgNCk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMykpIGEgLT0gKEJBU0UgPDwgMyk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMikpIGEgLT0gKEJBU0UgPDwgMik7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMSkpIGEgLT0gKEJBU0UgPDwgMSk7IFwKKyAgICAgICAgaWYgKGEgPj0gQkFTRSkgYSAtPSBCQVNFOyBcCisgICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjICBkZWZpbmUgTU9EKGEpIGEgJT0gQkFTRQorIyAgZGVmaW5lIE1PRDQoYSkgYSAlPSBCQVNFCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordUxvbmcgWkVYUE9SVCBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbikKKyAgICB1TG9uZyBhZGxlcjsKKyAgICBjb25zdCBCeXRlZiAqYnVmOworICAgIHVJbnQgbGVuOworeworICAgIHVuc2lnbmVkIGxvbmcgc3VtMjsKKyAgICB1bnNpZ25lZCBuOworCisgICAgLyogc3BsaXQgQWRsZXItMzIgaW50byBjb21wb25lbnQgc3VtcyAqLworICAgIHN1bTIgPSAoYWRsZXIgPj4gMTYpICYgMHhmZmZmOworICAgIGFkbGVyICY9IDB4ZmZmZjsKKworICAgIC8qIGluIGNhc2UgdXNlciBsaWtlcyBkb2luZyBhIGJ5dGUgYXQgYSB0aW1lLCBrZWVwIGl0IGZhc3QgKi8KKyAgICBpZiAobGVuID09IDEpIHsKKyAgICAgICAgYWRsZXIgKz0gYnVmWzBdOworICAgICAgICBpZiAoYWRsZXIgPj0gQkFTRSkKKyAgICAgICAgICAgIGFkbGVyIC09IEJBU0U7CisgICAgICAgIHN1bTIgKz0gYWRsZXI7CisgICAgICAgIGlmIChzdW0yID49IEJBU0UpCisgICAgICAgICAgICBzdW0yIC09IEJBU0U7CisgICAgICAgIHJldHVybiBhZGxlciB8IChzdW0yIDw8IDE2KTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsIEFkbGVyLTMyIHZhbHVlIChkZWZlcnJlZCBjaGVjayBmb3IgbGVuID09IDEgc3BlZWQpICovCisgICAgaWYgKGJ1ZiA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiAxTDsKKworICAgIC8qIGluIGNhc2Ugc2hvcnQgbGVuZ3RocyBhcmUgcHJvdmlkZWQsIGtlZXAgaXQgc29tZXdoYXQgZmFzdCAqLworICAgIGlmIChsZW4gPCAxNikgeworICAgICAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgICAgIGFkbGVyICs9ICpidWYrKzsKKyAgICAgICAgICAgIHN1bTIgKz0gYWRsZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFkbGVyID49IEJBU0UpCisgICAgICAgICAgICBhZGxlciAtPSBCQVNFOworICAgICAgICBNT0Q0KHN1bTIpOyAgICAgICAgICAgICAvKiBvbmx5IGFkZGVkIHNvIG1hbnkgQkFTRSdzICovCisgICAgICAgIHJldHVybiBhZGxlciB8IChzdW0yIDw8IDE2KTsKKyAgICB9CisKKyAgICAvKiBkbyBsZW5ndGggTk1BWCBibG9ja3MgLS0gcmVxdWlyZXMganVzdCBvbmUgbW9kdWxvIG9wZXJhdGlvbiAqLworICAgIHdoaWxlIChsZW4gPj0gTk1BWCkgeworICAgICAgICBsZW4gLT0gTk1BWDsKKyAgICAgICAgbiA9IE5NQVggLyAxNjsgICAgICAgICAgLyogTk1BWCBpcyBkaXZpc2libGUgYnkgMTYgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgRE8xNihidWYpOyAgICAgICAgICAvKiAxNiBzdW1zIHVucm9sbGVkICovCisgICAgICAgICAgICBidWYgKz0gMTY7CisgICAgICAgIH0gd2hpbGUgKC0tbik7CisgICAgICAgIE1PRChhZGxlcik7CisgICAgICAgIE1PRChzdW0yKTsKKyAgICB9CisKKyAgICAvKiBkbyByZW1haW5pbmcgYnl0ZXMgKGxlc3MgdGhhbiBOTUFYLCBzdGlsbCBqdXN0IG9uZSBtb2R1bG8pICovCisgICAgaWYgKGxlbikgeyAgICAgICAgICAgICAgICAgIC8qIGF2b2lkIG1vZHVsb3MgaWYgbm9uZSByZW1haW5pbmcgKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+PSAxNikgeworICAgICAgICAgICAgbGVuIC09IDE2OworICAgICAgICAgICAgRE8xNihidWYpOworICAgICAgICAgICAgYnVmICs9IDE2OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgYWRsZXIgKz0gKmJ1ZisrOworICAgICAgICAgICAgc3VtMiArPSBhZGxlcjsKKyAgICAgICAgfQorICAgICAgICBNT0QoYWRsZXIpOworICAgICAgICBNT0Qoc3VtMik7CisgICAgfQorCisgICAgLyogcmV0dXJuIHJlY29tYmluZWQgc3VtcyAqLworICAgIHJldHVybiBhZGxlciB8IChzdW0yIDw8IDE2KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUoYWRsZXIxLCBhZGxlcjIsIGxlbjIpCisgICAgdUxvbmcgYWRsZXIxOworICAgIHVMb25nIGFkbGVyMjsKKyAgICB6X29mZl90IGxlbjI7Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW0xOworICAgIHVuc2lnbmVkIGxvbmcgc3VtMjsKKyAgICB1bnNpZ25lZCByZW07CisKKyAgICAvKiB0aGUgZGVyaXZhdGlvbiBvZiB0aGlzIGZvcm11bGEgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlciAqLworICAgIHJlbSA9ICh1bnNpZ25lZCkobGVuMiAlIEJBU0UpOworICAgIHN1bTEgPSBhZGxlcjEgJiAweGZmZmY7CisgICAgc3VtMiA9IHJlbSAqIHN1bTE7CisgICAgTU9EKHN1bTIpOworICAgIHN1bTEgKz0gKGFkbGVyMiAmIDB4ZmZmZikgKyBCQVNFIC0gMTsKKyAgICBzdW0yICs9ICgoYWRsZXIxID4+IDE2KSAmIDB4ZmZmZikgKyAoKGFkbGVyMiA+PiAxNikgJiAweGZmZmYpICsgQkFTRSAtIHJlbTsKKyAgICBpZiAoc3VtMSA+IEJBU0UpIHN1bTEgLT0gQkFTRTsKKyAgICBpZiAoc3VtMSA+IEJBU0UpIHN1bTEgLT0gQkFTRTsKKyAgICBpZiAoc3VtMiA+IChCQVNFIDw8IDEpKSBzdW0yIC09IChCQVNFIDw8IDEpOworICAgIGlmIChzdW0yID4gQkFTRSkgc3VtMiAtPSBCQVNFOworICAgIHJldHVybiBzdW0xIHwgKHN1bTIgPDwgMTYpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvYWxnb3JpdGhtLnR4dCBiL3Vzci9rbGliYy96bGliL2FsZ29yaXRobS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMmRkZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2FsZ29yaXRobS50eHQKQEAgLTAsMCArMSwyMDkgQEAKKzEuIENvbXByZXNzaW9uIGFsZ29yaXRobSAoZGVmbGF0ZSkKKworVGhlIGRlZmxhdGlvbiBhbGdvcml0aG0gdXNlZCBieSBnemlwIChhbHNvIHppcCBhbmQgemxpYikgaXMgYSB2YXJpYXRpb24gb2YKK0xaNzcgKExlbXBlbC1aaXYgMTk3Nywgc2VlIHJlZmVyZW5jZSBiZWxvdykuIEl0IGZpbmRzIGR1cGxpY2F0ZWQgc3RyaW5ncyBpbgordGhlIGlucHV0IGRhdGEuICBUaGUgc2Vjb25kIG9jY3VycmVuY2Ugb2YgYSBzdHJpbmcgaXMgcmVwbGFjZWQgYnkgYQorcG9pbnRlciB0byB0aGUgcHJldmlvdXMgc3RyaW5nLCBpbiB0aGUgZm9ybSBvZiBhIHBhaXIgKGRpc3RhbmNlLAorbGVuZ3RoKS4gIERpc3RhbmNlcyBhcmUgbGltaXRlZCB0byAzMksgYnl0ZXMsIGFuZCBsZW5ndGhzIGFyZSBsaW1pdGVkCit0byAyNTggYnl0ZXMuIFdoZW4gYSBzdHJpbmcgZG9lcyBub3Qgb2NjdXIgYW55d2hlcmUgaW4gdGhlIHByZXZpb3VzCiszMksgYnl0ZXMsIGl0IGlzIGVtaXR0ZWQgYXMgYSBzZXF1ZW5jZSBvZiBsaXRlcmFsIGJ5dGVzLiAgKEluIHRoaXMKK2Rlc2NyaXB0aW9uLCBgc3RyaW5nJyBtdXN0IGJlIHRha2VuIGFzIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBieXRlcywKK2FuZCBpcyBub3QgcmVzdHJpY3RlZCB0byBwcmludGFibGUgY2hhcmFjdGVycy4pCisKK0xpdGVyYWxzIG9yIG1hdGNoIGxlbmd0aHMgYXJlIGNvbXByZXNzZWQgd2l0aCBvbmUgSHVmZm1hbiB0cmVlLCBhbmQKK21hdGNoIGRpc3RhbmNlcyBhcmUgY29tcHJlc3NlZCB3aXRoIGFub3RoZXIgdHJlZS4gVGhlIHRyZWVzIGFyZSBzdG9yZWQKK2luIGEgY29tcGFjdCBmb3JtIGF0IHRoZSBzdGFydCBvZiBlYWNoIGJsb2NrLiBUaGUgYmxvY2tzIGNhbiBoYXZlIGFueQorc2l6ZSAoZXhjZXB0IHRoYXQgdGhlIGNvbXByZXNzZWQgZGF0YSBmb3Igb25lIGJsb2NrIG11c3QgZml0IGluCithdmFpbGFibGUgbWVtb3J5KS4gQSBibG9jayBpcyB0ZXJtaW5hdGVkIHdoZW4gZGVmbGF0ZSgpIGRldGVybWluZXMgdGhhdAoraXQgd291bGQgYmUgdXNlZnVsIHRvIHN0YXJ0IGFub3RoZXIgYmxvY2sgd2l0aCBmcmVzaCB0cmVlcy4gKFRoaXMgaXMKK3NvbWV3aGF0IHNpbWlsYXIgdG8gdGhlIGJlaGF2aW9yIG9mIExaVy1iYXNlZCBfY29tcHJlc3NfLikKKworRHVwbGljYXRlZCBzdHJpbmdzIGFyZSBmb3VuZCB1c2luZyBhIGhhc2ggdGFibGUuIEFsbCBpbnB1dCBzdHJpbmdzIG9mCitsZW5ndGggMyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIGhhc2ggdGFibGUuIEEgaGFzaCBpbmRleCBpcyBjb21wdXRlZCBmb3IKK3RoZSBuZXh0IDMgYnl0ZXMuIElmIHRoZSBoYXNoIGNoYWluIGZvciB0aGlzIGluZGV4IGlzIG5vdCBlbXB0eSwgYWxsCitzdHJpbmdzIGluIHRoZSBjaGFpbiBhcmUgY29tcGFyZWQgd2l0aCB0aGUgY3VycmVudCBpbnB1dCBzdHJpbmcsIGFuZAordGhlIGxvbmdlc3QgbWF0Y2ggaXMgc2VsZWN0ZWQuCisKK1RoZSBoYXNoIGNoYWlucyBhcmUgc2VhcmNoZWQgc3RhcnRpbmcgd2l0aCB0aGUgbW9zdCByZWNlbnQgc3RyaW5ncywgdG8KK2Zhdm9yIHNtYWxsIGRpc3RhbmNlcyBhbmQgdGh1cyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgSHVmZm1hbiBlbmNvZGluZy4KK1RoZSBoYXNoIGNoYWlucyBhcmUgc2luZ2x5IGxpbmtlZC4gVGhlcmUgYXJlIG5vIGRlbGV0aW9ucyBmcm9tIHRoZQoraGFzaCBjaGFpbnMsIHRoZSBhbGdvcml0aG0gc2ltcGx5IGRpc2NhcmRzIG1hdGNoZXMgdGhhdCBhcmUgdG9vIG9sZC4KKworVG8gYXZvaWQgYSB3b3JzdC1jYXNlIHNpdHVhdGlvbiwgdmVyeSBsb25nIGhhc2ggY2hhaW5zIGFyZSBhcmJpdHJhcmlseQordHJ1bmNhdGVkIGF0IGEgY2VydGFpbiBsZW5ndGgsIGRldGVybWluZWQgYnkgYSBydW50aW1lIG9wdGlvbiAobGV2ZWwKK3BhcmFtZXRlciBvZiBkZWZsYXRlSW5pdCkuIFNvIGRlZmxhdGUoKSBkb2VzIG5vdCBhbHdheXMgZmluZCB0aGUgbG9uZ2VzdAorcG9zc2libGUgbWF0Y2ggYnV0IGdlbmVyYWxseSBmaW5kcyBhIG1hdGNoIHdoaWNoIGlzIGxvbmcgZW5vdWdoLgorCitkZWZsYXRlKCkgYWxzbyBkZWZlcnMgdGhlIHNlbGVjdGlvbiBvZiBtYXRjaGVzIHdpdGggYSBsYXp5IGV2YWx1YXRpb24KK21lY2hhbmlzbS4gQWZ0ZXIgYSBtYXRjaCBvZiBsZW5ndGggTiBoYXMgYmVlbiBmb3VuZCwgZGVmbGF0ZSgpIHNlYXJjaGVzIGZvcgorYSBsb25nZXIgbWF0Y2ggYXQgdGhlIG5leHQgaW5wdXQgYnl0ZS4gSWYgYSBsb25nZXIgbWF0Y2ggaXMgZm91bmQsIHRoZQorcHJldmlvdXMgbWF0Y2ggaXMgdHJ1bmNhdGVkIHRvIGEgbGVuZ3RoIG9mIG9uZSAodGh1cyBwcm9kdWNpbmcgYSBzaW5nbGUKK2xpdGVyYWwgYnl0ZSkgYW5kIHRoZSBwcm9jZXNzIG9mIGxhenkgZXZhbHVhdGlvbiBiZWdpbnMgYWdhaW4uIE90aGVyd2lzZSwKK3RoZSBvcmlnaW5hbCBtYXRjaCBpcyBrZXB0LCBhbmQgdGhlIG5leHQgbWF0Y2ggc2VhcmNoIGlzIGF0dGVtcHRlZCBvbmx5IE4KK3N0ZXBzIGxhdGVyLgorCitUaGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uIGlzIGFsc28gc3ViamVjdCB0byBhIHJ1bnRpbWUgcGFyYW1ldGVyLiBJZgordGhlIGN1cnJlbnQgbWF0Y2ggaXMgbG9uZyBlbm91Z2gsIGRlZmxhdGUoKSByZWR1Y2VzIHRoZSBzZWFyY2ggZm9yIGEgbG9uZ2VyCittYXRjaCwgdGh1cyBzcGVlZGluZyB1cCB0aGUgd2hvbGUgcHJvY2Vzcy4gSWYgY29tcHJlc3Npb24gcmF0aW8gaXMgbW9yZQoraW1wb3J0YW50IHRoYW4gc3BlZWQsIGRlZmxhdGUoKSBhdHRlbXB0cyBhIGNvbXBsZXRlIHNlY29uZCBzZWFyY2ggZXZlbiBpZgordGhlIGZpcnN0IG1hdGNoIGlzIGFscmVhZHkgbG9uZyBlbm91Z2guCisKK1RoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgbm90IHBlcmZvcm1lZCBmb3IgdGhlIGZhc3Rlc3QgY29tcHJlc3Npb24KK21vZGVzIChsZXZlbCBwYXJhbWV0ZXIgMSB0byAzKS4gRm9yIHRoZXNlIGZhc3QgbW9kZXMsIG5ldyBzdHJpbmdzCithcmUgaW5zZXJ0ZWQgaW4gdGhlIGhhc2ggdGFibGUgb25seSB3aGVuIG5vIG1hdGNoIHdhcyBmb3VuZCwgb3IKK3doZW4gdGhlIG1hdGNoIGlzIG5vdCB0b28gbG9uZy4gVGhpcyBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8KK2J1dCBzYXZlcyB0aW1lIHNpbmNlIHRoZXJlIGFyZSBib3RoIGZld2VyIGluc2VydGlvbnMgYW5kIGZld2VyIHNlYXJjaGVzLgorCisKKzIuIERlY29tcHJlc3Npb24gYWxnb3JpdGhtIChpbmZsYXRlKQorCisyLjEgSW50cm9kdWN0aW9uCisKK1RoZSBrZXkgcXVlc3Rpb24gaXMgaG93IHRvIHJlcHJlc2VudCBhIEh1ZmZtYW4gY29kZSAob3IgYW55IHByZWZpeCBjb2RlKSBzbwordGhhdCB5b3UgY2FuIGRlY29kZSBmYXN0LiAgVGhlIG1vc3QgaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljIGlzIHRoYXQgc2hvcnRlcgorY29kZXMgYXJlIG11Y2ggbW9yZSBjb21tb24gdGhhbiBsb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlCitzaG9ydCBjb2RlcyBmYXN0LCBhbmQgbGV0IHRoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KKworaW5mbGF0ZSgpIHNldHMgdXAgYSBmaXJzdCBsZXZlbCB0YWJsZSB0aGF0IGNvdmVycyBzb21lIG51bWJlciBvZiBiaXRzIG9mCitpbnB1dCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBsb25nZXN0IGNvZGUuICBJdCBnZXRzIHRoYXQgbWFueSBiaXRzIGZyb20gdGhlCitzdHJlYW0sIGFuZCBsb29rcyBpdCB1cCBpbiB0aGUgdGFibGUuICBUaGUgdGFibGUgd2lsbCB0ZWxsIGlmIHRoZSBuZXh0Citjb2RlIGlzIHRoYXQgbWFueSBiaXRzIG9yIGxlc3MgYW5kIGhvdyBtYW55LCBhbmQgaWYgaXQgaXMsIGl0IHdpbGwgdGVsbAordGhlIHZhbHVlLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgbGV2ZWwgdGFibGUgZm9yIHdoaWNoIGluZmxhdGUoKQorZ3JhYnMgbW9yZSBiaXRzIGFuZCB0cmllcyB0byBkZWNvZGUgYSBsb25nZXIgY29kZS4KKworSG93IG1hbnkgYml0cyB0byBtYWtlIHRoZSBmaXJzdCBsb29rdXAgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIHRoZSB0aW1lIGl0Cit0YWtlcyB0byBkZWNvZGUgYW5kIHRoZSB0aW1lIGl0IHRha2VzIHRvIGJ1aWxkIHRoZSB0YWJsZS4gIElmIGJ1aWxkaW5nIHRoZQordGFibGUgdG9vayBubyB0aW1lIChhbmQgaWYgeW91IGhhZCBpbmZpbml0ZSBtZW1vcnkpLCB0aGVuIHRoZXJlIHdvdWxkIG9ubHkKK2JlIGEgZmlyc3QgbGV2ZWwgdGFibGUgdG8gY292ZXIgYWxsIHRoZSB3YXkgdG8gdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsCitidWlsZGluZyB0aGUgdGFibGUgZW5kcyB1cCB0YWtpbmcgYSBsb3QgbG9uZ2VyIGZvciBtb3JlIGJpdHMgc2luY2Ugc2hvcnQKK2NvZGVzIGFyZSByZXBsaWNhdGVkIG1hbnkgdGltZXMgaW4gc3VjaCBhIHRhYmxlLiAgV2hhdCBpbmZsYXRlKCkgZG9lcyBpcworc2ltcGx5IHRvIG1ha2UgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaXJzdCB0YWJsZSBhIHZhcmlhYmxlLCBhbmQgIHRoZW4KK3RvIHNldCB0aGF0IHZhcmlhYmxlIGZvciB0aGUgbWF4aW11bSBzcGVlZC4KKworRm9yIGluZmxhdGUsIHdoaWNoIGhhcyAyODYgcG9zc2libGUgY29kZXMgZm9yIHRoZSBsaXRlcmFsL2xlbmd0aCB0cmVlLCB0aGUgc2l6ZQorb2YgdGhlIGZpcnN0IHRhYmxlIGlzIG5pbmUgYml0cy4gIEFsc28gdGhlIGRpc3RhbmNlIHRyZWVzIGhhdmUgMzAgcG9zc2libGUKK3ZhbHVlcywgYW5kIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcyBzaXggYml0cy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBvZgordGhvc2UgY2FzZXMsIHRoZSB0YWJsZSBlbmRlZCB1cCBvbmUgYml0IGxvbmdlciB0aGFuIHRoZSBgYGF2ZXJhZ2UnJyBjb2RlCitsZW5ndGgsIGkuZS4gdGhlIGNvZGUgbGVuZ3RoIG9mIGFuIGFwcHJveGltYXRlbHkgZmxhdCBjb2RlIHdoaWNoIHdvdWxkIGJlIGEKK2xpdHRsZSBtb3JlIHRoYW4gZWlnaHQgYml0cyBmb3IgMjg2IHN5bWJvbHMgYW5kIGEgbGl0dGxlIGxlc3MgdGhhbiBmaXZlIGJpdHMKK2ZvciAzMCBzeW1ib2xzLgorCisKKzIuMiBNb3JlIGRldGFpbHMgb24gdGhlIGluZmxhdGUgdGFibGUgbG9va3VwCisKK09rLCB5b3Ugd2FudCB0byBrbm93IHdoYXQgdGhpcyBjbGV2ZXJseSBvYmZ1c2NhdGVkIGluZmxhdGUgdHJlZSBhY3R1YWxseQorbG9va3MgbGlrZS4gIFlvdSBhcmUgY29ycmVjdCB0aGF0IGl0J3Mgbm90IGEgSHVmZm1hbiB0cmVlLiAgSXQgaXMgc2ltcGx5IGEKK2xvb2t1cCB0YWJsZSBmb3IgdGhlIGZpcnN0LCBsZXQncyBzYXksIG5pbmUgYml0cyBvZiBhIEh1ZmZtYW4gc3ltYm9sLiAgVGhlCitzeW1ib2wgY291bGQgYmUgYXMgc2hvcnQgYXMgb25lIGJpdCBvciBhcyBsb25nIGFzIDE1IGJpdHMuICBJZiBhIHBhcnRpY3VsYXIKK3N5bWJvbCBpcyBzaG9ydGVyIHRoYW4gbmluZSBiaXRzLCB0aGVuIHRoYXQgc3ltYm9sJ3MgdHJhbnNsYXRpb24gaXMgZHVwbGljYXRlZAoraW4gYWxsIHRob3NlIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIHRoYXQgc3ltYm9sJ3MgYml0cy4gIEZvciBleGFtcGxlLCBpZiB0aGUKK3N5bWJvbCBpcyBmb3VyIGJpdHMsIHRoZW4gaXQncyBkdXBsaWNhdGVkIDMyIHRpbWVzIGluIGEgbmluZS1iaXQgdGFibGUuICBJZiBhCitzeW1ib2wgaXMgbmluZSBiaXRzIGxvbmcsIGl0IGFwcGVhcnMgaW4gdGhlIHRhYmxlIG9uY2UuCisKK0lmIHRoZSBzeW1ib2wgaXMgbG9uZ2VyIHRoYW4gbmluZSBiaXRzLCB0aGVuIHRoYXQgZW50cnkgaW4gdGhlIHRhYmxlIHBvaW50cwordG8gYW5vdGhlciBzaW1pbGFyIHRhYmxlIGZvciB0aGUgcmVtYWluaW5nIGJpdHMuICBBZ2FpbiwgdGhlcmUgYXJlIGR1cGxpY2F0ZWQKK2VudHJpZXMgYXMgbmVlZGVkLiAgVGhlIGlkZWEgaXMgdGhhdCBtb3N0IG9mIHRoZSB0aW1lIHRoZSBzeW1ib2wgd2lsbCBiZSBzaG9ydAorYW5kIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgdGFibGUgbG9vayB1cC4gIChUaGF0J3Mgd2hvbGUgaWRlYSBiZWhpbmQgZGF0YQorY29tcHJlc3Npb24gaW4gdGhlIGZpcnN0IHBsYWNlLikgIEZvciB0aGUgbGVzcyBmcmVxdWVudCBsb25nIHN5bWJvbHMsIHRoZXJlCit3aWxsIGJlIHR3byBsb29rdXBzLiAgSWYgeW91IGhhZCBhIGNvbXByZXNzaW9uIG1ldGhvZCB3aXRoIHJlYWxseSBsb25nCitzeW1ib2xzLCB5b3UgY291bGQgaGF2ZSBhcyBtYW55IGxldmVscyBvZiBsb29rdXBzIGFzIGlzIGVmZmljaWVudC4gIEZvcgoraW5mbGF0ZSwgdHdvIGlzIGVub3VnaC4KKworU28gYSB0YWJsZSBlbnRyeSBlaXRoZXIgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUgKGluIHdoaWNoIGNhc2UgbmluZSBiaXRzIGluCit0aGUgYWJvdmUgZXhhbXBsZSBhcmUgZ29iYmxlZCksIG9yIGl0IGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBmb3IgdGhlIHN5bWJvbAorYW5kIHRoZSBudW1iZXIgb2YgYml0cyB0byBnb2JibGUuICBUaGVuIHlvdSBzdGFydCBhZ2FpbiB3aXRoIHRoZSBuZXh0Cit1bmdvYmJsZWQgYml0LgorCitZb3UgbWF5IHdvbmRlcjogd2h5IG5vdCBqdXN0IGhhdmUgb25lIGxvb2t1cCB0YWJsZSBmb3IgaG93IGV2ZXIgbWFueSBiaXRzIHRoZQorbG9uZ2VzdCBzeW1ib2wgaXM/ICBUaGUgcmVhc29uIGlzIHRoYXQgaWYgeW91IGRvIHRoYXQsIHlvdSBlbmQgdXAgc3BlbmRpbmcKK21vcmUgdGltZSBmaWxsaW5nIGluIGR1cGxpY2F0ZSBzeW1ib2wgZW50cmllcyB0aGFuIHlvdSBkbyBhY3R1YWxseSBkZWNvZGluZy4KK0F0IGxlYXN0IGZvciBkZWZsYXRlJ3Mgb3V0cHV0IHRoYXQgZ2VuZXJhdGVzIG5ldyB0cmVlcyBldmVyeSBzZXZlcmFsIDEwJ3Mgb2YKK2tieXRlcy4gIFlvdSBjYW4gaW1hZ2luZSB0aGF0IGZpbGxpbmcgaW4gYSAyXjE1IGVudHJ5IHRhYmxlIGZvciBhIDE1LWJpdCBjb2RlCit3b3VsZCB0YWtlIHRvbyBsb25nIGlmIHlvdSdyZSBvbmx5IGRlY29kaW5nIHNldmVyYWwgdGhvdXNhbmQgc3ltYm9scy4gIEF0IHRoZQorb3RoZXIgZXh0cmVtZSwgeW91IGNvdWxkIG1ha2UgYSBuZXcgdGFibGUgZm9yIGV2ZXJ5IGJpdCBpbiB0aGUgY29kZS4gIEluIGZhY3QsCit0aGF0J3MgZXNzZW50aWFsbHkgYSBIdWZmbWFuIHRyZWUuICBCdXQgdGhlbiB5b3Ugc3BlbmQgdHdvIG11Y2ggdGltZQordHJhdmVyc2luZyB0aGUgdHJlZSB3aGlsZSBkZWNvZGluZywgZXZlbiBmb3Igc2hvcnQgc3ltYm9scy4KKworU28gdGhlIG51bWJlciBvZiBiaXRzIGZvciB0aGUgZmlyc3QgbG9va3VwIHRhYmxlIGlzIGEgdHJhZGUgb2YgdGhlIHRpbWUgdG8KK2ZpbGwgb3V0IHRoZSB0YWJsZSB2cy4gdGhlIHRpbWUgc3BlbnQgbG9va2luZyBhdCB0aGUgc2Vjb25kIGxldmVsIGFuZCBhYm92ZSBvZgordGhlIHRhYmxlLgorCitIZXJlIGlzIGFuIGV4YW1wbGUsIHNjYWxlZCBkb3duOgorCitUaGUgY29kZSBiZWluZyBkZWNvZGVkLCB3aXRoIDEwIHN5bWJvbHMsIGZyb20gMSB0byA2IGJpdHMgbG9uZzoKKworQTogMAorQjogMTAKK0M6IDExMDAKK0Q6IDExMDEwCitFOiAxMTAxMQorRjogMTExMDAKK0c6IDExMTAxCitIOiAxMTExMAorSTogMTExMTEwCitKOiAxMTExMTEKKworTGV0J3MgbWFrZSB0aGUgZmlyc3QgdGFibGUgdGhyZWUgYml0cyBsb25nIChlaWdodCBlbnRyaWVzKToKKworMDAwOiBBLDEKKzAwMTogQSwxCiswMTA6IEEsMQorMDExOiBBLDEKKzEwMDogQiwyCisxMDE6IEIsMgorMTEwOiAtPiB0YWJsZSBYIChnb2JibGUgMyBiaXRzKQorMTExOiAtPiB0YWJsZSBZIChnb2JibGUgMyBiaXRzKQorCitFYWNoIGVudHJ5IGlzIHdoYXQgdGhlIGJpdHMgZGVjb2RlIGFzIGFuZCBob3cgbWFueSBiaXRzIHRoYXQgaXMsIGkuZS4gaG93CittYW55IGJpdHMgdG8gZ29iYmxlLiAgT3IgdGhlIGVudHJ5IHBvaW50cyB0byBhbm90aGVyIHRhYmxlLCB3aXRoIHRoZSBudW1iZXIgb2YKK2JpdHMgdG8gZ29iYmxlIGltcGxpY2l0IGluIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KKworVGFibGUgWCBpcyB0d28gYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTAgaXMgZml2ZSBiaXRzCitsb25nOgorCiswMDogQywxCiswMTogQywxCisxMDogRCwyCisxMTogRSwyCisKK1RhYmxlIFkgaXMgdGhyZWUgYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTEgaXMgc2l4CitiaXRzIGxvbmc6CisKKzAwMDogRiwyCiswMDE6IEYsMgorMDEwOiBHLDIKKzAxMTogRywyCisxMDA6IEgsMgorMTAxOiBILDIKKzExMDogSSwzCisxMTE6IEosMworCitTbyB3aGF0IHdlIGhhdmUgaGVyZSBhcmUgdGhyZWUgdGFibGVzIHdpdGggYSB0b3RhbCBvZiAyMCBlbnRyaWVzIHRoYXQgaGFkIHRvCitiZSBjb25zdHJ1Y3RlZC4gIFRoYXQncyBjb21wYXJlZCB0byA2NCBlbnRyaWVzIGZvciBhIHNpbmdsZSB0YWJsZS4gIE9yCitjb21wYXJlZCB0byAxNiBlbnRyaWVzIGZvciBhIEh1ZmZtYW4gdHJlZSAoc2l4IHR3byBlbnRyeSB0YWJsZXMgYW5kIG9uZSBmb3VyCitlbnRyeSB0YWJsZSkuICBBc3N1bWluZyB0aGF0IHRoZSBjb2RlIGlkZWFsbHkgcmVwcmVzZW50cyB0aGUgcHJvYmFiaWxpdHkgb2YKK3RoZSBzeW1ib2xzLCBpdCB0YWtlcyBvbiB0aGUgYXZlcmFnZSAxLjI1IGxvb2t1cHMgcGVyIHN5bWJvbC4gIFRoYXQncyBjb21wYXJlZAordG8gb25lIGxvb2t1cCBmb3IgdGhlIHNpbmdsZSB0YWJsZSwgb3IgMS42NiBsb29rdXBzIHBlciBzeW1ib2wgZm9yIHRoZQorSHVmZm1hbiB0cmVlLgorCitUaGVyZSwgSSB0aGluayB0aGF0IGdpdmVzIHlvdSBhIHBpY3R1cmUgb2Ygd2hhdCdzIGdvaW5nIG9uLiAgRm9yIGluZmxhdGUsIHRoZQorbWVhbmluZyBvZiBhIHBhcnRpY3VsYXIgc3ltYm9sIGlzIG9mdGVuIG1vcmUgdGhhbiBqdXN0IGEgbGV0dGVyLiAgSXQgY2FuIGJlIGEKK2J5dGUgKGEgImxpdGVyYWwiKSwgb3IgaXQgY2FuIGJlIGVpdGhlciBhIGxlbmd0aCBvciBhIGRpc3RhbmNlIHdoaWNoCitpbmRpY2F0ZXMgYSBiYXNlIHZhbHVlIGFuZCBhIG51bWJlciBvZiBiaXRzIHRvIGZldGNoIGFmdGVyIHRoZSBjb2RlIHRoYXQgaXMKK2FkZGVkIHRvIHRoZSBiYXNlIHZhbHVlLiAgT3IgaXQgbWlnaHQgYmUgdGhlIHNwZWNpYWwgZW5kLW9mLWJsb2NrIGNvZGUuICBUaGUKK2RhdGEgc3RydWN0dXJlcyBjcmVhdGVkIGluIGluZnRyZWVzLmMgdHJ5IHRvIGVuY29kZSBhbGwgdGhhdCBpbmZvcm1hdGlvbgorY29tcGFjdGx5IGluIHRoZSB0YWJsZXMuCisKKworSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgoramxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKK1JlZmVyZW5jZXM6CisKK1tMWjc3XSBaaXYgSi4sIExlbXBlbCBBLiwgYGBBIFVuaXZlcnNhbCBBbGdvcml0aG0gZm9yIFNlcXVlbnRpYWwgRGF0YQorQ29tcHJlc3Npb24sJycgSUVFRSBUcmFuc2FjdGlvbnMgb24gSW5mb3JtYXRpb24gVGhlb3J5LCBWb2wuIDIzLCBOby4gMywKK3BwLiAzMzctMzQzLgorCitgYERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uJycgYXZhaWxhYmxlIGluCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvY29tcHJlc3MuYyBiL3Vzci9rbGliYy96bGliL2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0OGY1NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2NvbXByZXNzLmMKQEAgLTAsMCArMSw3OSBAQAorLyogY29tcHJlc3MuYyAtLSBjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQ6IGNvbXByZXNzLmMsdiAxLjEgMjAwNS8wMi8yNyAyMzoxNTozOSBocGEgRXhwICQgKi8KKworI2RlZmluZSBaTElCX0lOVEVSTkFMCisjaW5jbHVkZSAiemxpYi5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIFRoZSBsZXZlbAorICAgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGRlZmxhdGVJbml0LiAgc291cmNlTGVuIGlzIHRoZSBieXRlCisgICBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCisgICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbiBzb3VyY2VMZW4gcGx1cworICAgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorCisgICAgIGNvbXByZXNzMiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKKyAgIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyovCitpbnQgWkVYUE9SVCBjb21wcmVzczIgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuLCBsZXZlbCkKKyAgICBCeXRlZiAqZGVzdDsKKyAgICB1TG9uZ2YgKmRlc3RMZW47CisgICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKKyAgICB1TG9uZyBzb3VyY2VMZW47CisgICAgaW50IGxldmVsOworeworICAgIHpfc3RyZWFtIHN0cmVhbTsKKyAgICBpbnQgZXJyOworCisgICAgc3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYqKXNvdXJjZTsKKyAgICBzdHJlYW0uYXZhaWxfaW4gPSAodUludClzb3VyY2VMZW47CisjaWZkZWYgTUFYU0VHXzY0SworICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisjZW5kaWYKKyAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OworICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKKyAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgbGV2ZWwpOworICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICAgIHJldHVybiBlcnIgPT0gWl9PSyA/IFpfQlVGX0VSUk9SIDogZXJyOworICAgIH0KKyAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICBlcnIgPSBkZWZsYXRlRW5kKCZzdHJlYW0pOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitpbnQgWkVYUE9SVCBjb21wcmVzcyAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4pCisgICAgQnl0ZWYgKmRlc3Q7CisgICAgdUxvbmdmICpkZXN0TGVuOworICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7CisgICAgdUxvbmcgc291cmNlTGVuOworeworICAgIHJldHVybiBjb21wcmVzczIoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBJZiB0aGUgZGVmYXVsdCBtZW1MZXZlbCBvciB3aW5kb3dCaXRzIGZvciBkZWZsYXRlSW5pdCgpIGlzIGNoYW5nZWQsIHRoZW4KKyAgIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAqLwordUxvbmcgWkVYUE9SVCBjb21wcmVzc0JvdW5kIChzb3VyY2VMZW4pCisgICAgdUxvbmcgc291cmNlTGVuOworeworICAgIHJldHVybiBzb3VyY2VMZW4gKyAoc291cmNlTGVuID4+IDEyKSArIChzb3VyY2VMZW4gPj4gMTQpICsgMTE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9jcmMzMi5jIGIvdXNyL2tsaWJjL3psaWIvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjU4YTllCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvY3JjMzIuYwpAQCAtMCwwICsxLDQyMyBAQAorLyogY3JjMzIuYyAtLSBjb21wdXRlIHRoZSBDUkMtMzIgb2YgYSBkYXRhIHN0cmVhbQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICoKKyAqIFRoYW5rcyB0byBSb2RuZXkgQnJvd24gPHJicm93bjY0QGNzYy5jb20uYXU+IGZvciBoaXMgY29udHJpYnV0aW9uIG9mIGZhc3RlcgorICogQ1JDIG1ldGhvZHM6IGV4Y2x1c2l2ZS1vcmluZyAzMiBiaXRzIG9mIGRhdGEgYXQgYSB0aW1lLCBhbmQgcHJlLWNvbXB1dGluZworICogdGFibGVzIGZvciB1cGRhdGluZyB0aGUgc2hpZnQgcmVnaXN0ZXIgaW4gb25lIHN0ZXAgd2l0aCB0aHJlZSBleGNsdXNpdmUtb3JzCisgKiBpbnN0ZWFkIG9mIGZvdXIgc3RlcHMgd2l0aCBmb3VyIGV4Y2x1c2l2ZS1vcnMuICBUaGlzIHJlc3VsdHMgaW4gYWJvdXQgYQorICogZmFjdG9yIG9mIHR3byBpbmNyZWFzZSBpbiBzcGVlZCBvbiBhIFBvd2VyIFBDIEc0IChQUEM3NDU1KSB1c2luZyBnY2MgLU8zLgorICovCisKKy8qIEAoIykgJElkJCAqLworCisvKgorICBOb3RlIG9uIHRoZSB1c2Ugb2YgRFlOQU1JQ19DUkNfVEFCTEU6IHRoZXJlIGlzIG5vIG11dGV4IG9yIHNlbWFwaG9yZQorICBwcm90ZWN0aW9uIG9uIHRoZSBzdGF0aWMgdmFyaWFibGVzIHVzZWQgdG8gY29udHJvbCB0aGUgZmlyc3QtdXNlIGdlbmVyYXRpb24KKyAgb2YgdGhlIGNyYyB0YWJsZXMuICBUaGVyZWZvcmUsIGlmIHlvdSAjZGVmaW5lIERZTkFNSUNfQ1JDX1RBQkxFLCB5b3Ugc2hvdWxkCisgIGZpcnN0IGNhbGwgZ2V0X2NyY190YWJsZSgpIHRvIGluaXRpYWxpemUgdGhlIHRhYmxlcyBiZWZvcmUgYWxsb3dpbmcgbW9yZSB0aGFuCisgIG9uZSB0aHJlYWQgdG8gdXNlIGNyYzMyKCkuCisgKi8KKworI2lmZGVmIE1BS0VDUkNICisjICBpbmNsdWRlIDxzdGRpby5oPgorIyAgaWZuZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisjICAgIGRlZmluZSBEWU5BTUlDX0NSQ19UQUJMRQorIyAgZW5kaWYgLyogIURZTkFNSUNfQ1JDX1RBQkxFICovCisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KKworI2luY2x1ZGUgInp1dGlsLmgiICAgICAgLyogZm9yIFNUREMgYW5kIEZBUiBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisvKiBGaW5kIGEgZm91ci1ieXRlIGludGVnZXIgdHlwZSBmb3IgY3JjMzJfbGl0dGxlKCkgYW5kIGNyYzMyX2JpZygpLiAqLworI2lmbmRlZiBOT0JZRk9VUgorIyAgaWZkZWYgU1REQyAgICAgICAgICAgLyogbmVlZCBBTlNJIEMgbGltaXRzLmggdG8gZGV0ZXJtaW5lIHNpemVzICovCisjICAgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgICBkZWZpbmUgQllGT1VSCisjICAgIGlmIChVSU5UX01BWCA9PSAweGZmZmZmZmZmVUwpCisgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdTQ7CisjICAgIGVsc2UKKyMgICAgICBpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB1NDsKKyMgICAgICBlbHNlCisjICAgICAgICBpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1NDsKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgdW5kZWYgQllGT1VSICAgICAvKiBjYW4ndCBmaW5kIGEgZm91ci1ieXRlIGludGVnZXIgdHlwZSEgKi8KKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmIC8qIFNUREMgKi8KKyNlbmRpZiAvKiAhTk9CWUZPVVIgKi8KKworLyogRGVmaW5pdGlvbnMgZm9yIGRvaW5nIHRoZSBjcmMgZm91ciBkYXRhIGJ5dGVzIGF0IGEgdGltZS4gKi8KKyNpZmRlZiBCWUZPVVIKKyMgIGRlZmluZSBSRVYodykgKCgodyk+PjI0KSsoKCh3KT4+OCkmMHhmZjAwKSsgXAorICAgICAgICAgICAgICAgICgoKHcpJjB4ZmYwMCk8PDgpKygoKHcpJjB4ZmYpPDwyNCkpCisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZSBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisjICBkZWZpbmUgVEJMUyA4CisjZWxzZQorIyAgZGVmaW5lIFRCTFMgMQorI2VuZGlmIC8qIEJZRk9VUiAqLworCisvKiBMb2NhbCBmdW5jdGlvbnMgZm9yIGNyYyBjb25jYXRlbmF0aW9uICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMgT0YoKHVuc2lnbmVkIGxvbmcgKm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2ZWMpKTsKK2xvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUgT0YoKHVuc2lnbmVkIGxvbmcgKnNxdWFyZSwgdW5zaWduZWQgbG9uZyAqbWF0KSk7CisKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorCitsb2NhbCB2b2xhdGlsZSBpbnQgY3JjX3RhYmxlX2VtcHR5ID0gMTsKK2xvY2FsIHVuc2lnbmVkIGxvbmcgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdOworbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSBPRigodm9pZCkpOworI2lmZGVmIE1BS0VDUkNICisgICBsb2NhbCB2b2lkIHdyaXRlX3RhYmxlIE9GKChGSUxFICosIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICopKTsKKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworLyoKKyAgR2VuZXJhdGUgdGFibGVzIGZvciBhIGJ5dGUtd2lzZSAzMi1iaXQgQ1JDIGNhbGN1bGF0aW9uIG9uIHRoZSBwb2x5bm9taWFsOgorICB4XjMyK3heMjYreF4yMyt4XjIyK3heMTYreF4xMit4XjExK3heMTAreF44K3heNyt4XjUreF40K3heMit4KzEuCisKKyAgUG9seW5vbWlhbHMgb3ZlciBHRigyKSBhcmUgcmVwcmVzZW50ZWQgaW4gYmluYXJ5LCBvbmUgYml0IHBlciBjb2VmZmljaWVudCwKKyAgd2l0aCB0aGUgbG93ZXN0IHBvd2VycyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUaGVuIGFkZGluZyBwb2x5bm9taWFscworICBpcyBqdXN0IGV4Y2x1c2l2ZS1vciwgYW5kIG11bHRpcGx5aW5nIGEgcG9seW5vbWlhbCBieSB4IGlzIGEgcmlnaHQgc2hpZnQgYnkKKyAgb25lLiAgSWYgd2UgY2FsbCB0aGUgYWJvdmUgcG9seW5vbWlhbCBwLCBhbmQgcmVwcmVzZW50IGEgYnl0ZSBhcyB0aGUKKyAgcG9seW5vbWlhbCBxLCBhbHNvIHdpdGggdGhlIGxvd2VzdCBwb3dlciBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgKHNvIHRoZQorICBieXRlIDB4YjEgaXMgdGhlIHBvbHlub21pYWwgeF43K3heMyt4KzEpLCB0aGVuIHRoZSBDUkMgaXMgKHEqeF4zMikgbW9kIHAsCisgIHdoZXJlIGEgbW9kIGIgbWVhbnMgdGhlIHJlbWFpbmRlciBhZnRlciBkaXZpZGluZyBhIGJ5IGIuCisKKyAgVGhpcyBjYWxjdWxhdGlvbiBpcyBkb25lIHVzaW5nIHRoZSBzaGlmdC1yZWdpc3RlciBtZXRob2Qgb2YgbXVsdGlwbHlpbmcgYW5kCisgIHRha2luZyB0aGUgcmVtYWluZGVyLiAgVGhlIHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIHplcm8sIGFuZCBmb3IgZWFjaAorICBpbmNvbWluZyBiaXQsIHheMzIgaXMgYWRkZWQgbW9kIHAgdG8gdGhlIHJlZ2lzdGVyIGlmIHRoZSBiaXQgaXMgYSBvbmUgKHdoZXJlCisgIHheMzIgbW9kIHAgaXMgcCt4XjMyID0geF4yNisuLi4rMSksIGFuZCB0aGUgcmVnaXN0ZXIgaXMgbXVsdGlwbGllZCBtb2QgcCBieQorICB4ICh3aGljaCBpcyBzaGlmdGluZyByaWdodCBieSBvbmUgYW5kIGFkZGluZyB4XjMyIG1vZCBwIGlmIHRoZSBiaXQgc2hpZnRlZAorICBvdXQgaXMgYSBvbmUpLiAgV2Ugc3RhcnQgd2l0aCB0aGUgaGlnaGVzdCBwb3dlciAobGVhc3Qgc2lnbmlmaWNhbnQgYml0KSBvZgorICBxIGFuZCByZXBlYXQgZm9yIGFsbCBlaWdodCBiaXRzIG9mIHEuCisKKyAgVGhlIGZpcnN0IHRhYmxlIGlzIHNpbXBseSB0aGUgQ1JDIG9mIGFsbCBwb3NzaWJsZSBlaWdodCBiaXQgdmFsdWVzLiAgVGhpcyBpcworICBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBDUkNzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCisgIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4gIFRoZSByZW1haW5pbmcgdGFibGVzCisgIGFsbG93IGZvciB3b3JkLWF0LWEtdGltZSBDUkMgY2FsY3VsYXRpb24gZm9yIGJvdGggYmlnLWVuZGlhbiBhbmQgbGl0dGxlLQorICBlbmRpYW4gbWFjaGluZXMsIHdoZXJlIGEgd29yZCBpcyBmb3VyIGJ5dGVzLgorKi8KK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUoKQoreworICAgIHVuc2lnbmVkIGxvbmcgYzsKKyAgICBpbnQgbiwgazsKKyAgICB1bnNpZ25lZCBsb25nIHBvbHk7ICAgICAgICAgICAgICAgICAvKiBwb2x5bm9taWFsIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuICovCisgICAgLyogdGVybXMgb2YgcG9seW5vbWlhbCBkZWZpbmluZyB0aGlzIGNyYyAoZXhjZXB0IHheMzIpOiAqLworICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQgZmlyc3QgPSAxOyAgICAgIC8qIGZsYWcgdG8gbGltaXQgY29uY3VycmVudCBtYWtpbmcgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwW10gPSB7MCwxLDIsNCw1LDcsOCwxMCwxMSwxMiwxNiwyMiwyMywyNn07CisKKyAgICAvKiBTZWUgaWYgYW5vdGhlciB0YXNrIGlzIGFscmVhZHkgZG9pbmcgdGhpcyAobm90IHRocmVhZC1zYWZlLCBidXQgYmV0dGVyCisgICAgICAgdGhhbiBub3RoaW5nIC0tIHNpZ25pZmljYW50bHkgcmVkdWNlcyBkdXJhdGlvbiBvZiB2dWxuZXJhYmlsaXR5IGluCisgICAgICAgY2FzZSB0aGUgYWR2aWNlIGFib3V0IERZTkFNSUNfQ1JDX1RBQkxFIGlzIGlnbm9yZWQpICovCisgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gMDsKKworICAgICAgICAvKiBtYWtlIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuIGZyb20gcG9seW5vbWlhbCAoMHhlZGI4ODMyMFVMKSAqLworICAgICAgICBwb2x5ID0gMFVMOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZW9mKHApL3NpemVvZih1bnNpZ25lZCBjaGFyKTsgbisrKQorICAgICAgICAgICAgcG9seSB8PSAxVUwgPDwgKDMxIC0gcFtuXSk7CisKKyAgICAgICAgLyogZ2VuZXJhdGUgYSBjcmMgZm9yIGV2ZXJ5IDgtYml0IHZhbHVlICovCisgICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworICAgICAgICAgICAgYyA9ICh1bnNpZ25lZCBsb25nKW47CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgICAgIGMgPSBjICYgMSA/IHBvbHkgXiAoYyA+PiAxKSA6IGMgPj4gMTsKKyAgICAgICAgICAgIGNyY190YWJsZVswXVtuXSA9IGM7CisgICAgICAgIH0KKworI2lmZGVmIEJZRk9VUgorICAgICAgICAvKiBnZW5lcmF0ZSBjcmMgZm9yIGVhY2ggdmFsdWUgZm9sbG93ZWQgYnkgb25lLCB0d28sIGFuZCB0aHJlZSB6ZXJvcywKKyAgICAgICAgICAgYW5kIHRoZW4gdGhlIGJ5dGUgcmV2ZXJzYWwgb2YgdGhvc2UgYXMgd2VsbCBhcyB0aGUgZmlyc3QgdGFibGUgKi8KKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7CisgICAgICAgICAgICBjID0gY3JjX3RhYmxlWzBdW25dOworICAgICAgICAgICAgY3JjX3RhYmxlWzRdW25dID0gUkVWKGMpOworICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bYyAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgICAgICAgICAgICAgY3JjX3RhYmxlW2tdW25dID0gYzsKKyAgICAgICAgICAgICAgICBjcmNfdGFibGVbayArIDRdW25dID0gUkVWKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQllGT1VSICovCisKKyAgICAgICAgY3JjX3RhYmxlX2VtcHR5ID0gMDsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgLyogbm90IGZpcnN0ICovCisgICAgICAgIC8qIHdhaXQgZm9yIHRoZSBvdGhlciBndXkgdG8gZmluaXNoIChub3QgZWZmaWNpZW50LCBidXQgcmFyZSkgKi8KKyAgICAgICAgd2hpbGUgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgICAgICAgIDsKKyAgICB9CisKKyNpZmRlZiBNQUtFQ1JDSAorICAgIC8qIHdyaXRlIG91dCBDUkMgdGFibGVzIHRvIGNyYzMyLmggKi8KKyAgICB7CisgICAgICAgIEZJTEUgKm91dDsKKworICAgICAgICBvdXQgPSBmb3BlbigiY3JjMzIuaCIsICJ3Iik7CisgICAgICAgIGlmIChvdXQgPT0gTlVMTCkgcmV0dXJuOworICAgICAgICBmcHJpbnRmKG91dCwgIi8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb25cbiIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmNcbiAqL1xuXG4iKTsKKyAgICAgICAgZnByaW50ZihvdXQsICJsb2NhbCBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAiKTsKKyAgICAgICAgZnByaW50ZihvdXQsICJjcmNfdGFibGVbVEJMU11bMjU2XSA9XG57XG4gIHtcbiIpOworICAgICAgICB3cml0ZV90YWJsZShvdXQsIGNyY190YWJsZVswXSk7CisjICBpZmRlZiBCWUZPVVIKKyAgICAgICAgZnByaW50ZihvdXQsICIjaWZkZWYgQllGT1VSXG4iKTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykgeworICAgICAgICAgICAgZnByaW50ZihvdXQsICIgIH0sXG4gIHtcbiIpOworICAgICAgICAgICAgd3JpdGVfdGFibGUob3V0LCBjcmNfdGFibGVba10pOworICAgICAgICB9CisgICAgICAgIGZwcmludGYob3V0LCAiI2VuZGlmXG4iKTsKKyMgIGVuZGlmIC8qIEJZRk9VUiAqLworICAgICAgICBmcHJpbnRmKG91dCwgIiAgfVxufTtcbiIpOworICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICB9CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KK30KKworI2lmZGVmIE1BS0VDUkNICitsb2NhbCB2b2lkIHdyaXRlX3RhYmxlKG91dCwgdGFibGUpCisgICAgRklMRSAqb3V0OworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICp0YWJsZTsKK3sKKyAgICBpbnQgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykKKyAgICAgICAgZnByaW50ZihvdXQsICIlczB4JTA4bHhVTCVzIiwgbiAlIDUgPyAiIiA6ICIgICAgIiwgdGFibGVbbl0sCisgICAgICAgICAgICAgICAgbiA9PSAyNTUgPyAiXG4iIDogKG4gJSA1ID09IDQgPyAiLFxuIiA6ICIsICIpKTsKK30KKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworCisjZWxzZSAvKiAhRFlOQU1JQ19DUkNfVEFCTEUgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGFibGVzIG9mIENSQy0zMnMgb2YgYWxsIHNpbmdsZS1ieXRlIHZhbHVlcywgbWFkZSBieSBtYWtlX2NyY190YWJsZSgpLgorICovCisjaW5jbHVkZSAiY3JjMzIuaCIKKyNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGFzbSB2ZXJzaW9ucyBvZiBjcmMzMigpCisgKi8KK2NvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKK3sKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorICAgIGlmIChjcmNfdGFibGVfZW1wdHkpCisgICAgICAgIG1ha2VfY3JjX3RhYmxlKCk7CisjZW5kaWYgLyogRFlOQU1JQ19DUkNfVEFCTEUgKi8KKyAgICByZXR1cm4gKGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICopY3JjX3RhYmxlOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIERPMSBjcmMgPSBjcmNfdGFibGVbMF1bKChpbnQpY3JjIF4gKCpidWYrKykpICYgMHhmZl0gXiAoY3JjID4+IDgpCisjZGVmaW5lIERPOCBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1bnNpZ25lZCBsb25nIFpFWFBPUlQgY3JjMzIoY3JjLCBidWYsIGxlbikKKyAgICB1bnNpZ25lZCBsb25nIGNyYzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICBpZiAoYnVmID09IFpfTlVMTCkgcmV0dXJuIDBVTDsKKworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgaWYgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLworCisjaWZkZWYgQllGT1VSCisgICAgaWYgKHNpemVvZih2b2lkICopID09IHNpemVvZihwdHJkaWZmX3QpKSB7CisgICAgICAgIHU0IGVuZGlhbjsKKworICAgICAgICBlbmRpYW4gPSAxOworICAgICAgICBpZiAoKigodW5zaWduZWQgY2hhciAqKSgmZW5kaWFuKSkpCisgICAgICAgICAgICByZXR1cm4gY3JjMzJfbGl0dGxlKGNyYywgYnVmLCBsZW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY3JjMzJfYmlnKGNyYywgYnVmLCBsZW4pOworICAgIH0KKyNlbmRpZiAvKiBCWUZPVVIgKi8KKyAgICBjcmMgPSBjcmMgXiAweGZmZmZmZmZmVUw7CisgICAgd2hpbGUgKGxlbiA+PSA4KSB7CisgICAgICAgIERPODsKKyAgICAgICAgbGVuIC09IDg7CisgICAgfQorICAgIGlmIChsZW4pIGRvIHsKKyAgICAgICAgRE8xOworICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICByZXR1cm4gY3JjIF4gMHhmZmZmZmZmZlVMOworfQorCisjaWZkZWYgQllGT1VSCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgRE9MSVQ0IGMgXj0gKmJ1ZjQrKzsgXAorICAgICAgICBjID0gY3JjX3RhYmxlWzNdW2MgJiAweGZmXSBeIGNyY190YWJsZVsyXVsoYyA+PiA4KSAmIDB4ZmZdIF4gXAorICAgICAgICAgICAgY3JjX3RhYmxlWzFdWyhjID4+IDE2KSAmIDB4ZmZdIF4gY3JjX3RhYmxlWzBdW2MgPj4gMjRdCisjZGVmaW5lIERPTElUMzIgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9saXR0bGUoY3JjLCBidWYsIGxlbikKKyAgICB1bnNpZ25lZCBsb25nIGNyYzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICByZWdpc3RlciB1NCBjOworICAgIHJlZ2lzdGVyIGNvbnN0IHU0IEZBUiAqYnVmNDsKKworICAgIGMgPSAodTQpY3JjOworICAgIGMgPSB+YzsKKyAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bKGMgXiAqYnVmKyspICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgYnVmNCA9IChjb25zdCB1NCBGQVIgKikoY29uc3Qgdm9pZCBGQVIgKilidWY7CisgICAgd2hpbGUgKGxlbiA+PSAzMikgeworICAgICAgICBET0xJVDMyOworICAgICAgICBsZW4gLT0gMzI7CisgICAgfQorICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgICBET0xJVDQ7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKyAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKilidWY0OworCisgICAgaWYgKGxlbikgZG8geworICAgICAgICBjID0gY3JjX3RhYmxlWzBdWyhjIF4gKmJ1ZisrKSAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIGMgPSB+YzsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBET0JJRzQgYyBePSAqKytidWY0OyBcCisgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bYyAmIDB4ZmZdIF4gY3JjX3RhYmxlWzVdWyhjID4+IDgpICYgMHhmZl0gXiBcCisgICAgICAgICAgICBjcmNfdGFibGVbNl1bKGMgPj4gMTYpICYgMHhmZl0gXiBjcmNfdGFibGVbN11bYyA+PiAyNF0KKyNkZWZpbmUgRE9CSUczMiBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyhjcmMsIGJ1ZiwgbGVuKQorICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIHJlZ2lzdGVyIHU0IGM7CisgICAgcmVnaXN0ZXIgY29uc3QgdTQgRkFSICpidWY0OworCisgICAgYyA9IFJFVigodTQpY3JjKTsKKyAgICBjID0gfmM7CisgICAgd2hpbGUgKGxlbiAmJiAoKHB0cmRpZmZfdClidWYgJiAzKSkgeworICAgICAgICBjID0gY3JjX3RhYmxlWzRdWyhjID4+IDI0KSBeICpidWYrK10gXiAoYyA8PCA4KTsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgYnVmNCA9IChjb25zdCB1NCBGQVIgKikoY29uc3Qgdm9pZCBGQVIgKilidWY7CisgICAgYnVmNC0tOworICAgIHdoaWxlIChsZW4gPj0gMzIpIHsKKyAgICAgICAgRE9CSUczMjsKKyAgICAgICAgbGVuIC09IDMyOworICAgIH0KKyAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgRE9CSUc0OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisgICAgYnVmNCsrOworICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqKWJ1ZjQ7CisKKyAgICBpZiAobGVuKSBkbyB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOworICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICBjID0gfmM7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKShSRVYoYykpOworfQorCisjZW5kaWYgLyogQllGT1VSICovCisKKyNkZWZpbmUgR0YyX0RJTSAzMiAgICAgIC8qIGRpbWVuc2lvbiBvZiBHRigyKSB2ZWN0b3JzIChsZW5ndGggb2YgQ1JDKSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMobWF0LCB2ZWMpCisgICAgdW5zaWduZWQgbG9uZyAqbWF0OworICAgIHVuc2lnbmVkIGxvbmcgdmVjOworeworICAgIHVuc2lnbmVkIGxvbmcgc3VtOworCisgICAgc3VtID0gMDsKKyAgICB3aGlsZSAodmVjKSB7CisgICAgICAgIGlmICh2ZWMgJiAxKQorICAgICAgICAgICAgc3VtIF49ICptYXQ7CisgICAgICAgIHZlYyA+Pj0gMTsKKyAgICAgICAgbWF0Kys7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUoc3F1YXJlLCBtYXQpCisgICAgdW5zaWduZWQgbG9uZyAqc3F1YXJlOworICAgIHVuc2lnbmVkIGxvbmcgKm1hdDsKK3sKKyAgICBpbnQgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCBHRjJfRElNOyBuKyspCisgICAgICAgIHNxdWFyZVtuXSA9IGdmMl9tYXRyaXhfdGltZXMobWF0LCBtYXRbbl0pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUoY3JjMSwgY3JjMiwgbGVuMikKKyAgICB1TG9uZyBjcmMxOworICAgIHVMb25nIGNyYzI7CisgICAgel9vZmZfdCBsZW4yOworeworICAgIGludCBuOworICAgIHVuc2lnbmVkIGxvbmcgcm93OworICAgIHVuc2lnbmVkIGxvbmcgZXZlbltHRjJfRElNXTsgICAgLyogZXZlbi1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9kZFtHRjJfRElNXTsgICAgIC8qIG9kZC1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KKworICAgIC8qIGRlZ2VuZXJhdGUgY2FzZSAqLworICAgIGlmIChsZW4yID09IDApCisgICAgICAgIHJldHVybiBjcmMxOworCisgICAgLyogcHV0IG9wZXJhdG9yIGZvciBvbmUgemVybyBiaXQgaW4gb2RkICovCisgICAgb2RkWzBdID0gMHhlZGI4ODMyMEw7ICAgICAgICAgICAvKiBDUkMtMzIgcG9seW5vbWlhbCAqLworICAgIHJvdyA9IDE7CisgICAgZm9yIChuID0gMTsgbiA8IEdGMl9ESU07IG4rKykgeworICAgICAgICBvZGRbbl0gPSByb3c7CisgICAgICAgIHJvdyA8PD0gMTsKKyAgICB9CisKKyAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIHR3byB6ZXJvIGJpdHMgaW4gZXZlbiAqLworICAgIGdmMl9tYXRyaXhfc3F1YXJlKGV2ZW4sIG9kZCk7CisKKyAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIGZvdXIgemVybyBiaXRzIGluIG9kZCAqLworICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7CisKKyAgICAvKiBhcHBseSBsZW4yIHplcm9zIHRvIGNyYzEgKGZpcnN0IHNxdWFyZSB3aWxsIHB1dCB0aGUgb3BlcmF0b3IgZm9yIG9uZQorICAgICAgIHplcm8gYnl0ZSwgZWlnaHQgemVybyBiaXRzLCBpbiBldmVuKSAqLworICAgIGRvIHsKKyAgICAgICAgLyogYXBwbHkgemVyb3Mgb3BlcmF0b3IgZm9yIHRoaXMgYml0IG9mIGxlbjIgKi8KKyAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKKyAgICAgICAgaWYgKGxlbjIgJiAxKQorICAgICAgICAgICAgY3JjMSA9IGdmMl9tYXRyaXhfdGltZXMoZXZlbiwgY3JjMSk7CisgICAgICAgIGxlbjIgPj49IDE7CisKKyAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCisgICAgICAgIGlmIChsZW4yID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBhbm90aGVyIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aXRoIG9kZCBhbmQgZXZlbiBzd2FwcGVkICovCisgICAgICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7CisgICAgICAgIGlmIChsZW4yICYgMSkKKyAgICAgICAgICAgIGNyYzEgPSBnZjJfbWF0cml4X3RpbWVzKG9kZCwgY3JjMSk7CisgICAgICAgIGxlbjIgPj49IDE7CisKKyAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCisgICAgfSB3aGlsZSAobGVuMiAhPSAwKTsKKworICAgIC8qIHJldHVybiBjb21iaW5lZCBjcmMgKi8KKyAgICBjcmMxIF49IGNyYzI7CisgICAgcmV0dXJuIGNyYzE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9jcmMzMi5oIGIvdXNyL2tsaWJjL3psaWIvY3JjMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDUzYjYxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvY3JjMzIuaApAQCAtMCwwICsxLDQ0MSBAQAorLyogY3JjMzIuaCAtLSB0YWJsZXMgZm9yIHJhcGlkIENSQyBjYWxjdWxhdGlvbgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuYworICovCisKK2xvY2FsIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdID0KK3sKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg3NzA3MzA5NlVMLCAweGVlMGU2MTJjVUwsIDB4OTkwOTUxYmFVTCwgMHgwNzZkYzQxOVVMLAorICAgIDB4NzA2YWY0OGZVTCwgMHhlOTYzYTUzNVVMLCAweDllNjQ5NWEzVUwsIDB4MGVkYjg4MzJVTCwgMHg3OWRjYjhhNFVMLAorICAgIDB4ZTBkNWU5MWVVTCwgMHg5N2QyZDk4OFVMLCAweDA5YjY0YzJiVUwsIDB4N2ViMTdjYmRVTCwgMHhlN2I4MmQwN1VMLAorICAgIDB4OTBiZjFkOTFVTCwgMHgxZGI3MTA2NFVMLCAweDZhYjAyMGYyVUwsIDB4ZjNiOTcxNDhVTCwgMHg4NGJlNDFkZVVMLAorICAgIDB4MWFkYWQ0N2RVTCwgMHg2ZGRkZTRlYlVMLCAweGY0ZDRiNTUxVUwsIDB4ODNkMzg1YzdVTCwgMHgxMzZjOTg1NlVMLAorICAgIDB4NjQ2YmE4YzBVTCwgMHhmZDYyZjk3YVVMLCAweDhhNjVjOWVjVUwsIDB4MTQwMTVjNGZVTCwgMHg2MzA2NmNkOVVMLAorICAgIDB4ZmEwZjNkNjNVTCwgMHg4ZDA4MGRmNVVMLCAweDNiNmUyMGM4VUwsIDB4NGM2OTEwNWVVTCwgMHhkNTYwNDFlNFVMLAorICAgIDB4YTI2NzcxNzJVTCwgMHgzYzAzZTRkMVVMLCAweDRiMDRkNDQ3VUwsIDB4ZDIwZDg1ZmRVTCwgMHhhNTBhYjU2YlVMLAorICAgIDB4MzViNWE4ZmFVTCwgMHg0MmIyOTg2Y1VMLCAweGRiYmJjOWQ2VUwsIDB4YWNiY2Y5NDBVTCwgMHgzMmQ4NmNlM1VMLAorICAgIDB4NDVkZjVjNzVVTCwgMHhkY2Q2MGRjZlVMLCAweGFiZDEzZDU5VUwsIDB4MjZkOTMwYWNVTCwgMHg1MWRlMDAzYVVMLAorICAgIDB4YzhkNzUxODBVTCwgMHhiZmQwNjExNlVMLCAweDIxYjRmNGI1VUwsIDB4NTZiM2M0MjNVTCwgMHhjZmJhOTU5OVVMLAorICAgIDB4YjhiZGE1MGZVTCwgMHgyODAyYjg5ZVVMLCAweDVmMDU4ODA4VUwsIDB4YzYwY2Q5YjJVTCwgMHhiMTBiZTkyNFVMLAorICAgIDB4MmY2ZjdjODdVTCwgMHg1ODY4NGMxMVVMLCAweGMxNjExZGFiVUwsIDB4YjY2NjJkM2RVTCwgMHg3NmRjNDE5MFVMLAorICAgIDB4MDFkYjcxMDZVTCwgMHg5OGQyMjBiY1VMLCAweGVmZDUxMDJhVUwsIDB4NzFiMTg1ODlVTCwgMHgwNmI2YjUxZlVMLAorICAgIDB4OWZiZmU0YTVVTCwgMHhlOGI4ZDQzM1VMLCAweDc4MDdjOWEyVUwsIDB4MGYwMGY5MzRVTCwgMHg5NjA5YTg4ZVVMLAorICAgIDB4ZTEwZTk4MThVTCwgMHg3ZjZhMGRiYlVMLCAweDA4NmQzZDJkVUwsIDB4OTE2NDZjOTdVTCwgMHhlNjYzNWMwMVVMLAorICAgIDB4NmI2YjUxZjRVTCwgMHgxYzZjNjE2MlVMLCAweDg1NjUzMGQ4VUwsIDB4ZjI2MjAwNGVVTCwgMHg2YzA2OTVlZFVMLAorICAgIDB4MWIwMWE1N2JVTCwgMHg4MjA4ZjRjMVVMLCAweGY1MGZjNDU3VUwsIDB4NjViMGQ5YzZVTCwgMHgxMmI3ZTk1MFVMLAorICAgIDB4OGJiZWI4ZWFVTCwgMHhmY2I5ODg3Y1VMLCAweDYyZGQxZGRmVUwsIDB4MTVkYTJkNDlVTCwgMHg4Y2QzN2NmM1VMLAorICAgIDB4ZmJkNDRjNjVVTCwgMHg0ZGIyNjE1OFVMLCAweDNhYjU1MWNlVUwsIDB4YTNiYzAwNzRVTCwgMHhkNGJiMzBlMlVMLAorICAgIDB4NGFkZmE1NDFVTCwgMHgzZGQ4OTVkN1VMLCAweGE0ZDFjNDZkVUwsIDB4ZDNkNmY0ZmJVTCwgMHg0MzY5ZTk2YVVMLAorICAgIDB4MzQ2ZWQ5ZmNVTCwgMHhhZDY3ODg0NlVMLCAweGRhNjBiOGQwVUwsIDB4NDQwNDJkNzNVTCwgMHgzMzAzMWRlNVVMLAorICAgIDB4YWEwYTRjNWZVTCwgMHhkZDBkN2NjOVVMLCAweDUwMDU3MTNjVUwsIDB4MjcwMjQxYWFVTCwgMHhiZTBiMTAxMFVMLAorICAgIDB4YzkwYzIwODZVTCwgMHg1NzY4YjUyNVVMLCAweDIwNmY4NWIzVUwsIDB4Yjk2NmQ0MDlVTCwgMHhjZTYxZTQ5ZlVMLAorICAgIDB4NWVkZWY5MGVVTCwgMHgyOWQ5Yzk5OFVMLCAweGIwZDA5ODIyVUwsIDB4YzdkN2E4YjRVTCwgMHg1OWIzM2QxN1VMLAorICAgIDB4MmViNDBkODFVTCwgMHhiN2JkNWMzYlVMLCAweGMwYmE2Y2FkVUwsIDB4ZWRiODgzMjBVTCwgMHg5YWJmYjNiNlVMLAorICAgIDB4MDNiNmUyMGNVTCwgMHg3NGIxZDI5YVVMLCAweGVhZDU0NzM5VUwsIDB4OWRkMjc3YWZVTCwgMHgwNGRiMjYxNVVMLAorICAgIDB4NzNkYzE2ODNVTCwgMHhlMzYzMGIxMlVMLCAweDk0NjQzYjg0VUwsIDB4MGQ2ZDZhM2VVTCwgMHg3YTZhNWFhOFVMLAorICAgIDB4ZTQwZWNmMGJVTCwgMHg5MzA5ZmY5ZFVMLCAweDBhMDBhZTI3VUwsIDB4N2QwNzllYjFVTCwgMHhmMDBmOTM0NFVMLAorICAgIDB4ODcwOGEzZDJVTCwgMHgxZTAxZjI2OFVMLCAweDY5MDZjMmZlVUwsIDB4Zjc2MjU3NWRVTCwgMHg4MDY1NjdjYlVMLAorICAgIDB4MTk2YzM2NzFVTCwgMHg2ZTZiMDZlN1VMLCAweGZlZDQxYjc2VUwsIDB4ODlkMzJiZTBVTCwgMHgxMGRhN2E1YVVMLAorICAgIDB4NjdkZDRhY2NVTCwgMHhmOWI5ZGY2ZlVMLCAweDhlYmVlZmY5VUwsIDB4MTdiN2JlNDNVTCwgMHg2MGIwOGVkNVVMLAorICAgIDB4ZDZkNmEzZThVTCwgMHhhMWQxOTM3ZVVMLCAweDM4ZDhjMmM0VUwsIDB4NGZkZmYyNTJVTCwgMHhkMWJiNjdmMVVMLAorICAgIDB4YTZiYzU3NjdVTCwgMHgzZmI1MDZkZFVMLCAweDQ4YjIzNjRiVUwsIDB4ZDgwZDJiZGFVTCwgMHhhZjBhMWI0Y1VMLAorICAgIDB4MzYwMzRhZjZVTCwgMHg0MTA0N2E2MFVMLCAweGRmNjBlZmMzVUwsIDB4YTg2N2RmNTVVTCwgMHgzMTZlOGVlZlVMLAorICAgIDB4NDY2OWJlNzlVTCwgMHhjYjYxYjM4Y1VMLCAweGJjNjY4MzFhVUwsIDB4MjU2ZmQyYTBVTCwgMHg1MjY4ZTIzNlVMLAorICAgIDB4Y2MwYzc3OTVVTCwgMHhiYjBiNDcwM1VMLCAweDIyMDIxNmI5VUwsIDB4NTUwNTI2MmZVTCwgMHhjNWJhM2JiZVVMLAorICAgIDB4YjJiZDBiMjhVTCwgMHgyYmI0NWE5MlVMLCAweDVjYjM2YTA0VUwsIDB4YzJkN2ZmYTdVTCwgMHhiNWQwY2YzMVVMLAorICAgIDB4MmNkOTllOGJVTCwgMHg1YmRlYWUxZFVMLCAweDliNjRjMmIwVUwsIDB4ZWM2M2YyMjZVTCwgMHg3NTZhYTM5Y1VMLAorICAgIDB4MDI2ZDkzMGFVTCwgMHg5YzA5MDZhOVVMLCAweGViMGUzNjNmVUwsIDB4NzIwNzY3ODVVTCwgMHgwNTAwNTcxM1VMLAorICAgIDB4OTViZjRhODJVTCwgMHhlMmI4N2ExNFVMLCAweDdiYjEyYmFlVUwsIDB4MGNiNjFiMzhVTCwgMHg5MmQyOGU5YlVMLAorICAgIDB4ZTVkNWJlMGRVTCwgMHg3Y2RjZWZiN1VMLCAweDBiZGJkZjIxVUwsIDB4ODZkM2QyZDRVTCwgMHhmMWQ0ZTI0MlVMLAorICAgIDB4NjhkZGIzZjhVTCwgMHgxZmRhODM2ZVVMLCAweDgxYmUxNmNkVUwsIDB4ZjZiOTI2NWJVTCwgMHg2ZmIwNzdlMVVMLAorICAgIDB4MThiNzQ3NzdVTCwgMHg4ODA4NWFlNlVMLCAweGZmMGY2YTcwVUwsIDB4NjYwNjNiY2FVTCwgMHgxMTAxMGI1Y1VMLAorICAgIDB4OGY2NTllZmZVTCwgMHhmODYyYWU2OVVMLCAweDYxNmJmZmQzVUwsIDB4MTY2Y2NmNDVVTCwgMHhhMDBhZTI3OFVMLAorICAgIDB4ZDcwZGQyZWVVTCwgMHg0ZTA0ODM1NFVMLCAweDM5MDNiM2MyVUwsIDB4YTc2NzI2NjFVTCwgMHhkMDYwMTZmN1VMLAorICAgIDB4NDk2OTQ3NGRVTCwgMHgzZTZlNzdkYlVMLCAweGFlZDE2YTRhVUwsIDB4ZDlkNjVhZGNVTCwgMHg0MGRmMGI2NlVMLAorICAgIDB4MzdkODNiZjBVTCwgMHhhOWJjYWU1M1VMLCAweGRlYmI5ZWM1VUwsIDB4NDdiMmNmN2ZVTCwgMHgzMGI1ZmZlOVVMLAorICAgIDB4YmRiZGYyMWNVTCwgMHhjYWJhYzI4YVVMLCAweDUzYjM5MzMwVUwsIDB4MjRiNGEzYTZVTCwgMHhiYWQwMzYwNVVMLAorICAgIDB4Y2RkNzA2OTNVTCwgMHg1NGRlNTcyOVVMLCAweDIzZDk2N2JmVUwsIDB4YjM2NjdhMmVVTCwgMHhjNDYxNGFiOFVMLAorICAgIDB4NWQ2ODFiMDJVTCwgMHgyYTZmMmI5NFVMLCAweGI0MGJiZTM3VUwsIDB4YzMwYzhlYTFVTCwgMHg1YTA1ZGYxYlVMLAorICAgIDB4MmQwMmVmOGRVTAorI2lmZGVmIEJZRk9VUgorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDE5MWIzMTQxVUwsIDB4MzIzNjYyODJVTCwgMHgyYjJkNTNjM1VMLCAweDY0NmNjNTA0VUwsCisgICAgMHg3ZDc3ZjQ0NVVMLCAweDU2NWFhNzg2VUwsIDB4NGY0MTk2YzdVTCwgMHhjOGQ5OGEwOFVMLCAweGQxYzJiYjQ5VUwsCisgICAgMHhmYWVmZTg4YVVMLCAweGUzZjRkOWNiVUwsIDB4YWNiNTRmMGNVTCwgMHhiNWFlN2U0ZFVMLCAweDllODMyZDhlVUwsCisgICAgMHg4Nzk4MWNjZlVMLCAweDRhYzIxMjUxVUwsIDB4NTNkOTIzMTBVTCwgMHg3OGY0NzBkM1VMLCAweDYxZWY0MTkyVUwsCisgICAgMHgyZWFlZDc1NVVMLCAweDM3YjVlNjE0VUwsIDB4MWM5OGI1ZDdVTCwgMHgwNTgzODQ5NlVMLCAweDgyMWI5ODU5VUwsCisgICAgMHg5YjAwYTkxOFVMLCAweGIwMmRmYWRiVUwsIDB4YTkzNmNiOWFVTCwgMHhlNjc3NWQ1ZFVMLCAweGZmNmM2YzFjVUwsCisgICAgMHhkNDQxM2ZkZlVMLCAweGNkNWEwZTllVUwsIDB4OTU4NDI0YTJVTCwgMHg4YzlmMTVlM1VMLCAweGE3YjI0NjIwVUwsCisgICAgMHhiZWE5Nzc2MVVMLCAweGYxZThlMWE2VUwsIDB4ZThmM2QwZTdVTCwgMHhjM2RlODMyNFVMLCAweGRhYzViMjY1VUwsCisgICAgMHg1ZDVkYWVhYVVMLCAweDQ0NDY5ZmViVUwsIDB4NmY2YmNjMjhVTCwgMHg3NjcwZmQ2OVVMLCAweDM5MzE2YmFlVUwsCisgICAgMHgyMDJhNWFlZlVMLCAweDBiMDcwOTJjVUwsIDB4MTIxYzM4NmRVTCwgMHhkZjQ2MzZmM1VMLCAweGM2NWQwN2IyVUwsCisgICAgMHhlZDcwNTQ3MVVMLCAweGY0NmI2NTMwVUwsIDB4YmIyYWYzZjdVTCwgMHhhMjMxYzJiNlVMLCAweDg5MWM5MTc1VUwsCisgICAgMHg5MDA3YTAzNFVMLCAweDE3OWZiY2ZiVUwsIDB4MGU4NDhkYmFVTCwgMHgyNWE5ZGU3OVVMLCAweDNjYjJlZjM4VUwsCisgICAgMHg3M2YzNzlmZlVMLCAweDZhZTg0OGJlVUwsIDB4NDFjNTFiN2RVTCwgMHg1OGRlMmEzY1VMLCAweGYwNzk0ZjA1VUwsCisgICAgMHhlOTYyN2U0NFVMLCAweGMyNGYyZDg3VUwsIDB4ZGI1NDFjYzZVTCwgMHg5NDE1OGEwMVVMLCAweDhkMGViYjQwVUwsCisgICAgMHhhNjIzZTg4M1VMLCAweGJmMzhkOWMyVUwsIDB4MzhhMGM1MGRVTCwgMHgyMWJiZjQ0Y1VMLCAweDBhOTZhNzhmVUwsCisgICAgMHgxMzhkOTZjZVVMLCAweDVjY2MwMDA5VUwsIDB4NDVkNzMxNDhVTCwgMHg2ZWZhNjI4YlVMLCAweDc3ZTE1M2NhVUwsCisgICAgMHhiYWJiNWQ1NFVMLCAweGEzYTA2YzE1VUwsIDB4ODg4ZDNmZDZVTCwgMHg5MTk2MGU5N1VMLCAweGRlZDc5ODUwVUwsCisgICAgMHhjN2NjYTkxMVVMLCAweGVjZTFmYWQyVUwsIDB4ZjVmYWNiOTNVTCwgMHg3MjYyZDc1Y1VMLCAweDZiNzllNjFkVUwsCisgICAgMHg0MDU0YjVkZVVMLCAweDU5NGY4NDlmVUwsIDB4MTYwZTEyNThVTCwgMHgwZjE1MjMxOVVMLCAweDI0Mzg3MGRhVUwsCisgICAgMHgzZDIzNDE5YlVMLCAweDY1ZmQ2YmE3VUwsIDB4N2NlNjVhZTZVTCwgMHg1N2NiMDkyNVVMLCAweDRlZDAzODY0VUwsCisgICAgMHgwMTkxYWVhM1VMLCAweDE4OGE5ZmUyVUwsIDB4MzNhN2NjMjFVTCwgMHgyYWJjZmQ2MFVMLCAweGFkMjRlMWFmVUwsCisgICAgMHhiNDNmZDBlZVVMLCAweDlmMTI4MzJkVUwsIDB4ODYwOWIyNmNVTCwgMHhjOTQ4MjRhYlVMLCAweGQwNTMxNWVhVUwsCisgICAgMHhmYjdlNDYyOVVMLCAweGUyNjU3NzY4VUwsIDB4MmYzZjc5ZjZVTCwgMHgzNjI0NDhiN1VMLCAweDFkMDkxYjc0VUwsCisgICAgMHgwNDEyMmEzNVVMLCAweDRiNTNiY2YyVUwsIDB4NTI0ODhkYjNVTCwgMHg3OTY1ZGU3MFVMLCAweDYwN2VlZjMxVUwsCisgICAgMHhlN2U2ZjNmZVVMLCAweGZlZmRjMmJmVUwsIDB4ZDVkMDkxN2NVTCwgMHhjY2NiYTAzZFVMLCAweDgzOGEzNmZhVUwsCisgICAgMHg5YTkxMDdiYlVMLCAweGIxYmM1NDc4VUwsIDB4YThhNzY1MzlVTCwgMHgzYjgzOTg0YlVMLCAweDIyOThhOTBhVUwsCisgICAgMHgwOWI1ZmFjOVVMLCAweDEwYWVjYjg4VUwsIDB4NWZlZjVkNGZVTCwgMHg0NmY0NmMwZVVMLCAweDZkZDkzZmNkVUwsCisgICAgMHg3NGMyMGU4Y1VMLCAweGYzNWExMjQzVUwsIDB4ZWE0MTIzMDJVTCwgMHhjMTZjNzBjMVVMLCAweGQ4Nzc0MTgwVUwsCisgICAgMHg5NzM2ZDc0N1VMLCAweDhlMmRlNjA2VUwsIDB4YTUwMGI1YzVVTCwgMHhiYzFiODQ4NFVMLCAweDcxNDE4YTFhVUwsCisgICAgMHg2ODVhYmI1YlVMLCAweDQzNzdlODk4VUwsIDB4NWE2Y2Q5ZDlVTCwgMHgxNTJkNGYxZVVMLCAweDBjMzY3ZTVmVUwsCisgICAgMHgyNzFiMmQ5Y1VMLCAweDNlMDAxY2RkVUwsIDB4Yjk5ODAwMTJVTCwgMHhhMDgzMzE1M1VMLCAweDhiYWU2MjkwVUwsCisgICAgMHg5MmI1NTNkMVVMLCAweGRkZjRjNTE2VUwsIDB4YzRlZmY0NTdVTCwgMHhlZmMyYTc5NFVMLCAweGY2ZDk5NmQ1VUwsCisgICAgMHhhZTA3YmNlOVVMLCAweGI3MWM4ZGE4VUwsIDB4OWMzMWRlNmJVTCwgMHg4NTJhZWYyYVVMLCAweGNhNmI3OWVkVUwsCisgICAgMHhkMzcwNDhhY1VMLCAweGY4NWQxYjZmVUwsIDB4ZTE0NjJhMmVVTCwgMHg2NmRlMzZlMVVMLCAweDdmYzUwN2EwVUwsCisgICAgMHg1NGU4NTQ2M1VMLCAweDRkZjM2NTIyVUwsIDB4MDJiMmYzZTVVTCwgMHgxYmE5YzJhNFVMLCAweDMwODQ5MTY3VUwsCisgICAgMHgyOTlmYTAyNlVMLCAweGU0YzVhZWI4VUwsIDB4ZmRkZTlmZjlVTCwgMHhkNmYzY2MzYVVMLCAweGNmZThmZDdiVUwsCisgICAgMHg4MGE5NmJiY1VMLCAweDk5YjI1YWZkVUwsIDB4YjI5ZjA5M2VVTCwgMHhhYjg0Mzg3ZlVMLCAweDJjMWMyNGIwVUwsCisgICAgMHgzNTA3MTVmMVVMLCAweDFlMmE0NjMyVUwsIDB4MDczMTc3NzNVTCwgMHg0ODcwZTFiNFVMLCAweDUxNmJkMGY1VUwsCisgICAgMHg3YTQ2ODMzNlVMLCAweDYzNWRiMjc3VUwsIDB4Y2JmYWQ3NGVVTCwgMHhkMmUxZTYwZlVMLCAweGY5Y2NiNWNjVUwsCisgICAgMHhlMGQ3ODQ4ZFVMLCAweGFmOTYxMjRhVUwsIDB4YjY4ZDIzMGJVTCwgMHg5ZGEwNzBjOFVMLCAweDg0YmI0MTg5VUwsCisgICAgMHgwMzIzNWQ0NlVMLCAweDFhMzg2YzA3VUwsIDB4MzExNTNmYzRVTCwgMHgyODBlMGU4NVVMLCAweDY3NGY5ODQyVUwsCisgICAgMHg3ZTU0YTkwM1VMLCAweDU1NzlmYWMwVUwsIDB4NGM2MmNiODFVTCwgMHg4MTM4YzUxZlVMLCAweDk4MjNmNDVlVUwsCisgICAgMHhiMzBlYTc5ZFVMLCAweGFhMTU5NmRjVUwsIDB4ZTU1NDAwMWJVTCwgMHhmYzRmMzE1YVVMLCAweGQ3NjI2Mjk5VUwsCisgICAgMHhjZTc5NTNkOFVMLCAweDQ5ZTE0ZjE3VUwsIDB4NTBmYTdlNTZVTCwgMHg3YmQ3MmQ5NVVMLCAweDYyY2MxY2Q0VUwsCisgICAgMHgyZDhkOGExM1VMLCAweDM0OTZiYjUyVUwsIDB4MWZiYmU4OTFVTCwgMHgwNmEwZDlkMFVMLCAweDVlN2VmM2VjVUwsCisgICAgMHg0NzY1YzJhZFVMLCAweDZjNDg5MTZlVUwsIDB4NzU1M2EwMmZVTCwgMHgzYTEyMzZlOFVMLCAweDIzMDkwN2E5VUwsCisgICAgMHgwODI0NTQ2YVVMLCAweDExM2Y2NTJiVUwsIDB4OTZhNzc5ZTRVTCwgMHg4ZmJjNDhhNVVMLCAweGE0OTExYjY2VUwsCisgICAgMHhiZDhhMmEyN1VMLCAweGYyY2JiY2UwVUwsIDB4ZWJkMDhkYTFVTCwgMHhjMGZkZGU2MlVMLCAweGQ5ZTZlZjIzVUwsCisgICAgMHgxNGJjZTFiZFVMLCAweDBkYTdkMGZjVUwsIDB4MjY4YTgzM2ZVTCwgMHgzZjkxYjI3ZVVMLCAweDcwZDAyNGI5VUwsCisgICAgMHg2OWNiMTVmOFVMLCAweDQyZTY0NjNiVUwsIDB4NWJmZDc3N2FVTCwgMHhkYzY1NmJiNVVMLCAweGM1N2U1YWY0VUwsCisgICAgMHhlZTUzMDkzN1VMLCAweGY3NDgzODc2VUwsIDB4YjgwOWFlYjFVTCwgMHhhMTEyOWZmMFVMLCAweDhhM2ZjYzMzVUwsCisgICAgMHg5MzI0ZmQ3MlVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4MDFjMjZhMzdVTCwgMHgwMzg0ZDQ2ZVVMLCAweDAyNDZiZTU5VUwsIDB4MDcwOWE4ZGNVTCwKKyAgICAweDA2Y2JjMmViVUwsIDB4MDQ4ZDdjYjJVTCwgMHgwNTRmMTY4NVVMLCAweDBlMTM1MWI4VUwsIDB4MGZkMTNiOGZVTCwKKyAgICAweDBkOTc4NWQ2VUwsIDB4MGM1NWVmZTFVTCwgMHgwOTFhZjk2NFVMLCAweDA4ZDg5MzUzVUwsIDB4MGE5ZTJkMGFVTCwKKyAgICAweDBiNWM0NzNkVUwsIDB4MWMyNmEzNzBVTCwgMHgxZGU0Yzk0N1VMLCAweDFmYTI3NzFlVUwsIDB4MWU2MDFkMjlVTCwKKyAgICAweDFiMmYwYmFjVUwsIDB4MWFlZDYxOWJVTCwgMHgxOGFiZGZjMlVMLCAweDE5NjliNWY1VUwsIDB4MTIzNWYyYzhVTCwKKyAgICAweDEzZjc5OGZmVUwsIDB4MTFiMTI2YTZVTCwgMHgxMDczNGM5MVVMLCAweDE1M2M1YTE0VUwsIDB4MTRmZTMwMjNVTCwKKyAgICAweDE2Yjg4ZTdhVUwsIDB4MTc3YWU0NGRVTCwgMHgzODRkNDZlMFVMLCAweDM5OGYyY2Q3VUwsIDB4M2JjOTkyOGVVTCwKKyAgICAweDNhMGJmOGI5VUwsIDB4M2Y0NGVlM2NVTCwgMHgzZTg2ODQwYlVMLCAweDNjYzAzYTUyVUwsIDB4M2QwMjUwNjVVTCwKKyAgICAweDM2NWUxNzU4VUwsIDB4Mzc5YzdkNmZVTCwgMHgzNWRhYzMzNlVMLCAweDM0MThhOTAxVUwsIDB4MzE1N2JmODRVTCwKKyAgICAweDMwOTVkNWIzVUwsIDB4MzJkMzZiZWFVTCwgMHgzMzExMDFkZFVMLCAweDI0NmJlNTkwVUwsIDB4MjVhOThmYTdVTCwKKyAgICAweDI3ZWYzMWZlVUwsIDB4MjYyZDViYzlVTCwgMHgyMzYyNGQ0Y1VMLCAweDIyYTAyNzdiVUwsIDB4MjBlNjk5MjJVTCwKKyAgICAweDIxMjRmMzE1VUwsIDB4MmE3OGI0MjhVTCwgMHgyYmJhZGUxZlVMLCAweDI5ZmM2MDQ2VUwsIDB4MjgzZTBhNzFVTCwKKyAgICAweDJkNzExY2Y0VUwsIDB4MmNiMzc2YzNVTCwgMHgyZWY1Yzg5YVVMLCAweDJmMzdhMmFkVUwsIDB4NzA5YThkYzBVTCwKKyAgICAweDcxNThlN2Y3VUwsIDB4NzMxZTU5YWVVTCwgMHg3MmRjMzM5OVVMLCAweDc3OTMyNTFjVUwsIDB4NzY1MTRmMmJVTCwKKyAgICAweDc0MTdmMTcyVUwsIDB4NzVkNTliNDVVTCwgMHg3ZTg5ZGM3OFVMLCAweDdmNGJiNjRmVUwsIDB4N2QwZDA4MTZVTCwKKyAgICAweDdjY2Y2MjIxVUwsIDB4Nzk4MDc0YTRVTCwgMHg3ODQyMWU5M1VMLCAweDdhMDRhMGNhVUwsIDB4N2JjNmNhZmRVTCwKKyAgICAweDZjYmMyZWIwVUwsIDB4NmQ3ZTQ0ODdVTCwgMHg2ZjM4ZmFkZVVMLCAweDZlZmE5MGU5VUwsIDB4NmJiNTg2NmNVTCwKKyAgICAweDZhNzdlYzViVUwsIDB4NjgzMTUyMDJVTCwgMHg2OWYzMzgzNVVMLCAweDYyYWY3ZjA4VUwsIDB4NjM2ZDE1M2ZVTCwKKyAgICAweDYxMmJhYjY2VUwsIDB4NjBlOWMxNTFVTCwgMHg2NWE2ZDdkNFVMLCAweDY0NjRiZGUzVUwsIDB4NjYyMjAzYmFVTCwKKyAgICAweDY3ZTA2OThkVUwsIDB4NDhkN2NiMjBVTCwgMHg0OTE1YTExN1VMLCAweDRiNTMxZjRlVUwsIDB4NGE5MTc1NzlVTCwKKyAgICAweDRmZGU2M2ZjVUwsIDB4NGUxYzA5Y2JVTCwgMHg0YzVhYjc5MlVMLCAweDRkOThkZGE1VUwsIDB4NDZjNDlhOThVTCwKKyAgICAweDQ3MDZmMGFmVUwsIDB4NDU0MDRlZjZVTCwgMHg0NDgyMjRjMVVMLCAweDQxY2QzMjQ0VUwsIDB4NDAwZjU4NzNVTCwKKyAgICAweDQyNDllNjJhVUwsIDB4NDM4YjhjMWRVTCwgMHg1NGYxNjg1MFVMLCAweDU1MzMwMjY3VUwsIDB4NTc3NWJjM2VVTCwKKyAgICAweDU2YjdkNjA5VUwsIDB4NTNmOGMwOGNVTCwgMHg1MjNhYWFiYlVMLCAweDUwN2MxNGUyVUwsIDB4NTFiZTdlZDVVTCwKKyAgICAweDVhZTIzOWU4VUwsIDB4NWIyMDUzZGZVTCwgMHg1OTY2ZWQ4NlVMLCAweDU4YTQ4N2IxVUwsIDB4NWRlYjkxMzRVTCwKKyAgICAweDVjMjlmYjAzVUwsIDB4NWU2ZjQ1NWFVTCwgMHg1ZmFkMmY2ZFVMLCAweGUxMzUxYjgwVUwsIDB4ZTBmNzcxYjdVTCwKKyAgICAweGUyYjFjZmVlVUwsIDB4ZTM3M2E1ZDlVTCwgMHhlNjNjYjM1Y1VMLCAweGU3ZmVkOTZiVUwsIDB4ZTViODY3MzJVTCwKKyAgICAweGU0N2EwZDA1VUwsIDB4ZWYyNjRhMzhVTCwgMHhlZWU0MjAwZlVMLCAweGVjYTI5ZTU2VUwsIDB4ZWQ2MGY0NjFVTCwKKyAgICAweGU4MmZlMmU0VUwsIDB4ZTllZDg4ZDNVTCwgMHhlYmFiMzY4YVVMLCAweGVhNjk1Y2JkVUwsIDB4ZmQxM2I4ZjBVTCwKKyAgICAweGZjZDFkMmM3VUwsIDB4ZmU5NzZjOWVVTCwgMHhmZjU1MDZhOVVMLCAweGZhMWExMDJjVUwsIDB4ZmJkODdhMWJVTCwKKyAgICAweGY5OWVjNDQyVUwsIDB4Zjg1Y2FlNzVVTCwgMHhmMzAwZTk0OFVMLCAweGYyYzI4MzdmVUwsIDB4ZjA4NDNkMjZVTCwKKyAgICAweGYxNDY1NzExVUwsIDB4ZjQwOTQxOTRVTCwgMHhmNWNiMmJhM1VMLCAweGY3OGQ5NWZhVUwsIDB4ZjY0ZmZmY2RVTCwKKyAgICAweGQ5Nzg1ZDYwVUwsIDB4ZDhiYTM3NTdVTCwgMHhkYWZjODkwZVVMLCAweGRiM2VlMzM5VUwsIDB4ZGU3MWY1YmNVTCwKKyAgICAweGRmYjM5ZjhiVUwsIDB4ZGRmNTIxZDJVTCwgMHhkYzM3NGJlNVVMLCAweGQ3NmIwY2Q4VUwsIDB4ZDZhOTY2ZWZVTCwKKyAgICAweGQ0ZWZkOGI2VUwsIDB4ZDUyZGIyODFVTCwgMHhkMDYyYTQwNFVMLCAweGQxYTBjZTMzVUwsIDB4ZDNlNjcwNmFVTCwKKyAgICAweGQyMjQxYTVkVUwsIDB4YzU1ZWZlMTBVTCwgMHhjNDljOTQyN1VMLCAweGM2ZGEyYTdlVUwsIDB4YzcxODQwNDlVTCwKKyAgICAweGMyNTc1NmNjVUwsIDB4YzM5NTNjZmJVTCwgMHhjMWQzODJhMlVMLCAweGMwMTFlODk1VUwsIDB4Y2I0ZGFmYThVTCwKKyAgICAweGNhOGZjNTlmVUwsIDB4YzhjOTdiYzZVTCwgMHhjOTBiMTFmMVVMLCAweGNjNDQwNzc0VUwsIDB4Y2Q4NjZkNDNVTCwKKyAgICAweGNmYzBkMzFhVUwsIDB4Y2UwMmI5MmRVTCwgMHg5MWFmOTY0MFVMLCAweDkwNmRmYzc3VUwsIDB4OTIyYjQyMmVVTCwKKyAgICAweDkzZTkyODE5VUwsIDB4OTZhNjNlOWNVTCwgMHg5NzY0NTRhYlVMLCAweDk1MjJlYWYyVUwsIDB4OTRlMDgwYzVVTCwKKyAgICAweDlmYmNjN2Y4VUwsIDB4OWU3ZWFkY2ZVTCwgMHg5YzM4MTM5NlVMLCAweDlkZmE3OWExVUwsIDB4OThiNTZmMjRVTCwKKyAgICAweDk5NzcwNTEzVUwsIDB4OWIzMWJiNGFVTCwgMHg5YWYzZDE3ZFVMLCAweDhkODkzNTMwVUwsIDB4OGM0YjVmMDdVTCwKKyAgICAweDhlMGRlMTVlVUwsIDB4OGZjZjhiNjlVTCwgMHg4YTgwOWRlY1VMLCAweDhiNDJmN2RiVUwsIDB4ODkwNDQ5ODJVTCwKKyAgICAweDg4YzYyM2I1VUwsIDB4ODM5YTY0ODhVTCwgMHg4MjU4MGViZlVMLCAweDgwMWViMGU2VUwsIDB4ODFkY2RhZDFVTCwKKyAgICAweDg0OTNjYzU0VUwsIDB4ODU1MWE2NjNVTCwgMHg4NzE3MTgzYVVMLCAweDg2ZDU3MjBkVUwsIDB4YTllMmQwYTBVTCwKKyAgICAweGE4MjBiYTk3VUwsIDB4YWE2NjA0Y2VVTCwgMHhhYmE0NmVmOVVMLCAweGFlZWI3ODdjVUwsIDB4YWYyOTEyNGJVTCwKKyAgICAweGFkNmZhYzEyVUwsIDB4YWNhZGM2MjVVTCwgMHhhN2YxODExOFVMLCAweGE2MzNlYjJmVUwsIDB4YTQ3NTU1NzZVTCwKKyAgICAweGE1YjczZjQxVUwsIDB4YTBmODI5YzRVTCwgMHhhMTNhNDNmM1VMLCAweGEzN2NmZGFhVUwsIDB4YTJiZTk3OWRVTCwKKyAgICAweGI1YzQ3M2QwVUwsIDB4YjQwNjE5ZTdVTCwgMHhiNjQwYTdiZVVMLCAweGI3ODJjZDg5VUwsIDB4YjJjZGRiMGNVTCwKKyAgICAweGIzMGZiMTNiVUwsIDB4YjE0OTBmNjJVTCwgMHhiMDhiNjU1NVVMLCAweGJiZDcyMjY4VUwsIDB4YmExNTQ4NWZVTCwKKyAgICAweGI4NTNmNjA2VUwsIDB4Yjk5MTljMzFVTCwgMHhiY2RlOGFiNFVMLCAweGJkMWNlMDgzVUwsIDB4YmY1YTVlZGFVTCwKKyAgICAweGJlOTgzNGVkVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHhiOGJjNjc2NVVMLCAweGFhMDljODhiVUwsIDB4MTJiNWFmZWVVTCwgMHg4ZjYyOTc1N1VMLAorICAgIDB4MzdkZWYwMzJVTCwgMHgyNTZiNWZkY1VMLCAweDlkZDczOGI5VUwsIDB4YzViNDI4ZWZVTCwgMHg3ZDA4NGY4YVVMLAorICAgIDB4NmZiZGUwNjRVTCwgMHhkNzAxODcwMVVMLCAweDRhZDZiZmI4VUwsIDB4ZjI2YWQ4ZGRVTCwgMHhlMGRmNzczM1VMLAorICAgIDB4NTg2MzEwNTZVTCwgMHg1MDE5NTc5ZlVMLCAweGU4YTUzMGZhVUwsIDB4ZmExMDlmMTRVTCwgMHg0MmFjZjg3MVVMLAorICAgIDB4ZGY3YmMwYzhVTCwgMHg2N2M3YTdhZFVMLCAweDc1NzIwODQzVUwsIDB4Y2RjZTZmMjZVTCwgMHg5NWFkN2Y3MFVMLAorICAgIDB4MmQxMTE4MTVVTCwgMHgzZmE0YjdmYlVMLCAweDg3MThkMDllVUwsIDB4MWFjZmU4MjdVTCwgMHhhMjczOGY0MlVMLAorICAgIDB4YjBjNjIwYWNVTCwgMHgwODdhNDdjOVVMLCAweGEwMzJhZjNlVUwsIDB4MTg4ZWM4NWJVTCwgMHgwYTNiNjdiNVVMLAorICAgIDB4YjI4NzAwZDBVTCwgMHgyZjUwMzg2OVVMLCAweDk3ZWM1ZjBjVUwsIDB4ODU1OWYwZTJVTCwgMHgzZGU1OTc4N1VMLAorICAgIDB4NjU4Njg3ZDFVTCwgMHhkZDNhZTBiNFVMLCAweGNmOGY0ZjVhVUwsIDB4NzczMzI4M2ZVTCwgMHhlYWU0MTA4NlVMLAorICAgIDB4NTI1ODc3ZTNVTCwgMHg0MGVkZDgwZFVMLCAweGY4NTFiZjY4VUwsIDB4ZjAyYmY4YTFVTCwgMHg0ODk3OWZjNFVMLAorICAgIDB4NWEyMjMwMmFVTCwgMHhlMjllNTc0ZlVMLCAweDdmNDk2ZmY2VUwsIDB4YzdmNTA4OTNVTCwgMHhkNTQwYTc3ZFVMLAorICAgIDB4NmRmY2MwMThVTCwgMHgzNTlmZDA0ZVVMLCAweDhkMjNiNzJiVUwsIDB4OWY5NjE4YzVVTCwgMHgyNzJhN2ZhMFVMLAorICAgIDB4YmFmZDQ3MTlVTCwgMHgwMjQxMjA3Y1VMLCAweDEwZjQ4ZjkyVUwsIDB4YTg0OGU4ZjdVTCwgMHg5YjE0NTgzZFVMLAorICAgIDB4MjNhODNmNThVTCwgMHgzMTFkOTBiNlVMLCAweDg5YTFmN2QzVUwsIDB4MTQ3NmNmNmFVTCwgMHhhY2NhYTgwZlVMLAorICAgIDB4YmU3ZjA3ZTFVTCwgMHgwNmMzNjA4NFVMLCAweDVlYTA3MGQyVUwsIDB4ZTYxYzE3YjdVTCwgMHhmNGE5Yjg1OVVMLAorICAgIDB4NGMxNWRmM2NVTCwgMHhkMWMyZTc4NVVMLCAweDY5N2U4MGUwVUwsIDB4N2JjYjJmMGVVTCwgMHhjMzc3NDg2YlVMLAorICAgIDB4Y2IwZDBmYTJVTCwgMHg3M2IxNjhjN1VMLCAweDYxMDRjNzI5VUwsIDB4ZDliOGEwNGNVTCwgMHg0NDZmOThmNVVMLAorICAgIDB4ZmNkM2ZmOTBVTCwgMHhlZTY2NTA3ZVVMLCAweDU2ZGEzNzFiVUwsIDB4MGViOTI3NGRVTCwgMHhiNjA1NDAyOFVMLAorICAgIDB4YTRiMGVmYzZVTCwgMHgxYzBjODhhM1VMLCAweDgxZGJiMDFhVUwsIDB4Mzk2N2Q3N2ZVTCwgMHgyYmQyNzg5MVVMLAorICAgIDB4OTM2ZTFmZjRVTCwgMHgzYjI2ZjcwM1VMLCAweDgzOWE5MDY2VUwsIDB4OTEyZjNmODhVTCwgMHgyOTkzNThlZFVMLAorICAgIDB4YjQ0NDYwNTRVTCwgMHgwY2Y4MDczMVVMLCAweDFlNGRhOGRmVUwsIDB4YTZmMWNmYmFVTCwgMHhmZTkyZGZlY1VMLAorICAgIDB4NDYyZWI4ODlVTCwgMHg1NDliMTc2N1VMLCAweGVjMjc3MDAyVUwsIDB4NzFmMDQ4YmJVTCwgMHhjOTRjMmZkZVVMLAorICAgIDB4ZGJmOTgwMzBVTCwgMHg2MzQ1ZTc1NVVMLCAweDZiM2ZhMDljVUwsIDB4ZDM4M2M3ZjlVTCwgMHhjMTM2NjgxN1VMLAorICAgIDB4Nzk4YTBmNzJVTCwgMHhlNDVkMzdjYlVMLCAweDVjZTE1MGFlVUwsIDB4NGU1NGZmNDBVTCwgMHhmNmU4OTgyNVVMLAorICAgIDB4YWU4Yjg4NzNVTCwgMHgxNjM3ZWYxNlVMLCAweDA0ODI0MGY4VUwsIDB4YmMzZTI3OWRVTCwgMHgyMWU5MWYyNFVMLAorICAgIDB4OTk1NTc4NDFVTCwgMHg4YmUwZDdhZlVMLCAweDMzNWNiMGNhVUwsIDB4ZWQ1OWI2M2JVTCwgMHg1NWU1ZDE1ZVVMLAorICAgIDB4NDc1MDdlYjBVTCwgMHhmZmVjMTlkNVVMLCAweDYyM2IyMTZjVUwsIDB4ZGE4NzQ2MDlVTCwgMHhjODMyZTllN1VMLAorICAgIDB4NzA4ZThlODJVTCwgMHgyOGVkOWVkNFVMLCAweDkwNTFmOWIxVUwsIDB4ODJlNDU2NWZVTCwgMHgzYTU4MzEzYVVMLAorICAgIDB4YTc4ZjA5ODNVTCwgMHgxZjMzNmVlNlVMLCAweDBkODZjMTA4VUwsIDB4YjUzYWE2NmRVTCwgMHhiZDQwZTFhNFVMLAorICAgIDB4MDVmYzg2YzFVTCwgMHgxNzQ5MjkyZlVMLCAweGFmZjU0ZTRhVUwsIDB4MzIyMjc2ZjNVTCwgMHg4YTllMTE5NlVMLAorICAgIDB4OTgyYmJlNzhVTCwgMHgyMDk3ZDkxZFVMLCAweDc4ZjRjOTRiVUwsIDB4YzA0OGFlMmVVTCwgMHhkMmZkMDFjMFVMLAorICAgIDB4NmE0MTY2YTVVTCwgMHhmNzk2NWUxY1VMLCAweDRmMmEzOTc5VUwsIDB4NWQ5Zjk2OTdVTCwgMHhlNTIzZjFmMlVMLAorICAgIDB4NGQ2YjE5MDVVTCwgMHhmNWQ3N2U2MFVMLCAweGU3NjJkMThlVUwsIDB4NWZkZWI2ZWJVTCwgMHhjMjA5OGU1MlVMLAorICAgIDB4N2FiNWU5MzdVTCwgMHg2ODAwNDZkOVVMLCAweGQwYmMyMWJjVUwsIDB4ODhkZjMxZWFVTCwgMHgzMDYzNTY4ZlVMLAorICAgIDB4MjJkNmY5NjFVTCwgMHg5YTZhOWUwNFVMLCAweDA3YmRhNmJkVUwsIDB4YmYwMWMxZDhVTCwgMHhhZGI0NmUzNlVMLAorICAgIDB4MTUwODA5NTNVTCwgMHgxZDcyNGU5YVVMLCAweGE1Y2UyOWZmVUwsIDB4Yjc3Yjg2MTFVTCwgMHgwZmM3ZTE3NFVMLAorICAgIDB4OTIxMGQ5Y2RVTCwgMHgyYWFjYmVhOFVMLCAweDM4MTkxMTQ2VUwsIDB4ODBhNTc2MjNVTCwgMHhkOGM2NjY3NVVMLAorICAgIDB4NjA3YTAxMTBVTCwgMHg3MmNmYWVmZVVMLCAweGNhNzNjOTliVUwsIDB4NTdhNGYxMjJVTCwgMHhlZjE4OTY0N1VMLAorICAgIDB4ZmRhZDM5YTlVTCwgMHg0NTExNWVjY1VMLCAweDc2NGRlZTA2VUwsIDB4Y2VmMTg5NjNVTCwgMHhkYzQ0MjY4ZFVMLAorICAgIDB4NjRmODQxZThVTCwgMHhmOTJmNzk1MVVMLCAweDQxOTMxZTM0VUwsIDB4NTMyNmIxZGFVTCwgMHhlYjlhZDZiZlVMLAorICAgIDB4YjNmOWM2ZTlVTCwgMHgwYjQ1YTE4Y1VMLCAweDE5ZjAwZTYyVUwsIDB4YTE0YzY5MDdVTCwgMHgzYzliNTFiZVVMLAorICAgIDB4ODQyNzM2ZGJVTCwgMHg5NjkyOTkzNVVMLCAweDJlMmVmZTUwVUwsIDB4MjY1NGI5OTlVTCwgMHg5ZWU4ZGVmY1VMLAorICAgIDB4OGM1ZDcxMTJVTCwgMHgzNGUxMTY3N1VMLCAweGE5MzYyZWNlVUwsIDB4MTE4YTQ5YWJVTCwgMHgwMzNmZTY0NVVMLAorICAgIDB4YmI4MzgxMjBVTCwgMHhlM2UwOTE3NlVMLCAweDViNWNmNjEzVUwsIDB4NDllOTU5ZmRVTCwgMHhmMTU1M2U5OFVMLAorICAgIDB4NmM4MjA2MjFVTCwgMHhkNDNlNjE0NFVMLCAweGM2OGJjZWFhVUwsIDB4N2UzN2E5Y2ZVTCwgMHhkNjdmNDEzOFVMLAorICAgIDB4NmVjMzI2NWRVTCwgMHg3Yzc2ODliM1VMLCAweGM0Y2FlZWQ2VUwsIDB4NTkxZGQ2NmZVTCwgMHhlMWExYjEwYVVMLAorICAgIDB4ZjMxNDFlZTRVTCwgMHg0YmE4Nzk4MVVMLCAweDEzY2I2OWQ3VUwsIDB4YWI3NzBlYjJVTCwgMHhiOWMyYTE1Y1VMLAorICAgIDB4MDE3ZWM2MzlVTCwgMHg5Y2E5ZmU4MFVMLCAweDI0MTU5OWU1VUwsIDB4MzZhMDM2MGJVTCwgMHg4ZTFjNTE2ZVVMLAorICAgIDB4ODY2NjE2YTdVTCwgMHgzZWRhNzFjMlVMLCAweDJjNmZkZTJjVUwsIDB4OTRkM2I5NDlVTCwgMHgwOTA0ODFmMFVMLAorICAgIDB4YjFiOGU2OTVVTCwgMHhhMzBkNDk3YlVMLCAweDFiYjEyZTFlVUwsIDB4NDNkMjNlNDhVTCwgMHhmYjZlNTkyZFVMLAorICAgIDB4ZTlkYmY2YzNVTCwgMHg1MTY3OTFhNlVMLCAweGNjYjBhOTFmVUwsIDB4NzQwY2NlN2FVTCwgMHg2NmI5NjE5NFVMLAorICAgIDB4ZGUwNTA2ZjFVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDk2MzAwNzc3VUwsIDB4MmM2MTBlZWVVTCwgMHhiYTUxMDk5OVVMLCAweDE5YzQ2ZDA3VUwsCisgICAgMHg4ZmY0NmE3MFVMLCAweDM1YTU2M2U5VUwsIDB4YTM5NTY0OWVVTCwgMHgzMjg4ZGIwZVVMLCAweGE0YjhkYzc5VUwsCisgICAgMHgxZWU5ZDVlMFVMLCAweDg4ZDlkMjk3VUwsIDB4MmI0Y2I2MDlVTCwgMHhiZDdjYjE3ZVVMLCAweDA3MmRiOGU3VUwsCisgICAgMHg5MTFkYmY5MFVMLCAweDY0MTBiNzFkVUwsIDB4ZjIyMGIwNmFVTCwgMHg0ODcxYjlmM1VMLCAweGRlNDFiZTg0VUwsCisgICAgMHg3ZGQ0ZGExYVVMLCAweGViZTRkZDZkVUwsIDB4NTFiNWQ0ZjRVTCwgMHhjNzg1ZDM4M1VMLCAweDU2OTg2YzEzVUwsCisgICAgMHhjMGE4NmI2NFVMLCAweDdhZjk2MmZkVUwsIDB4ZWNjOTY1OGFVTCwgMHg0ZjVjMDExNFVMLCAweGQ5NmMwNjYzVUwsCisgICAgMHg2MzNkMGZmYVVMLCAweGY1MGQwODhkVUwsIDB4YzgyMDZlM2JVTCwgMHg1ZTEwNjk0Y1VMLCAweGU0NDE2MGQ1VUwsCisgICAgMHg3MjcxNjdhMlVMLCAweGQxZTQwMzNjVUwsIDB4NDdkNDA0NGJVTCwgMHhmZDg1MGRkMlVMLCAweDZiYjUwYWE1VUwsCisgICAgMHhmYWE4YjUzNVVMLCAweDZjOThiMjQyVUwsIDB4ZDZjOWJiZGJVTCwgMHg0MGY5YmNhY1VMLCAweGUzNmNkODMyVUwsCisgICAgMHg3NTVjZGY0NVVMLCAweGNmMGRkNmRjVUwsIDB4NTkzZGQxYWJVTCwgMHhhYzMwZDkyNlVMLCAweDNhMDBkZTUxVUwsCisgICAgMHg4MDUxZDdjOFVMLCAweDE2NjFkMGJmVUwsIDB4YjVmNGI0MjFVTCwgMHgyM2M0YjM1NlVMLCAweDk5OTViYWNmVUwsCisgICAgMHgwZmE1YmRiOFVMLCAweDllYjgwMjI4VUwsIDB4MDg4ODA1NWZVTCwgMHhiMmQ5MGNjNlVMLCAweDI0ZTkwYmIxVUwsCisgICAgMHg4NzdjNmYyZlVMLCAweDExNGM2ODU4VUwsIDB4YWIxZDYxYzFVTCwgMHgzZDJkNjZiNlVMLCAweDkwNDFkYzc2VUwsCisgICAgMHgwNjcxZGIwMVVMLCAweGJjMjBkMjk4VUwsIDB4MmExMGQ1ZWZVTCwgMHg4OTg1YjE3MVVMLCAweDFmYjViNjA2VUwsCisgICAgMHhhNWU0YmY5ZlVMLCAweDMzZDRiOGU4VUwsIDB4YTJjOTA3NzhVTCwgMHgzNGY5MDAwZlVMLCAweDhlYTgwOTk2VUwsCisgICAgMHgxODk4MGVlMVVMLCAweGJiMGQ2YTdmVUwsIDB4MmQzZDZkMDhVTCwgMHg5NzZjNjQ5MVVMLCAweDAxNWM2M2U2VUwsCisgICAgMHhmNDUxNmI2YlVMLCAweDYyNjE2YzFjVUwsIDB4ZDgzMDY1ODVVTCwgMHg0ZTAwNjJmMlVMLCAweGVkOTUwNjZjVUwsCisgICAgMHg3YmE1MDExYlVMLCAweGMxZjQwODgyVUwsIDB4NTdjNDBmZjVVTCwgMHhjNmQ5YjA2NVVMLCAweDUwZTliNzEyVUwsCisgICAgMHhlYWI4YmU4YlVMLCAweDdjODhiOWZjVUwsIDB4ZGYxZGRkNjJVTCwgMHg0OTJkZGExNVVMLCAweGYzN2NkMzhjVUwsCisgICAgMHg2NTRjZDRmYlVMLCAweDU4NjFiMjRkVUwsIDB4Y2U1MWI1M2FVTCwgMHg3NDAwYmNhM1VMLCAweGUyMzBiYmQ0VUwsCisgICAgMHg0MWE1ZGY0YVVMLCAweGQ3OTVkODNkVUwsIDB4NmRjNGQxYTRVTCwgMHhmYmY0ZDZkM1VMLCAweDZhZTk2OTQzVUwsCisgICAgMHhmY2Q5NmUzNFVMLCAweDQ2ODg2N2FkVUwsIDB4ZDBiODYwZGFVTCwgMHg3MzJkMDQ0NFVMLCAweGU1MWQwMzMzVUwsCisgICAgMHg1ZjRjMGFhYVVMLCAweGM5N2MwZGRkVUwsIDB4M2M3MTA1NTBVTCwgMHhhYTQxMDIyN1VMLCAweDEwMTAwYmJlVUwsCisgICAgMHg4NjIwMGNjOVVMLCAweDI1YjU2ODU3VUwsIDB4YjM4NTZmMjBVTCwgMHgwOWQ0NjZiOVVMLCAweDlmZTQ2MWNlVUwsCisgICAgMHgwZWY5ZGU1ZVVMLCAweDk4YzlkOTI5VUwsIDB4MjI5OGQwYjBVTCwgMHhiNGE4ZDdjN1VMLCAweDE3M2RiMzU5VUwsCisgICAgMHg4MTBkYjQyZVVMLCAweDNiNWNiZGI3VUwsIDB4YWQ2Y2JhYzBVTCwgMHgyMDgzYjhlZFVMLCAweGI2YjNiZjlhVUwsCisgICAgMHgwY2UyYjYwM1VMLCAweDlhZDJiMTc0VUwsIDB4Mzk0N2Q1ZWFVTCwgMHhhZjc3ZDI5ZFVMLCAweDE1MjZkYjA0VUwsCisgICAgMHg4MzE2ZGM3M1VMLCAweDEyMGI2M2UzVUwsIDB4ODQzYjY0OTRVTCwgMHgzZTZhNmQwZFVMLCAweGE4NWE2YTdhVUwsCisgICAgMHgwYmNmMGVlNFVMLCAweDlkZmYwOTkzVUwsIDB4MjdhZTAwMGFVTCwgMHhiMTllMDc3ZFVMLCAweDQ0OTMwZmYwVUwsCisgICAgMHhkMmEzMDg4N1VMLCAweDY4ZjIwMTFlVUwsIDB4ZmVjMjA2NjlVTCwgMHg1ZDU3NjJmN1VMLCAweGNiNjc2NTgwVUwsCisgICAgMHg3MTM2NmMxOVVMLCAweGU3MDY2YjZlVUwsIDB4NzYxYmQ0ZmVVTCwgMHhlMDJiZDM4OVVMLCAweDVhN2FkYTEwVUwsCisgICAgMHhjYzRhZGQ2N1VMLCAweDZmZGZiOWY5VUwsIDB4ZjllZmJlOGVVTCwgMHg0M2JlYjcxN1VMLCAweGQ1OGViMDYwVUwsCisgICAgMHhlOGEzZDZkNlVMLCAweDdlOTNkMWExVUwsIDB4YzRjMmQ4MzhVTCwgMHg1MmYyZGY0ZlVMLCAweGYxNjdiYmQxVUwsCisgICAgMHg2NzU3YmNhNlVMLCAweGRkMDZiNTNmVUwsIDB4NGIzNmIyNDhVTCwgMHhkYTJiMGRkOFVMLCAweDRjMWIwYWFmVUwsCisgICAgMHhmNjRhMDMzNlVMLCAweDYwN2EwNDQxVUwsIDB4YzNlZjYwZGZVTCwgMHg1NWRmNjdhOFVMLCAweGVmOGU2ZTMxVUwsCisgICAgMHg3OWJlNjk0NlVMLCAweDhjYjM2MWNiVUwsIDB4MWE4MzY2YmNVTCwgMHhhMGQyNmYyNVVMLCAweDM2ZTI2ODUyVUwsCisgICAgMHg5NTc3MGNjY1VMLCAweDAzNDcwYmJiVUwsIDB4YjkxNjAyMjJVTCwgMHgyZjI2MDU1NVVMLCAweGJlM2JiYWM1VUwsCisgICAgMHgyODBiYmRiMlVMLCAweDkyNWFiNDJiVUwsIDB4MDQ2YWIzNWNVTCwgMHhhN2ZmZDdjMlVMLCAweDMxY2ZkMGI1VUwsCisgICAgMHg4YjllZDkyY1VMLCAweDFkYWVkZTViVUwsIDB4YjBjMjY0OWJVTCwgMHgyNmYyNjNlY1VMLCAweDljYTM2YTc1VUwsCisgICAgMHgwYTkzNmQwMlVMLCAweGE5MDYwOTljVUwsIDB4M2YzNjBlZWJVTCwgMHg4NTY3MDc3MlVMLCAweDEzNTcwMDA1VUwsCisgICAgMHg4MjRhYmY5NVVMLCAweDE0N2FiOGUyVUwsIDB4YWUyYmIxN2JVTCwgMHgzODFiYjYwY1VMLCAweDliOGVkMjkyVUwsCisgICAgMHgwZGJlZDVlNVVMLCAweGI3ZWZkYzdjVUwsIDB4MjFkZmRiMGJVTCwgMHhkNGQyZDM4NlVMLCAweDQyZTJkNGYxVUwsCisgICAgMHhmOGIzZGQ2OFVMLCAweDZlODNkYTFmVUwsIDB4Y2QxNmJlODFVTCwgMHg1YjI2YjlmNlVMLCAweGUxNzdiMDZmVUwsCisgICAgMHg3NzQ3YjcxOFVMLCAweGU2NWEwODg4VUwsIDB4NzA2YTBmZmZVTCwgMHhjYTNiMDY2NlVMLCAweDVjMGIwMTExVUwsCisgICAgMHhmZjllNjU4ZlVMLCAweDY5YWU2MmY4VUwsIDB4ZDNmZjZiNjFVTCwgMHg0NWNmNmMxNlVMLCAweDc4ZTIwYWEwVUwsCisgICAgMHhlZWQyMGRkN1VMLCAweDU0ODMwNDRlVUwsIDB4YzJiMzAzMzlVTCwgMHg2MTI2NjdhN1VMLCAweGY3MTY2MGQwVUwsCisgICAgMHg0ZDQ3Njk0OVVMLCAweGRiNzc2ZTNlVUwsIDB4NGE2YWQxYWVVTCwgMHhkYzVhZDZkOVVMLCAweDY2MGJkZjQwVUwsCisgICAgMHhmMDNiZDgzN1VMLCAweDUzYWViY2E5VUwsIDB4YzU5ZWJiZGVVTCwgMHg3ZmNmYjI0N1VMLCAweGU5ZmZiNTMwVUwsCisgICAgMHgxY2YyYmRiZFVMLCAweDhhYzJiYWNhVUwsIDB4MzA5M2IzNTNVTCwgMHhhNmEzYjQyNFVMLCAweDA1MzZkMGJhVUwsCisgICAgMHg5MzA2ZDdjZFVMLCAweDI5NTdkZTU0VUwsIDB4YmY2N2Q5MjNVTCwgMHgyZTdhNjZiM1VMLCAweGI4NGE2MWM0VUwsCisgICAgMHgwMjFiNjg1ZFVMLCAweDk0MmI2ZjJhVUwsIDB4MzdiZTBiYjRVTCwgMHhhMThlMGNjM1VMLCAweDFiZGYwNTVhVUwsCisgICAgMHg4ZGVmMDIyZFVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4NDEzMTFiMTlVTCwgMHg4MjYyMzYzMlVMLCAweGMzNTMyZDJiVUwsIDB4MDRjNTZjNjRVTCwKKyAgICAweDQ1ZjQ3NzdkVUwsIDB4ODZhNzVhNTZVTCwgMHhjNzk2NDE0ZlVMLCAweDA4OGFkOWM4VUwsIDB4NDliYmMyZDFVTCwKKyAgICAweDhhZThlZmZhVUwsIDB4Y2JkOWY0ZTNVTCwgMHgwYzRmYjVhY1VMLCAweDRkN2VhZWI1VUwsIDB4OGUyZDgzOWVVTCwKKyAgICAweGNmMWM5ODg3VUwsIDB4NTExMmMyNGFVTCwgMHgxMDIzZDk1M1VMLCAweGQzNzBmNDc4VUwsIDB4OTI0MWVmNjFVTCwKKyAgICAweDU1ZDdhZTJlVUwsIDB4MTRlNmI1MzdVTCwgMHhkN2I1OTgxY1VMLCAweDk2ODQ4MzA1VUwsIDB4NTk5ODFiODJVTCwKKyAgICAweDE4YTkwMDliVUwsIDB4ZGJmYTJkYjBVTCwgMHg5YWNiMzZhOVVMLCAweDVkNWQ3N2U2VUwsIDB4MWM2YzZjZmZVTCwKKyAgICAweGRmM2Y0MWQ0VUwsIDB4OWUwZTVhY2RVTCwgMHhhMjI0ODQ5NVVMLCAweGUzMTU5ZjhjVUwsIDB4MjA0NmIyYTdVTCwKKyAgICAweDYxNzdhOWJlVUwsIDB4YTZlMWU4ZjFVTCwgMHhlN2QwZjNlOFVMLCAweDI0ODNkZWMzVUwsIDB4NjViMmM1ZGFVTCwKKyAgICAweGFhYWU1ZDVkVUwsIDB4ZWI5ZjQ2NDRVTCwgMHgyOGNjNmI2ZlVMLCAweDY5ZmQ3MDc2VUwsIDB4YWU2YjMxMzlVTCwKKyAgICAweGVmNWEyYTIwVUwsIDB4MmMwOTA3MGJVTCwgMHg2ZDM4MWMxMlVMLCAweGYzMzY0NmRmVUwsIDB4YjIwNzVkYzZVTCwKKyAgICAweDcxNTQ3MGVkVUwsIDB4MzA2NTZiZjRVTCwgMHhmN2YzMmFiYlVMLCAweGI2YzIzMWEyVUwsIDB4NzU5MTFjODlVTCwKKyAgICAweDM0YTAwNzkwVUwsIDB4ZmJiYzlmMTdVTCwgMHhiYThkODQwZVVMLCAweDc5ZGVhOTI1VUwsIDB4MzhlZmIyM2NVTCwKKyAgICAweGZmNzlmMzczVUwsIDB4YmU0OGU4NmFVTCwgMHg3ZDFiYzU0MVVMLCAweDNjMmFkZTU4VUwsIDB4MDU0Zjc5ZjBVTCwKKyAgICAweDQ0N2U2MmU5VUwsIDB4ODcyZDRmYzJVTCwgMHhjNjFjNTRkYlVMLCAweDAxOGExNTk0VUwsIDB4NDBiYjBlOGRVTCwKKyAgICAweDgzZTgyM2E2VUwsIDB4YzJkOTM4YmZVTCwgMHgwZGM1YTAzOFVMLCAweDRjZjRiYjIxVUwsIDB4OGZhNzk2MGFVTCwKKyAgICAweGNlOTY4ZDEzVUwsIDB4MDkwMGNjNWNVTCwgMHg0ODMxZDc0NVVMLCAweDhiNjJmYTZlVUwsIDB4Y2E1M2UxNzdVTCwKKyAgICAweDU0NWRiYmJhVUwsIDB4MTU2Y2EwYTNVTCwgMHhkNjNmOGQ4OFVMLCAweDk3MGU5NjkxVUwsIDB4NTA5OGQ3ZGVVTCwKKyAgICAweDExYTljY2M3VUwsIDB4ZDJmYWUxZWNVTCwgMHg5M2NiZmFmNVVMLCAweDVjZDc2MjcyVUwsIDB4MWRlNjc5NmJVTCwKKyAgICAweGRlYjU1NDQwVUwsIDB4OWY4NDRmNTlVTCwgMHg1ODEyMGUxNlVMLCAweDE5MjMxNTBmVUwsIDB4ZGE3MDM4MjRVTCwKKyAgICAweDliNDEyMzNkVUwsIDB4YTc2YmZkNjVVTCwgMHhlNjVhZTY3Y1VMLCAweDI1MDljYjU3VUwsIDB4NjQzOGQwNGVVTCwKKyAgICAweGEzYWU5MTAxVUwsIDB4ZTI5ZjhhMThVTCwgMHgyMWNjYTczM1VMLCAweDYwZmRiYzJhVUwsIDB4YWZlMTI0YWRVTCwKKyAgICAweGVlZDAzZmI0VUwsIDB4MmQ4MzEyOWZVTCwgMHg2Y2IyMDk4NlVMLCAweGFiMjQ0OGM5VUwsIDB4ZWExNTUzZDBVTCwKKyAgICAweDI5NDY3ZWZiVUwsIDB4Njg3NzY1ZTJVTCwgMHhmNjc5M2YyZlVMLCAweGI3NDgyNDM2VUwsIDB4NzQxYjA5MWRVTCwKKyAgICAweDM1MmExMjA0VUwsIDB4ZjJiYzUzNGJVTCwgMHhiMzhkNDg1MlVMLCAweDcwZGU2NTc5VUwsIDB4MzFlZjdlNjBVTCwKKyAgICAweGZlZjNlNmU3VUwsIDB4YmZjMmZkZmVVTCwgMHg3YzkxZDBkNVVMLCAweDNkYTBjYmNjVUwsIDB4ZmEzNjhhODNVTCwKKyAgICAweGJiMDc5MTlhVUwsIDB4Nzg1NGJjYjFVTCwgMHgzOTY1YTdhOFVMLCAweDRiOTg4MzNiVUwsIDB4MGFhOTk4MjJVTCwKKyAgICAweGM5ZmFiNTA5VUwsIDB4ODhjYmFlMTBVTCwgMHg0ZjVkZWY1ZlVMLCAweDBlNmNmNDQ2VUwsIDB4Y2QzZmQ5NmRVTCwKKyAgICAweDhjMGVjMjc0VUwsIDB4NDMxMjVhZjNVTCwgMHgwMjIzNDFlYVVMLCAweGMxNzA2Y2MxVUwsIDB4ODA0MTc3ZDhVTCwKKyAgICAweDQ3ZDczNjk3VUwsIDB4MDZlNjJkOGVVTCwgMHhjNWI1MDBhNVVMLCAweDg0ODQxYmJjVUwsIDB4MWE4YTQxNzFVTCwKKyAgICAweDViYmI1YTY4VUwsIDB4OThlODc3NDNVTCwgMHhkOWQ5NmM1YVVMLCAweDFlNGYyZDE1VUwsIDB4NWY3ZTM2MGNVTCwKKyAgICAweDljMmQxYjI3VUwsIDB4ZGQxYzAwM2VVTCwgMHgxMjAwOThiOVVMLCAweDUzMzE4M2EwVUwsIDB4OTA2MmFlOGJVTCwKKyAgICAweGQxNTNiNTkyVUwsIDB4MTZjNWY0ZGRVTCwgMHg1N2Y0ZWZjNFVMLCAweDk0YTdjMmVmVUwsIDB4ZDU5NmQ5ZjZVTCwKKyAgICAweGU5YmMwN2FlVUwsIDB4YTg4ZDFjYjdVTCwgMHg2YmRlMzE5Y1VMLCAweDJhZWYyYTg1VUwsIDB4ZWQ3OTZiY2FVTCwKKyAgICAweGFjNDg3MGQzVUwsIDB4NmYxYjVkZjhVTCwgMHgyZTJhNDZlMVVMLCAweGUxMzZkZTY2VUwsIDB4YTAwN2M1N2ZVTCwKKyAgICAweDYzNTRlODU0VUwsIDB4MjI2NWYzNGRVTCwgMHhlNWYzYjIwMlVMLCAweGE0YzJhOTFiVUwsIDB4Njc5MTg0MzBVTCwKKyAgICAweDI2YTA5ZjI5VUwsIDB4YjhhZWM1ZTRVTCwgMHhmOTlmZGVmZFVMLCAweDNhY2NmM2Q2VUwsIDB4N2JmZGU4Y2ZVTCwKKyAgICAweGJjNmJhOTgwVUwsIDB4ZmQ1YWIyOTlVTCwgMHgzZTA5OWZiMlVMLCAweDdmMzg4NGFiVUwsIDB4YjAyNDFjMmNVTCwKKyAgICAweGYxMTUwNzM1VUwsIDB4MzI0NjJhMWVVTCwgMHg3Mzc3MzEwN1VMLCAweGI0ZTE3MDQ4VUwsIDB4ZjVkMDZiNTFVTCwKKyAgICAweDM2ODM0NjdhVUwsIDB4NzdiMjVkNjNVTCwgMHg0ZWQ3ZmFjYlVMLCAweDBmZTZlMWQyVUwsIDB4Y2NiNWNjZjlVTCwKKyAgICAweDhkODRkN2UwVUwsIDB4NGExMjk2YWZVTCwgMHgwYjIzOGRiNlVMLCAweGM4NzBhMDlkVUwsIDB4ODk0MWJiODRVTCwKKyAgICAweDQ2NWQyMzAzVUwsIDB4MDc2YzM4MWFVTCwgMHhjNDNmMTUzMVVMLCAweDg1MGUwZTI4VUwsIDB4NDI5ODRmNjdVTCwKKyAgICAweDAzYTk1NDdlVUwsIDB4YzBmYTc5NTVVTCwgMHg4MWNiNjI0Y1VMLCAweDFmYzUzODgxVUwsIDB4NWVmNDIzOThVTCwKKyAgICAweDlkYTcwZWIzVUwsIDB4ZGM5NjE1YWFVTCwgMHgxYjAwNTRlNVVMLCAweDVhMzE0ZmZjVUwsIDB4OTk2MjYyZDdVTCwKKyAgICAweGQ4NTM3OWNlVUwsIDB4MTc0ZmUxNDlVTCwgMHg1NjdlZmE1MFVMLCAweDk1MmRkNzdiVUwsIDB4ZDQxY2NjNjJVTCwKKyAgICAweDEzOGE4ZDJkVUwsIDB4NTJiYjk2MzRVTCwgMHg5MWU4YmIxZlVMLCAweGQwZDlhMDA2VUwsIDB4ZWNmMzdlNWVVTCwKKyAgICAweGFkYzI2NTQ3VUwsIDB4NmU5MTQ4NmNVTCwgMHgyZmEwNTM3NVVMLCAweGU4MzYxMjNhVUwsIDB4YTkwNzA5MjNVTCwKKyAgICAweDZhNTQyNDA4VUwsIDB4MmI2NTNmMTFVTCwgMHhlNDc5YTc5NlVMLCAweGE1NDhiYzhmVUwsIDB4NjYxYjkxYTRVTCwKKyAgICAweDI3MmE4YWJkVUwsIDB4ZTBiY2NiZjJVTCwgMHhhMThkZDBlYlVMLCAweDYyZGVmZGMwVUwsIDB4MjNlZmU2ZDlVTCwKKyAgICAweGJkZTFiYzE0VUwsIDB4ZmNkMGE3MGRVTCwgMHgzZjgzOGEyNlVMLCAweDdlYjI5MTNmVUwsIDB4YjkyNGQwNzBVTCwKKyAgICAweGY4MTVjYjY5VUwsIDB4M2I0NmU2NDJVTCwgMHg3YTc3ZmQ1YlVMLCAweGI1NmI2NWRjVUwsIDB4ZjQ1YTdlYzVVTCwKKyAgICAweDM3MDk1M2VlVUwsIDB4NzYzODQ4ZjdVTCwgMHhiMWFlMDliOFVMLCAweGYwOWYxMmExVUwsIDB4MzNjYzNmOGFVTCwKKyAgICAweDcyZmQyNDkzVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHgzNzZhYzIwMVVMLCAweDZlZDQ4NDAzVUwsIDB4NTliZTQ2MDJVTCwgMHhkY2E4MDkwN1VMLAorICAgIDB4ZWJjMmNiMDZVTCwgMHhiMjdjOGQwNFVMLCAweDg1MTY0ZjA1VUwsIDB4Yjg1MTEzMGVVTCwgMHg4ZjNiZDEwZlVMLAorICAgIDB4ZDY4NTk3MGRVTCwgMHhlMWVmNTUwY1VMLCAweDY0ZjkxYTA5VUwsIDB4NTM5M2Q4MDhVTCwgMHgwYTJkOWUwYVVMLAorICAgIDB4M2Q0NzVjMGJVTCwgMHg3MGEzMjYxY1VMLCAweDQ3YzllNDFkVUwsIDB4MWU3N2EyMWZVTCwgMHgyOTFkNjAxZVVMLAorICAgIDB4YWMwYjJmMWJVTCwgMHg5YjYxZWQxYVVMLCAweGMyZGZhYjE4VUwsIDB4ZjViNTY5MTlVTCwgMHhjOGYyMzUxMlVMLAorICAgIDB4ZmY5OGY3MTNVTCwgMHhhNjI2YjExMVVMLCAweDkxNGM3MzEwVUwsIDB4MTQ1YTNjMTVVTCwgMHgyMzMwZmUxNFVMLAorICAgIDB4N2E4ZWI4MTZVTCwgMHg0ZGU0N2ExN1VMLCAweGUwNDY0ZDM4VUwsIDB4ZDcyYzhmMzlVTCwgMHg4ZTkyYzkzYlVMLAorICAgIDB4YjlmODBiM2FVTCwgMHgzY2VlNDQzZlVMLCAweDBiODQ4NjNlVUwsIDB4NTIzYWMwM2NVTCwgMHg2NTUwMDIzZFVMLAorICAgIDB4NTgxNzVlMzZVTCwgMHg2ZjdkOWMzN1VMLCAweDM2YzNkYTM1VUwsIDB4MDFhOTE4MzRVTCwgMHg4NGJmNTczMVVMLAorICAgIDB4YjNkNTk1MzBVTCwgMHhlYTZiZDMzMlVMLCAweGRkMDExMTMzVUwsIDB4OTBlNTZiMjRVTCwgMHhhNzhmYTkyNVVMLAorICAgIDB4ZmUzMWVmMjdVTCwgMHhjOTViMmQyNlVMLCAweDRjNGQ2MjIzVUwsIDB4N2IyN2EwMjJVTCwgMHgyMjk5ZTYyMFVMLAorICAgIDB4MTVmMzI0MjFVTCwgMHgyOGI0NzgyYVVMLCAweDFmZGViYTJiVUwsIDB4NDY2MGZjMjlVTCwgMHg3MTBhM2UyOFVMLAorICAgIDB4ZjQxYzcxMmRVTCwgMHhjMzc2YjMyY1VMLCAweDlhYzhmNTJlVUwsIDB4YWRhMjM3MmZVTCwgMHhjMDhkOWE3MFVMLAorICAgIDB4ZjdlNzU4NzFVTCwgMHhhZTU5MWU3M1VMLCAweDk5MzNkYzcyVUwsIDB4MWMyNTkzNzdVTCwgMHgyYjRmNTE3NlVMLAorICAgIDB4NzJmMTE3NzRVTCwgMHg0NTliZDU3NVVMLCAweDc4ZGM4OTdlVUwsIDB4NGZiNjRiN2ZVTCwgMHgxNjA4MGQ3ZFVMLAorICAgIDB4MjE2MmNmN2NVTCwgMHhhNDc0ODA3OVVMLCAweDkzMWU0Mjc4VUwsIDB4Y2FhMDA0N2FVTCwgMHhmZGNhYzY3YlVMLAorICAgIDB4YjAyZWJjNmNVTCwgMHg4NzQ0N2U2ZFVMLCAweGRlZmEzODZmVUwsIDB4ZTk5MGZhNmVVTCwgMHg2Yzg2YjU2YlVMLAorICAgIDB4NWJlYzc3NmFVTCwgMHgwMjUyMzE2OFVMLCAweDM1MzhmMzY5VUwsIDB4MDg3ZmFmNjJVTCwgMHgzZjE1NmQ2M1VMLAorICAgIDB4NjZhYjJiNjFVTCwgMHg1MWMxZTk2MFVMLCAweGQ0ZDdhNjY1VUwsIDB4ZTNiZDY0NjRVTCwgMHhiYTAzMjI2NlVMLAorICAgIDB4OGQ2OWUwNjdVTCwgMHgyMGNiZDc0OFVMLCAweDE3YTExNTQ5VUwsIDB4NGUxZjUzNGJVTCwgMHg3OTc1OTE0YVVMLAorICAgIDB4ZmM2M2RlNGZVTCwgMHhjYjA5MWM0ZVVMLCAweDkyYjc1YTRjVUwsIDB4YTVkZDk4NGRVTCwgMHg5ODlhYzQ0NlVMLAorICAgIDB4YWZmMDA2NDdVTCwgMHhmNjRlNDA0NVVMLCAweGMxMjQ4MjQ0VUwsIDB4NDQzMmNkNDFVTCwgMHg3MzU4MGY0MFVMLAorICAgIDB4MmFlNjQ5NDJVTCwgMHgxZDhjOGI0M1VMLCAweDUwNjhmMTU0VUwsIDB4NjcwMjMzNTVVTCwgMHgzZWJjNzU1N1VMLAorICAgIDB4MDlkNmI3NTZVTCwgMHg4Y2MwZjg1M1VMLCAweGJiYWEzYTUyVUwsIDB4ZTIxNDdjNTBVTCwgMHhkNTdlYmU1MVVMLAorICAgIDB4ZTgzOWUyNWFVTCwgMHhkZjUzMjA1YlVMLCAweDg2ZWQ2NjU5VUwsIDB4YjE4N2E0NThVTCwgMHgzNDkxZWI1ZFVMLAorICAgIDB4MDNmYjI5NWNVTCwgMHg1YTQ1NmY1ZVVMLCAweDZkMmZhZDVmVUwsIDB4ODAxYjM1ZTFVTCwgMHhiNzcxZjdlMFVMLAorICAgIDB4ZWVjZmIxZTJVTCwgMHhkOWE1NzNlM1VMLCAweDVjYjMzY2U2VUwsIDB4NmJkOWZlZTdVTCwgMHgzMjY3YjhlNVVMLAorICAgIDB4MDUwZDdhZTRVTCwgMHgzODRhMjZlZlVMLCAweDBmMjBlNGVlVUwsIDB4NTY5ZWEyZWNVTCwgMHg2MWY0NjBlZFVMLAorICAgIDB4ZTRlMjJmZThVTCwgMHhkMzg4ZWRlOVVMLCAweDhhMzZhYmViVUwsIDB4YmQ1YzY5ZWFVTCwgMHhmMGI4MTNmZFVMLAorICAgIDB4YzdkMmQxZmNVTCwgMHg5ZTZjOTdmZVVMLCAweGE5MDY1NWZmVUwsIDB4MmMxMDFhZmFVTCwgMHgxYjdhZDhmYlVMLAorICAgIDB4NDJjNDllZjlVTCwgMHg3NWFlNWNmOFVMLCAweDQ4ZTkwMGYzVUwsIDB4N2Y4M2MyZjJVTCwgMHgyNjNkODRmMFVMLAorICAgIDB4MTE1NzQ2ZjFVTCwgMHg5NDQxMDlmNFVMLCAweGEzMmJjYmY1VUwsIDB4ZmE5NThkZjdVTCwgMHhjZGZmNGZmNlVMLAorICAgIDB4NjA1ZDc4ZDlVTCwgMHg1NzM3YmFkOFVMLCAweDBlODlmY2RhVUwsIDB4MzllMzNlZGJVTCwgMHhiY2Y1NzFkZVVMLAorICAgIDB4OGI5ZmIzZGZVTCwgMHhkMjIxZjVkZFVMLCAweGU1NGIzN2RjVUwsIDB4ZDgwYzZiZDdVTCwgMHhlZjY2YTlkNlVMLAorICAgIDB4YjZkOGVmZDRVTCwgMHg4MWIyMmRkNVVMLCAweDA0YTQ2MmQwVUwsIDB4MzNjZWEwZDFVTCwgMHg2YTcwZTZkM1VMLAorICAgIDB4NWQxYTI0ZDJVTCwgMHgxMGZlNWVjNVVMLCAweDI3OTQ5Y2M0VUwsIDB4N2UyYWRhYzZVTCwgMHg0OTQwMThjN1VMLAorICAgIDB4Y2M1NjU3YzJVTCwgMHhmYjNjOTVjM1VMLCAweGEyODJkM2MxVUwsIDB4OTVlODExYzBVTCwgMHhhOGFmNGRjYlVMLAorICAgIDB4OWZjNThmY2FVTCwgMHhjNjdiYzljOFVMLCAweGYxMTEwYmM5VUwsIDB4NzQwNzQ0Y2NVTCwgMHg0MzZkODZjZFVMLAorICAgIDB4MWFkM2MwY2ZVTCwgMHgyZGI5MDJjZVVMLCAweDQwOTZhZjkxVUwsIDB4NzdmYzZkOTBVTCwgMHgyZTQyMmI5MlVMLAorICAgIDB4MTkyOGU5OTNVTCwgMHg5YzNlYTY5NlVMLCAweGFiNTQ2NDk3VUwsIDB4ZjJlYTIyOTVVTCwgMHhjNTgwZTA5NFVMLAorICAgIDB4ZjhjN2JjOWZVTCwgMHhjZmFkN2U5ZVVMLCAweDk2MTMzODljVUwsIDB4YTE3OWZhOWRVTCwgMHgyNDZmYjU5OFVMLAorICAgIDB4MTMwNTc3OTlVTCwgMHg0YWJiMzE5YlVMLCAweDdkZDFmMzlhVUwsIDB4MzAzNTg5OGRVTCwgMHgwNzVmNGI4Y1VMLAorICAgIDB4NWVlMTBkOGVVTCwgMHg2OThiY2Y4ZlVMLCAweGVjOWQ4MDhhVUwsIDB4ZGJmNzQyOGJVTCwgMHg4MjQ5MDQ4OVVMLAorICAgIDB4YjUyM2M2ODhVTCwgMHg4ODY0OWE4M1VMLCAweGJmMGU1ODgyVUwsIDB4ZTZiMDFlODBVTCwgMHhkMWRhZGM4MVVMLAorICAgIDB4NTRjYzkzODRVTCwgMHg2M2E2NTE4NVVMLCAweDNhMTgxNzg3VUwsIDB4MGQ3MmQ1ODZVTCwgMHhhMGQwZTJhOVVMLAorICAgIDB4OTdiYTIwYThVTCwgMHhjZTA0NjZhYVVMLCAweGY5NmVhNGFiVUwsIDB4N2M3OGViYWVVTCwgMHg0YjEyMjlhZlVMLAorICAgIDB4MTJhYzZmYWRVTCwgMHgyNWM2YWRhY1VMLCAweDE4ODFmMWE3VUwsIDB4MmZlYjMzYTZVTCwgMHg3NjU1NzVhNFVMLAorICAgIDB4NDEzZmI3YTVVTCwgMHhjNDI5ZjhhMFVMLCAweGYzNDMzYWExVUwsIDB4YWFmZDdjYTNVTCwgMHg5ZDk3YmVhMlVMLAorICAgIDB4ZDA3M2M0YjVVTCwgMHhlNzE5MDZiNFVMLCAweGJlYTc0MGI2VUwsIDB4ODljZDgyYjdVTCwgMHgwY2RiY2RiMlVMLAorICAgIDB4M2JiMTBmYjNVTCwgMHg2MjBmNDliMVVMLCAweDU1NjU4YmIwVUwsIDB4NjgyMmQ3YmJVTCwgMHg1ZjQ4MTViYVVMLAorICAgIDB4MDZmNjUzYjhVTCwgMHgzMTljOTFiOVVMLCAweGI0OGFkZWJjVUwsIDB4ODNlMDFjYmRVTCwgMHhkYTVlNWFiZlVMLAorICAgIDB4ZWQzNDk4YmVVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDY1NjdiY2I4VUwsIDB4OGJjODA5YWFVTCwgMHhlZWFmYjUxMlVMLCAweDU3OTc2MjhmVUwsCisgICAgMHgzMmYwZGUzN1VMLCAweGRjNWY2YjI1VUwsIDB4YjkzOGQ3OWRVTCwgMHhlZjI4YjRjNVVMLCAweDhhNGYwODdkVUwsCisgICAgMHg2NGUwYmQ2ZlVMLCAweDAxODcwMWQ3VUwsIDB4YjhiZmQ2NGFVTCwgMHhkZGQ4NmFmMlVMLCAweDMzNzdkZmUwVUwsCisgICAgMHg1NjEwNjM1OFVMLCAweDlmNTcxOTUwVUwsIDB4ZmEzMGE1ZThVTCwgMHgxNDlmMTBmYVVMLCAweDcxZjhhYzQyVUwsCisgICAgMHhjOGMwN2JkZlVMLCAweGFkYTdjNzY3VUwsIDB4NDMwODcyNzVVTCwgMHgyNjZmY2VjZFVMLCAweDcwN2ZhZDk1VUwsCisgICAgMHgxNTE4MTEyZFVMLCAweGZiYjdhNDNmVUwsIDB4OWVkMDE4ODdVTCwgMHgyN2U4Y2YxYVVMLCAweDQyOGY3M2EyVUwsCisgICAgMHhhYzIwYzZiMFVMLCAweGM5NDc3YTA4VUwsIDB4M2VhZjMyYTBVTCwgMHg1YmM4OGUxOFVMLCAweGI1NjczYjBhVUwsCisgICAgMHhkMDAwODdiMlVMLCAweDY5Mzg1MDJmVUwsIDB4MGM1ZmVjOTdVTCwgMHhlMmYwNTk4NVVMLCAweDg3OTdlNTNkVUwsCisgICAgMHhkMTg3ODY2NVVMLCAweGI0ZTAzYWRkVUwsIDB4NWE0ZjhmY2ZVTCwgMHgzZjI4MzM3N1VMLCAweDg2MTBlNGVhVUwsCisgICAgMHhlMzc3NTg1MlVMLCAweDBkZDhlZDQwVUwsIDB4NjhiZjUxZjhVTCwgMHhhMWY4MmJmMFVMLCAweGM0OWY5NzQ4VUwsCisgICAgMHgyYTMwMjI1YVVMLCAweDRmNTc5ZWUyVUwsIDB4ZjY2ZjQ5N2ZVTCwgMHg5MzA4ZjVjN1VMLCAweDdkYTc0MGQ1VUwsCisgICAgMHgxOGMwZmM2ZFVMLCAweDRlZDA5ZjM1VUwsIDB4MmJiNzIzOGRVTCwgMHhjNTE4OTY5ZlVMLCAweGEwN2YyYTI3VUwsCisgICAgMHgxOTQ3ZmRiYVVMLCAweDdjMjA0MTAyVUwsIDB4OTI4ZmY0MTBVTCwgMHhmN2U4NDhhOFVMLCAweDNkNTgxNDliVUwsCisgICAgMHg1ODNmYTgyM1VMLCAweGI2OTAxZDMxVUwsIDB4ZDNmN2ExODlVTCwgMHg2YWNmNzYxNFVMLCAweDBmYThjYWFjVUwsCisgICAgMHhlMTA3N2ZiZVVMLCAweDg0NjBjMzA2VUwsIDB4ZDI3MGEwNWVVTCwgMHhiNzE3MWNlNlVMLCAweDU5YjhhOWY0VUwsCisgICAgMHgzY2RmMTU0Y1VMLCAweDg1ZTdjMmQxVUwsIDB4ZTA4MDdlNjlVTCwgMHgwZTJmY2I3YlVMLCAweDZiNDg3N2MzVUwsCisgICAgMHhhMjBmMGRjYlVMLCAweGM3NjhiMTczVUwsIDB4MjljNzA0NjFVTCwgMHg0Y2EwYjhkOVVMLCAweGY1OTg2ZjQ0VUwsCisgICAgMHg5MGZmZDNmY1VMLCAweDdlNTA2NmVlVUwsIDB4MWIzN2RhNTZVTCwgMHg0ZDI3YjkwZVVMLCAweDI4NDAwNWI2VUwsCisgICAgMHhjNmVmYjBhNFVMLCAweGEzODgwYzFjVUwsIDB4MWFiMGRiODFVTCwgMHg3ZmQ3NjczOVVMLCAweDkxNzhkMjJiVUwsCisgICAgMHhmNDFmNmU5M1VMLCAweDAzZjcyNjNiVUwsIDB4NjY5MDlhODNVTCwgMHg4ODNmMmY5MVVMLCAweGVkNTg5MzI5VUwsCisgICAgMHg1NDYwNDRiNFVMLCAweDMxMDdmODBjVUwsIDB4ZGZhODRkMWVVTCwgMHhiYWNmZjFhNlVMLCAweGVjZGY5MmZlVUwsCisgICAgMHg4OWI4MmU0NlVMLCAweDY3MTc5YjU0VUwsIDB4MDI3MDI3ZWNVTCwgMHhiYjQ4ZjA3MVVMLCAweGRlMmY0Y2M5VUwsCisgICAgMHgzMDgwZjlkYlVMLCAweDU1ZTc0NTYzVUwsIDB4OWNhMDNmNmJVTCwgMHhmOWM3ODNkM1VMLCAweDE3NjgzNmMxVUwsCisgICAgMHg3MjBmOGE3OVVMLCAweGNiMzc1ZGU0VUwsIDB4YWU1MGUxNWNVTCwgMHg0MGZmNTQ0ZVVMLCAweDI1OThlOGY2VUwsCisgICAgMHg3Mzg4OGJhZVVMLCAweDE2ZWYzNzE2VUwsIDB4Zjg0MDgyMDRVTCwgMHg5ZDI3M2ViY1VMLCAweDI0MWZlOTIxVUwsCisgICAgMHg0MTc4NTU5OVVMLCAweGFmZDdlMDhiVUwsIDB4Y2FiMDVjMzNVTCwgMHgzYmI2NTllZFVMLCAweDVlZDFlNTU1VUwsCisgICAgMHhiMDdlNTA0N1VMLCAweGQ1MTllY2ZmVUwsIDB4NmMyMTNiNjJVTCwgMHgwOTQ2ODdkYVVMLCAweGU3ZTkzMmM4VUwsCisgICAgMHg4MjhlOGU3MFVMLCAweGQ0OWVlZDI4VUwsIDB4YjFmOTUxOTBVTCwgMHg1ZjU2ZTQ4MlVMLCAweDNhMzE1ODNhVUwsCisgICAgMHg4MzA5OGZhN1VMLCAweGU2NmUzMzFmVUwsIDB4MDhjMTg2MGRVTCwgMHg2ZGE2M2FiNVVMLCAweGE0ZTE0MGJkVUwsCisgICAgMHhjMTg2ZmMwNVVMLCAweDJmMjk0OTE3VUwsIDB4NGE0ZWY1YWZVTCwgMHhmMzc2MjIzMlVMLCAweDk2MTE5ZThhVUwsCisgICAgMHg3OGJlMmI5OFVMLCAweDFkZDk5NzIwVUwsIDB4NGJjOWY0NzhVTCwgMHgyZWFlNDhjMFVMLCAweGMwMDFmZGQyVUwsCisgICAgMHhhNTY2NDE2YVVMLCAweDFjNWU5NmY3VUwsIDB4NzkzOTJhNGZVTCwgMHg5Nzk2OWY1ZFVMLCAweGYyZjEyM2U1VUwsCisgICAgMHgwNTE5NmI0ZFVMLCAweDYwN2VkN2Y1VUwsIDB4OGVkMTYyZTdVTCwgMHhlYmI2ZGU1ZlVMLCAweDUyOGUwOWMyVUwsCisgICAgMHgzN2U5YjU3YVVMLCAweGQ5NDYwMDY4VUwsIDB4YmMyMWJjZDBVTCwgMHhlYTMxZGY4OFVMLCAweDhmNTY2MzMwVUwsCisgICAgMHg2MWY5ZDYyMlVMLCAweDA0OWU2YTlhVUwsIDB4YmRhNmJkMDdVTCwgMHhkOGMxMDFiZlVMLCAweDM2NmViNGFkVUwsCisgICAgMHg1MzA5MDgxNVVMLCAweDlhNGU3MjFkVUwsIDB4ZmYyOWNlYTVVTCwgMHgxMTg2N2JiN1VMLCAweDc0ZTFjNzBmVUwsCisgICAgMHhjZGQ5MTA5MlVMLCAweGE4YmVhYzJhVUwsIDB4NDYxMTE5MzhVTCwgMHgyMzc2YTU4MFVMLCAweDc1NjZjNmQ4VUwsCisgICAgMHgxMDAxN2E2MFVMLCAweGZlYWVjZjcyVUwsIDB4OWJjOTczY2FVTCwgMHgyMmYxYTQ1N1VMLCAweDQ3OTYxOGVmVUwsCisgICAgMHhhOTM5YWRmZFVMLCAweGNjNWUxMTQ1VUwsIDB4MDZlZTRkNzZVTCwgMHg2Mzg5ZjFjZVVMLCAweDhkMjY0NGRjVUwsCisgICAgMHhlODQxZjg2NFVMLCAweDUxNzkyZmY5VUwsIDB4MzQxZTkzNDFVTCwgMHhkYWIxMjY1M1VMLCAweGJmZDY5YWViVUwsCisgICAgMHhlOWM2ZjliM1VMLCAweDhjYTE0NTBiVUwsIDB4NjIwZWYwMTlVTCwgMHgwNzY5NGNhMVVMLCAweGJlNTE5YjNjVUwsCisgICAgMHhkYjM2Mjc4NFVMLCAweDM1OTk5Mjk2VUwsIDB4NTBmZTJlMmVVTCwgMHg5OWI5NTQyNlVMLCAweGZjZGVlODllVUwsCisgICAgMHgxMjcxNWQ4Y1VMLCAweDc3MTZlMTM0VUwsIDB4Y2UyZTM2YTlVTCwgMHhhYjQ5OGExMVVMLCAweDQ1ZTYzZjAzVUwsCisgICAgMHgyMDgxODNiYlVMLCAweDc2OTFlMGUzVUwsIDB4MTNmNjVjNWJVTCwgMHhmZDU5ZTk0OVVMLCAweDk4M2U1NWYxVUwsCisgICAgMHgyMTA2ODI2Y1VMLCAweDQ0NjEzZWQ0VUwsIDB4YWFjZThiYzZVTCwgMHhjZmE5Mzc3ZVVMLCAweDM4NDE3ZmQ2VUwsCisgICAgMHg1ZDI2YzM2ZVVMLCAweGIzODk3NjdjVUwsIDB4ZDZlZWNhYzRVTCwgMHg2ZmQ2MWQ1OVVMLCAweDBhYjFhMWUxVUwsCisgICAgMHhlNDFlMTRmM1VMLCAweDgxNzlhODRiVUwsIDB4ZDc2OWNiMTNVTCwgMHhiMjBlNzdhYlVMLCAweDVjYTFjMmI5VUwsCisgICAgMHgzOWM2N2UwMVVMLCAweDgwZmVhOTljVUwsIDB4ZTU5OTE1MjRVTCwgMHgwYjM2YTAzNlVMLCAweDZlNTExYzhlVUwsCisgICAgMHhhNzE2NjY4NlVMLCAweGMyNzFkYTNlVUwsIDB4MmNkZTZmMmNVTCwgMHg0OWI5ZDM5NFVMLCAweGYwODEwNDA5VUwsCisgICAgMHg5NWU2YjhiMVVMLCAweDdiNDkwZGEzVUwsIDB4MWUyZWIxMWJVTCwgMHg0ODNlZDI0M1VMLCAweDJkNTk2ZWZiVUwsCisgICAgMHhjM2Y2ZGJlOVVMLCAweGE2OTE2NzUxVUwsIDB4MWZhOWIwY2NVTCwgMHg3YWNlMGM3NFVMLCAweDk0NjFiOTY2VUwsCisgICAgMHhmMTA2MDVkZVVMCisjZW5kaWYKKyAgfQorfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2RlZmxhdGUuYyBiL3Vzci9rbGliYy96bGliL2RlZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTliMDNkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvZGVmbGF0ZS5jCkBAIC0wLDAgKzEsMTczNiBAQAorLyogZGVmbGF0ZS5jIC0tIGNvbXByZXNzIGRhdGEgdXNpbmcgdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIGRlcGVuZHMgb24gYmVpbmcgYWJsZSB0byBpZGVudGlmeSBwb3J0aW9ucworICogICAgICBvZiB0aGUgaW5wdXQgdGV4dCB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIGVhcmxpZXIgaW5wdXQgKHdpdGhpbiBhCisgKiAgICAgIHNsaWRpbmcgd2luZG93IHRyYWlsaW5nIGJlaGluZCB0aGUgaW5wdXQgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCkuCisgKgorICogICAgICBUaGUgbW9zdCBzdHJhaWdodGZvcndhcmQgdGVjaG5pcXVlIHR1cm5zIG91dCB0byBiZSB0aGUgZmFzdGVzdCBmb3IKKyAqICAgICAgbW9zdCBpbnB1dCBmaWxlczogdHJ5IGFsbCBwb3NzaWJsZSBtYXRjaGVzIGFuZCBzZWxlY3QgdGhlIGxvbmdlc3QuCisgKiAgICAgIFRoZSBrZXkgZmVhdHVyZSBvZiB0aGlzIGFsZ29yaXRobSBpcyB0aGF0IGluc2VydGlvbnMgaW50byB0aGUgc3RyaW5nCisgKiAgICAgIGRpY3Rpb25hcnkgYXJlIHZlcnkgc2ltcGxlIGFuZCB0aHVzIGZhc3QsIGFuZCBkZWxldGlvbnMgYXJlIGF2b2lkZWQKKyAqICAgICAgY29tcGxldGVseS4gSW5zZXJ0aW9ucyBhcmUgcGVyZm9ybWVkIGF0IGVhY2ggaW5wdXQgY2hhcmFjdGVyLCB3aGVyZWFzCisgKiAgICAgIHN0cmluZyBtYXRjaGVzIGFyZSBwZXJmb3JtZWQgb25seSB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBlbmRzLiBTbyBpdAorICogICAgICBpcyBwcmVmZXJhYmxlIHRvIHNwZW5kIG1vcmUgdGltZSBpbiBtYXRjaGVzIHRvIGFsbG93IHZlcnkgZmFzdCBzdHJpbmcKKyAqICAgICAgaW5zZXJ0aW9ucyBhbmQgYXZvaWQgZGVsZXRpb25zLiBUaGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGZvciBzbWFsbAorICogICAgICBzdHJpbmdzIGlzIGluc3BpcmVkIGZyb20gdGhhdCBvZiBSYWJpbiAmIEthcnAuIEEgYnJ1dGUgZm9yY2UgYXBwcm9hY2gKKyAqICAgICAgaXMgdXNlZCB0byBmaW5kIGxvbmdlciBzdHJpbmdzIHdoZW4gYSBzbWFsbCBtYXRjaCBoYXMgYmVlbiBmb3VuZC4KKyAqICAgICAgQSBzaW1pbGFyIGFsZ29yaXRobSBpcyB1c2VkIGluIGNvbWljIChieSBKYW4tTWFyayBXYW1zKSBhbmQgZnJlZXplCisgKiAgICAgIChieSBMZW9uaWQgQnJvdWtoaXMpLgorICogICAgICAgICBBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVzZWQgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgYWxnb3JpdGhtCisgKiAgICAgIChieSBGaWFsYSBhbmQgR3JlZW5lKSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiBsaW5lYXIgYW1vcnRpemVkCisgKiAgICAgIHRpbWUsIGJ1dCBoYXMgYSBsYXJnZXIgYXZlcmFnZSBjb3N0LCB1c2VzIG1vcmUgbWVtb3J5IGFuZCBpcyBwYXRlbnRlZC4KKyAqICAgICAgSG93ZXZlciB0aGUgRiZHIGFsZ29yaXRobSBtYXkgYmUgZmFzdGVyIGZvciBzb21lIGhpZ2hseSByZWR1bmRhbnQKKyAqICAgICAgZmlsZXMgaWYgdGhlIHBhcmFtZXRlciBtYXhfY2hhaW5fbGVuZ3RoIChkZXNjcmliZWQgYmVsb3cpIGlzIHRvbyBsYXJnZS4KKyAqCisgKiAgQUNLTk9XTEVER0VNRU5UUworICoKKyAqICAgICAgVGhlIGlkZWEgb2YgbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgaXMgZHVlIHRvIEphbi1NYXJrIFdhbXMsIGFuZAorICogICAgICBJIGZvdW5kIGl0IGluICdmcmVlemUnIHdyaXR0ZW4gYnkgTGVvbmlkIEJyb3VraGlzLgorICogICAgICBUaGFua3MgdG8gbWFueSBwZW9wbGUgZm9yIGJ1ZyByZXBvcnRzIGFuZCB0ZXN0aW5nLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIuCisgKiAgICAgIEF2YWlsYWJsZSBpbiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dAorICoKKyAqICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGUgUmFiaW4gYW5kIEthcnAgYWxnb3JpdGhtIGlzIGdpdmVuIGluIHRoZSBib29rCisgKiAgICAgICAgICJBbGdvcml0aG1zIiBieSBSLiBTZWRnZXdpY2ssIEFkZGlzb24tV2VzbGV5LCBwMjUyLgorICoKKyAqICAgICAgRmlhbGEsRS5SLiwgYW5kIEdyZWVuZSxELkguCisgKiAgICAgICAgIERhdGEgQ29tcHJlc3Npb24gd2l0aCBGaW5pdGUgV2luZG93cywgQ29tbS5BQ00sIDMyLDQgKDE5ODkpIDQ5MC01OTUKKyAqCisgKi8KKworLyogQCgjKSAkSWQ6IGRlZmxhdGUuYyx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjaW5jbHVkZSAiZGVmbGF0ZS5oIgorCitjb25zdCBjaGFyIGRlZmxhdGVfY29weXJpZ2h0W10gPQorICAgIiBkZWZsYXRlIDEuMi4zIENvcHlyaWdodCAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseSAiOworLyoKKyAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQorICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CisgIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcworICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBGdW5jdGlvbiBwcm90b3R5cGVzLgorICovCit0eXBlZGVmIGVudW0geworICAgIG5lZWRfbW9yZSwgICAgICAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi8KKyAgICBibG9ja19kb25lLCAgICAgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovCisgICAgZmluaXNoX3N0YXJ0ZWQsIC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovCisgICAgZmluaXNoX2RvbmUgICAgIC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi8KK30gYmxvY2tfc3RhdGU7CisKK3R5cGVkZWYgYmxvY2tfc3RhdGUgKCpjb21wcmVzc19mdW5jKSBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7CisvKiBDb21wcmVzc2lvbiBmdW5jdGlvbi4gUmV0dXJucyB0aGUgYmxvY2sgc3RhdGUgYWZ0ZXIgdGhlIGNhbGwuICovCisKK2xvY2FsIHZvaWQgZmlsbF93aW5kb3cgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc3RvcmVkIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfZmFzdCAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKKyNpZm5kZWYgRkFTVEVTVAorbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworI2VuZGlmCitsb2NhbCB2b2lkIGxtX2luaXQgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB2b2lkIHB1dFNob3J0TVNCICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB1SW50IGIpKTsKK2xvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyAgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Citsb2NhbCBpbnQgcmVhZF9idWYgICAgICAgIE9GKCh6X3N0cmVhbXAgc3RybSwgQnl0ZWYgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOworI2lmbmRlZiBGQVNURVNUCisjaWZkZWYgQVNNVgorICAgICAgdm9pZCBtYXRjaF9pbml0IE9GKCh2b2lkKSk7IC8qIGFzbSBjb2RlIGluaXRpYWxpemF0aW9uICovCisgICAgICB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOworI2Vsc2UKK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CisjZW5kaWYKKyNlbmRpZgorbG9jYWwgdUludCBsb25nZXN0X21hdGNoX2Zhc3QgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CisKKyNpZmRlZiBERUJVRworbG9jYWwgIHZvaWQgY2hlY2tfbWF0Y2ggT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkpOworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YQorICovCisKKyNkZWZpbmUgTklMIDAKKy8qIFRhaWwgb2YgaGFzaCBjaGFpbnMgKi8KKworI2lmbmRlZiBUT09fRkFSCisjICBkZWZpbmUgVE9PX0ZBUiA0MDk2CisjZW5kaWYKKy8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KKworI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisvKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgorICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgorICovCisKKy8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvbgorICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvCisgKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKKyAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY29uZmlnX3MgeworICAgdXNoIGdvb2RfbGVuZ3RoOyAvKiByZWR1Y2UgbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfbGF6eTsgICAgLyogZG8gbm90IHBlcmZvcm0gbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBuaWNlX2xlbmd0aDsgLyogcXVpdCBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfY2hhaW47CisgICBjb21wcmVzc19mdW5jIGZ1bmM7Cit9IGNvbmZpZzsKKworI2lmZGVmIEZBU1RFU1QKK2xvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzJdID0geworLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqLworLyogMCAqLyB7MCwgICAgMCwgIDAsICAgIDAsIGRlZmxhdGVfc3RvcmVkfSwgIC8qIHN0b3JlIG9ubHkgKi8KKy8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0LCBkZWZsYXRlX2Zhc3R9fTsgLyogbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKyNlbHNlCitsb2NhbCBjb25zdCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7CisvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCisvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLworLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH0sIC8qIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovCisvKiAyICovIHs0LCAgICA1LCAxNiwgICAgOCwgZGVmbGF0ZV9mYXN0fSwKKy8qIDMgKi8gezQsICAgIDYsIDMyLCAgIDMyLCBkZWZsYXRlX2Zhc3R9LAorCisvKiA0ICovIHs0LCAgICA0LCAxNiwgICAxNiwgZGVmbGF0ZV9zbG93fSwgIC8qIGxhenkgbWF0Y2hlcyAqLworLyogNSAqLyB7OCwgICAxNiwgMzIsICAgMzIsIGRlZmxhdGVfc2xvd30sCisvKiA2ICovIHs4LCAgIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93fSwKKy8qIDcgKi8gezgsICAgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3d9LAorLyogOCAqLyB7MzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3d9LAorLyogOSAqLyB7MzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3d9fTsgLyogbWF4IGNvbXByZXNzaW9uICovCisjZW5kaWYKKworLyogTm90ZTogdGhlIGRlZmxhdGUoKSBjb2RlIHJlcXVpcmVzIG1heF9sYXp5ID49IE1JTl9NQVRDSCBhbmQgbWF4X2NoYWluID49IDQKKyAqIEZvciBkZWZsYXRlX2Zhc3QoKSAobGV2ZWxzIDw9IDMpIGdvb2QgaXMgaWdub3JlZCBhbmQgbGF6eSBoYXMgYSBkaWZmZXJlbnQKKyAqIG1lYW5pbmcuCisgKi8KKworI2RlZmluZSBFUVVBTCAwCisvKiByZXN1bHQgb2YgbWVtY21wIGZvciBlcXVhbCBzdHJpbmdzICovCisKKyNpZm5kZWYgTk9fRFVNTVlfREVDTAorc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0gocyxoLGMpIChoID0gKCgoaCk8PHMtPmhhc2hfc2hpZnQpIF4gKGMpKSAmIHMtPmhhc2hfbWFzaykKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluc2VydCBzdHJpbmcgc3RyIGluIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQgbWF0Y2hfaGVhZCB0byB0aGUgcHJldmlvdXMgaGVhZAorICogb2YgdGhlIGhhc2ggY2hhaW4gKHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgd2l0aCBzYW1lIGhhc2gga2V5KS4gUmV0dXJuCisgKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgorICogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggLURGQVNURVNULCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgZm9yY2VkCisgKiB0byAxLCBhbmQgbm8gaGFzaCBjaGFpbnMgYXJlIG1haW50YWluZWQuCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHN0ciBhcmUgdmFsaWQKKyAqICAgIChleGNlcHQgZm9yIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAqLworI2lmZGVmIEZBU1RFU1QKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgbWF0Y2hfaGVhZCA9IHMtPmhlYWRbcy0+aW5zX2hdLCBcCisgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKShzdHIpKQorI2Vsc2UKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgbWF0Y2hfaGVhZCA9IHMtPnByZXZbKHN0cikgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKKyAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIChhdm9pZGluZyA2NEsgb3ZlcmZsb3cgZm9yIDE2IGJpdCBzeXN0ZW1zKS4KKyAqIHByZXZbXSB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHRoZSBmbHkuCisgKi8KKyNkZWZpbmUgQ0xFQVJfSEFTSChzKSBcCisgICAgcy0+aGVhZFtzLT5oYXNoX3NpemUtMV0gPSBOSUw7IFwKKyAgICB6bWVtemVybygoQnl0ZWYgKilzLT5oZWFkLCAodW5zaWduZWQpKHMtPmhhc2hfc2l6ZS0xKSpzaXplb2YoKnMtPmhlYWQpKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgbGV2ZWw7CisgICAgY29uc3QgY2hhciAqdmVyc2lvbjsKKyAgICBpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgcmV0dXJuIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKKyAgICAvKiBUbyBkbzogaWdub3JlIHN0cm0tPm5leHRfaW4gaWYgd2UgdXNlIGl0IGFzIHdpbmRvdyAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgIHZlcnNpb24sIHN0cmVhbV9zaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCAgbGV2ZWw7CisgICAgaW50ICBtZXRob2Q7CisgICAgaW50ICB3aW5kb3dCaXRzOworICAgIGludCAgbWVtTGV2ZWw7CisgICAgaW50ICBzdHJhdGVneTsKKyAgICBjb25zdCBjaGFyICp2ZXJzaW9uOworICAgIGludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCB3cmFwID0gMTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBteV92ZXJzaW9uW10gPSBaTElCX1ZFUlNJT047CisKKyAgICB1c2hmICpvdmVybGF5OworICAgIC8qIFdlIG92ZXJsYXkgcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmLiBUaGlzIHdvcmtzIHNpbmNlIHRoZSBhdmVyYWdlCisgICAgICogb3V0cHV0IHNpemUgZm9yIChsZW5ndGgsZGlzdGFuY2UpIGNvZGVzIGlzIDw9IDI0IGJpdHMuCisgICAgICovCisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBteV92ZXJzaW9uWzBdIHx8CisgICAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkpIHsKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7CisgICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7CisgICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICB9CisgICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkgc3RybS0+emZyZWUgPSB6Y2ZyZWU7CisKKyNpZmRlZiBGQVNURVNUCisgICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKKyNlbHNlCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworI2VuZGlmCisKKyAgICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovCisgICAgICAgIHdyYXAgPSAwOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHsKKyAgICAgICAgd3JhcCA9IDI7ICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovCisgICAgICAgIHdpbmRvd0JpdHMgLT0gMTY7CisgICAgfQorI2VuZGlmCisgICAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9IFpfREVGTEFURUQgfHwKKyAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwKKyAgICAgICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIGlmICh3aW5kb3dCaXRzID09IDgpIHdpbmRvd0JpdHMgPSA5OyAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqLworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAocyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopczsKKyAgICBzLT5zdHJtID0gc3RybTsKKworICAgIHMtPndyYXAgPSB3cmFwOworICAgIHMtPmd6aGVhZCA9IFpfTlVMTDsKKyAgICBzLT53X2JpdHMgPSB3aW5kb3dCaXRzOworICAgIHMtPndfc2l6ZSA9IDEgPDwgcy0+d19iaXRzOworICAgIHMtPndfbWFzayA9IHMtPndfc2l6ZSAtIDE7CisKKyAgICBzLT5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7CisgICAgcy0+aGFzaF9zaXplID0gMSA8PCBzLT5oYXNoX2JpdHM7CisgICAgcy0+aGFzaF9tYXNrID0gcy0+aGFzaF9zaXplIC0gMTsKKyAgICBzLT5oYXNoX3NoaWZ0ID0gICgocy0+aGFzaF9iaXRzK01JTl9NQVRDSC0xKS9NSU5fTUFUQ0gpOworCisgICAgcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhzdHJtLCBzLT53X3NpemUsIDIqc2l6ZW9mKEJ5dGUpKTsKKyAgICBzLT5wcmV2ICAgPSAoUG9zZiAqKSAgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIHMtPmhlYWQgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+aGFzaF9zaXplLCBzaXplb2YoUG9zKSk7CisKKyAgICBzLT5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovCisKKyAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKHN0cm0sIHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTsKKyAgICBzLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7CisgICAgcy0+cGVuZGluZ19idWZfc2l6ZSA9ICh1bGcpcy0+bGl0X2J1ZnNpemUgKiAoc2l6ZW9mKHVzaCkrMkwpOworCisgICAgaWYgKHMtPndpbmRvdyA9PSBaX05VTEwgfHwgcy0+cHJldiA9PSBaX05VTEwgfHwgcy0+aGVhZCA9PSBaX05VTEwgfHwKKyAgICAgICAgcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7CisgICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKKyAgICAgICAgc3RybS0+bXNnID0gKGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOworICAgICAgICBkZWZsYXRlRW5kIChzdHJtKTsKKyAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIH0KKyAgICBzLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKKyAgICBzLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplOworCisgICAgcy0+bGV2ZWwgPSBsZXZlbDsKKyAgICBzLT5zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHMtPm1ldGhvZCA9IChCeXRlKW1ldGhvZDsKKworICAgIHJldHVybiBkZWZsYXRlUmVzZXQoc3RybSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IChzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OworICAgIHVJbnQgIGRpY3RMZW5ndGg7Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB1SW50IGxlbmd0aCA9IGRpY3RMZW5ndGg7CisgICAgdUludCBuOworICAgIElQb3MgaGFzaF9oZWFkID0gMDsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgZGljdGlvbmFyeSA9PSBaX05VTEwgfHwKKyAgICAgICAgc3RybS0+c3RhdGUtPndyYXAgPT0gMiB8fAorICAgICAgICAoc3RybS0+c3RhdGUtPndyYXAgPT0gMSAmJiBzdHJtLT5zdGF0ZS0+c3RhdHVzICE9IElOSVRfU1RBVEUpKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgaWYgKHMtPndyYXApCisgICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMihzdHJtLT5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7CisKKyAgICBpZiAobGVuZ3RoIDwgTUlOX01BVENIKSByZXR1cm4gWl9PSzsKKyAgICBpZiAobGVuZ3RoID4gTUFYX0RJU1QocykpIHsKKyAgICAgICAgbGVuZ3RoID0gTUFYX0RJU1Qocyk7CisgICAgICAgIGRpY3Rpb25hcnkgKz0gZGljdExlbmd0aCAtIGxlbmd0aDsgLyogdXNlIHRoZSB0YWlsIG9mIHRoZSBkaWN0aW9uYXJ5ICovCisgICAgfQorICAgIHptZW1jcHkocy0+d2luZG93LCBkaWN0aW9uYXJ5LCBsZW5ndGgpOworICAgIHMtPnN0cnN0YXJ0ID0gbGVuZ3RoOworICAgIHMtPmJsb2NrX3N0YXJ0ID0gKGxvbmcpbGVuZ3RoOworCisgICAgLyogSW5zZXJ0IGFsbCBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIChleGNlcHQgZm9yIHRoZSBsYXN0IHR3byBieXRlcykuCisgICAgICogcy0+bG9va2FoZWFkIHN0YXlzIG51bGwsIHNvIHMtPmluc19oIHdpbGwgYmUgcmVjb21wdXRlZCBhdCB0aGUgbmV4dAorICAgICAqIGNhbGwgb2YgZmlsbF93aW5kb3cuCisgICAgICovCisgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbMF07CisgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1sxXSk7CisgICAgZm9yIChuID0gMDsgbiA8PSBsZW5ndGggLSBNSU5fTUFUQ0g7IG4rKykgeworICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIG4sIGhhc2hfaGVhZCk7CisgICAgfQorICAgIGlmIChoYXNoX2hlYWQpIGhhc2hfaGVhZCA9IDA7ICAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVSZXNldCAoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIHN0cm0tPnRvdGFsX2luID0gc3RybS0+dG90YWxfb3V0ID0gMDsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7IC8qIHVzZSB6ZnJlZSBpZiB3ZSBldmVyIGFsbG9jYXRlIG1zZyBkeW5hbWljYWxseSAqLworICAgIHN0cm0tPmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKKworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIHMtPnBlbmRpbmcgPSAwOworICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7CisKKyAgICBpZiAocy0+d3JhcCA8IDApIHsKKyAgICAgICAgcy0+d3JhcCA9IC1zLT53cmFwOyAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqLworICAgIH0KKyAgICBzLT5zdGF0dXMgPSBzLT53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEU7CisgICAgc3RybS0+YWRsZXIgPQorI2lmZGVmIEdaSVAKKyAgICAgICAgcy0+d3JhcCA9PSAyID8gY3JjMzIoMEwsIFpfTlVMTCwgMCkgOgorI2VuZGlmCisgICAgICAgIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgcy0+bGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7CisKKyAgICBfdHJfaW5pdChzKTsKKyAgICBsbV9pbml0KHMpOworCisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgKHN0cm0sIGhlYWQpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgZ3pfaGVhZGVycCBoZWFkOworeworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBpZiAoc3RybS0+c3RhdGUtPndyYXAgIT0gMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0cm0tPnN0YXRlLT5nemhlYWQgPSBoZWFkOworICAgIHJldHVybiBaX09LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgKHN0cm0sIGJpdHMsIHZhbHVlKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBiaXRzOworICAgIGludCB2YWx1ZTsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+c3RhdGUtPmJpX3ZhbGlkID0gYml0czsKKyAgICBzdHJtLT5zdGF0ZS0+YmlfYnVmID0gKHVzaCkodmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMoc3RybSwgbGV2ZWwsIHN0cmF0ZWd5KQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgc3RyYXRlZ3k7Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjb21wcmVzc19mdW5jIGZ1bmM7CisgICAgaW50IGVyciA9IFpfT0s7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgcyA9IHN0cm0tPnN0YXRlOworCisjaWZkZWYgRkFTVEVTVAorICAgIGlmIChsZXZlbCAhPSAwKSBsZXZlbCA9IDE7CisjZWxzZQorICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKKyNlbmRpZgorICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8IHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKKworICAgIGlmIChmdW5jICE9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmZ1bmMgJiYgc3RybS0+dG90YWxfaW4gIT0gMCkgeworICAgICAgICAvKiBGbHVzaCB0aGUgbGFzdCBidWZmZXI6ICovCisgICAgICAgIGVyciA9IGRlZmxhdGUoc3RybSwgWl9QQVJUSUFMX0ZMVVNIKTsKKyAgICB9CisgICAgaWYgKHMtPmxldmVsICE9IGxldmVsKSB7CisgICAgICAgIHMtPmxldmVsID0gbGV2ZWw7CisgICAgICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKKyAgICAgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmdvb2RfbGVuZ3RoOworICAgICAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0ubmljZV9sZW5ndGg7CisgICAgICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47CisgICAgfQorICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUoc3RybSwgZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBnb29kX2xlbmd0aDsKKyAgICBpbnQgbWF4X2xhenk7CisgICAgaW50IG5pY2VfbGVuZ3RoOworICAgIGludCBtYXhfY2hhaW47Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgcy0+Z29vZF9tYXRjaCA9IGdvb2RfbGVuZ3RoOworICAgIHMtPm1heF9sYXp5X21hdGNoID0gbWF4X2xhenk7CisgICAgcy0+bmljZV9tYXRjaCA9IG5pY2VfbGVuZ3RoOworICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBtYXhfY2hhaW47CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZvciB0aGUgZGVmYXVsdCB3aW5kb3dCaXRzIG9mIDE1IGFuZCBtZW1MZXZlbCBvZiA4LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGEgY2xvc2UgdG8gZXhhY3QsIGFzIHdlbGwgYXMgc21hbGwsIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUuCisgKiBUaGV5IGFyZSBjb2RlZCBhcyBjb25zdGFudHMgaGVyZSBmb3IgYSByZWFzb24tLWlmIHRoZSAjZGVmaW5lJ3MgYXJlCisgKiBjaGFuZ2VkLCB0aGVuIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLiAgVGhlIHJldHVybgorICogdmFsdWUgZm9yIDE1IGFuZCA4IG9ubHkgd29ya3MgZm9yIHRob3NlIGV4YWN0IHNldHRpbmdzLgorICoKKyAqIEZvciBhbnkgc2V0dGluZyBvdGhlciB0aGFuIHRob3NlIGRlZmF1bHRzIGZvciB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbCwKKyAqIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGNvbnNlcnZhdGl2ZSB3b3JzdCBjYXNlIGZvciB0aGUgbWF4aW11bSBleHBhbnNpb24KKyAqIHJlc3VsdGluZyBmcm9tIHVzaW5nIGZpeGVkIGJsb2NrcyBpbnN0ZWFkIG9mIHN0b3JlZCBibG9ja3MsIHdoaWNoIGRlZmxhdGUKKyAqIGNhbiBlbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBmb3Igc29tZSBjb21iaW5hdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdG8gcHJvdmlkZSBjbG9zZXIgdXBwZXIgYm91bmRzCisgKiBmb3IgZXZlcnkgY29tYmluYXRpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwsIGFzIHdlbGwgYXMgd3JhcC4KKyAqIEJ1dCBldmVuIHRoZSBjb25zZXJ2YXRpdmUgdXBwZXIgYm91bmQgb2YgYWJvdXQgMTQlIGV4cGFuc2lvbiBkb2VzIG5vdAorICogc2VlbSBvbmVyb3VzIGZvciBvdXRwdXQgYnVmZmVyIGFsbG9jYXRpb24uCisgKi8KK3VMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kKHN0cm0sIHNvdXJjZUxlbikKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB1TG9uZyBkZXN0TGVuOworCisgICAgLyogY29uc2VydmF0aXZlIHVwcGVyIGJvdW5kICovCisgICAgZGVzdExlbiA9IHNvdXJjZUxlbiArCisgICAgICAgICAgICAgICgoc291cmNlTGVuICsgNykgPj4gMykgKyAoKHNvdXJjZUxlbiArIDYzKSA+PiA2KSArIDExOworCisgICAgLyogaWYgY2FuJ3QgZ2V0IHBhcmFtZXRlcnMsIHJldHVybiBjb25zZXJ2YXRpdmUgYm91bmQgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gZGVzdExlbjsKKworICAgIC8qIGlmIG5vdCBkZWZhdWx0IHBhcmFtZXRlcnMsIHJldHVybiBjb25zZXJ2YXRpdmUgYm91bmQgKi8KKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgaWYgKHMtPndfYml0cyAhPSAxNSB8fCBzLT5oYXNoX2JpdHMgIT0gOCArIDcpCisgICAgICAgIHJldHVybiBkZXN0TGVuOworCisgICAgLyogZGVmYXVsdCBzZXR0aW5nczogcmV0dXJuIHRpZ2h0IGJvdW5kIGZvciB0aGF0IGNhc2UgKi8KKyAgICByZXR1cm4gY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci4KKyAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbgorICogcGVuZGluZ19idWYuCisgKi8KK2xvY2FsIHZvaWQgcHV0U2hvcnRNU0IgKHMsIGIpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB1SW50IGI7Cit7CisgICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpOworICAgIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzCisgKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0CisgKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9vdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuCisgKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuCisgKi8KK2xvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyhzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIHVuc2lnbmVkIGxlbiA9IHN0cm0tPnN0YXRlLT5wZW5kaW5nOworCisgICAgaWYgKGxlbiA+IHN0cm0tPmF2YWlsX291dCkgbGVuID0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworCisgICAgem1lbWNweShzdHJtLT5uZXh0X291dCwgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0LCBsZW4pOworICAgIHN0cm0tPm5leHRfb3V0ICArPSBsZW47CisgICAgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0ICArPSBsZW47CisgICAgc3RybS0+dG90YWxfb3V0ICs9IGxlbjsKKyAgICBzdHJtLT5hdmFpbF9vdXQgIC09IGxlbjsKKyAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZyAtPSBsZW47CisgICAgaWYgKHN0cm0tPnN0YXRlLT5wZW5kaW5nID09IDApIHsKKyAgICAgICAgc3RybS0+c3RhdGUtPnBlbmRpbmdfb3V0ID0gc3RybS0+c3RhdGUtPnBlbmRpbmdfYnVmOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZSAoc3RybSwgZmx1c2gpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGZsdXNoOworeworICAgIGludCBvbGRfZmx1c2g7IC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBmbHVzaCA+IFpfRklOSVNIIHx8IGZsdXNoIDwgMCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIHMgPSBzdHJtLT5zdGF0ZTsKKworICAgIGlmIChzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKKyAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApIHx8CisgICAgICAgIChzLT5zdGF0dXMgPT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9IFpfRklOSVNIKSkgeworICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTsKKyAgICB9CisgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKKworICAgIHMtPnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi8KKyAgICBvbGRfZmx1c2ggPSBzLT5sYXN0X2ZsdXNoOworICAgIHMtPmxhc3RfZmx1c2ggPSBmbHVzaDsKKworICAgIC8qIFdyaXRlIHRoZSBoZWFkZXIgKi8KKyAgICBpZiAocy0+c3RhdHVzID09IElOSVRfU1RBVEUpIHsKKyNpZmRlZiBHWklQCisgICAgICAgIGlmIChzLT53cmFwID09IDIpIHsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBwdXRfYnl0ZShzLCAzMSk7CisgICAgICAgICAgICBwdXRfYnl0ZShzLCAxMzkpOworICAgICAgICAgICAgcHV0X2J5dGUocywgOCk7CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5sZXZlbCA9PSA5ID8gMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7CisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPnRleHQgPyAxIDogMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmhjcmMgPyAyIDogMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmV4dHJhID09IFpfTlVMTCA/IDAgOiA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+bmFtZSA9PSBaX05VTEwgPyAwIDogOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmNvbW1lbnQgPT0gWl9OVUxMID8gMCA6IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkocy0+Z3poZWFkLT50aW1lICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDgpICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiAyNCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+bGV2ZWwgPT0gOSA/IDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IDogMCkpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+b3MgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+ZXh0cmFfbGVuICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPmV4dHJhX2xlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQorICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nKTsKKyAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBFWFRSQV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgdUludCBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy0+d19iaXRzLTgpPDw0KSkgPDwgODsKKyAgICAgICAgICAgIHVJbnQgbGV2ZWxfZmxhZ3M7CisKKyAgICAgICAgICAgIGlmIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIpCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPCA2KQorICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHMtPmxldmVsID09IDYpCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMzsKKyAgICAgICAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7CisgICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOworICAgICAgICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTsKKworICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7CisKKyAgICAgICAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqLworICAgICAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKKyAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgJiAweGZmZmYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBHWklQCisgICAgaWYgKHMtPnN0YXR1cyA9PSBFWFRSQV9TVEFURSkgeworICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBOVUxMKSB7CisgICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCisKKyAgICAgICAgICAgIHdoaWxlIChzLT5nemluZGV4IDwgKHMtPmd6aGVhZC0+ZXh0cmFfbGVuICYgMHhmZmZmKSkgeworICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgICAgICAgICBiZWcgPSBzLT5wZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+ZXh0cmFbcy0+Z3ppbmRleF0pOworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgaWYgKHMtPmd6aW5kZXggPT0gcy0+Z3poZWFkLT5leHRyYV9sZW4pIHsKKyAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBOQU1FX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPnN0YXR1cyA9IE5BTUVfU1RBVEU7CisgICAgfQorICAgIGlmIChzLT5zdGF0dXMgPT0gTkFNRV9TVEFURSkgeworICAgICAgICBpZiAocy0+Z3poZWFkLT5uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KKyAgICAgICAgICAgIGludCB2YWw7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbCA9IHMtPmd6aGVhZC0+bmFtZVtzLT5nemluZGV4KytdOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7CisgICAgICAgICAgICB9IHdoaWxlICh2YWwgIT0gMCk7CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gQ09NTUVOVF9TVEFURTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXR1cyA9PSBDT01NRU5UX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmNvbW1lbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLworICAgICAgICAgICAgaW50IHZhbDsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgICAgICAgICBiZWcgPSBzLT5wZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsID0gcy0+Z3poZWFkLT5jb21tZW50W3MtPmd6aW5kZXgrK107CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgdmFsKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHZhbCAhPSAwKTsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgaWYgKHZhbCA9PSAwKQorICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEhDUkNfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXR1cyA9PSBIQ1JDX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpIHsKKyAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA+IHMtPnBlbmRpbmdfYnVmX3NpemUpCisgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA8PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPmFkbGVyICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gOCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovCisgICAgaWYgKHMtPnBlbmRpbmcgIT0gMCkgeworICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGgKKyAgICAgICAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kCisgICAgICAgICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbywKKyAgICAgICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlCisgICAgICAgICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmUKKyAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcAorICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi4KKyAgICAgKi8KKyAgICB9IGVsc2UgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgZmx1c2ggPD0gb2xkX2ZsdXNoICYmCisgICAgICAgICAgICAgICBmbHVzaCAhPSBaX0ZJTklTSCkgeworICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqLworICAgIGlmIChzLT5zdGF0dXMgPT0gRklOSVNIX1NUQVRFICYmIHN0cm0tPmF2YWlsX2luICE9IDApIHsKKyAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7CisgICAgfQorCisgICAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLgorICAgICAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiAhPSAwIHx8IHMtPmxvb2thaGVhZCAhPSAwIHx8CisgICAgICAgIChmbHVzaCAhPSBaX05PX0ZMVVNIICYmIHMtPnN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpKSB7CisgICAgICAgIGJsb2NrX3N0YXRlIGJzdGF0ZTsKKworICAgICAgICBic3RhdGUgPSAoKihjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jKSkocywgZmx1c2gpOworCisgICAgICAgIGlmIChic3RhdGUgPT0gZmluaXNoX3N0YXJ0ZWQgfHwgYnN0YXRlID09IGZpbmlzaF9kb25lKSB7CisgICAgICAgICAgICBzLT5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBuZWVkX21vcmUgfHwgYnN0YXRlID09IGZpbmlzaF9zdGFydGVkKSB7CisgICAgICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICBzLT5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsCisgICAgICAgICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZQorICAgICAgICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuCisgICAgICAgICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzbworICAgICAgICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0CisgICAgICAgICAgICAgKiBvbmUgZW1wdHkgYmxvY2suCisgICAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoYnN0YXRlID09IGJsb2NrX2RvbmUpIHsKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1BBUlRJQUxfRkxVU0gpIHsKKyAgICAgICAgICAgICAgICBfdHJfYWxpZ24ocyk7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KKyAgICAgICAgICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIChjaGFyKikwLCAwTCwgMCk7CisgICAgICAgICAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWQKKyAgICAgICAgICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0ZVTExfRkxVU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0xFQVJfSEFTSChzKTsgICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisgICAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCAiYnVnMiIpOworCisgICAgaWYgKGZsdXNoICE9IFpfRklOSVNIKSByZXR1cm4gWl9PSzsKKyAgICBpZiAocy0+d3JhcCA8PSAwKSByZXR1cm4gWl9TVFJFQU1fRU5EOworCisgICAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi8KKyNpZmRlZiBHWklQCisgICAgaWYgKHMtPndyYXAgPT0gMikgeworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+YWRsZXIgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gOCkgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gMTYpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPmFkbGVyID4+IDI0KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPnRvdGFsX2luICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDgpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT50b3RhbF9pbiA+PiAyNCkgJiAweGZmKSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyID4+IDE2KSk7CisgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworICAgIH0KKyAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW4KKyAgICAgKiB0byBmbHVzaCB0aGUgcmVzdC4KKyAgICAgKi8KKyAgICBpZiAocy0+d3JhcCA+IDApIHMtPndyYXAgPSAtcy0+d3JhcDsgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqLworICAgIHJldHVybiBzLT5wZW5kaW5nICE9IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIChzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdGF0dXMgPSBzdHJtLT5zdGF0ZS0+c3RhdHVzOworICAgIGlmIChzdGF0dXMgIT0gSU5JVF9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gRVhUUkFfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IE5BTUVfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IENPTU1FTlRfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IEhDUkNfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IEJVU1lfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IEZJTklTSF9TVEFURSkgeworICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIC8qIERlYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uczogKi8KKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+cGVuZGluZ19idWYpOworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5oZWFkKTsKKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+cHJldik7CisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPndpbmRvdyk7CisKKyAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7CisgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CisKKyAgICByZXR1cm4gc3RhdHVzID09IEJVU1lfU1RBVEUgPyBaX0RBVEFfRVJST1IgOiBaX09LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IHRoZSBzb3VyY2Ugc3RhdGUgdG8gdGhlIGRlc3RpbmF0aW9uIHN0YXRlLgorICogVG8gc2ltcGxpZnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGZvciAxNi1iaXQgTVNET1MgKHdoaWNoCisgKiBkb2Vzbid0IGhhdmUgZW5vdWdoIG1lbW9yeSBhbnl3YXkgdG8gZHVwbGljYXRlIGNvbXByZXNzaW9uIHN0YXRlcykuCisgKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVDb3B5IChkZXN0LCBzb3VyY2UpCisgICAgel9zdHJlYW1wIGRlc3Q7CisgICAgel9zdHJlYW1wIHNvdXJjZTsKK3sKKyNpZmRlZiBNQVhTRUdfNjRLCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICBkZWZsYXRlX3N0YXRlICpkczsKKyAgICBkZWZsYXRlX3N0YXRlICpzczsKKyAgICB1c2hmICpvdmVybGF5OworCisKKyAgICBpZiAoc291cmNlID09IFpfTlVMTCB8fCBkZXN0ID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorCisgICAgc3MgPSBzb3VyY2UtPnN0YXRlOworCisgICAgem1lbWNweShkZXN0LCBzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOworCisgICAgZHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0MoZGVzdCwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoZHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKSBkczsKKyAgICB6bWVtY3B5KGRzLCBzcywgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBkcy0+c3RybSA9IGRlc3Q7CisKKyAgICBkcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7CisgICAgZHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIGRzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKGRlc3QsIGRzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CisgICAgZHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKworICAgIGlmIChkcy0+d2luZG93ID09IFpfTlVMTCB8fCBkcy0+cHJldiA9PSBaX05VTEwgfHwgZHMtPmhlYWQgPT0gWl9OVUxMIHx8CisgICAgICAgIGRzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgZGVmbGF0ZUVuZCAoZGVzdCk7CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgLyogZm9sbG93aW5nIHptZW1jcHkgZG8gbm90IHdvcmsgZm9yIDE2LWJpdCBNU0RPUyAqLworICAgIHptZW1jcHkoZHMtPndpbmRvdywgc3MtPndpbmRvdywgZHMtPndfc2l6ZSAqIDIgKiBzaXplb2YoQnl0ZSkpOworICAgIHptZW1jcHkoZHMtPnByZXYsIHNzLT5wcmV2LCBkcy0+d19zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoZHMtPmhlYWQsIHNzLT5oZWFkLCBkcy0+aGFzaF9zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoZHMtPnBlbmRpbmdfYnVmLCBzcy0+cGVuZGluZ19idWYsICh1SW50KWRzLT5wZW5kaW5nX2J1Zl9zaXplKTsKKworICAgIGRzLT5wZW5kaW5nX291dCA9IGRzLT5wZW5kaW5nX2J1ZiArIChzcy0+cGVuZGluZ19vdXQgLSBzcy0+cGVuZGluZ19idWYpOworICAgIGRzLT5kX2J1ZiA9IG92ZXJsYXkgKyBkcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7CisgICAgZHMtPmxfYnVmID0gZHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKmRzLT5saXRfYnVmc2l6ZTsKKworICAgIGRzLT5sX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2x0cmVlOworICAgIGRzLT5kX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2R0cmVlOworICAgIGRzLT5ibF9kZXNjLmR5bl90cmVlID0gZHMtPmJsX3RyZWU7CisKKyAgICByZXR1cm4gWl9PSzsKKyNlbmRpZiAvKiBNQVhTRUdfNjRLICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgorICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2gKKyAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkCisgKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9pbiBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC4KKyAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLgorICovCitsb2NhbCBpbnQgcmVhZF9idWYoc3RybSwgYnVmLCBzaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIEJ5dGVmICpidWY7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5hdmFpbF9pbjsKKworICAgIGlmIChsZW4gPiBzaXplKSBsZW4gPSBzaXplOworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgICBzdHJtLT5hdmFpbF9pbiAgLT0gbGVuOworCisgICAgaWYgKHN0cm0tPnN0YXRlLT53cmFwID09IDEpIHsKKyAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBzdHJtLT5uZXh0X2luLCBsZW4pOworICAgIH0KKyNpZmRlZiBHWklQCisgICAgZWxzZSBpZiAoc3RybS0+c3RhdGUtPndyYXAgPT0gMikgeworICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzdHJtLT5uZXh0X2luLCBsZW4pOworICAgIH0KKyNlbmRpZgorICAgIHptZW1jcHkoYnVmLCBzdHJtLT5uZXh0X2luLCBsZW4pOworICAgIHN0cm0tPm5leHRfaW4gICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBsZW47CisKKyAgICByZXR1cm4gKGludClsZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgImxvbmdlc3QgbWF0Y2giIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbQorICovCitsb2NhbCB2b2lkIGxtX2luaXQgKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBzLT53aW5kb3dfc2l6ZSA9ICh1bGcpMkwqcy0+d19zaXplOworCisgICAgQ0xFQVJfSEFTSChzKTsKKworICAgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6CisgICAgICovCisgICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9sYXp5OworICAgIHMtPmdvb2RfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5nb29kX2xlbmd0aDsKKyAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubmljZV9sZW5ndGg7CisgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9jaGFpbjsKKworICAgIHMtPnN0cnN0YXJ0ID0gMDsKKyAgICBzLT5ibG9ja19zdGFydCA9IDBMOworICAgIHMtPmxvb2thaGVhZCA9IDA7CisgICAgcy0+bWF0Y2hfbGVuZ3RoID0gcy0+cHJldl9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgIHMtPmluc19oID0gMDsKKyNpZm5kZWYgRkFTVEVTVAorI2lmZGVmIEFTTVYKKyAgICBtYXRjaF9pbml0KCk7IC8qIGluaXRpYWxpemUgdGhlIGFzbSBjb2RlICovCisjZW5kaWYKKyNlbmRpZgorfQorCisjaWZuZGVmIEZBU1RFU1QKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCisgKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCisgKiBnYXJiYWdlLgorICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudAorICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQorICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC4KKyAqLworI2lmbmRlZiBBU01WCisvKiBGb3IgODB4ODYgYW5kIDY4MHgwLCBhbiBvcHRpbWl6ZWQgdmVyc2lvbiB3aWxsIGJlIHByb3ZpZGVkIGluIG1hdGNoLmFzbSBvcgorICogbWF0Y2guUy4gVGhlIGNvZGUgd2lsbCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4KKyAqLworbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworeworICAgIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7LyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLworICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KKyAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworICAgIGludCBuaWNlX21hdGNoID0gcy0+bmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqLworICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KKyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKKyAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisgICAgICovCisgICAgUG9zZiAqcHJldiA9IHMtPnByZXY7CisgICAgdUludCB3bWFzayA9IHMtPndfbWFzazsKKworI2lmZGVmIFVOQUxJR05FRF9PSworICAgIC8qIENvbXBhcmUgdHdvIGJ5dGVzIGF0IGEgdGltZS4gTm90ZTogdGhpcyBpcyBub3QgYWx3YXlzIGJlbmVmaWNpYWwuCisgICAgICogVHJ5IHdpdGggYW5kIHdpdGhvdXQgLURVTkFMSUdORURfT0sgdG8gY2hlY2suCisgICAgICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIIC0gMTsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CisjZWxzZQorICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKyAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisKKyAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KKyAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7CisKKyAgICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLworICAgIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CisgICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKKyAgICB9CisgICAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLgorICAgICAqLworICAgIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOworCisgICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7CisKKyAgICBkbyB7CisgICAgICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOworICAgICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgICAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKKyAgICAgICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93CisgICAgICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZQorICAgICAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZAorICAgICAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLgorICAgICAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc28KKyAgICAgICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuCisgICAgICAgICAqLworI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKKyAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCisgICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAorICAgICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKKworICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKKyAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKKyAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0CisgICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50CisgICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKKyAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKKyAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChzY2FuWzJdID09IG1hdGNoWzJdLCAic2NhblsyXT8iKTsKKyAgICAgICAgc2NhbisrLCBtYXRjaCsrOworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKyAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovCisKKyAgICAgICAgLyogSGVyZSwgc2NhbiA8PSB3aW5kb3crc3Ryc3RhcnQrMjU3ICovCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisgICAgICAgIGlmICgqc2NhbiA9PSAqbWF0Y2gpIHNjYW4rKzsKKworICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSAoTUFYX01BVENILTEpOworCisjZWxzZSAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobWF0Y2hbYmVzdF9sZW5dICAgIT0gc2Nhbl9lbmQgIHx8CisgICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwKKyAgICAgICAgICAgICptYXRjaCAgICAgICAgICAgICE9ICpzY2FuICAgICB8fAorICAgICAgICAgICAgKisrbWF0Y2ggICAgICAgICAgIT0gc2NhblsxXSkgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorICAgICAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorICAgICAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisgICAgICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAgICAgKi8KKyAgICAgICAgc2NhbiArPSAyLCBtYXRjaCsrOworICAgICAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKKyAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICAgICAqLworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworCisgICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisjZW5kaWYgLyogVU5BTElHTkVEX09LICovCisKKyAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7CisgICAgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOworICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0CisgICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisKKyAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CisgICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKK30KKyNlbmRpZiAvKiBBU01WICovCisjZW5kaWYgLyogRkFTVEVTVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBsZXZlbCA9PSAxIG9yIHN0cmF0ZWd5ID09IFpfUkxFIG9ubHkKKyAqLworbG9jYWwgdUludCBsb25nZXN0X21hdGNoX2Zhc3QocywgY3VyX21hdGNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCit7CisgICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLworICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KKyAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CisKKyAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KKyAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7CisKKyAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCAibmVlZCBsb29rYWhlYWQiKTsKKworICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOworCisgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7CisKKyAgICAvKiBSZXR1cm4gZmFpbHVyZSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyOgorICAgICAqLworICAgIGlmIChtYXRjaFswXSAhPSBzY2FuWzBdIHx8IG1hdGNoWzFdICE9IHNjYW5bMV0pIHJldHVybiBNSU5fTUFUQ0gtMTsKKworICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCisgICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLikKKyAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKKyAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KKyAgICAgKi8KKyAgICBzY2FuICs9IDIsIG1hdGNoICs9IDI7CisgICAgQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgIm1hdGNoWzJdPyIpOworCisgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKKyAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KKyAgICAgKi8KKyAgICBkbyB7CisgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7CisKKyAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworCisgICAgbGVuID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7CisKKyAgICBpZiAobGVuIDwgTUlOX01BVENIKSByZXR1cm4gTUlOX01BVENIIC0gMTsKKworICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOworICAgIHJldHVybiAodUludClsZW4gPD0gcy0+bG9va2FoZWFkID8gKHVJbnQpbGVuIDogcy0+bG9va2FoZWFkOworfQorCisjaWZkZWYgREVCVUcKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgdGhhdCB0aGUgbWF0Y2ggYXQgbWF0Y2hfc3RhcnQgaXMgaW5kZWVkIGEgbWF0Y2guCisgKi8KK2xvY2FsIHZvaWQgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIHN0YXJ0LCBtYXRjaDsKKyAgICBpbnQgbGVuZ3RoOworeworICAgIC8qIGNoZWNrIHRoYXQgdGhlIG1hdGNoIGlzIGluZGVlZCBhIG1hdGNoICovCisgICAgaWYgKHptZW1jbXAocy0+d2luZG93ICsgbWF0Y2gsCisgICAgICAgICAgICAgICAgcy0+d2luZG93ICsgc3RhcnQsIGxlbmd0aCkgIT0gRVFVQUwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgc3RhcnQgJXUsIG1hdGNoICV1LCBsZW5ndGggJWRcbiIsCisgICAgICAgICAgICAgICAgc3RhcnQsIG1hdGNoLCBsZW5ndGgpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVjJWMiLCBzLT53aW5kb3dbbWF0Y2grK10sIHMtPndpbmRvd1tzdGFydCsrXSk7CisgICAgICAgIH0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOworICAgICAgICB6X2Vycm9yKCJpbnZhbGlkIG1hdGNoIik7CisgICAgfQorICAgIGlmICh6X3ZlcmJvc2UgPiAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJcXFslZCwlZF0iLCBzdGFydC1tYXRjaCwgbGVuZ3RoKTsKKyAgICAgICAgZG8geyBwdXRjKHMtPndpbmRvd1tzdGFydCsrXSwgc3RkZXJyKTsgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CisgICAgfQorfQorI2Vsc2UKKyMgIGRlZmluZSBjaGVja19tYXRjaChzLCBzdGFydCwgbWF0Y2gsIGxlbmd0aCkKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuCisgKiBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQuCisgKgorICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFECisgKiBPVVQgYXNzZXJ0aW9uczogc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRAorICogICAgQXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgYXZhaWxfaW4gPT0gMDsgcmVhZHMgYXJlCisgKiAgICBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZSB6aXAgdHJhbnNsYXRlX2VvbAorICogICAgb3B0aW9uIC0tIG5vdCBzdXBwb3J0ZWQgaGVyZSkuCisgKi8KK2xvY2FsIHZvaWQgZmlsbF93aW5kb3cocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIG4sIG07CisgICAgcmVnaXN0ZXIgUG9zZiAqcDsKKyAgICB1bnNpZ25lZCBtb3JlOyAgICAvKiBBbW91bnQgb2YgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuICovCisgICAgdUludCB3c2l6ZSA9IHMtPndfc2l6ZTsKKworICAgIGRvIHsKKyAgICAgICAgbW9yZSA9ICh1bnNpZ25lZCkocy0+d2luZG93X3NpemUgLSh1bGcpcy0+bG9va2FoZWFkIC0odWxnKXMtPnN0cnN0YXJ0KTsKKworICAgICAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqLworICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gMikgeworICAgICAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbW9yZSA9IHdzaXplOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHsKKyAgICAgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYKKyAgICAgICAgICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1vcmUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsCisgICAgICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPj0gd3NpemUrTUFYX0RJU1QocykpIHsKKworICAgICAgICAgICAgem1lbWNweShzLT53aW5kb3csIHMtPndpbmRvdyt3c2l6ZSwgKHVuc2lnbmVkKXdzaXplKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0IC09IHdzaXplOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgICAgLT0gd3NpemU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovCisgICAgICAgICAgICBzLT5ibG9ja19zdGFydCAtPSAobG9uZykgd3NpemU7CisKKyAgICAgICAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlcworICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAKKyAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKKyAgICAgICAgICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZgorICAgICAgICAgICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLikKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogJSUlIGF2b2lkIHRoaXMgd2hlbiBaX1JMRSAqLworICAgICAgICAgICAgbiA9IHMtPmhhc2hfc2l6ZTsKKyAgICAgICAgICAgIHAgPSAmcy0+aGVhZFtuXTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtID0gKi0tcDsKKyAgICAgICAgICAgICAgICAqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CisKKyAgICAgICAgICAgIG4gPSB3c2l6ZTsKKyNpZm5kZWYgRkFTVEVTVAorICAgICAgICAgICAgcCA9ICZzLT5wcmV2W25dOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG0gPSAqLS1wOworICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworICAgICAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0CisgICAgICAgICAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CisjZW5kaWYKKyAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIHJldHVybjsKKworICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzoKKyAgICAgICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiYKKyAgICAgICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0CisgICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKQorICAgICAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDIKKyAgICAgICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksCisgICAgICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmCisgICAgICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuCisgICAgICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuCisgICAgICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChtb3JlID49IDIsICJtb3JlIDwgMiIpOworCisgICAgICAgIG4gPSByZWFkX2J1ZihzLT5zdHJtLCBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIHMtPmxvb2thaGVhZCwgbW9yZSk7CisgICAgICAgIHMtPmxvb2thaGVhZCArPSBuOworCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdOworICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzLT5zdHJzdGFydCsxXSk7CisjaWYgTUlOX01BVENIICE9IDMKKyAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsCisgICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KKyAgICAgICAgICovCisKKyAgICB9IHdoaWxlIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMtPnN0cm0tPmF2YWlsX2luICE9IDApOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCisgKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgorICovCisjZGVmaW5lIEZMVVNIX0JMT0NLX09OTFkocywgZW9mKSB7IFwKKyAgIF90cl9mbHVzaF9ibG9jayhzLCAocy0+YmxvY2tfc3RhcnQgPj0gMEwgPyBcCisgICAgICAgICAgICAgICAgICAgKGNoYXJmICopJnMtPndpbmRvd1sodW5zaWduZWQpcy0+YmxvY2tfc3RhcnRdIDogXAorICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKVpfTlVMTCksIFwKKyAgICAgICAgICAgICAgICAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KSwgXAorICAgICAgICAgICAgICAgIChlb2YpKTsgXAorICAgcy0+YmxvY2tfc3RhcnQgPSBzLT5zdHJzdGFydDsgXAorICAgZmx1c2hfcGVuZGluZyhzLT5zdHJtKTsgXAorICAgVHJhY2V2KChzdGRlcnIsIltGTFVTSF0iKSk7IFwKK30KKworLyogU2FtZSBidXQgZm9yY2UgcHJlbWF0dXJlIGV4aXQgaWYgbmVjZXNzYXJ5LiAqLworI2RlZmluZSBGTFVTSF9CTE9DSyhzLCBlb2YpIHsgXAorICAgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpOyBcCisgICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiAoZW9mKSA/IGZpbmlzaF9zdGFydGVkIDogbmVlZF9tb3JlOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4KKyAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2UKKyAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tCisgKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkCisgICAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6CisgICAgICovCisgICAgdWxnIG1heF9ibG9ja19zaXplID0gMHhmZmZmOworICAgIHVsZyBtYXhfc3RhcnQ7CisKKyAgICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLT5wZW5kaW5nX2J1Zl9zaXplIC0gNSkgeworICAgICAgICBtYXhfYmxvY2tfc2l6ZSA9IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1OworICAgIH0KKworICAgIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDw9IDEpIHsKKworICAgICAgICAgICAgQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8CisgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgPj0gKGxvbmcpcy0+d19zaXplLCAic2xpZGUgdG9vIGxhdGUiKTsKKworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDAgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgcmV0dXJuIG5lZWRfbW9yZTsKKworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgfQorICAgICAgICBBc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsICJibG9jayBnb25lIik7CisKKyAgICAgICAgcy0+c3Ryc3RhcnQgKz0gcy0+bG9va2FoZWFkOworICAgICAgICBzLT5sb29rYWhlYWQgPSAwOworCisgICAgICAgIC8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqLworICAgICAgICBtYXhfc3RhcnQgPSBzLT5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplOworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPT0gMCB8fCAodWxnKXMtPnN0cnN0YXJ0ID49IG1heF9zdGFydCkgeworICAgICAgICAgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi8KKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCA9ICh1SW50KShzLT5zdHJzdGFydCAtIG1heF9zdGFydCk7CisgICAgICAgICAgICBzLT5zdHJzdGFydCA9ICh1SW50KW1heF9zdGFydDsKKyAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOworICAgICAgICB9CisgICAgICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZQorICAgICAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPnN0cnN0YXJ0IC0gKHVJbnQpcy0+YmxvY2tfc3RhcnQgPj0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOworICAgICAgICB9CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudAorICogYmxvY2sgc3RhdGUuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHMKKyAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydAorICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLgorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2Zhc3QocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgSVBvcyBoYXNoX2hlYWQgPSBOSUw7IC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi8KKyAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKyAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGUKKyAgICAgICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCisgICAgICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENICisgICAgICAgICAqLworICAgICAgICBpZiAoaGFzaF9oZWFkICE9IE5JTCAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAorICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgorICAgICAgICAgICAgICovCisjaWZkZWYgRkFTVEVTVAorICAgICAgICAgICAgaWYgKChzLT5zdHJhdGVneSAhPSBaX0hVRkZNQU5fT05MWSAmJiBzLT5zdHJhdGVneSAhPSBaX1JMRSkgfHwKKyAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoX2Zhc3QgKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZICYmIHMtPnN0cmF0ZWd5ICE9IFpfUkxFKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2hfZmFzdCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIG9yIGxvbmdlc3RfbWF0Y2hfZmFzdCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQsIHMtPm1hdGNoX3N0YXJ0LCBzLT5tYXRjaF9sZW5ndGgpOworCisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOworCisgICAgICAgICAgICBzLT5sb29rYWhlYWQgLT0gcy0+bWF0Y2hfbGVuZ3RoOworCisgICAgICAgICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCisgICAgICAgICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgorICAgICAgICAgICAgICovCisjaWZuZGVmIEZBU1RFU1QKKyAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gcy0+bWF4X2luc2VydF9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICBzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy0+bWF0Y2hfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKKyAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKKyNpZiBNSU5fTUFUQ0ggIT0gMworICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICB9CisgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOworICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKK30KKworI2lmbmRlZiBGQVNURVNUCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenkKKyAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKKyAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBmbHVzaDsKK3sKKyAgICBJUG9zIGhhc2hfaGVhZCA9IE5JTDsgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCisgICAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKi8KKyAgICAgICAgcy0+cHJldl9sZW5ndGggPSBzLT5tYXRjaF9sZW5ndGgsIHMtPnByZXZfbWF0Y2ggPSBzLT5tYXRjaF9zdGFydDsKKyAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisKKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+cHJldl9sZW5ndGggPCBzLT5tYXhfbGF6eV9tYXRjaCAmJgorICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZICYmIHMtPnN0cmF0ZWd5ICE9IFpfUkxFKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2hfZmFzdCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBvciBsb25nZXN0X21hdGNoX2Zhc3QoKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisKKyAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy0+c3RyYXRlZ3kgPT0gWl9GSUxURVJFRAorI2lmIFRPT19GQVIgPD0gMzI3NjcKKyAgICAgICAgICAgICAgICB8fCAocy0+bWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJgorICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpIHsKKworICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKKyAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAorICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOworICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCisKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKKworICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLTEgLSBzLT5wcmV2X21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdAorICAgICAgICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgorICAgICAgICAgICAgICogdGhlIGhhc2ggdGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5wcmV2X2xlbmd0aC0xOworICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoKytzLT5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5wcmV2X2xlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisKKyAgICAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworCisgICAgICAgIH0gZWxzZSBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQorICAgICAgICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAorICAgICAgICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0sIGJmbHVzaCk7CisgICAgICAgICAgICBpZiAoYmZsdXNoKSB7CisgICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKKyAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOworICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKyAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICB9CisgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOworICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKK30KKyNlbmRpZiAvKiBGQVNURVNUICovCisKKyNpZiAwCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZQorICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mCisgKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfcmxlKHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIGludCBiZmx1c2g7ICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisgICAgdUludCBydW47ICAgICAgICAgICAvKiBsZW5ndGggb2YgcnVuICovCisgICAgdUludCBtYXg7ICAgICAgICAgICAvKiBtYXhpbXVtIGxlbmd0aCBvZiBydW4gKi8KKyAgICB1SW50IHByZXY7ICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovCisgICAgQnl0ZWYgKnNjYW47ICAgICAgICAvKiBzY2FuIGZvciBlbmQgb2YgcnVuICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIGxvbmdlc3QgZW5jb2RhYmxlIHJ1bi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNQVhfTUFUQ0gpIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1BWF9NQVRDSCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqLworICAgICAgICBydW4gPSAwOworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPiAwKSB7ICAgICAgLyogaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBieXRlLCB0aGF0IGlzICovCisgICAgICAgICAgICBtYXggPSBzLT5sb29rYWhlYWQgPCBNQVhfTUFUQ0ggPyBzLT5sb29rYWhlYWQgOiBNQVhfTUFUQ0g7CisgICAgICAgICAgICBzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgLSAxOworICAgICAgICAgICAgcHJldiA9ICpzY2FuKys7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKCpzY2FuKysgIT0gcHJldikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IHdoaWxlICgrK3J1biA8IG1heCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovCisgICAgICAgIGlmIChydW4gPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+c3Ryc3RhcnQgLSAxLCBydW4pOworICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3QocywgMSwgcnVuIC0gTUlOX01BVENILCBiZmx1c2gpOworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHJ1bjsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHJ1bjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7CisgICAgICAgICAgICBfdHJfdGFsbHlfbGl0IChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdLCBiZmx1c2gpOworICAgICAgICAgICAgcy0+bG9va2FoZWFkLS07CisgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICB9CisgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworICAgIH0KKyAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7CisgICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9kZWZsYXRlLmggYi91c3Iva2xpYmMvemxpYi9kZWZsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzN2Q3MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2RlZmxhdGUuaApAQCAtMCwwICsxLDMzMSBAQAorLyogZGVmbGF0ZS5oIC0tIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBKZWFuLWxvdXAgR2FpbGx5CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIEAoIykgJElkOiBkZWZsYXRlLmgsdiAxLjEgMjAwNS8wMi8yNyAyMzoxNTozOSBocGEgRXhwICQgKi8KKworI2lmbmRlZiBERUZMQVRFX0gKKyNkZWZpbmUgREVGTEFURV9ICisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCisvKiBkZWZpbmUgTk9fR1pJUCB3aGVuIGNvbXBpbGluZyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGd6aXAgaGVhZGVyIGFuZAorICAgdHJhaWxlciBjcmVhdGlvbiBieSBkZWZsYXRlKCkuICBOT19HWklQIHdvdWxkIGJlIHVzZWQgdG8gYXZvaWQgbGlua2luZyBpbgorICAgdGhlIGNyYyBjb2RlIHdoZW4gaXQgaXMgbm90IG5lZWRlZC4gIEZvciBzaGFyZWQgbGlicmFyaWVzLCBnemlwIGVuY29kaW5nCisgICBzaG91bGQgYmUgbGVmdCBlbmFibGVkLiAqLworI2lmbmRlZiBOT19HWklQCisjICBkZWZpbmUgR1pJUAorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuCisgKi8KKworI2RlZmluZSBMRU5HVEhfQ09ERVMgMjkKKy8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqLworCisjZGVmaW5lIExJVEVSQUxTICAyNTYKKy8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqLworCisjZGVmaW5lIExfQ09ERVMgKExJVEVSQUxTKzErTEVOR1RIX0NPREVTKQorLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgRF9DT0RFUyAgIDMwCisvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKworI2RlZmluZSBCTF9DT0RFUyAgMTkKKy8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqLworCisjZGVmaW5lIEhFQVBfU0laRSAoMipMX0NPREVTKzEpCisvKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLworCisjZGVmaW5lIE1BWF9CSVRTIDE1CisvKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi8KKworI2RlZmluZSBJTklUX1NUQVRFICAgIDQyCisjZGVmaW5lIEVYVFJBX1NUQVRFICAgNjkKKyNkZWZpbmUgTkFNRV9TVEFURSAgICA3MworI2RlZmluZSBDT01NRU5UX1NUQVRFIDkxCisjZGVmaW5lIEhDUkNfU1RBVEUgICAxMDMKKyNkZWZpbmUgQlVTWV9TVEFURSAgIDExMworI2RlZmluZSBGSU5JU0hfU1RBVEUgNjY2CisvKiBTdHJlYW0gc3RhdHVzICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwordHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YV9zIHsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZnJlcTsgICAgICAgLyogZnJlcXVlbmN5IGNvdW50ICovCisgICAgICAgIHVzaCAgY29kZTsgICAgICAgLyogYml0IHN0cmluZyAqLworICAgIH0gZmM7CisgICAgdW5pb24geworICAgICAgICB1c2ggIGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLworICAgICAgICB1c2ggIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBiaXQgc3RyaW5nICovCisgICAgfSBkbDsKK30gRkFSIGN0X2RhdGE7CisKKyNkZWZpbmUgRnJlcSBmYy5mcmVxCisjZGVmaW5lIENvZGUgZmMuY29kZQorI2RlZmluZSBEYWQgIGRsLmRhZAorI2RlZmluZSBMZW4gIGRsLmxlbgorCit0eXBlZGVmIHN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgIHN0YXRpY190cmVlX2Rlc2M7CisKK3R5cGVkZWYgc3RydWN0IHRyZWVfZGVzY19zIHsKKyAgICBjdF9kYXRhICpkeW5fdHJlZTsgICAgICAgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi8KKyAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIHN0YXRpY190cmVlX2Rlc2MgKnN0YXRfZGVzYzsgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi8KK30gRkFSIHRyZWVfZGVzYzsKKwordHlwZWRlZiB1c2ggUG9zOwordHlwZWRlZiBQb3MgRkFSIFBvc2Y7Cit0eXBlZGVmIHVuc2lnbmVkIElQb3M7CisKKy8qIEEgUG9zIGlzIGFuIGluZGV4IGluIHRoZSBjaGFyYWN0ZXIgd2luZG93LiBXZSB1c2Ugc2hvcnQgaW5zdGVhZCBvZiBpbnQgdG8KKyAqIHNhdmUgc3BhY2UgaW4gdGhlIHZhcmlvdXMgdGFibGVzLiBJUG9zIGlzIHVzZWQgb25seSBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgeworICAgIHpfc3RyZWFtcCBzdHJtOyAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovCisgICAgaW50ICAgc3RhdHVzOyAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqLworICAgIEJ5dGVmICpwZW5kaW5nX2J1ZjsgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovCisgICAgdWxnICAgcGVuZGluZ19idWZfc2l6ZTsgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqLworICAgIEJ5dGVmICpwZW5kaW5nX291dDsgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovCisgICAgdUludCAgIHBlbmRpbmc7ICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovCisgICAgaW50ICAgd3JhcDsgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLworICAgIGd6X2hlYWRlcnAgIGd6aGVhZDsgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovCisgICAgdUludCAgIGd6aW5kZXg7ICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi8KKyAgICBCeXRlICBtZXRob2Q7ICAgICAgICAvKiBTVE9SRUQgKGZvciB6aXAgb25seSkgb3IgREVGTEFURUQgKi8KKyAgICBpbnQgICBsYXN0X2ZsdXNoOyAgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovCisKKyAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IGRlZmxhdGUuYzogKi8KKworICAgIHVJbnQgIHdfc2l6ZTsgICAgICAgIC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqLworICAgIHVJbnQgIHdfYml0czsgICAgICAgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqLworICAgIHVJbnQgIHdfbWFzazsgICAgICAgIC8qIHdfc2l6ZSAtIDEgKi8KKworICAgIEJ5dGVmICp3aW5kb3c7CisgICAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csCisgICAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemUKKyAgICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mCisgICAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzCisgICAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cworICAgICAqIHRoZSB3aW5kb3cgc2l6ZSB0byA2NEssIHdoaWNoIGlzIHF1aXRlIHVzZWZ1bCBvbiBNU0RPUy4KKyAgICAgKiBUbyBkbzogdXNlIHRoZSB1c2VyIGlucHV0IGJ1ZmZlciBhcyBzbGlkaW5nIHdpbmRvdy4KKyAgICAgKi8KKworICAgIHVsZyB3aW5kb3dfc2l6ZTsKKyAgICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlcgorICAgICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuCisgICAgICovCisKKyAgICBQb3NmICpwcmV2OworICAgIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzCisgICAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy4KKyAgICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy4KKyAgICAgKi8KKworICAgIFBvc2YgKmhlYWQ7IC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovCisKKyAgICB1SW50ICBpbnNfaDsgICAgICAgICAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi8KKyAgICB1SW50ICBoYXNoX3NpemU7ICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KKyAgICB1SW50ICBoYXNoX2JpdHM7ICAgICAgLyogbG9nMihoYXNoX3NpemUpICovCisgICAgdUludCAgaGFzaF9tYXNrOyAgICAgIC8qIGhhc2hfc2l6ZS0xICovCisKKyAgICB1SW50ICBoYXNoX3NoaWZ0OworICAgIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0CisgICAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0CisgICAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6CisgICAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0cworICAgICAqLworCisgICAgbG9uZyBibG9ja19zdGFydDsKKyAgICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHMKKyAgICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLgorICAgICAqLworCisgICAgdUludCBtYXRjaF9sZW5ndGg7ICAgICAgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLworICAgIElQb3MgcHJldl9tYXRjaDsgICAgICAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi8KKyAgICBpbnQgbWF0Y2hfYXZhaWxhYmxlOyAgICAgICAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi8KKyAgICB1SW50IHN0cnN0YXJ0OyAgICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi8KKyAgICB1SW50IG1hdGNoX3N0YXJ0OyAgICAgICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqLworICAgIHVJbnQgbG9va2FoZWFkOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqLworCisgICAgdUludCBwcmV2X2xlbmd0aDsKKyAgICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXMKKyAgICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi4KKyAgICAgKi8KKworICAgIHVJbnQgbWF4X2NoYWluX2xlbmd0aDsKKyAgICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpcworICAgICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGUKKyAgICAgKiBzcGVlZC4KKyAgICAgKi8KKworICAgIHVJbnQgbWF4X2xhenlfbWF0Y2g7CisgICAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseQorICAgICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uCisgICAgICogbGV2ZWxzID49IDQuCisgICAgICovCisjICAgZGVmaW5lIG1heF9pbnNlcnRfbGVuZ3RoICBtYXhfbGF6eV9tYXRjaAorICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90CisgICAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgorICAgICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuCisgICAgICovCisKKyAgICBpbnQgbGV2ZWw7ICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqLworICAgIGludCBzdHJhdGVneTsgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqLworCisgICAgdUludCBnb29kX21hdGNoOworICAgIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqLworCisgICAgaW50IG5pY2VfbWF0Y2g7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi8KKworICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi8KKyAgICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCisgICAgc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCisgICAgc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovCisKKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgbF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgZF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovCisgICAgc3RydWN0IHRyZWVfZGVzY19zIGJsX2Rlc2M7ICAgICAgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovCisKKyAgICB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07CisgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCisKKyAgICBpbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovCisgICAgaW50IGhlYXBfbGVuOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqLworICAgIGludCBoZWFwX21heDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovCisgICAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC4KKyAgICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLgorICAgICAqLworCisgICAgdWNoIGRlcHRoWzIqTF9DT0RFUysxXTsKKyAgICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5CisgICAgICovCisKKyAgICB1Y2hmICpsX2J1ZjsgICAgICAgICAgLyogYnVmZmVyIGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovCisKKyAgICB1SW50ICBsaXRfYnVmc2l6ZTsKKyAgICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yCisgICAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOgorICAgICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnMKKyAgICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0CisgICAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuCisgICAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yCisgICAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQorICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhbgorICAgICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuCisgICAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLgorICAgICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3QKKyAgICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgorICAgICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnkKKyAgICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmUKKyAgICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nCisgICAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS4KKyAgICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0CisgICAgICovCisKKyAgICB1SW50IGxhc3RfbGl0OyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKworICAgIHVzaGYgKmRfYnVmOworICAgIC8qIEJ1ZmZlciBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmUKKyAgICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZworICAgICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS4KKyAgICAgKi8KKworICAgIHVsZyBvcHRfbGVuOyAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqLworICAgIHVsZyBzdGF0aWNfbGVuOyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovCisgICAgdUludCBtYXRjaGVzOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqLworICAgIGludCBsYXN0X2VvYl9sZW47ICAgLyogYml0IGxlbmd0aCBvZiBFT0IgY29kZSBmb3IgbGFzdCBibG9jayAqLworCisjaWZkZWYgREVCVUcKKyAgICB1bGcgY29tcHJlc3NlZF9sZW47IC8qIHRvdGFsIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBmaWxlIG1vZCAyXjMyICovCisgICAgdWxnIGJpdHNfc2VudDsgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZGF0YSBzZW50IG1vZCAyXjMyICovCisjZW5kaWYKKworICAgIHVzaCBiaV9idWY7CisgICAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3QKKyAgICAgKiBzaWduaWZpY2FudCBiaXRzKS4KKyAgICAgKi8KKyAgICBpbnQgYmlfdmFsaWQ7CisgICAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0CisgICAgICogYXJlIGFsd2F5cyB6ZXJvLgorICAgICAqLworCit9IEZBUiBkZWZsYXRlX3N0YXRlOworCisvKiBPdXRwdXQgYSBieXRlIG9uIHRoZSBzdHJlYW0uCisgKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdfYnVmLgorICovCisjZGVmaW5lIHB1dF9ieXRlKHMsIGMpIHtzLT5wZW5kaW5nX2J1ZltzLT5wZW5kaW5nKytdID0gKGMpO30KKworCisjZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKKy8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCisgKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCisgKi8KKworI2RlZmluZSBNQVhfRElTVChzKSAgKChzKS0+d19zaXplLU1JTl9MT09LQUhFQUQpCisvKiBJbiBvcmRlciB0byBzaW1wbGlmeSB0aGUgY29kZSwgcGFydGljdWxhcmx5IG9uIDE2IGJpdCBtYWNoaW5lcywgbWF0Y2gKKyAqIGRpc3RhbmNlcyBhcmUgbGltaXRlZCB0byBNQVhfRElTVCBpbnN0ZWFkIG9mIFdTSVpFLgorICovCisKKyAgICAgICAgLyogaW4gdHJlZXMuYyAqLwordm9pZCBfdHJfaW5pdCAgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7CitpbnQgIF90cl90YWxseSAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVuc2lnbmVkIGRpc3QsIHVuc2lnbmVkIGxjKSk7Cit2b2lkIF90cl9mbHVzaF9ibG9jayAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVsZyBzdG9yZWRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9mKSk7Cit2b2lkIF90cl9hbGlnbiAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK3ZvaWQgX3RyX3N0b3JlZF9ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlb2YpKTsKKworI2RlZmluZSBkX2NvZGUoZGlzdCkgXAorICAgKChkaXN0KSA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NisoKGRpc3QpPj43KV0pCisvKiBNYXBwaW5nIGZyb20gYSBkaXN0YW5jZSB0byBhIGRpc3RhbmNlIGNvZGUuIGRpc3QgaXMgdGhlIGRpc3RhbmNlIC0gMSBhbmQKKyAqIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLiBfZGlzdF9jb2RlWzI1Nl0gYW5kIF9kaXN0X2NvZGVbMjU3XSBhcmUgbmV2ZXIKKyAqIHVzZWQuCisgKi8KKworI2lmbmRlZiBERUJVRworLyogSW5saW5lIHZlcnNpb25zIG9mIF90cl90YWxseSBmb3Igc3BlZWQ6ICovCisKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorICBleHRlcm4gdWNoIF9sZW5ndGhfY29kZVtdOworICBleHRlcm4gdWNoIF9kaXN0X2NvZGVbXTsKKyNlbHNlCisgIGV4dGVybiBjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW107CisgIGV4dGVybiBjb25zdCB1Y2ggX2Rpc3RfY29kZVtdOworI2VuZGlmCisKKyMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIFwKKyAgeyB1Y2ggY2MgPSAoYyk7IFwKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSAwOyBcCisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBjYzsgXAorICAgIHMtPmR5bl9sdHJlZVtjY10uRnJlcSsrOyBcCisgICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKKyAgIH0KKyMgZGVmaW5lIF90cl90YWxseV9kaXN0KHMsIGRpc3RhbmNlLCBsZW5ndGgsIGZsdXNoKSBcCisgIHsgdWNoIGxlbiA9IChsZW5ndGgpOyBcCisgICAgdXNoIGRpc3QgPSAoZGlzdGFuY2UpOyBcCisgICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gZGlzdDsgXAorICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gbGVuOyBcCisgICAgZGlzdC0tOyBcCisgICAgcy0+ZHluX2x0cmVlW19sZW5ndGhfY29kZVtsZW5dK0xJVEVSQUxTKzFdLkZyZXErKzsgXAorICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsgXAorICAgIGZsdXNoID0gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOyBcCisgIH0KKyNlbHNlCisjIGRlZmluZSBfdHJfdGFsbHlfbGl0KHMsIGMsIGZsdXNoKSBmbHVzaCA9IF90cl90YWxseShzLCAwLCBjKQorIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKKyAgICAgICAgICAgICAgZmx1c2ggPSBfdHJfdGFsbHkocywgZGlzdGFuY2UsIGxlbmd0aCkKKyNlbmRpZgorCisjZW5kaWYgLyogREVGTEFURV9IICovCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9nemlvLmMgYi91c3Iva2xpYmMvemxpYi9nemlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExNmVhMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2d6aW8uYwpAQCAtMCwwICsxLDEwMjkgQEAKKy8qIGd6aW8uYyAtLSBJTyBvbiAuZ3ogZmlsZXMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogQ29tcGlsZSB0aGlzIGZpbGUgd2l0aCAtRE5PX0daQ09NUFJFU1MgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCisgKi8KKworLyogQCgjKSAkSWQ6IGd6aW8uYyx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInp1dGlsLmgiCisKKyNpZmRlZiBOT19ERUZMQVRFICAgICAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGRlZmluaXRpb24gKi8KKyMgIGRlZmluZSBOT19HWkNPTVBSRVNTCisjZW5kaWYKKworI2lmbmRlZiBOT19EVU1NWV9ERUNMCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisjZW5kaWYKKworI2lmbmRlZiBaX0JVRlNJWkUKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIFpfQlVGU0laRSA0MDk2IC8qIG1pbmltaXplIG1lbW9yeSB1c2FnZSBmb3IgMTYtYml0IERPUyAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgWl9CVUZTSVpFIDE2Mzg0CisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFpfUFJJTlRGX0JVRlNJWkUKKyMgIGRlZmluZSBaX1BSSU5URl9CVUZTSVpFIDQwOTYKKyNlbmRpZgorCisjaWZkZWYgX19NVlNfXworIyAgcHJhZ21hIG1hcCAoZmRvcGVuICwgIlwxNzRcMTc0RkRPUEVOIikKKyAgIEZJTEUgKmZkb3BlbihpbnQsIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmbmRlZiBTVERDCitleHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7CitleHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOworI2VuZGlmCisKKyNkZWZpbmUgQUxMT0Moc2l6ZSkgbWFsbG9jKHNpemUpCisjZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KKworc3RhdGljIGludCBjb25zdCBnel9tYWdpY1syXSA9IHsweDFmLCAweDhifTsgLyogZ3ppcCBtYWdpYyBoZWFkZXIgKi8KKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KKyNkZWZpbmUgSEVBRF9DUkMgICAgIDB4MDIgLyogYml0IDEgc2V0OiBoZWFkZXIgQ1JDIHByZXNlbnQgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBSRVNFUlZFRCAgICAgMHhFMCAvKiBiaXRzIDUuLjc6IHJlc2VydmVkICovCisKK3R5cGVkZWYgc3RydWN0IGd6X3N0cmVhbSB7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCAgICAgIHpfZXJyOyAgIC8qIGVycm9yIGNvZGUgZm9yIGxhc3Qgc3RyZWFtIG9wZXJhdGlvbiAqLworICAgIGludCAgICAgIHpfZW9mOyAgIC8qIHNldCBpZiBlbmQgb2YgaW5wdXQgZmlsZSAqLworICAgIEZJTEUgICAgICpmaWxlOyAgIC8qIC5neiBmaWxlICovCisgICAgQnl0ZSAgICAgKmluYnVmOyAgLyogaW5wdXQgYnVmZmVyICovCisgICAgQnl0ZSAgICAgKm91dGJ1ZjsgLyogb3V0cHV0IGJ1ZmZlciAqLworICAgIHVMb25nICAgIGNyYzsgICAgIC8qIGNyYzMyIG9mIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgY2hhciAgICAgKm1zZzsgICAgLyogZXJyb3IgbWVzc2FnZSAqLworICAgIGNoYXIgICAgICpwYXRoOyAgIC8qIHBhdGggbmFtZSBmb3IgZGVidWdnaW5nIG9ubHkgKi8KKyAgICBpbnQgICAgICB0cmFuc3BhcmVudDsgLyogMSBpZiBpbnB1dCBmaWxlIGlzIG5vdCBhIC5neiBmaWxlICovCisgICAgY2hhciAgICAgbW9kZTsgICAgLyogJ3cnIG9yICdyJyAqLworICAgIHpfb2ZmX3QgIHN0YXJ0OyAgIC8qIHN0YXJ0IG9mIGNvbXByZXNzZWQgZGF0YSBpbiBmaWxlIChoZWFkZXIgc2tpcHBlZCkgKi8KKyAgICB6X29mZl90ICBpbjsgICAgICAvKiBieXRlcyBpbnRvIGRlZmxhdGUgb3IgaW5mbGF0ZSAqLworICAgIHpfb2ZmX3QgIG91dDsgICAgIC8qIGJ5dGVzIG91dCBvZiBkZWZsYXRlIG9yIGluZmxhdGUgKi8KKyAgICBpbnQgICAgICBiYWNrOyAgICAvKiBvbmUgY2hhcmFjdGVyIHB1c2gtYmFjayAqLworICAgIGludCAgICAgIGxhc3Q7ICAgIC8qIHRydWUgaWYgcHVzaC1iYWNrIGlzIGxhc3QgY2hhcmFjdGVyICovCit9IGd6X3N0cmVhbTsKKworCitsb2NhbCBnekZpbGUgZ3pfb3BlbiAgICAgIE9GKChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlLCBpbnQgIGZkKSk7Citsb2NhbCBpbnQgZG9fZmx1c2ggICAgICAgIE9GKChnekZpbGUgZmlsZSwgaW50IGZsdXNoKSk7Citsb2NhbCBpbnQgICAgZ2V0X2J5dGUgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKK2xvY2FsIHZvaWQgICBjaGVja19oZWFkZXIgT0YoKGd6X3N0cmVhbSAqcykpOworbG9jYWwgaW50ICAgIGRlc3Ryb3kgICAgICBPRigoZ3pfc3RyZWFtICpzKSk7Citsb2NhbCB2b2lkICAgcHV0TG9uZyAgICAgIE9GKChGSUxFICpmaWxlLCB1TG9uZyB4KSk7Citsb2NhbCB1TG9uZyAgZ2V0TG9uZyAgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgorICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikuIFRoZSBmaWxlIGlzIGdpdmVuIGVpdGhlciBieSBmaWxlIGRlc2NyaXB0b3IKKyAgIG9yIHBhdGggbmFtZSAoaWYgZmQgPT0gLTEpLgorICAgICBnel9vcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcworICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlOyBlcnJubworICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCisgICB6bGliIGVycm9yIGlzIFpfTUVNX0VSUk9SKS4KKyovCitsb2NhbCBnekZpbGUgZ3pfb3BlbiAocGF0aCwgbW9kZSwgZmQpCisgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICBjb25zdCBjaGFyICptb2RlOworICAgIGludCAgZmQ7Cit7CisgICAgaW50IGVycjsKKyAgICBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047IC8qIGNvbXByZXNzaW9uIGxldmVsICovCisgICAgaW50IHN0cmF0ZWd5ID0gWl9ERUZBVUxUX1NUUkFURUdZOyAvKiBjb21wcmVzc2lvbiBzdHJhdGVneSAqLworICAgIGNoYXIgKnAgPSAoY2hhciopbW9kZTsKKyAgICBnel9zdHJlYW0gKnM7CisgICAgY2hhciBmbW9kZVs4MF07IC8qIGNvcHkgb2YgbW9kZSwgd2l0aG91dCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgKi8KKyAgICBjaGFyICptID0gZm1vZGU7CisKKyAgICBpZiAoIXBhdGggfHwgIW1vZGUpIHJldHVybiBaX05VTEw7CisKKyAgICBzID0gKGd6X3N0cmVhbSAqKUFMTE9DKHNpemVvZihnel9zdHJlYW0pKTsKKyAgICBpZiAoIXMpIHJldHVybiBaX05VTEw7CisKKyAgICBzLT5zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzLT5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgcy0+c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmID0gWl9OVUxMOworICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZiA9IFpfTlVMTDsKKyAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gMDsKKyAgICBzLT5maWxlID0gTlVMTDsKKyAgICBzLT56X2VyciA9IFpfT0s7CisgICAgcy0+el9lb2YgPSAwOworICAgIHMtPmluID0gMDsKKyAgICBzLT5vdXQgPSAwOworICAgIHMtPmJhY2sgPSBFT0Y7CisgICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgcy0+bXNnID0gTlVMTDsKKyAgICBzLT50cmFuc3BhcmVudCA9IDA7CisKKyAgICBzLT5wYXRoID0gKGNoYXIqKUFMTE9DKHN0cmxlbihwYXRoKSsxKTsKKyAgICBpZiAocy0+cGF0aCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKKyAgICB9CisgICAgc3RyY3B5KHMtPnBhdGgsIHBhdGgpOyAvKiBkbyB0aGlzIGVhcmx5IGZvciBkZWJ1Z2dpbmcgKi8KKworICAgIHMtPm1vZGUgPSAnXDAnOworICAgIGRvIHsKKyAgICAgICAgaWYgKCpwID09ICdyJykgcy0+bW9kZSA9ICdyJzsKKyAgICAgICAgaWYgKCpwID09ICd3JyB8fCAqcCA9PSAnYScpIHMtPm1vZGUgPSAndyc7CisgICAgICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB7CisgICAgICAgICAgICBsZXZlbCA9ICpwIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdmJykgeworICAgICAgICAgIHN0cmF0ZWd5ID0gWl9GSUxURVJFRDsKKyAgICAgICAgfSBlbHNlIGlmICgqcCA9PSAnaCcpIHsKKyAgICAgICAgICBzdHJhdGVneSA9IFpfSFVGRk1BTl9PTkxZOworICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdSJykgeworICAgICAgICAgIHN0cmF0ZWd5ID0gWl9STEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbSsrID0gKnA7IC8qIGNvcHkgdGhlIG1vZGUgKi8KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCpwKysgJiYgbSAhPSBmbW9kZSArIHNpemVvZihmbW9kZSkpOworICAgIGlmIChzLT5tb2RlID09ICdcMCcpIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKKworICAgIGlmIChzLT5tb2RlID09ICd3JykgeworI2lmZGVmIE5PX0daQ09NUFJFU1MKKyAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoJihzLT5zdHJlYW0pLCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIHN0cmF0ZWd5KTsKKyAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHN1cHByZXNzIHpsaWIgaGVhZGVyICovCisKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CisjZW5kaWYKKyAgICAgICAgaWYgKGVyciAhPSBaX09LIHx8IHMtPm91dGJ1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luICA9IHMtPmluYnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CisKKyAgICAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCYocy0+c3RyZWFtKSwgLU1BWF9XQklUUyk7CisgICAgICAgIC8qIHdpbmRvd0JpdHMgaXMgcGFzc2VkIDwgMCB0byB0ZWxsIHRoYXQgdGhlcmUgaXMgbm8gemxpYiBoZWFkZXIuCisgICAgICAgICAqIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgaW5mbGF0ZSAqcmVxdWlyZXMqIGFuIGV4dHJhICJkdW1teSIgYnl0ZQorICAgICAgICAgKiBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0gaW4gb3JkZXIgdG8gY29tcGxldGUgZGVjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgICogcmV0dXJuIFpfU1RSRUFNX0VORC4gSGVyZSB0aGUgZ3ppcCBDUkMzMiBlbnN1cmVzIHRoYXQgNCBieXRlcyBhcmUKKyAgICAgICAgICogcHJlc2VudCBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+aW5idWYgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKKworICAgIGVycm5vID0gMDsKKyAgICBzLT5maWxlID0gZmQgPCAwID8gRl9PUEVOKHBhdGgsIGZtb2RlKSA6IChGSUxFKilmZG9wZW4oZmQsIGZtb2RlKTsKKworICAgIGlmIChzLT5maWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworICAgIH0KKyAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyAgICAgICAgLyogV3JpdGUgYSB2ZXJ5IHNpbXBsZSAuZ3ogaGVhZGVyOgorICAgICAgICAgKi8KKyAgICAgICAgZnByaW50ZihzLT5maWxlLCAiJWMlYyVjJWMlYyVjJWMlYyVjJWMiLCBnel9tYWdpY1swXSwgZ3pfbWFnaWNbMV0sCisgICAgICAgICAgICAgWl9ERUZMQVRFRCwgMCAvKmZsYWdzKi8sIDAsMCwwLDAgLyp0aW1lKi8sIDAgLyp4ZmxhZ3MqLywgT1NfQ09ERSk7CisgICAgICAgIHMtPnN0YXJ0ID0gMTBMOworICAgICAgICAvKiBXZSB1c2UgMTBMIGluc3RlYWQgb2YgZnRlbGwocy0+ZmlsZSkgdG8gYmVjYXVzZSBmdGVsbCBjYXVzZXMgYW4KKyAgICAgICAgICogZmZsdXNoIG9uIHNvbWUgc3lzdGVtcy4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgdXNlCisgICAgICAgICAqIHN0YXJ0IGFueXdheSBpbiB3cml0ZSBtb2RlLCBzbyB0aGlzIGluaXRpYWxpemF0aW9uIGlzIG5vdAorICAgICAgICAgKiBuZWNlc3NhcnkuCisgICAgICAgICAqLworICAgIH0gZWxzZSB7CisgICAgICAgIGNoZWNrX2hlYWRlcihzKTsgLyogc2tpcCB0aGUgLmd6IGhlYWRlciAqLworICAgICAgICBzLT5zdGFydCA9IGZ0ZWxsKHMtPmZpbGUpIC0gcy0+c3RyZWFtLmF2YWlsX2luOworICAgIH0KKworICAgIHJldHVybiAoZ3pGaWxlKXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgorKi8KK2d6RmlsZSBaRVhQT1JUIGd6b3BlbiAocGF0aCwgbW9kZSkKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgcmV0dXJuIGd6X29wZW4gKHBhdGgsIG1vZGUsIC0xKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIEFzc29jaWF0ZSBhIGd6RmlsZSB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQuIGZkIGlzIG5vdCBkdXAnZWQgaGVyZQorICAgdG8gbWltaWMgdGhlIGJlaGF2aW8odSlyIG9mIGZkb3Blbi4KKyovCitnekZpbGUgWkVYUE9SVCBnemRvcGVuIChmZCwgbW9kZSkKKyAgICBpbnQgZmQ7CisgICAgY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICBjaGFyIG5hbWVbNDZdOyAgICAgIC8qIGFsbG93IGZvciB1cCB0byAxMjgtYml0IGludGVnZXJzICovCisKKyAgICBpZiAoZmQgPCAwKSByZXR1cm4gKGd6RmlsZSlaX05VTEw7CisgICAgc3ByaW50ZihuYW1lLCAiPGZkOiVkPiIsIGZkKTsgLyogZm9yIGRlYnVnZ2luZyAqLworCisgICAgcmV0dXJuIGd6X29wZW4gKG5hbWUsIG1vZGUsIGZkKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBzdHJhdGVneQorICovCitpbnQgWkVYUE9SVCBnenNldHBhcmFtcyAoZmlsZSwgbGV2ZWwsIHN0cmF0ZWd5KQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgc3RyYXRlZ3k7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIE1ha2Ugcm9vbSB0byBhbGxvdyBmbHVzaGluZyAqLworICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKworICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWY7CisgICAgICAgIGlmIChmd3JpdGUocy0+b3V0YnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpICE9IFpfQlVGU0laRSkgeworICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POworICAgICAgICB9CisgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7CisgICAgfQorCisgICAgcmV0dXJuIGRlZmxhdGVQYXJhbXMgKCYocy0+c3RyZWFtKSwgbGV2ZWwsIHN0cmF0ZWd5KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlYWQgYSBieXRlIGZyb20gYSBnel9zdHJlYW07IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbi4gUmV0dXJuIEVPRgorICAgZm9yIGVuZCBvZiBmaWxlLgorICAgSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHMgaGFzIGJlZW4gc3VjZXNzZnVsbHkgb3BlbmVkIGZvciByZWFkaW5nLgorKi8KK2xvY2FsIGludCBnZXRfYnl0ZShzKQorICAgIGd6X3N0cmVhbSAqczsKK3sKKyAgICBpZiAocy0+el9lb2YpIHJldHVybiBFT0Y7CisgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpZnJlYWQocy0+aW5idWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSk7CisgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgcy0+el9lb2YgPSAxOworCSAgICAvKiBrbGliYyBoYWNrICovCisgICAgICAgICAgICBpZiAoZXJybm8pIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgIH0KKyAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKyAgICB9CisgICAgcy0+c3RyZWFtLmF2YWlsX2luLS07CisgICAgcmV0dXJuICoocy0+c3RyZWFtLm5leHRfaW4pKys7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQ2hlY2sgdGhlIGd6aXAgaGVhZGVyIG9mIGEgZ3pfc3RyZWFtIG9wZW5lZCBmb3IgcmVhZGluZy4gU2V0IHRoZSBzdHJlYW0KKyAgICBtb2RlIHRvIHRyYW5zcGFyZW50IGlmIHRoZSBnemlwIG1hZ2ljIGhlYWRlciBpcyBub3QgcHJlc2VudDsgc2V0IHMtPmVycgorICAgIHRvIFpfREFUQV9FUlJPUiBpZiB0aGUgbWFnaWMgaGVhZGVyIGlzIHByZXNlbnQgYnV0IHRoZSByZXN0IG9mIHRoZSBoZWFkZXIKKyAgICBpcyBpbmNvcnJlY3QuCisgICAgSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHMgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIHN1Y2Vzc2Z1bGx5OworICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiBpcyB6ZXJvIGZvciB0aGUgZmlyc3QgdGltZSwgYnV0IG1heSBiZSBub24temVybworICAgICAgIGZvciBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzLgorKi8KK2xvY2FsIHZvaWQgY2hlY2tfaGVhZGVyKHMpCisgICAgZ3pfc3RyZWFtICpzOworeworICAgIGludCBtZXRob2Q7IC8qIG1ldGhvZCBieXRlICovCisgICAgaW50IGZsYWdzOyAgLyogZmxhZ3MgYnl0ZSAqLworICAgIHVJbnQgbGVuOworICAgIGludCBjOworCisgICAgLyogQXNzdXJlIHR3byBieXRlcyBpbiB0aGUgYnVmZmVyIHNvIHdlIGNhbiBwZWVrIGFoZWFkIC0tIGhhbmRsZSBjYXNlCisgICAgICAgd2hlcmUgZmlyc3QgYnl0ZSBvZiBoZWFkZXIgaXMgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGFmdGVyIHRoZSBsYXN0CisgICAgICAgZ3ppcCBzZWdtZW50ICovCisgICAgbGVuID0gcy0+c3RyZWFtLmF2YWlsX2luOworICAgIGlmIChsZW4gPCAyKSB7CisgICAgICAgIGlmIChsZW4pIHMtPmluYnVmWzBdID0gcy0+c3RyZWFtLm5leHRfaW5bMF07CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgbGVuID0gKHVJbnQpZnJlYWQocy0+aW5idWYgKyBsZW4sIDEsIFpfQlVGU0laRSA+PiBsZW4sIHMtPmZpbGUpOworCS8qIGtsaWJjIGhhY2sgKi8KKyAgICAgICAgaWYgKGxlbiA9PSAwICYmIGVycm5vKSBzLT56X2VyciA9IFpfRVJSTk87CisgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiArPSBsZW47CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CisgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPCAyKSB7CisgICAgICAgICAgICBzLT50cmFuc3BhcmVudCA9IHMtPnN0cmVhbS5hdmFpbF9pbjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFBlZWsgYWhlYWQgdG8gY2hlY2sgdGhlIGd6aXAgbWFnaWMgaGVhZGVyICovCisgICAgaWYgKHMtPnN0cmVhbS5uZXh0X2luWzBdICE9IGd6X21hZ2ljWzBdIHx8CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luWzFdICE9IGd6X21hZ2ljWzFdKSB7CisgICAgICAgIHMtPnRyYW5zcGFyZW50ID0gMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzLT5zdHJlYW0uYXZhaWxfaW4gLT0gMjsKKyAgICBzLT5zdHJlYW0ubmV4dF9pbiArPSAyOworCisgICAgLyogQ2hlY2sgdGhlIHJlc3Qgb2YgdGhlIGd6aXAgaGVhZGVyICovCisgICAgbWV0aG9kID0gZ2V0X2J5dGUocyk7CisgICAgZmxhZ3MgPSBnZXRfYnl0ZShzKTsKKyAgICBpZiAobWV0aG9kICE9IFpfREVGTEFURUQgfHwgKGZsYWdzICYgUkVTRVJWRUQpICE9IDApIHsKKyAgICAgICAgcy0+el9lcnIgPSBaX0RBVEFfRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBEaXNjYXJkIHRpbWUsIHhmbGFncyBhbmQgT1MgY29kZTogKi8KKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDY7IGxlbisrKSAodm9pZClnZXRfYnl0ZShzKTsKKworICAgIGlmICgoZmxhZ3MgJiBFWFRSQV9GSUVMRCkgIT0gMCkgeyAvKiBza2lwIHRoZSBleHRyYSBmaWVsZCAqLworICAgICAgICBsZW4gID0gICh1SW50KWdldF9ieXRlKHMpOworICAgICAgICBsZW4gKz0gKCh1SW50KWdldF9ieXRlKHMpKTw8ODsKKyAgICAgICAgLyogbGVuIGlzIGdhcmJhZ2UgaWYgRU9GIGJ1dCB0aGUgbG9vcCBiZWxvdyB3aWxsIHF1aXQgYW55d2F5ICovCisgICAgICAgIHdoaWxlIChsZW4tLSAhPSAwICYmIGdldF9ieXRlKHMpICE9IEVPRikgOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgT1JJR19OQU1FKSAhPSAwKSB7IC8qIHNraXAgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSAqLworICAgICAgICB3aGlsZSAoKGMgPSBnZXRfYnl0ZShzKSkgIT0gMCAmJiBjICE9IEVPRikgOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgQ09NTUVOVCkgIT0gMCkgeyAgIC8qIHNraXAgdGhlIC5neiBmaWxlIGNvbW1lbnQgKi8KKyAgICAgICAgd2hpbGUgKChjID0gZ2V0X2J5dGUocykpICE9IDAgJiYgYyAhPSBFT0YpIDsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIEhFQURfQ1JDKSAhPSAwKSB7ICAvKiBza2lwIHRoZSBoZWFkZXIgY3JjICovCisgICAgICAgIGZvciAobGVuID0gMDsgbGVuIDwgMjsgbGVuKyspICh2b2lkKWdldF9ieXRlKHMpOworICAgIH0KKyAgICBzLT56X2VyciA9IHMtPnpfZW9mID8gWl9EQVRBX0VSUk9SIDogWl9PSzsKK30KKworIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2xlYW51cCB0aGVuIGZyZWUgdGhlIGdpdmVuIGd6X3N0cmVhbS4gUmV0dXJuIGEgemxpYiBlcnJvciBjb2RlLgorICAgVHJ5IGZyZWVpbmcgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YgYWxsb2NhdGlvbnMuCisgKi8KK2xvY2FsIGludCBkZXN0cm95IChzKQorICAgIGd6X3N0cmVhbSAqczsKK3sKKyAgICBpbnQgZXJyID0gWl9PSzsKKworICAgIGlmICghcykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgVFJZRlJFRShzLT5tc2cpOworCisgICAgaWYgKHMtPnN0cmVhbS5zdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzLT5tb2RlID09ICd3JykgeworI2lmZGVmIE5PX0daQ09NUFJFU1MKKyAgICAgICAgICAgIGVyciA9IFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgICAgIGVyciA9IGRlZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKHMtPm1vZGUgPT0gJ3InKSB7CisgICAgICAgICAgICBlcnIgPSBpbmZsYXRlRW5kKCYocy0+c3RyZWFtKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmZpbGUgIT0gTlVMTCAmJiBmY2xvc2Uocy0+ZmlsZSkpIHsKKyNpZmRlZiBFU1BJUEUKKyAgICAgICAgaWYgKGVycm5vICE9IEVTUElQRSkgLyogZmNsb3NlIGlzIGJyb2tlbiBmb3IgcGlwZXMgaW4gSFAvVVggKi8KKyNlbmRpZgorICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICB9CisgICAgaWYgKHMtPnpfZXJyIDwgMCkgZXJyID0gcy0+el9lcnI7CisKKyAgICBUUllGUkVFKHMtPmluYnVmKTsKKyAgICBUUllGUkVFKHMtPm91dGJ1Zik7CisgICAgVFJZRlJFRShzLT5wYXRoKTsKKyAgICBUUllGUkVFKHMpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yIGVuZCBvZiBmaWxlKS4KKyovCitpbnQgWkVYUE9SVCBnenJlYWQgKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIHZvaWRwIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKyAgICBCeXRlZiAqc3RhcnQgPSAoQnl0ZWYqKWJ1ZjsgLyogc3RhcnRpbmcgcG9pbnQgZm9yIGNyYyBjb21wdXRhdGlvbiAqLworICAgIEJ5dGUgICpuZXh0X291dDsgLyogPT0gc3RyZWFtLm5leHRfb3V0IGJ1dCBub3QgZm9yY2VkIGZhciAoZm9yIE1TRE9TKSAqLworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgaWYgKHMtPnpfZXJyID09IFpfREFUQV9FUlJPUiB8fCBzLT56X2VyciA9PSBaX0VSUk5PKSByZXR1cm4gLTE7CisgICAgaWYgKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCkgcmV0dXJuIDA7ICAvKiBFT0YgKi8KKworICAgIG5leHRfb3V0ID0gKEJ5dGUqKWJ1ZjsKKyAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYqKWJ1ZjsKKyAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gbGVuOworCisgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgJiYgcy0+YmFjayAhPSBFT0YpIHsKKyAgICAgICAgKm5leHRfb3V0KysgPSBzLT5iYWNrOworICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQrKzsKKyAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dC0tOworICAgICAgICBzLT5iYWNrID0gRU9GOworICAgICAgICBzLT5vdXQrKzsKKyAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgaWYgKHMtPmxhc3QpIHsKKyAgICAgICAgICAgIHMtPnpfZXJyID0gWl9TVFJFQU1fRU5EOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAocy0+c3RyZWFtLmF2YWlsX291dCAhPSAwKSB7CisKKyAgICAgICAgaWYgKHMtPnRyYW5zcGFyZW50KSB7CisgICAgICAgICAgICAvKiBDb3B5IGZpcnN0IHRoZSBsb29rYWhlYWQgYnl0ZXM6ICovCisgICAgICAgICAgICB1SW50IG4gPSBzLT5zdHJlYW0uYXZhaWxfaW47CisgICAgICAgICAgICBpZiAobiA+IHMtPnN0cmVhbS5hdmFpbF9vdXQpIG4gPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgem1lbWNweShzLT5zdHJlYW0ubmV4dF9vdXQsIHMtPnN0cmVhbS5uZXh0X2luLCBuKTsKKyAgICAgICAgICAgICAgICBuZXh0X291dCArPSBuOworICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IG5leHRfb3V0OworICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luICAgKz0gbjsKKyAgICAgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0IC09IG47CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luICAtPSBuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCAtPQorICAgICAgICAgICAgICAgICAgICAodUludClmcmVhZChuZXh0X291dCwgMSwgcy0+c3RyZWFtLmF2YWlsX291dCwgcy0+ZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gLT0gcy0+c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgICAgIHMtPmluICArPSBsZW47CisgICAgICAgICAgICBzLT5vdXQgKz0gbGVuOworICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSBzLT56X2VvZiA9IDE7CisgICAgICAgICAgICByZXR1cm4gKGludClsZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwICYmICFzLT56X2VvZikgeworCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludClmcmVhZChzLT5pbmJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPnpfZW9mID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8pIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworICAgICAgICB9CisgICAgICAgIHMtPmluICs9IHMtPnN0cmVhbS5hdmFpbF9pbjsKKyAgICAgICAgcy0+b3V0ICs9IHMtPnN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgIHMtPnpfZXJyID0gaW5mbGF0ZSgmKHMtPnN0cmVhbSksIFpfTk9fRkxVU0gpOworICAgICAgICBzLT5pbiAtPSBzLT5zdHJlYW0uYXZhaWxfaW47CisgICAgICAgIHMtPm91dCAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworCisgICAgICAgIGlmIChzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIC8qIENoZWNrIENSQyBhbmQgb3JpZ2luYWwgc2l6ZSAqLworICAgICAgICAgICAgcy0+Y3JjID0gY3JjMzIocy0+Y3JjLCBzdGFydCwgKHVJbnQpKHMtPnN0cmVhbS5uZXh0X291dCAtIHN0YXJ0KSk7CisgICAgICAgICAgICBzdGFydCA9IHMtPnN0cmVhbS5uZXh0X291dDsKKworICAgICAgICAgICAgaWYgKGdldExvbmcocykgIT0gcy0+Y3JjKSB7CisgICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICh2b2lkKWdldExvbmcocyk7CisgICAgICAgICAgICAgICAgLyogVGhlIHVuY29tcHJlc3NlZCBsZW5ndGggcmV0dXJuZWQgYnkgYWJvdmUgZ2V0bG9uZygpIG1heSBiZQorICAgICAgICAgICAgICAgICAqIGRpZmZlcmVudCBmcm9tIHMtPm91dCBpbiBjYXNlIG9mIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMuCisgICAgICAgICAgICAgICAgICogQ2hlY2sgZm9yIHN1Y2ggZmlsZXM6CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY2hlY2tfaGVhZGVyKHMpOworICAgICAgICAgICAgICAgIGlmIChzLT56X2VyciA9PSBaX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGluZmxhdGVSZXNldCgmKHMtPnN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICBzLT5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnpfZXJyICE9IFpfT0sgfHwgcy0+el9lb2YpIGJyZWFrOworICAgIH0KKyAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIHN0YXJ0LCAodUludCkocy0+c3RyZWFtLm5leHRfb3V0IC0gc3RhcnQpKTsKKworICAgIGlmIChsZW4gPT0gcy0+c3RyZWFtLmF2YWlsX291dCAmJgorICAgICAgICAocy0+el9lcnIgPT0gWl9EQVRBX0VSUk9SIHx8IHMtPnpfZXJyID09IFpfRVJSTk8pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIChpbnQpKGxlbiAtIHMtPnN0cmVhbS5hdmFpbF9vdXQpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKKyAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisqLworaW50IFpFWFBPUlQgZ3pnZXRjKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgdW5zaWduZWQgY2hhciBjOworCisgICAgcmV0dXJuIGd6cmVhZChmaWxlLCAmYywgMSkgPT0gMSA/IGMgOiAtMTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFB1c2ggb25lIGJ5dGUgYmFjayBvbnRvIHRoZSBzdHJlYW0uCisqLworaW50IFpFWFBPUlQgZ3p1bmdldGMoYywgZmlsZSkKKyAgICBpbnQgYzsKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJyB8fCBjID09IEVPRiB8fCBzLT5iYWNrICE9IEVPRikgcmV0dXJuIEVPRjsKKyAgICBzLT5iYWNrID0gYzsKKyAgICBzLT5vdXQtLTsKKyAgICBzLT5sYXN0ID0gKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCk7CisgICAgaWYgKHMtPmxhc3QpIHMtPnpfZXJyID0gWl9PSzsKKyAgICBzLT56X2VvZiA9IDA7CisgICAgcmV0dXJuIGM7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUKKyAgIHJlYWQsIG9yIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbgorICAgZW5kLW9mLWZpbGUgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQKKyAgIHdpdGggYSBudWxsIGNoYXJhY3Rlci4KKyAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisKKyAgICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBvcHRpbWl6ZWQgYXQgYWxsLgorKi8KK2NoYXIgKiBaRVhQT1JUIGd6Z2V0cyhmaWxlLCBidWYsIGxlbikKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbjsKK3sKKyAgICBjaGFyICpiID0gYnVmOworICAgIGlmIChidWYgPT0gWl9OVUxMIHx8IGxlbiA8PSAwKSByZXR1cm4gWl9OVUxMOworCisgICAgd2hpbGUgKC0tbGVuID4gMCAmJiBnenJlYWQoZmlsZSwgYnVmLCAxKSA9PSAxICYmICpidWYrKyAhPSAnXG4nKSA7CisgICAgKmJ1ZiA9ICdcMCc7CisgICAgcmV0dXJuIGIgPT0gYnVmICYmIGxlbiA+IDAgPyBaX05VTEwgOiBiOworfQorCisKKyNpZm5kZWYgTk9fR1pDT01QUkVTUworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KK2ludCBaRVhQT1JUIGd6d3JpdGUgKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIHZvaWRwYyBidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3cnKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopYnVmOworICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKworICAgIHdoaWxlIChzLT5zdHJlYW0uYXZhaWxfaW4gIT0gMCkgeworCisgICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKworICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmOworICAgICAgICAgICAgaWYgKGZ3cml0ZShzLT5vdXRidWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSkgIT0gWl9CVUZTSVpFKSB7CisgICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKKyAgICAgICAgfQorICAgICAgICBzLT5pbiArPSBzLT5zdHJlYW0uYXZhaWxfaW47CisgICAgICAgIHMtPm91dCArPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICBzLT56X2VyciA9IGRlZmxhdGUoJihzLT5zdHJlYW0pLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgcy0+aW4gLT0gcy0+c3RyZWFtLmF2YWlsX2luOworICAgICAgICBzLT5vdXQgLT0gcy0+c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgaWYgKHMtPnpfZXJyICE9IFpfT0spIGJyZWFrOworICAgIH0KKyAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIChjb25zdCBCeXRlZiAqKWJ1ZiwgbGVuKTsKKworICAgIHJldHVybiAoaW50KShsZW4gLSBzLT5zdHJlYW0uYXZhaWxfaW4pOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KKyNpZmRlZiBTVERDCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBaRVhQT1JUVkEgZ3pwcmludGYgKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC8qIGFyZ3MgKi8gLi4uKQoreworICAgIGNoYXIgYnVmW1pfUFJJTlRGX0JVRlNJWkVdOworICAgIHZhX2xpc3QgdmE7CisgICAgaW50IGxlbjsKKworICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyNpZmRlZiBOT192c25wcmludGYKKyMgIGlmZGVmIEhBU192c3ByaW50Zl92b2lkCisgICAgKHZvaWQpdnNwcmludGYoYnVmLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIGZvciAobGVuID0gMDsgbGVuIDwgc2l6ZW9mKGJ1Zik7IGxlbisrKQorICAgICAgICBpZiAoYnVmW2xlbl0gPT0gMCkgYnJlYWs7CisjICBlbHNlCisgICAgbGVuID0gdnNwcmludGYoYnVmLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworIyAgZW5kaWYKKyNlbHNlCisjICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKKyAgICAodm9pZCl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICBsZW4gPSBzdHJsZW4oYnVmKTsKKyMgIGVsc2UKKyAgICBsZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyMgIGVuZGlmCisjZW5kaWYKKyAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZW9mKGJ1ZikgfHwgYnVmW3NpemVvZihidWYpIC0gMV0gIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgYnVmLCAodW5zaWduZWQpbGVuKTsKK30KKyNlbHNlIC8qIG5vdCBBTlNJIEMgKi8KKworaW50IFpFWFBPUlRWQSBnenByaW50ZiAoZmlsZSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsCisgICAgICAgICAgICAgICAgICAgICAgIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCkKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgaW50IGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKyAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwOworeworICAgIGNoYXIgYnVmW1pfUFJJTlRGX0JVRlNJWkVdOworICAgIGludCBsZW47CisKKyAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CisjaWZkZWYgTk9fc25wcmludGYKKyMgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKKyAgICBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCisgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworICAgIGZvciAobGVuID0gMDsgbGVuIDwgc2l6ZW9mKGJ1Zik7IGxlbisrKQorICAgICAgICBpZiAoYnVmW2xlbl0gPT0gMCkgYnJlYWs7CisjICBlbHNlCisgICAgbGVuID0gc3ByaW50ZihidWYsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorICAgICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisjICBlbmRpZgorI2Vsc2UKKyMgIGlmZGVmIEhBU19zbnByaW50Zl92b2lkCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCisgICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyAgICBsZW4gPSBzdHJsZW4oYnVmKTsKKyMgIGVsc2UKKyAgICBsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKyAgICAgICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyMgIGVuZGlmCisjZW5kaWYKKyAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IHNpemVvZihidWYpIHx8IGJ1ZltzaXplb2YoYnVmKSAtIDFdICE9IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBnendyaXRlKGZpbGUsIGJ1ZiwgbGVuKTsKK30KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworaW50IFpFWFBPUlQgZ3pwdXRjKGZpbGUsIGMpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGM7Cit7CisgICAgdW5zaWduZWQgY2hhciBjYyA9ICh1bnNpZ25lZCBjaGFyKSBjOyAvKiByZXF1aXJlZCBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zICovCisKKyAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCAmY2MsIDEpID09IDEgPyAoaW50KWNjIDogLTE7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCisgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisgICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCitpbnQgWkVYUE9SVCBnenB1dHMoZmlsZSwgcykKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyICpzOworeworICAgIHJldHVybiBnendyaXRlKGZpbGUsIChjaGFyKilzLCAodW5zaWduZWQpc3RybGVuKHMpKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLgorKi8KK2xvY2FsIGludCBkb19mbHVzaCAoZmlsZSwgZmx1c2gpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGZsdXNoOworeworICAgIHVJbnQgbGVuOworICAgIGludCBkb25lID0gMDsKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gMDsgLyogc2hvdWxkIGJlIHplcm8gYWxyZWFkeSBhbnl3YXkgKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gWl9CVUZTSVpFIC0gcy0+c3RyZWFtLmF2YWlsX291dDsKKworICAgICAgICBpZiAobGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmICgodUludClmd3JpdGUocy0+b3V0YnVmLCAxLCBsZW4sIHMtPmZpbGUpICE9IGxlbikgeworICAgICAgICAgICAgICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKKyAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbmUpIGJyZWFrOworICAgICAgICBzLT5vdXQgKz0gcy0+c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgcy0+el9lcnIgPSBkZWZsYXRlKCYocy0+c3RyZWFtKSwgZmx1c2gpOworICAgICAgICBzLT5vdXQgLT0gcy0+c3RyZWFtLmF2YWlsX291dDsKKworICAgICAgICAvKiBJZ25vcmUgdGhlIHNlY29uZCBvZiB0d28gY29uc2VjdXRpdmUgZmx1c2hlczogKi8KKyAgICAgICAgaWYgKGxlbiA9PSAwICYmIHMtPnpfZXJyID09IFpfQlVGX0VSUk9SKSBzLT56X2VyciA9IFpfT0s7CisKKyAgICAgICAgLyogZGVmbGF0ZSBoYXMgZmluaXNoZWQgZmx1c2hpbmcgb25seSB3aGVuIGl0IGhhc24ndCB1c2VkIHVwCisgICAgICAgICAqIGFsbCB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyOgorICAgICAgICAgKi8KKyAgICAgICAgZG9uZSA9IChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDAgfHwgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKTsKKworICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSyAmJiBzLT56X2VyciAhPSBaX1NUUkVBTV9FTkQpIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gIHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiBzLT56X2VycjsKK30KKworaW50IFpFWFBPUlQgZ3pmbHVzaCAoZmlsZSwgZmx1c2gpCisgICAgIGd6RmlsZSBmaWxlOworICAgICBpbnQgZmx1c2g7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKyAgICBpbnQgZXJyID0gZG9fZmx1c2ggKGZpbGUsIGZsdXNoKTsKKworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgZmZsdXNoKHMtPmZpbGUpOworICAgIHJldHVybiAgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IHMtPnpfZXJyOworfQorI2VuZGlmIC8qIE5PX0daQ09NUFJFU1MgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlIGdpdmVuCisgICBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KKyAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICBTRUVLX0VORCBpcyBub3QgaW1wbGVtZW50ZWQsIHJldHVybnMgZXJyb3IuCisgICAgICBJbiB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGd6c2VlayBjYW4gYmUgZXh0cmVtZWx5IHNsb3cuCisqLworel9vZmZfdCBaRVhQT1JUIGd6c2VlayAoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmZfdCBvZmZzZXQ7CisgICAgaW50IHdoZW5jZTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCB8fCB3aGVuY2UgPT0gU0VFS19FTkQgfHwKKyAgICAgICAgcy0+el9lcnIgPT0gWl9FUlJOTyB8fCBzLT56X2VyciA9PSBaX0RBVEFfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIC0xTDsKKyAgICB9CisKKyAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyNpZmRlZiBOT19HWkNPTVBSRVNTCisgICAgICAgIHJldHVybiAtMUw7CisjZWxzZQorICAgICAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKSB7CisgICAgICAgICAgICBvZmZzZXQgLT0gcy0+aW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA8IDApIHJldHVybiAtMUw7CisKKyAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgb2Zmc2V0IGlzIHRoZSBudW1iZXIgb2YgemVybyBieXRlcyB0byB3cml0ZS4gKi8KKyAgICAgICAgaWYgKHMtPmluYnVmID09IFpfTlVMTCkgeworICAgICAgICAgICAgcy0+aW5idWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsgLyogZm9yIHNlZWtpbmcgKi8KKyAgICAgICAgICAgIGlmIChzLT5pbmJ1ZiA9PSBaX05VTEwpIHJldHVybiAtMUw7CisgICAgICAgICAgICB6bWVtemVybyhzLT5pbmJ1ZiwgWl9CVUZTSVpFKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAob2Zmc2V0ID4gMCkgIHsKKyAgICAgICAgICAgIHVJbnQgc2l6ZSA9IFpfQlVGU0laRTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBaX0JVRlNJWkUpIHNpemUgPSAodUludClvZmZzZXQ7CisKKyAgICAgICAgICAgIHNpemUgPSBnendyaXRlKGZpbGUsIHMtPmluYnVmLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHJldHVybiAtMUw7CisKKyAgICAgICAgICAgIG9mZnNldCAtPSBzaXplOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzLT5pbjsKKyNlbmRpZgorICAgIH0KKyAgICAvKiBSZXN0IG9mIGZ1bmN0aW9uIGlzIGZvciByZWFkaW5nIG9ubHkgKi8KKworICAgIC8qIGNvbXB1dGUgYWJzb2x1dGUgcG9zaXRpb24gKi8KKyAgICBpZiAod2hlbmNlID09IFNFRUtfQ1VSKSB7CisgICAgICAgIG9mZnNldCArPSBzLT5vdXQ7CisgICAgfQorICAgIGlmIChvZmZzZXQgPCAwKSByZXR1cm4gLTFMOworCisgICAgaWYgKHMtPnRyYW5zcGFyZW50KSB7CisgICAgICAgIC8qIG1hcCB0byBmc2VlayAqLworICAgICAgICBzLT5iYWNrID0gRU9GOworICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworICAgICAgICBpZiAoZnNlZWsocy0+ZmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSByZXR1cm4gLTFMOworCisgICAgICAgIHMtPmluID0gcy0+b3V0ID0gb2Zmc2V0OworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKworICAgIC8qIEZvciBhIG5lZ2F0aXZlIHNlZWssIHJld2luZCBhbmQgdXNlIHBvc2l0aXZlIHNlZWsgKi8KKyAgICBpZiAob2Zmc2V0ID49IHMtPm91dCkgeworICAgICAgICBvZmZzZXQgLT0gcy0+b3V0OworICAgIH0gZWxzZSBpZiAoZ3pyZXdpbmQoZmlsZSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMUw7CisgICAgfQorICAgIC8qIG9mZnNldCBpcyBub3cgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLiAqLworCisgICAgaWYgKG9mZnNldCAhPSAwICYmIHMtPm91dGJ1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CisgICAgICAgIGlmIChzLT5vdXRidWYgPT0gWl9OVUxMKSByZXR1cm4gLTFMOworICAgIH0KKyAgICBpZiAob2Zmc2V0ICYmIHMtPmJhY2sgIT0gRU9GKSB7CisgICAgICAgIHMtPmJhY2sgPSBFT0Y7CisgICAgICAgIHMtPm91dCsrOworICAgICAgICBvZmZzZXQtLTsKKyAgICAgICAgaWYgKHMtPmxhc3QpIHMtPnpfZXJyID0gWl9TVFJFQU1fRU5EOworICAgIH0KKyAgICB3aGlsZSAob2Zmc2V0ID4gMCkgIHsKKyAgICAgICAgaW50IHNpemUgPSBaX0JVRlNJWkU7CisgICAgICAgIGlmIChvZmZzZXQgPCBaX0JVRlNJWkUpIHNpemUgPSAoaW50KW9mZnNldDsKKworICAgICAgICBzaXplID0gZ3pyZWFkKGZpbGUsIHMtPm91dGJ1ZiwgKHVJbnQpc2l6ZSk7CisgICAgICAgIGlmIChzaXplIDw9IDApIHJldHVybiAtMUw7CisgICAgICAgIG9mZnNldCAtPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gcy0+b3V0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV3aW5kcyBpbnB1dCBmaWxlLgorKi8KK2ludCBaRVhQT1JUIGd6cmV3aW5kIChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gLTE7CisKKyAgICBzLT56X2VyciA9IFpfT0s7CisgICAgcy0+el9lb2YgPSAwOworICAgIHMtPmJhY2sgPSBFT0Y7CisgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworICAgIHMtPmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgIGlmICghcy0+dHJhbnNwYXJlbnQpICh2b2lkKWluZmxhdGVSZXNldCgmcy0+c3RyZWFtKTsKKyAgICBzLT5pbiA9IDA7CisgICAgcy0+b3V0ID0gMDsKKyAgICByZXR1cm4gZnNlZWsocy0+ZmlsZSwgcy0+c3RhcnQsIFNFRUtfU0VUKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorKi8KK3pfb2ZmX3QgWkVYUE9SVCBnenRlbGwgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgcmV0dXJuIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KKyAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCisqLworaW50IFpFWFBPUlQgZ3plb2YgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIC8qIFdpdGggY29uY2F0ZW5hdGVkIGNvbXByZXNzZWQgZmlsZXMgdGhhdCBjYW4gaGF2ZSBlbWJlZGRlZAorICAgICAqIGNyYyB0cmFpbGVycywgel9lb2YgaXMgbm8gbG9uZ2VyIHRoZSBvbmx5L2Jlc3QgaW5kaWNhdG9yIG9mIEVPRgorICAgICAqIG9uIGEgZ3pfc3RyZWFtLiBIYW5kbGUgZW5kLW9mLXN0cmVhbSBlcnJvciBleHBsaWNpdGx5IGhlcmUuCisgICAgICovCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJykgcmV0dXJuIDA7CisgICAgaWYgKHMtPnpfZW9mKSByZXR1cm4gMTsKKyAgICByZXR1cm4gcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV0dXJucyAxIGlmIHJlYWRpbmcgYW5kIGRvaW5nIHNvIHRyYW5zcGFyZW50bHksIG90aGVyd2lzZSB6ZXJvLgorKi8KK2ludCBaRVhQT1JUIGd6ZGlyZWN0IChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gMDsKKyAgICByZXR1cm4gcy0+dHJhbnNwYXJlbnQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgT3V0cHV0cyBhIGxvbmcgaW4gTFNCIG9yZGVyIHRvIHRoZSBnaXZlbiBmaWxlCisqLworbG9jYWwgdm9pZCBwdXRMb25nIChmaWxlLCB4KQorICAgIEZJTEUgKmZpbGU7CisgICAgdUxvbmcgeDsKK3sKKyAgICBpbnQgbjsKKyAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CisgICAgICAgIGZwdXRjKChpbnQpKHggJiAweGZmKSwgZmlsZSk7CisgICAgICAgIHggPj49IDg7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzIHpfZXJyIGluIGNhc2UKKyAgIG9mIGVycm9yLgorKi8KK2xvY2FsIHVMb25nIGdldExvbmcgKHMpCisgICAgZ3pfc3RyZWFtICpzOworeworICAgIHVMb25nIHggPSAodUxvbmcpZ2V0X2J5dGUocyk7CisgICAgaW50IGM7CisKKyAgICB4ICs9ICgodUxvbmcpZ2V0X2J5dGUocykpPDw4OworICAgIHggKz0gKCh1TG9uZylnZXRfYnl0ZShzKSk8PDE2OworICAgIGMgPSBnZXRfYnl0ZShzKTsKKyAgICBpZiAoYyA9PSBFT0YpIHMtPnpfZXJyID0gWl9EQVRBX0VSUk9SOworICAgIHggKz0gKCh1TG9uZyljKTw8MjQ7CisgICAgcmV0dXJuIHg7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCisqLworaW50IFpFWFBPUlQgZ3pjbG9zZSAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisjaWZkZWYgTk9fR1pDT01QUkVTUworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICBpZiAoZG9fZmx1c2ggKGZpbGUsIFpfRklOSVNIKSAhPSBaX09LKQorICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3koKGd6X3N0cmVhbSopZmlsZSk7CisKKyAgICAgICAgcHV0TG9uZyAocy0+ZmlsZSwgcy0+Y3JjKTsKKyAgICAgICAgcHV0TG9uZyAocy0+ZmlsZSwgKHVMb25nKShzLT5pbiAmIDB4ZmZmZmZmZmYpKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gZGVzdHJveSgoZ3pfc3RyZWFtKilmaWxlKTsKK30KKworI2lmZGVmIFNUREMKKyMgIGRlZmluZSB6c3RyZXJyb3IoZXJybnVtKSBzdHJlcnJvcihlcnJudW0pCisjZWxzZQorIyAgZGVmaW5lIHpzdHJlcnJvcihlcnJudW0pICIiCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCisgICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorKi8KK2NvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IgKGZpbGUsIGVycm51bSkKKyAgICBnekZpbGUgZmlsZTsKKyAgICBpbnQgKmVycm51bTsKK3sKKyAgICBjaGFyICptOworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgICplcnJudW0gPSBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIChjb25zdCBjaGFyKilFUlJfTVNHKFpfU1RSRUFNX0VSUk9SKTsKKyAgICB9CisgICAgKmVycm51bSA9IHMtPnpfZXJyOworICAgIGlmICgqZXJybnVtID09IFpfT0spIHJldHVybiAoY29uc3QgY2hhciopIiI7CisKKyAgICBtID0gKGNoYXIqKSgqZXJybnVtID09IFpfRVJSTk8gPyB6c3RyZXJyb3IoZXJybm8pIDogcy0+c3RyZWFtLm1zZyk7CisKKyAgICBpZiAobSA9PSBOVUxMIHx8ICptID09ICdcMCcpIG0gPSAoY2hhciopRVJSX01TRyhzLT56X2Vycik7CisKKyAgICBUUllGUkVFKHMtPm1zZyk7CisgICAgcy0+bXNnID0gKGNoYXIqKUFMTE9DKHN0cmxlbihzLT5wYXRoKSArIHN0cmxlbihtKSArIDMpOworICAgIGlmIChzLT5tc2cgPT0gWl9OVUxMKSByZXR1cm4gKGNvbnN0IGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOworICAgIHN0cmNweShzLT5tc2csIHMtPnBhdGgpOworICAgIHN0cmNhdChzLT5tc2csICI6ICIpOworICAgIHN0cmNhdChzLT5tc2csIG0pOworICAgIHJldHVybiAoY29uc3QgY2hhciopcy0+bXNnOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgQ2xlYXIgdGhlIGVycm9yIGFuZCBlbmQtb2YtZmlsZSBmbGFncywgYW5kIGRvIHRoZSBzYW1lIGZvciB0aGUgcmVhbCBmaWxlLgorKi8KK3ZvaWQgWkVYUE9SVCBnemNsZWFyZXJyIChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMKSByZXR1cm47CisgICAgaWYgKHMtPnpfZXJyICE9IFpfU1RSRUFNX0VORCkgcy0+el9lcnIgPSBaX09LOworICAgIHMtPnpfZW9mID0gMDsKKyAgICAvKiBrbGliYyBoYWNrICovCisgICAgLyogY2xlYXJlcnIocy0+ZmlsZSk7ICovCit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9pbmZiYWNrLmMgYi91c3Iva2xpYmMvemxpYi9pbmZiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1ZGJjOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2luZmJhY2suYwpAQCAtMCwwICsxLDYyMyBAQAorLyogaW5mYmFjay5jIC0tIGluZmxhdGUgdXNpbmcgYSBjYWxsLWJhY2sgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAgIFRoaXMgY29kZSBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIGluZmxhdGUuYy4gIE5vcm1hbGx5IGVpdGhlciBpbmZiYWNrLm8gb3IKKyAgIGluZmxhdGUubyB3b3VsZCBiZSBsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbi0tbm90IGJvdGguICBUaGUgaW50ZXJmYWNlCisgICB3aXRoIGluZmZhc3QuYyBpcyByZXRhaW5lZCBzbyB0aGF0IG9wdGltaXplZCBhc3NlbWJsZXItY29kZWQgdmVyc2lvbnMgb2YKKyAgIGluZmxhdGVfZmFzdCgpIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIGluZmxhdGUuYyBvciBpbmZiYWNrLmMuCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7CisKKy8qCisgICBzdHJtIHByb3ZpZGVzIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbiB6YWxsb2MgYW5kIHpmcmVlLCBvcgorICAgWl9OVUxMIHRvIHVzZSB0aGUgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgIHdpbmRvd0JpdHMgaXMgaW4gdGhlIHJhbmdlIDguLjE1LCBhbmQgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZAorICAgd2luZG93IGFuZCBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgMioqd2luZG93Qml0cyBieXRlcy4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyhzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3csIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07CitpbnQgd2luZG93Qml0czsKK3Vuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCisgICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHdpbmRvdyA9PSBaX05VTEwgfHwKKyAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOworICAgIHN0YXRlLT5kbWF4ID0gMzI3NjhVOworICAgIHN0YXRlLT53Yml0cyA9IHdpbmRvd0JpdHM7CisgICAgc3RhdGUtPndzaXplID0gMVUgPDwgd2luZG93Qml0czsKKyAgICBzdGF0ZS0+d2luZG93ID0gd2luZG93OworICAgIHN0YXRlLT53cml0ZSA9IDA7CisgICAgc3RhdGUtPndoYXZlID0gMDsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG8KKyAgIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC4KKyAgIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGUKKyAgIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmQKKyAgIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluCisgICBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmUKKyAgIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW4KKyAgIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuCisgKi8KK2xvY2FsIHZvaWQgZml4ZWR0YWJsZXMoc3RhdGUpCitzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworeworI2lmZGVmIEJVSUxERklYRUQKKyAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7CisgICAgc3RhdGljIGNvZGUgKmxlbmZpeCwgKmRpc3RmaXg7CisgICAgc3RhdGljIGNvZGUgZml4ZWRbNTQ0XTsKKworICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCisgICAgaWYgKHZpcmdpbikgeworICAgICAgICB1bnNpZ25lZCBzeW0sIGJpdHM7CisgICAgICAgIHN0YXRpYyBjb2RlICpuZXh0OworCisgICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDk7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDc7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIG5leHQgPSBmaXhlZDsKKyAgICAgICAgbGVuZml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDk7CisgICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAzMikgc3RhdGUtPmxlbnNbc3ltKytdID0gNTsKKyAgICAgICAgZGlzdGZpeCA9IG5leHQ7CisgICAgICAgIGJpdHMgPSA1OworICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKKworICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLworICAgICAgICB2aXJnaW4gPSAwOworICAgIH0KKyNlbHNlIC8qICFCVUlMREZJWEVEICovCisjICAgaW5jbHVkZSAiaW5mZml4ZWQuaCIKKyNlbmRpZiAvKiBCVUlMREZJWEVEICovCisgICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7CisgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7CisgICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKK30KKworLyogTWFjcm9zIGZvciBpbmZsYXRlQmFjaygpOiAqLworCisvKiBMb2FkIHJldHVybmVkIHN0YXRlIGZyb20gaW5mbGF0ZV9mYXN0KCkgKi8KKyNkZWZpbmUgTE9BRCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKKyAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAorICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAorICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKKyAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCisgICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFNldCBzdGF0ZSBmcm9tIHJlZ2lzdGVycyBmb3IgaW5mbGF0ZV9mYXN0KCkgKi8KKyNkZWZpbmUgUkVTVE9SRSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBwdXQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVmdDsgXAorICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7IFwKKyAgICAgICAgc3RhdGUtPmhvbGQgPSBob2xkOyBcCisgICAgICAgIHN0YXRlLT5iaXRzID0gYml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgSU5JVEJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPSAwOyBcCisgICAgICAgIGJpdHMgPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUuICBJZiBpbnB1dCBpcyByZXF1ZXN0ZWQsIGJ1dCBkZW5pZWQsCisgICB0aGVuIHJldHVybiBhIFpfQlVGX0VSUk9SIGZyb20gaW5mbGF0ZUJhY2soKS4gKi8KKyNkZWZpbmUgUFVMTCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGhhdmUgPT0gMCkgeyBcCisgICAgICAgICAgICBoYXZlID0gaW4oaW5fZGVzYywgJm5leHQpOyBcCisgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKKyAgICAgICAgICAgICAgICBuZXh0ID0gWl9OVUxMOyBcCisgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKKyAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpCisgICB3aXRoIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIFBVTEwoKTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGgKKyAgIGFuIGVycm9yLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKKyAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKKyAgIFpfQlVGX0VSUk9SLiAqLworI2RlZmluZSBST09NKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKKyAgICAgICAgICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7IFwKKyAgICAgICAgICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7IFwKKyAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IGxlZnQ7IFwKKyAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHB1dCwgbGVmdCkpIHsgXAorICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCisgICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisvKgorICAgc3RybSBwcm92aWRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCB3aW5kb3cgYnVmZmVyIG9uIGlucHV0LAorICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSB1bnVzZWQgaW5wdXQgb24gcmV0dXJuLiAgRm9yIFpfREFUQV9FUlJPUgorICAgcmV0dXJucywgc3RybSB3aWxsIGFsc28gcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLgorCisgICBpbigpIGFuZCBvdXQoKSBhcmUgdGhlIGNhbGwtYmFjayBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucy4gIFdoZW4KKyAgIGluZmxhdGVCYWNrKCkgbmVlZHMgbW9yZSBpbnB1dCwgaXQgY2FsbHMgaW4oKS4gIFdoZW4gaW5mbGF0ZUJhY2soKSBoYXMKKyAgIGZpbGxlZCB0aGUgd2luZG93IHdpdGggb3V0cHV0LCBvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGRhdGEgaW4gdGhlCisgICB3aW5kb3csIGl0IGNhbGxzIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAorICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCisgICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKKyAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCisgICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKKyAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCisgICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgorCisgICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgorICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCisgICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAorICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQorICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAorICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KKyAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbl9kZXNjLCBvdXQsIG91dF9kZXNjKQorel9zdHJlYW1wIHN0cm07Citpbl9mdW5jIGluOwordm9pZCBGQVIgKmluX2Rlc2M7CitvdXRfZnVuYyBvdXQ7Cit2b2lkIEZBUiAqb3V0X2Rlc2M7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbmV4dDsgICAgLyogbmV4dCBpbnB1dCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpwdXQ7ICAgICAvKiBuZXh0IG91dHB1dCAqLworICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCisgICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KKyAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCisgICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIHN0cm0gZXhpc3RzIGFuZCB0aGF0IHRoZSBzdGF0ZSB3YXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisKKyAgICAvKiBSZXNldCB0aGUgc3RhdGUgKi8KKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgIHN0YXRlLT5sYXN0ID0gMDsKKyAgICBzdGF0ZS0+d2hhdmUgPSAwOworICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOworICAgIGhhdmUgPSBuZXh0ICE9IFpfTlVMTCA/IHN0cm0tPmF2YWlsX2luIDogMDsKKyAgICBob2xkID0gMDsKKyAgICBiaXRzID0gMDsKKyAgICBwdXQgPSBzdGF0ZS0+d2luZG93OworICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7CisKKyAgICAvKiBJbmZsYXRlIHVudGlsIGVuZCBvZiBibG9jayBtYXJrZWQgYXMgbGFzdCAqLworICAgIGZvciAoOzspCisgICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGFuZCBkaXNwYXRjaCBibG9jayB0eXBlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICBCWVRFQklUUygpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRE9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsgICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRBQkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYmxvY2sgdHlwZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RPUkVEOgorICAgICAgICAgICAgLyogZ2V0IGFuZCB2ZXJpZnkgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLworICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOworICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7CisgICAgICAgICAgICBJTklUQklUUygpOworCisgICAgICAgICAgICAvKiBjb3B5IHN0b3JlZCBibG9jayBmcm9tIGlucHV0IHRvIG91dHB1dCAqLworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIFBVTEwoKTsKKyAgICAgICAgICAgICAgICBST09NKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVEFCTEU6CisgICAgICAgICAgICAvKiBnZXQgZHluYW1pYyB0YWJsZSBlbnRyaWVzIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKKyAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OworICAgICAgICAgICAgRFJPUEJJVFMoNCk7CisjaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKKworICAgICAgICAgICAgLyogZ2V0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAobm90IGEgdHlwbykgKi8KKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOworICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA3OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUtPmxlbnMsIDE5LCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKKworICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IHRoaXMudmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsID09IDE3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgc3RhdGUtPm5sZW4sICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmRpc3RiaXRzID0gNjsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zICsgc3RhdGUtPm5sZW4sIHN0YXRlLT5uZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5uZXh0KSwgJihzdGF0ZS0+ZGlzdGJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZXMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworCisgICAgICAgIGNhc2UgTEVOOgorICAgICAgICAgICAgLyogdXNlIGluZmxhdGVfZmFzdCgpIGlmIHdlIGhhdmUgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKKyAgICAgICAgICAgICAgICBSRVNUT1JFKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplIC0gbGVmdDsKKyAgICAgICAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhdGUtPndzaXplKTsKKyAgICAgICAgICAgICAgICBMT0FEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGdldCBhIGxpdGVyYWwsIGxlbmd0aCwgb3IgZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYmICh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKXRoaXMudmFsOworCisgICAgICAgICAgICAvKiBwcm9jZXNzIGxpdGVyYWwgKi8KKyAgICAgICAgICAgIGlmICh0aGlzLm9wID09IDApIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHRoaXMudmFsID49IDB4MjAgJiYgdGhpcy52YWwgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgdGhpcy52YWwpKTsKKyAgICAgICAgICAgICAgICBST09NKCk7CisgICAgICAgICAgICAgICAgKnB1dCsrID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlLT5sZW5ndGgpOworICAgICAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcHJvY2VzcyBlbmQgb2YgYmxvY2sgKi8KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgMzIpIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlICovCisgICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbGVuZ3RoIGNvZGUgLS0gZ2V0IGV4dHJhIGJpdHMsIGlmIGFueSAqLworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcbiIsIHN0YXRlLT5sZW5ndGgpKTsKKworICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKXRoaXMudmFsOworCisgICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgZXh0cmEgYml0cywgaWYgYW55ICovCisgICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKHRoaXMub3ApICYgMTU7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5vZmZzZXQgKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IHN0YXRlLT53c2l6ZSAtIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA6IDApKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgc3RhdGUtPm9mZnNldCkpOworCisgICAgICAgICAgICAvKiBjb3B5IG1hdGNoIGZyb20gd2luZG93IHRvIG91dHB1dCAqLworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPm9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA8IGxlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCArIGNvcHk7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0IC0gY29weTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+bGVuZ3RoKSBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgKnB1dCsrID0gKmZyb20rKzsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgfSB3aGlsZSAoc3RhdGUtPmxlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRE9ORToKKyAgICAgICAgICAgIC8qIGluZmxhdGUgc3RyZWFtIHRlcm1pbmF0ZWQgcHJvcGVybHkgLS0gd3JpdGUgbGVmdG92ZXIgb3V0cHV0ICovCisgICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7CisgICAgICAgICAgICBpZiAobGVmdCA8IHN0YXRlLT53c2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHN0YXRlLT53aW5kb3csIHN0YXRlLT53c2l6ZSAtIGxlZnQpKQorICAgICAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworCisgICAgICAgIGNhc2UgQkFEOgorICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogY2FuJ3QgaGFwcGVuLCBidXQgbWFrZXMgY29tcGlsZXJzIGhhcHB5ICovCisgICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICB9CisKKyAgICAvKiBSZXR1cm4gdW51c2VkIGlucHV0ICovCisgIGluZl9sZWF2ZToKKyAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsKKyAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tFbmQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9pbmZmYXN0LmMgYi91c3Iva2xpYmMvemxpYi9pbmZmYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlZTkyZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2luZmZhc3QuYwpAQCAtMCwwICsxLDMxOCBAQAorLyogaW5mZmFzdC5jIC0tIGZhc3QgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCisKKyNpZm5kZWYgQVNNSU5GCisKKy8qIEFsbG93IG1hY2hpbmUgZGVwZW5kZW50IG9wdGltaXphdGlvbiBmb3IgcG9zdC1pbmNyZW1lbnQgb3IgcHJlLWluY3JlbWVudC4KKyAgIEJhc2VkIG9uIHRlc3RpbmcgdG8gZGF0ZSwKKyAgIFByZS1pbmNyZW1lbnQgcHJlZmVycmVkIGZvcjoKKyAgIC0gUG93ZXJQQyBHMyAoQWRsZXIpCisgICAtIE1JUFMgUjUwMDAgKFJhbmRlcnMtUGVocnNvbikKKyAgIFBvc3QtaW5jcmVtZW50IHByZWZlcnJlZCBmb3I6CisgICAtIG5vbmUKKyAgIE5vIG1lYXN1cmFibGUgZGlmZmVyZW5jZToKKyAgIC0gUGVudGl1bSBJSUkgKEFuZGVyc29uKQorICAgLSBNNjgwNjAgKE5pa2wpCisgKi8KKyNpZmRlZiBQT1NUSU5DCisjICBkZWZpbmUgT0ZGIDAKKyMgIGRlZmluZSBQVVAoYSkgKihhKSsrCisjZWxzZQorIyAgZGVmaW5lIE9GRiAxCisjICBkZWZpbmUgUFVQKGEpICorKyhhKQorI2VuZGlmCisKKy8qCisgICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nCisgICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMKKyAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yCisgICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlCisgICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS4KKworICAgRW50cnkgYXNzdW1wdGlvbnM6CisKKyAgICAgICAgc3RhdGUtPm1vZGUgPT0gTEVOCisgICAgICAgIHN0cm0tPmF2YWlsX2luID49IDYKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID49IDI1OAorICAgICAgICBzdGFydCA+PSBzdHJtLT5hdmFpbF9vdXQKKyAgICAgICAgc3RhdGUtPmJpdHMgPCA4CisKKyAgIE9uIHJldHVybiwgc3RhdGUtPm1vZGUgaXMgb25lIG9mOgorCisgICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dAorICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9jaworICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YQorCisgICBOb3RlczoKKworICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlCisgICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSwKKyAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuCisgICAgICBUaGVyZWZvcmUgaWYgc3RybS0+YXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWQKKyAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuCisKKyAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNTgKKyAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKQorICAgICAgcmVxdWlyZXMgc3RybS0+YXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvcgorICAgICAgb3V0cHV0IHNwYWNlLgorICovCit2b2lkIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY2hhciBGQVIgKmluOyAgICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbGFzdDsgICAgLyogd2hpbGUgaW4gPCBsYXN0LCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKm91dDsgICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmJlZzsgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS0+bmV4dF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZW5kOyAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovCisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICB1bnNpZ25lZCBkbWF4OyAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovCisjZW5kaWYKKyAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2hhdmU7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBsb2NhbCBzdHJtLT5ob2xkICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0tPmJpdHMgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqbGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+bGVuY29kZSAqLworICAgIGNvZGUgY29uc3QgRkFSICpkY29kZTsgICAgICAvKiBsb2NhbCBzdHJtLT5kaXN0Y29kZSAqLworICAgIHVuc2lnbmVkIGxtYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi8KKyAgICB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgb3A7ICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqLworICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi8KKworICAgIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaW4gPSBzdHJtLT5uZXh0X2luIC0gT0ZGOworICAgIGxhc3QgPSBpbiArIChzdHJtLT5hdmFpbF9pbiAtIDUpOworICAgIG91dCA9IHN0cm0tPm5leHRfb3V0IC0gT0ZGOworICAgIGJlZyA9IG91dCAtIChzdGFydCAtIHN0cm0tPmF2YWlsX291dCk7CisgICAgZW5kID0gb3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIDI1Nyk7CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICBkbWF4ID0gc3RhdGUtPmRtYXg7CisjZW5kaWYKKyAgICB3c2l6ZSA9IHN0YXRlLT53c2l6ZTsKKyAgICB3aGF2ZSA9IHN0YXRlLT53aGF2ZTsKKyAgICB3cml0ZSA9IHN0YXRlLT53cml0ZTsKKyAgICB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OworICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsKKyAgICBiaXRzID0gc3RhdGUtPmJpdHM7CisgICAgbGNvZGUgPSBzdGF0ZS0+bGVuY29kZTsKKyAgICBkY29kZSA9IHN0YXRlLT5kaXN0Y29kZTsKKyAgICBsbWFzayA9ICgxVSA8PCBzdGF0ZS0+bGVuYml0cykgLSAxOworICAgIGRtYXNrID0gKDFVIDw8IHN0YXRlLT5kaXN0Yml0cykgLSAxOworCisgICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoCisgICAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi8KKyAgICBkbyB7CisgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICB9CisgICAgICAgIHRoaXMgPSBsY29kZVtob2xkICYgbG1hc2tdOworICAgICAgZG9sZW46CisgICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLmJpdHMpOworICAgICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMub3ApOworICAgICAgICBpZiAob3AgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCB0aGlzLnZhbCA+PSAweDIwICYmIHRoaXMudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCB0aGlzLnZhbCkpOworICAgICAgICAgICAgUFVQKG91dCkgPSAodW5zaWduZWQgY2hhcikodGhpcy52YWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqLworICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKSh0aGlzLnZhbCk7CisgICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgaWYgKG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgeworICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbiArPSAodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBsZW4pKTsKKyAgICAgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMgPSBkY29kZVtob2xkICYgZG1hc2tdOworICAgICAgICAgIGRvZGlzdDoKKyAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLmJpdHMpOworICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICBiaXRzIC09IG9wOworICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMub3ApOworICAgICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqLworICAgICAgICAgICAgICAgIGRpc3QgPSAodW5zaWduZWQpKHRoaXMudmFsKTsKKyAgICAgICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovCisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgeworICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzdCArPSAodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBkaXN0KSk7CisgICAgICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKG91dCAtIGJlZyk7ICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdyAtIE9GRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlID09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3cml0ZSA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wIC09IHdyaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gd2luZG93IC0gT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZSA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHdyaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3JpdGUgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgICAgICB0aGlzID0gZGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmICgoMVUgPDwgb3ApIC0gMSkpXTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvZGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgdGhpcyA9IGxjb2RlW3RoaXMudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07CisgICAgICAgICAgICBnb3RvIGRvbGVuOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCk7CisKKyAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi8KKyAgICBsZW4gPSBiaXRzID4+IDM7CisgICAgaW4gLT0gbGVuOworICAgIGJpdHMgLT0gbGVuIDw8IDM7CisgICAgaG9sZCAmPSAoMVUgPDwgYml0cykgLSAxOworCisgICAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi8KKyAgICBzdHJtLT5uZXh0X2luID0gaW4gKyBPRkY7CisgICAgc3RybS0+bmV4dF9vdXQgPSBvdXQgKyBPRkY7CisgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpKGluIDwgbGFzdCA/IDUgKyAobGFzdCAtIGluKSA6IDUgLSAoaW4gLSBsYXN0KSk7CisgICAgc3RybS0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkKShvdXQgPCBlbmQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU3ICsgKGVuZCAtIG91dCkgOiAyNTcgLSAob3V0IC0gZW5kKSk7CisgICAgc3RhdGUtPmhvbGQgPSBob2xkOworICAgIHN0YXRlLT5iaXRzID0gYml0czsKKyAgICByZXR1cm47Cit9CisKKy8qCisgICBpbmZsYXRlX2Zhc3QoKSBzcGVlZHVwcyB0aGF0IHR1cm5lZCBvdXQgc2xvd2VyIChvbiBhIFBvd2VyUEMgRzMgNzUwQ1hlKToKKyAgIC0gVXNpbmcgYml0IGZpZWxkcyBmb3IgY29kZSBzdHJ1Y3R1cmUKKyAgIC0gRGlmZmVyZW50IG9wIGRlZmluaXRpb24gdG8gYXZvaWQgJiBmb3IgZXh0cmEgYml0cyAoZG8gJiBmb3IgdGFibGUgYml0cykKKyAgIC0gVGhyZWUgc2VwYXJhdGUgZGVjb2RpbmcgZG8tbG9vcHMgZm9yIGRpcmVjdCwgd2luZG93LCBhbmQgd3JpdGUgPT0gMAorICAgLSBTcGVjaWFsIGNhc2UgZm9yIGRpc3RhbmNlID4gMSBjb3BpZXMgdG8gZG8gb3ZlcmxhcHBlZCBsb2FkIGFuZCBzdG9yZSBjb3B5CisgICAtIEV4cGxpY2l0IGJyYW5jaCBwcmVkaWN0aW9ucyAoYmFzZWQgb24gbWVhc3VyZWQgYnJhbmNoIHByb2JhYmlsaXRpZXMpCisgICAtIERlZmVycmluZyBtYXRjaCBjb3B5IGFuZCBpbnRlcnNwZXJzZWQgaXQgd2l0aCBkZWNvZGluZyBzdWJzZXF1ZW50IGNvZGVzCisgICAtIFN3YXBwaW5nIGxpdGVyYWwvbGVuZ3RoIGVsc2UKKyAgIC0gU3dhcHBpbmcgd2luZG93L2RpcmVjdCBlbHNlCisgICAtIExhcmdlciB1bnJvbGxlZCBjb3B5IGxvb3BzICh0aHJlZSBpcyBhYm91dCByaWdodCkKKyAgIC0gTW92aW5nIGxlbiAtPSAzIHN0YXRlbWVudCBpbnRvIG1pZGRsZSBvZiBsb29wCisgKi8KKworI2VuZGlmIC8qICFBU01JTkYgKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZmZhc3QuaCBiL3Vzci9rbGliYy96bGliL2luZmZhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTg4ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvaW5mZmFzdC5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qIGluZmZhc3QuaCAtLSBoZWFkZXIgdG8gdXNlIGluZmZhc3QuYworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCit2b2lkIGluZmxhdGVfZmFzdCBPRigoel9zdHJlYW1wIHN0cm0sIHVuc2lnbmVkIHN0YXJ0KSk7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9pbmZmaXhlZC5oIGIvdXNyL2tsaWJjL3psaWIvaW5mZml4ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVkNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvaW5mZml4ZWQuaApAQCAtMCwwICsxLDk0IEBACisgICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMKKyAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4KKyAgICAgKi8KKworICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0CisgICAgICAgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kCisgICAgICAgaXMgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICAgICAqLworCisgICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WzUxMl0gPSB7CisgICAgICAgIHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSwKKyAgICAgICAgezAsOSwxOTJ9LHsxNiw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MH0sezAsOCwwfSx7MCw4LDEyOH0sCisgICAgICAgIHswLDgsNjR9LHswLDksMjI0fSx7MTYsNyw2fSx7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NH0sezE5LDcsNTl9LAorICAgICAgICB7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDh9LHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzZ9LAorICAgICAgICB7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSx7MCw5LDI0MH0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sCisgICAgICAgIHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSx7MCw4LDUyfSx7MCw5LDIwMH0sezE3LDcsMTN9LHswLDgsMTAwfSwKKyAgICAgICAgezAsOCwzNn0sezAsOSwxNjh9LHswLDgsNH0sezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMyfSx7MTYsNyw4fSwKKyAgICAgICAgezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTJ9LHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTZ9LAorICAgICAgICB7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LHswLDksMTg0fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sCisgICAgICAgIHswLDksMjQ4fSx7MTYsNywzfSx7MCw4LDgyfSx7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sCisgICAgICAgIHswLDgsNTB9LHswLDksMTk2fSx7MTcsNywxMX0sezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjR9LHswLDgsMn0sCisgICAgICAgIHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOH0sezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDh9LAorICAgICAgICB7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LHswLDksMjEyfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LAorICAgICAgICB7MCw5LDE4MH0sezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ0fSx7MTYsNyw1fSx7MCw4LDg2fSwKKyAgICAgICAgezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNH0sezE3LDcsMTV9LAorICAgICAgICB7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzJ9LHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM2fSwKKyAgICAgICAgezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sezAsOSwxNTZ9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sCisgICAgICAgIHswLDksMjIwfSx7MTgsNywyN30sezAsOCwxMTB9LHswLDgsNDZ9LHswLDksMTg4fSx7MCw4LDE0fSx7MCw4LDE0Mn0sCisgICAgICAgIHswLDgsNzh9LHswLDksMjUyfSx7OTYsNywwfSx7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSwKKyAgICAgICAgezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk0fSx7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjJ9LAorICAgICAgICB7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSx7MCw5LDIyNn0sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sCisgICAgICAgIHswLDksMTQ2fSx7MTksNyw1OX0sezAsOCwxMjF9LHswLDgsNTd9LHswLDksMjEwfSx7MTcsNywxN30sezAsOCwxMDV9LAorICAgICAgICB7MCw4LDQxfSx7MCw5LDE3OH0sezAsOCw5fSx7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDJ9LHsxNiw3LDR9LAorICAgICAgICB7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDJ9LAorICAgICAgICB7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LHswLDksMTcwfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSwKKyAgICAgICAgezAsOSwyMzR9LHsxNiw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU0fSx7MjAsNyw4M30sezAsOCwxMjV9LAorICAgICAgICB7MCw4LDYxfSx7MCw5LDIxOH0sezE4LDcsMjN9LHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4Nn0sezAsOCwxM30sCisgICAgICAgIHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MH0sezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSwKKyAgICAgICAgezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSx7MCw5LDE5OH0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LAorICAgICAgICB7MCw5LDE2Nn0sezAsOCwzfSx7MCw4LDEzMX0sezAsOCw2N30sezAsOSwyMzB9LHsxNiw3LDd9LHswLDgsOTF9LAorICAgICAgICB7MCw4LDI3fSx7MCw5LDE1MH0sezIwLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNH0sezE4LDcsMTl9LAorICAgICAgICB7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODJ9LHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0Nn0sCisgICAgICAgIHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sCisgICAgICAgIHswLDksMjA2fSx7MTcsNywxNX0sezAsOCwxMDN9LHswLDgsMzl9LHswLDksMTc0fSx7MCw4LDd9LHswLDgsMTM1fSwKKyAgICAgICAgezAsOCw3MX0sezAsOSwyMzh9LHsxNiw3LDl9LHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU4fSx7MjAsNyw5OX0sCisgICAgICAgIHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyMn0sezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MH0sCisgICAgICAgIHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSx7MCw5LDI1NH0sezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sCisgICAgICAgIHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSx7MCw5LDE5M30sezE2LDcsMTB9LHswLDgsOTZ9LAorICAgICAgICB7MCw4LDMyfSx7MCw5LDE2MX0sezAsOCwwfSx7MCw4LDEyOH0sezAsOCw2NH0sezAsOSwyMjV9LHsxNiw3LDZ9LAorICAgICAgICB7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NX0sezE5LDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOX0sCisgICAgICAgIHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzd9LHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LAorICAgICAgICB7MCw5LDI0MX0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LAorICAgICAgICB7MCw4LDUyfSx7MCw5LDIwMX0sezE3LDcsMTN9LHswLDgsMTAwfSx7MCw4LDM2fSx7MCw5LDE2OX0sezAsOCw0fSwKKyAgICAgICAgezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMzfSx7MTYsNyw4fSx7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1M30sCisgICAgICAgIHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTd9LHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sCisgICAgICAgIHswLDksMTg1fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sezAsOSwyNDl9LHsxNiw3LDN9LHswLDgsODJ9LAorICAgICAgICB7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTd9LHsxNyw3LDExfSwKKyAgICAgICAgezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjV9LHswLDgsMn0sezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI5fSwKKyAgICAgICAgezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDl9LHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sCisgICAgICAgIHswLDksMjEzfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LHswLDksMTgxfSx7MCw4LDEwfSx7MCw4LDEzOH0sCisgICAgICAgIHswLDgsNzR9LHswLDksMjQ1fSx7MTYsNyw1fSx7MCw4LDg2fSx7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sCisgICAgICAgIHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNX0sezE3LDcsMTV9LHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3M30sCisgICAgICAgIHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM3fSx7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSwKKyAgICAgICAgezAsOSwxNTd9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjF9LHsxOCw3LDI3fSx7MCw4LDExMH0sCisgICAgICAgIHswLDgsNDZ9LHswLDksMTg5fSx7MCw4LDE0fSx7MCw4LDE0Mn0sezAsOCw3OH0sezAsOSwyNTN9LHs5Niw3LDB9LAorICAgICAgICB7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSx7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTV9LAorICAgICAgICB7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjN9LHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LAorICAgICAgICB7MCw5LDIyN30sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sezAsOSwxNDd9LHsxOSw3LDU5fSx7MCw4LDEyMX0sCisgICAgICAgIHswLDgsNTd9LHswLDksMjExfSx7MTcsNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc5fSx7MCw4LDl9LAorICAgICAgICB7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDN9LHsxNiw3LDR9LHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sCisgICAgICAgIHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDN9LHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sCisgICAgICAgIHswLDksMTcxfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSx7MCw5LDIzNX0sezE2LDcsOH0sezAsOCw5M30sCisgICAgICAgIHswLDgsMjl9LHswLDksMTU1fSx7MjAsNyw4M30sezAsOCwxMjV9LHswLDgsNjF9LHswLDksMjE5fSx7MTgsNywyM30sCisgICAgICAgIHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4N30sezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUxfSwKKyAgICAgICAgezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSx7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LAorICAgICAgICB7MCw5LDE5OX0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY3fSx7MCw4LDN9LHswLDgsMTMxfSwKKyAgICAgICAgezAsOCw2N30sezAsOSwyMzF9LHsxNiw3LDd9LHswLDgsOTF9LHswLDgsMjd9LHswLDksMTUxfSx7MjAsNyw2N30sCisgICAgICAgIHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNX0sezE4LDcsMTl9LHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4M30sCisgICAgICAgIHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0N30sezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sCisgICAgICAgIHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sezAsOSwyMDd9LHsxNyw3LDE1fSx7MCw4LDEwM30sCisgICAgICAgIHswLDgsMzl9LHswLDksMTc1fSx7MCw4LDd9LHswLDgsMTM1fSx7MCw4LDcxfSx7MCw5LDIzOX0sezE2LDcsOX0sCisgICAgICAgIHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU5fSx7MjAsNyw5OX0sezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIzfSwKKyAgICAgICAgezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MX0sezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LAorICAgICAgICB7MCw5LDI1NX0KKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFszMl0gPSB7CisgICAgICAgIHsxNiw1LDF9LHsyMyw1LDI1N30sezE5LDUsMTd9LHsyNyw1LDQwOTd9LHsxNyw1LDV9LHsyNSw1LDEwMjV9LAorICAgICAgICB7MjEsNSw2NX0sezI5LDUsMTYzODV9LHsxNiw1LDN9LHsyNCw1LDUxM30sezIwLDUsMzN9LHsyOCw1LDgxOTN9LAorICAgICAgICB7MTgsNSw5fSx7MjYsNSwyMDQ5fSx7MjIsNSwxMjl9LHs2NCw1LDB9LHsxNiw1LDJ9LHsyMyw1LDM4NX0sCisgICAgICAgIHsxOSw1LDI1fSx7MjcsNSw2MTQ1fSx7MTcsNSw3fSx7MjUsNSwxNTM3fSx7MjEsNSw5N30sezI5LDUsMjQ1Nzd9LAorICAgICAgICB7MTYsNSw0fSx7MjQsNSw3Njl9LHsyMCw1LDQ5fSx7MjgsNSwxMjI4OX0sezE4LDUsMTN9LHsyNiw1LDMwNzN9LAorICAgICAgICB7MjIsNSwxOTN9LHs2NCw1LDB9CisgICAgfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZmxhdGUuYyBiL3Vzci9rbGliYy96bGliL2luZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJmZGVlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvaW5mbGF0ZS5jCkBAIC0wLDAgKzEsMTM2OCBAQAorLyogaW5mbGF0ZS5jIC0tIHpsaWIgZGVjb21wcmVzc2lvbgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqCisgKiAxLjIuYmV0YTAgICAgMjQgTm92IDIwMDIKKyAqIC0gRmlyc3QgdmVyc2lvbiAtLSBjb21wbGV0ZSByZXdyaXRlIG9mIGluZmxhdGUgdG8gc2ltcGxpZnkgY29kZSwgYXZvaWQKKyAqICAgY3JlYXRpb24gb2Ygd2luZG93IHdoZW4gbm90IG5lZWRlZCwgbWluaW1pemUgdXNlIG9mIHdpbmRvdyB3aGVuIGl0IGlzCisgKiAgIG5lZWRlZCwgbWFrZSBpbmZmYXN0LmMgZXZlbiBmYXN0ZXIsIGltcGxlbWVudCBnemlwIGRlY29kaW5nLCBhbmQgdG8KKyAqICAgaW1wcm92ZSBjb2RlIHJlYWRhYmlsaXR5IGFuZCBzdHlsZSBvdmVyIHRoZSBwcmV2aW91cyB6bGliIGluZmxhdGUgY29kZQorICoKKyAqIDEuMi5iZXRhMSAgICAyNSBOb3YgMjAwMgorICogLSBVc2UgcG9pbnRlcnMgZm9yIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0IGNoZWNraW5nIGluIGluZmZhc3QuYworICogLSBSZW1vdmUgaW5wdXQgYW5kIG91dHB1dCBjb3VudGVycyBpbiBpbmZmYXN0LmMKKyAqIC0gQ2hhbmdlIGluZmZhc3QuYyBlbnRyeSBhbmQgbG9vcCBmcm9tIGF2YWlsX2luID49IDcgdG8gPj0gNgorICogLSBSZW1vdmUgdW5uZWNlc3Nhcnkgc2Vjb25kIGJ5dGUgcHVsbCBmcm9tIGxlbmd0aCBleHRyYSBpbiBpbmZmYXN0LmMKKyAqIC0gVW5yb2xsIGRpcmVjdCBjb3B5IHRvIHRocmVlIGNvcGllcyBwZXIgbG9vcCBpbiBpbmZmYXN0LmMKKyAqCisgKiAxLjIuYmV0YTIgICAgNCBEZWMgMjAwMgorICogLSBDaGFuZ2UgZXh0ZXJuYWwgcm91dGluZSBuYW1lcyB0byByZWR1Y2UgcG90ZW50aWFsIGNvbmZsaWN0cworICogLSBDb3JyZWN0IGZpbGVuYW1lIHRvIGluZmZpeGVkLmggZm9yIGZpeGVkIHRhYmxlcyBpbiBpbmZsYXRlLmMKKyAqIC0gTWFrZSBoYnVmW10gdW5zaWduZWQgY2hhciB0byBtYXRjaCBwYXJhbWV0ZXIgdHlwZSBpbiBpbmZsYXRlLmMKKyAqIC0gQ2hhbmdlIHN0cm0tPm5leHRfb3V0Wy1zdGF0ZS0+b2Zmc2V0XSB0byAqKHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPm9mZnNldCkKKyAqICAgdG8gYXZvaWQgbmVnYXRpb24gcHJvYmxlbSBvbiBBbHBoYXMgKDY0IGJpdCkgaW4gaW5mbGF0ZS5jCisgKgorICogMS4yLmJldGEzICAgIDIyIERlYyAyMDAyCisgKiAtIEFkZCBjb21tZW50cyBvbiBzdGF0ZS0+Yml0cyBhc3NlcnRpb24gaW4gaW5mZmFzdC5jCisgKiAtIEFkZCBjb21tZW50cyBvbiBvcCBmaWVsZCBpbiBpbmZ0cmVlcy5oCisgKiAtIEZpeCBidWcgaW4gcmV1c2Ugb2YgYWxsb2NhdGVkIHdpbmRvdyBhZnRlciBpbmZsYXRlUmVzZXQoKQorICogLSBSZW1vdmUgYml0IGZpZWxkcy0tYmFjayB0byBieXRlIHN0cnVjdHVyZSBmb3Igc3BlZWQKKyAqIC0gUmVtb3ZlIGRpc3RhbmNlIGV4dHJhID09IDAgY2hlY2sgaW4gaW5mbGF0ZV9mYXN0KCktLW9ubHkgaGVscHMgZm9yIGxlbmd0aHMKKyAqIC0gQ2hhbmdlIHBvc3QtaW5jcmVtZW50cyB0byBwcmUtaW5jcmVtZW50cyBpbiBpbmZsYXRlX2Zhc3QoKSwgUFBDIGJpYXNlZD8KKyAqIC0gQWRkIGNvbXBpbGUgdGltZSBvcHRpb24sIFBPU1RJTkMsIHRvIHVzZSBwb3N0LWluY3JlbWVudHMgaW5zdGVhZCAoSW50ZWw/KQorICogLSBNYWtlIE1BVENIIGNvcHkgaW4gaW5mbGF0ZSgpIG11Y2ggZmFzdGVyIGZvciB3aGVuIGluZmxhdGVfZmFzdCgpIG5vdCB1c2VkCisgKiAtIFVzZSBsb2NhbCBjb3BpZXMgb2Ygc3RyZWFtIG5leHQgYW5kIGF2YWlsIHZhbHVlcywgYXMgd2VsbCBhcyBsb2NhbCBiaXQKKyAqICAgYnVmZmVyIGFuZCBiaXQgY291bnQgaW4gaW5mbGF0ZSgpLS1mb3Igc3BlZWQgd2hlbiBpbmZsYXRlX2Zhc3QoKSBub3QgdXNlZAorICoKKyAqIDEuMi5iZXRhNCAgICAxIEphbiAyMDAzCisgKiAtIFNwbGl0IHB0ciAtIDI1NyBzdGF0ZW1lbnRzIGluIGluZmxhdGVfdGFibGUoKSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncworICogLSBNb3ZlIGEgY29tbWVudCBvbiBvdXRwdXQgYnVmZmVyIHNpemVzIGZyb20gaW5mZmFzdC5jIHRvIGluZmxhdGUuYworICogLSBBZGQgY29tbWVudHMgaW4gaW5mZmFzdC5jIHRvIGludHJvZHVjZSB0aGUgaW5mbGF0ZV9mYXN0KCkgcm91dGluZQorICogLSBSZWFycmFuZ2Ugd2luZG93IGNvcGllcyBpbiBpbmZsYXRlX2Zhc3QoKSBmb3Igc3BlZWQgYW5kIHNpbXBsaWZpY2F0aW9uCisgKiAtIFVucm9sbCBsYXN0IGNvcHkgZm9yIHdpbmRvdyBtYXRjaCBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBVc2UgbG9jYWwgY29waWVzIG9mIHdpbmRvdyB2YXJpYWJsZXMgaW4gaW5mbGF0ZV9mYXN0KCkgZm9yIHNwZWVkCisgKiAtIFB1bGwgb3V0IGNvbW1vbiB3cml0ZSA9PSAwIGNhc2UgZm9yIHNwZWVkIGluIGluZmxhdGVfZmFzdCgpCisgKiAtIE1ha2Ugb3AgYW5kIGxlbiBpbiBpbmZsYXRlX2Zhc3QoKSB1bnNpZ25lZCBmb3IgY29uc2lzdGVuY3kKKyAqIC0gQWRkIEZBUiB0byBsY29kZSBhbmQgZGNvZGUgZGVjbGFyYXRpb25zIGluIGluZmxhdGVfZmFzdCgpCisgKiAtIFNpbXBsaWZpZWQgYmFkIGRpc3RhbmNlIGNoZWNrIGluIGluZmxhdGVfZmFzdCgpCisgKiAtIEFkZGVkIGluZmxhdGVCYWNrSW5pdCgpLCBpbmZsYXRlQmFjaygpLCBhbmQgaW5mbGF0ZUJhY2tFbmQoKSBpbiBuZXcKKyAqICAgc291cmNlIGZpbGUgaW5mYmFjay5jIHRvIHByb3ZpZGUgYSBjYWxsLWJhY2sgaW50ZXJmYWNlIHRvIGluZmxhdGUgZm9yCisgKiAgIHByb2dyYW1zIGxpa2UgZ3ppcCBhbmQgdW56aXAgLS0gdXNlcyB3aW5kb3cgYXMgb3V0cHV0IGJ1ZmZlciB0byBhdm9pZAorICogICB3aW5kb3cgY29weWluZworICoKKyAqIDEuMi5iZXRhNSAgICAxIEphbiAyMDAzCisgKiAtIEltcHJvdmVkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gcHJvdmlkZSBpbml0aWFsCisgKiAgIGlucHV0IGluIHN0cm0uCisgKiAtIEZpeGVkIHN0b3JlZCBibG9ja3MgYnVnIGluIGluZmxhdGVCYWNrKCkKKyAqCisgKiAxLjIuYmV0YTYgICAgNCBKYW4gMjAwMworICogLSBBZGRlZCBjb21tZW50cyBpbiBpbmZmYXN0LmMgb24gZWZmZWN0aXZlbmVzcyBvZiBQT1NUSU5DCisgKiAtIFR5cGVjYXN0aW5nIGFsbCBhcm91bmQgdG8gcmVkdWNlIGNvbXBpbGVyIHdhcm5pbmdzCisgKiAtIENoYW5nZWQgbG9vcHMgZnJvbSB3aGlsZSAoMSkgb3IgZG8ge30gd2hpbGUgKDEpIHRvIGZvciAoOzspLCBhZ2FpbiB0bworICogICBtYWtlIGNvbXBpbGVycyBoYXBweQorICogLSBDaGFuZ2VkIHR5cGUgb2Ygd2luZG93IGluIGluZmxhdGVCYWNrSW5pdCgpIHRvIHVuc2lnbmVkIGNoYXIgKgorICoKKyAqIDEuMi5iZXRhNyAgICAyNyBKYW4gMjAwMworICogLSBDaGFuZ2VkIG1hbnkgdHlwZXMgdG8gdW5zaWduZWQgb3IgdW5zaWduZWQgc2hvcnQgdG8gYXZvaWQgd2FybmluZ3MKKyAqIC0gQWRkZWQgaW5mbGF0ZUNvcHkoKSBmdW5jdGlvbgorICoKKyAqIDEuMi4wICAgICAgICA5IE1hciAyMDAzCisgKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBpbnRlcmZhY2UgdG8gcHJvdmlkZSBzZXBhcmF0ZSBvcGFxdWUgZGVzY3JpcHRvcnMKKyAqICAgZm9yIHRoZSBpbigpIGFuZCBvdXQoKSBmdW5jdGlvbnMKKyAqIC0gQ2hhbmdlZCBpbmZsYXRlQmFjaygpIGFyZ3VtZW50IGFuZCBpbl9mdW5jIHR5cGVkZWYgdG8gc3dhcCB0aGUgbGVuZ3RoCisgKiAgIGFuZCBidWZmZXIgYWRkcmVzcyByZXR1cm4gdmFsdWVzIGZvciB0aGUgaW5wdXQgZnVuY3Rpb24KKyAqIC0gQ2hlY2sgbmV4dF9pbiBhbmQgbmV4dF9vdXQgZm9yIFpfTlVMTCBvbiBlbnRyeSB0byBpbmZsYXRlKCkKKyAqCisgKiBUaGUgaGlzdG9yeSBmb3IgdmVyc2lvbnMgYWZ0ZXIgMS4yLjAgYXJlIGluIENoYW5nZUxvZyBpbiB6bGliIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCisKKyNpZmRlZiBNQUtFRklYRUQKKyMgIGlmbmRlZiBCVUlMREZJWEVECisjICAgIGRlZmluZSBCVUlMREZJWEVECisjICBlbmRpZgorI2VuZGlmCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK2xvY2FsIHZvaWQgZml4ZWR0YWJsZXMgT0YoKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGUpKTsKK2xvY2FsIGludCB1cGRhdGV3aW5kb3cgT0YoKHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBvdXQpKTsKKyNpZmRlZiBCVUlMREZJWEVECisgICB2b2lkIG1ha2VmaXhlZCBPRigodm9pZCkpOworI2VuZGlmCitsb2NhbCB1bnNpZ25lZCBzeW5jc2VhcmNoIE9GKCh1bnNpZ25lZCBGQVIgKmhhdmUsIHVuc2lnbmVkIGNoYXIgRkFSICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsKKworaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0KHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIHN0cm0tPnRvdGFsX2luID0gc3RybS0+dG90YWxfb3V0ID0gc3RhdGUtPnRvdGFsID0gMDsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgc3RybS0+YWRsZXIgPSAxOyAgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqLworICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKKyAgICBzdGF0ZS0+bGFzdCA9IDA7CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKKyAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKKyAgICBzdGF0ZS0+aGVhZCA9IFpfTlVMTDsKKyAgICBzdGF0ZS0+d3NpemUgPSAwOworICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgc3RhdGUtPndyaXRlID0gMDsKKyAgICBzdGF0ZS0+aG9sZCA9IDA7CisgICAgc3RhdGUtPmJpdHMgPSAwOworICAgIHN0YXRlLT5sZW5jb2RlID0gc3RhdGUtPmRpc3Rjb2RlID0gc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOworICAgIHJldHVybiBaX09LOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUoc3RybSwgYml0cywgdmFsdWUpCit6X3N0cmVhbXAgc3RybTsKK2ludCBiaXRzOworaW50IHZhbHVlOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKGJpdHMgPiAxNiB8fCBzdGF0ZS0+Yml0cyArIGJpdHMgPiAzMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHZhbHVlICY9ICgxTCA8PCBiaXRzKSAtIDE7CisgICAgc3RhdGUtPmhvbGQgKz0gdmFsdWUgPDwgc3RhdGUtPmJpdHM7CisgICAgc3RhdGUtPmJpdHMgKz0gYml0czsKKyAgICByZXR1cm4gWl9PSzsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyhzdHJtLCB3aW5kb3dCaXRzLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKK3pfc3RyZWFtcCBzdHJtOworaW50IHdpbmRvd0JpdHM7Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCisgICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKKyAgICAgICAgICAgIFpBTExPQyhzdHJtLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopc3RhdGU7CisgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CisgICAgICAgIHN0YXRlLT53cmFwID0gMDsKKyAgICAgICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3RhdGUtPndyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDE7CisjaWZkZWYgR1VOWklQCisgICAgICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHdpbmRvd0JpdHMgJj0gMTU7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkgeworICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZSk7CisgICAgICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIHN0YXRlLT53Yml0cyA9ICh1bnNpZ25lZCl3aW5kb3dCaXRzOworICAgIHN0YXRlLT53aW5kb3cgPSBaX05VTEw7CisgICAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfKHN0cm0sIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIHJldHVybiBpbmZsYXRlSW5pdDJfKHN0cm0sIERFRl9XQklUUywgdmVyc2lvbiwgc3RyZWFtX3NpemUpOworfQorCisvKgorICAgUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bworICAgZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgorICAgSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQorICAgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZAorICAgdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KKyAgIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpbgorICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KKyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyhzdGF0ZSkKK3N0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Cit7CisjaWZkZWYgQlVJTERGSVhFRAorICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKKyAgICBzdGF0aWMgY29kZSAqbGVuZml4LCAqZGlzdGZpeDsKKyAgICBzdGF0aWMgY29kZSBmaXhlZFs1NDRdOworCisgICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KKyAgICBpZiAodmlyZ2luKSB7CisgICAgICAgIHVuc2lnbmVkIHN5bSwgYml0czsKKyAgICAgICAgc3RhdGljIGNvZGUgKm5leHQ7CisKKyAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUtPmxlbnNbc3ltKytdID0gOTsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgc3RhdGUtPmxlbnNbc3ltKytdID0gNzsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgbmV4dCA9IGZpeGVkOworICAgICAgICBsZW5maXggPSBuZXh0OworICAgICAgICBiaXRzID0gOTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA1OworICAgICAgICBkaXN0Zml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDU7CisgICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zLCAzMiwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCisgICAgICAgIHZpcmdpbiA9IDA7CisgICAgfQorI2Vsc2UgLyogIUJVSUxERklYRUQgKi8KKyMgICBpbmNsdWRlICJpbmZmaXhlZC5oIgorI2VuZGlmIC8qIEJVSUxERklYRUQgKi8KKyAgICBzdGF0ZS0+bGVuY29kZSA9IGxlbmZpeDsKKyAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgc3RhdGUtPmRpc3Rjb2RlID0gZGlzdGZpeDsKKyAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA1OworfQorCisjaWZkZWYgTUFLRUZJWEVECisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAgIFdyaXRlIG91dCB0aGUgaW5mZml4ZWQuaCB0aGF0IGlzICNpbmNsdWRlJ2QgYWJvdmUuICBEZWZpbmluZyBNQUtFRklYRUQgYWxzbworICAgZGVmaW5lcyBCVUlMREZJWEVELCBzbyB0aGUgdGFibGVzIGFyZSBidWlsdCBvbiB0aGUgZmx5LiAgbWFrZWZpeGVkKCkgd3JpdGVzCisgICB0aG9zZSB0YWJsZXMgdG8gc3Rkb3V0LCB3aGljaCB3b3VsZCBiZSBwaXBlZCB0byBpbmZmaXhlZC5oLiAgQSBzbWFsbCBwcm9ncmFtCisgICBjYW4gc2ltcGx5IGNhbGwgbWFrZWZpeGVkIHRvIGRvIHRoaXM6CisKKyAgICB2b2lkIG1ha2VmaXhlZCh2b2lkKTsKKworICAgIGludCBtYWluKHZvaWQpCisgICAgeworICAgICAgICBtYWtlZml4ZWQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBUaGVuIHRoYXQgY2FuIGJlIGxpbmtlZCB3aXRoIHpsaWIgYnVpbHQgd2l0aCBNQUtFRklYRUQgZGVmaW5lZCBhbmQgcnVuOgorCisgICAgYS5vdXQgPiBpbmZmaXhlZC5oCisgKi8KK3ZvaWQgbWFrZWZpeGVkKCkKK3sKKyAgICB1bnNpZ25lZCBsb3csIHNpemU7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgc3RhdGU7CisKKyAgICBmaXhlZHRhYmxlcygmc3RhdGUpOworICAgIHB1dHMoIiAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcyIpOworICAgIHB1dHMoIiAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4iKTsKKyAgICBwdXRzKCIgICAgICovIik7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIik7CisgICAgcHV0cygiICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMiKTsKKyAgICBwdXRzKCIgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOworICAgIHB1dHMoIiAgICAgKi8iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBzaXplID0gMVUgPDwgOTsKKyAgICBwcmludGYoIiAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbJXVdID0geyIsIHNpemUpOworICAgIGxvdyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKGxvdyAlIDcpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOworICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBzdGF0ZS5sZW5jb2RlW2xvd10ub3AsIHN0YXRlLmxlbmNvZGVbbG93XS5iaXRzLAorICAgICAgICAgICAgICAgc3RhdGUubGVuY29kZVtsb3ddLnZhbCk7CisgICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKKyAgICAgICAgcHV0Y2hhcignLCcpOworICAgIH0KKyAgICBwdXRzKCJcbiAgICB9OyIpOworICAgIHNpemUgPSAxVSA8PCA1OworICAgIHByaW50ZigiXG4gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFsldV0gPSB7Iiwgc2l6ZSk7CisgICAgbG93ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgobG93ICUgNikgPT0gMCkgcHJpbnRmKCJcbiAgICAgICAgIik7CisgICAgICAgIHByaW50ZigieyV1LCV1LCVkfSIsIHN0YXRlLmRpc3Rjb2RlW2xvd10ub3AsIHN0YXRlLmRpc3Rjb2RlW2xvd10uYml0cywKKyAgICAgICAgICAgICAgIHN0YXRlLmRpc3Rjb2RlW2xvd10udmFsKTsKKyAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOworICAgICAgICBwdXRjaGFyKCcsJyk7CisgICAgfQorICAgIHB1dHMoIlxuICAgIH07Iik7Cit9CisjZW5kaWYgLyogTUFLRUZJWEVEICovCisKKy8qCisgICBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlCisgICByZXR1cm5pbmcuICBJZiB3aW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LCBjcmVhdGUgaXQuICBUaGlzIGlzIG9ubHkgY2FsbGVkCisgICB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzCisgICBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuCisgICBJdCBpcyBhbHNvIGNhbGxlZCB0byBjcmVhdGUgYSB3aW5kb3cgZm9yIGRpY3Rpb25hcnkgZGF0YSB3aGVuIGEgZGljdGlvbmFyeQorICAgaXMgbG9hZGVkLgorCisgICBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkCisgICBhZHZhbnRhZ2UsIHNpbmNlIG9ubHkgdGhlIGxhc3QgMzJLIG9mIG91dHB1dCBpcyBjb3BpZWQgdG8gdGhlIHNsaWRpbmcgd2luZG93CisgICB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZgorICAgb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLgorICAgVGhlIGFkdmFudGFnZSBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlcy4KKyAqLworbG9jYWwgaW50IHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpCit6X3N0cmVhbXAgc3RybTsKK3Vuc2lnbmVkIG91dDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNvcHksIGRpc3Q7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aW5kb3cgKi8KKyAgICBpZiAoc3RhdGUtPndpbmRvdyA9PSBaX05VTEwpIHsKKyAgICAgICAgc3RhdGUtPndpbmRvdyA9ICh1bnNpZ25lZCBjaGFyIEZBUiAqKQorICAgICAgICAgICAgICAgICAgICAgICAgWkFMTE9DKHN0cm0sIDFVIDw8IHN0YXRlLT53Yml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgY2hhcikpOworICAgICAgICBpZiAoc3RhdGUtPndpbmRvdyA9PSBaX05VTEwpIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGlmIHdpbmRvdyBub3QgaW4gdXNlIHlldCwgaW5pdGlhbGl6ZSAqLworICAgIGlmIChzdGF0ZS0+d3NpemUgPT0gMCkgeworICAgICAgICBzdGF0ZS0+d3NpemUgPSAxVSA8PCBzdGF0ZS0+d2JpdHM7CisgICAgICAgIHN0YXRlLT53cml0ZSA9IDA7CisgICAgICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgfQorCisgICAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovCisgICAgY29weSA9IG91dCAtIHN0cm0tPmF2YWlsX291dDsKKyAgICBpZiAoY29weSA+PSBzdGF0ZS0+d3NpemUpIHsKKyAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93LCBzdHJtLT5uZXh0X291dCAtIHN0YXRlLT53c2l6ZSwgc3RhdGUtPndzaXplKTsKKyAgICAgICAgc3RhdGUtPndyaXRlID0gMDsKKyAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGlzdCA9IHN0YXRlLT53c2l6ZSAtIHN0YXRlLT53cml0ZTsKKyAgICAgICAgaWYgKGRpc3QgPiBjb3B5KSBkaXN0ID0gY29weTsKKyAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPndyaXRlLCBzdHJtLT5uZXh0X291dCAtIGNvcHksIGRpc3QpOworICAgICAgICBjb3B5IC09IGRpc3Q7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gY29weSwgY29weSk7CisgICAgICAgICAgICBzdGF0ZS0+d3JpdGUgPSBjb3B5OworICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhdGUtPndyaXRlICs9IGRpc3Q7CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyaXRlID09IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndyaXRlID0gMDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUpIHN0YXRlLT53aGF2ZSArPSBkaXN0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBNYWNyb3MgZm9yIGluZmxhdGUoKTogKi8KKworLyogY2hlY2sgZnVuY3Rpb24gdG8gdXNlIGFkbGVyMzIoKSBmb3IgemxpYiBvciBjcmMzMigpIGZvciBnemlwICovCisjaWZkZWYgR1VOWklQCisjICBkZWZpbmUgVVBEQVRFKGNoZWNrLCBidWYsIGxlbikgXAorICAgIChzdGF0ZS0+ZmxhZ3MgPyBjcmMzMihjaGVjaywgYnVmLCBsZW4pIDogYWRsZXIzMihjaGVjaywgYnVmLCBsZW4pKQorI2Vsc2UKKyMgIGRlZmluZSBVUERBVEUoY2hlY2ssIGJ1ZiwgbGVuKSBhZGxlcjMyKGNoZWNrLCBidWYsIGxlbikKKyNlbmRpZgorCisvKiBjaGVjayBtYWNyb3MgZm9yIGhlYWRlciBjcmMgKi8KKyNpZmRlZiBHVU5aSVAKKyMgIGRlZmluZSBDUkMyKGNoZWNrLCB3b3JkKSBcCisgICAgZG8geyBcCisgICAgICAgIGhidWZbMF0gPSAodW5zaWduZWQgY2hhcikod29yZCk7IFwKKyAgICAgICAgaGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gOCk7IFwKKyAgICAgICAgY2hlY2sgPSBjcmMzMihjaGVjaywgaGJ1ZiwgMik7IFwKKyAgICB9IHdoaWxlICgwKQorCisjICBkZWZpbmUgQ1JDNChjaGVjaywgd29yZCkgXAorICAgIGRvIHsgXAorICAgICAgICBoYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKHdvcmQpOyBcCisgICAgICAgIGhidWZbMV0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDgpOyBcCisgICAgICAgIGhidWZbMl0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDE2KTsgXAorICAgICAgICBoYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiAyNCk7IFwKKyAgICAgICAgY2hlY2sgPSBjcmMzMihjaGVjaywgaGJ1ZiwgNCk7IFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIExvYWQgcmVnaXN0ZXJzIHdpdGggc3RhdGUgaW4gaW5mbGF0ZSgpIGZvciBzcGVlZCAqLworI2RlZmluZSBMT0FEKCkgXAorICAgIGRvIHsgXAorICAgICAgICBwdXQgPSBzdHJtLT5uZXh0X291dDsgXAorICAgICAgICBsZWZ0ID0gc3RybS0+YXZhaWxfb3V0OyBcCisgICAgICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOyBcCisgICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9pbjsgXAorICAgICAgICBob2xkID0gc3RhdGUtPmhvbGQ7IFwKKyAgICAgICAgYml0cyA9IHN0YXRlLT5iaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmVzdG9yZSBzdGF0ZSBmcm9tIHJlZ2lzdGVycyBpbiBpbmZsYXRlKCkgKi8KKyNkZWZpbmUgUkVTVE9SRSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBwdXQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVmdDsgXAorICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7IFwKKyAgICAgICAgc3RhdGUtPmhvbGQgPSBob2xkOyBcCisgICAgICAgIHN0YXRlLT5iaXRzID0gYml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgSU5JVEJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPSAwOyBcCisgICAgICAgIGJpdHMgPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGUoKQorICAgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLworI2RlZmluZSBQVUxMQllURSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7IFwKKyAgICAgICAgaGF2ZS0tOyBcCisgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCpuZXh0KyspIDw8IGJpdHM7IFwKKyAgICAgICAgYml0cyArPSA4OyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IG4gYml0cyBpbiB0aGUgYml0IGFjY3VtdWxhdG9yLiAgSWYgdGhlcmUgaXMKKyAgIG5vdCBlbm91Z2ggYXZhaWxhYmxlIGlucHV0IHRvIGRvIHRoYXQsIHRoZW4gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXZlcnNlIHRoZSBieXRlcyBpbiBhIDMyLWJpdCB2YWx1ZSAqLworI2RlZmluZSBSRVZFUlNFKHEpIFwKKyAgICAoKCgocSkgPj4gMjQpICYgMHhmZikgKyAoKChxKSA+PiA4KSAmIDB4ZmYwMCkgKyBcCisgICAgICgoKHEpICYgMHhmZjAwKSA8PCA4KSArICgoKHEpICYgMHhmZikgPDwgMjQpKQorCisvKgorICAgaW5mbGF0ZSgpIHVzZXMgYSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgYXMgbXVjaCBpbnB1dCBkYXRhIGFuZCBnZW5lcmF0ZSBhcworICAgbXVjaCBvdXRwdXQgZGF0YSBhcyBwb3NzaWJsZSBiZWZvcmUgcmV0dXJuaW5nLiAgVGhlIHN0YXRlIG1hY2hpbmUgaXMKKyAgIHN0cnVjdHVyZWQgcm91Z2hseSBhcyBmb2xsb3dzOgorCisgICAgZm9yICg7Oykgc3dpdGNoIChzdGF0ZSkgeworICAgIC4uLgorICAgIGNhc2UgU1RBVEVuOgorICAgICAgICBpZiAobm90IGVub3VnaCBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSB0byBtYWtlIHByb2dyZXNzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAuLi4gbWFrZSBwcm9ncmVzcyAuLi4KKyAgICAgICAgc3RhdGUgPSBTVEFURW07CisgICAgICAgIGJyZWFrOworICAgIC4uLgorICAgIH0KKworICAgc28gd2hlbiBpbmZsYXRlKCkgaXMgY2FsbGVkIGFnYWluLCB0aGUgc2FtZSBjYXNlIGlzIGF0dGVtcHRlZCBhZ2FpbiwgYW5kCisgICBpZiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2VzIGFyZSBwcm92aWRlZCwgdGhlIG1hY2hpbmUgcHJvY2VlZHMgdG8gdGhlCisgICBuZXh0IHN0YXRlLiAgVGhlIE5FRURCSVRTKCkgbWFjcm8gaXMgdXN1YWxseSB0aGUgd2F5IHRoZSBzdGF0ZSBldmFsdWF0ZXMKKyAgIHdoZXRoZXIgaXQgY2FuIHByb2NlZWQgb3Igc2hvdWxkIHJldHVybi4gIE5FRURCSVRTKCkgZG9lcyB0aGUgcmV0dXJuIGlmCisgICB0aGUgcmVxdWVzdGVkIGJpdHMgYXJlIG5vdCBhdmFpbGFibGUuICBUaGUgdHlwaWNhbCB1c2Ugb2YgdGhlIEJJVFMgbWFjcm9zCisgICBpczoKKworICAgICAgICBORUVEQklUUyhuKTsKKyAgICAgICAgLi4uIGRvIHNvbWV0aGluZyB3aXRoIEJJVFMobikgLi4uCisgICAgICAgIERST1BCSVRTKG4pOworCisgICB3aGVyZSBORUVEQklUUyhuKSBlaXRoZXIgcmV0dXJucyBmcm9tIGluZmxhdGUoKSBpZiB0aGVyZSBpc24ndCBlbm91Z2gKKyAgIGlucHV0IGxlZnQgdG8gbG9hZCBuIGJpdHMgaW50byB0aGUgYWNjdW11bGF0b3IsIG9yIGl0IGNvbnRpbnVlcy4gIEJJVFMobikKKyAgIGdpdmVzIHRoZSBsb3cgbiBiaXRzIGluIHRoZSBhY2N1bXVsYXRvci4gIFdoZW4gZG9uZSwgRFJPUEJJVFMobikgZHJvcHMKKyAgIHRoZSBsb3cgbiBiaXRzIG9mZiB0aGUgYWNjdW11bGF0b3IuICBJTklUQklUUygpIGNsZWFycyB0aGUgYWNjdW11bGF0b3IKKyAgIGFuZCBzZXRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgdG8gemVyby4gIEJZVEVCSVRTKCkgZGlzY2FyZHMganVzdAorICAgZW5vdWdoIGJpdHMgdG8gcHV0IHRoZSBhY2N1bXVsYXRvciBvbiBhIGJ5dGUgYm91bmRhcnkuICBBZnRlciBCWVRFQklUUygpCisgICBhbmQgYSBORUVEQklUUyg4KSwgdGhlbiBCSVRTKDgpIHdvdWxkIHJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0uCisKKyAgIE5FRURCSVRTKG4pIHVzZXMgUFVMTEJZVEUoKSB0byBnZXQgYW4gYXZhaWxhYmxlIGJ5dGUgb2YgaW5wdXQsIG9yIHRvIHJldHVybgorICAgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAgVGhlIGRlY29kaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBjb2RlcyB1c2VzCisgICBQVUxMQllURSgpIGRpcmVjdGx5IGluIG9yZGVyIHRvIHB1bGwganVzdCBlbm91Z2ggYnl0ZXMgdG8gZGVjb2RlIHRoZSBuZXh0CisgICBjb2RlLCBhbmQgbm8gbW9yZS4KKworICAgU29tZSBzdGF0ZXMgbG9vcCB1bnRpbCB0aGV5IGdldCBlbm91Z2ggaW5wdXQsIG1ha2luZyBzdXJlIHRoYXQgZW5vdWdoCisgICBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIHRvIGNvbnRpbnVlIHRoZSBsb29wIHdoZXJlIGl0IGxlZnQgb2ZmCisgICBpZiBORUVEQklUUygpIHJldHVybnMgaW4gdGhlIGxvb3AuICBGb3IgZXhhbXBsZSwgd2FudCwgbmVlZCwgYW5kIGtlZXAKKyAgIHdvdWxkIGFsbCBoYXZlIHRvIGFjdHVhbGx5IGJlIHBhcnQgb2YgdGhlIHNhdmVkIHN0YXRlIGluIGNhc2UgTkVFREJJVFMoKQorICAgcmV0dXJuczoKKworICAgIGNhc2UgU1RBVEV3OgorICAgICAgICB3aGlsZSAod2FudCA8IG5lZWQpIHsKKyAgICAgICAgICAgIE5FRURCSVRTKG4pOworICAgICAgICAgICAga2VlcFt3YW50KytdID0gQklUUyhuKTsKKyAgICAgICAgICAgIERST1BCSVRTKG4pOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gU1RBVEV4OworICAgIGNhc2UgU1RBVEV4OgorCisgICBBcyBzaG93biBhYm92ZSwgaWYgdGhlIG5leHQgc3RhdGUgaXMgYWxzbyB0aGUgbmV4dCBjYXNlLCB0aGVuIHRoZSBicmVhaworICAgaXMgb21pdHRlZC4KKworICAgQSBzdGF0ZSBtYXkgYWxzbyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgYXZhaWxhYmxlIHRvCisgICBjb21wbGV0ZSB0aGF0IHN0YXRlLiAgVGhvc2Ugc3RhdGVzIGFyZSBjb3B5aW5nIHN0b3JlZCBkYXRhLCB3cml0aW5nIGEKKyAgIGxpdGVyYWwgYnl0ZSwgYW5kIGNvcHlpbmcgYSBtYXRjaGluZyBzdHJpbmcuCisKKyAgIFdoZW4gcmV0dXJuaW5nLCBhICJnb3RvIGluZl9sZWF2ZSIgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHRvdGFsIGNvdW50ZXJzLAorICAgdXBkYXRlIHRoZSBjaGVjayB2YWx1ZSwgYW5kIGRldGVybWluZSB3aGV0aGVyIGFueSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlCisgICBkdXJpbmcgdGhhdCBpbmZsYXRlKCkgY2FsbCBpbiBvcmRlciB0byByZXR1cm4gdGhlIHByb3BlciByZXR1cm4gY29kZS4KKyAgIFByb2dyZXNzIGlzIGRlZmluZWQgYXMgYSBjaGFuZ2UgaW4gZWl0aGVyIHN0cm0tPmF2YWlsX2luIG9yIHN0cm0tPmF2YWlsX291dC4KKyAgIFdoZW4gdGhlcmUgaXMgYSB3aW5kb3csIGdvdG8gaW5mX2xlYXZlIHdpbGwgdXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdAorICAgb3V0cHV0IHdyaXR0ZW4uICBJZiBhIGdvdG8gaW5mX2xlYXZlIG9jY3VycyBpbiB0aGUgbWlkZGxlIG9mIGRlY29tcHJlc3Npb24KKyAgIGFuZCB0aGVyZSBpcyBubyB3aW5kb3cgY3VycmVudGx5LCBnb3RvIGluZl9sZWF2ZSB3aWxsIGNyZWF0ZSBvbmUgYW5kIGNvcHkKKyAgIG91dHB1dCB0byB0aGUgd2luZG93IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgb25seSBhZmZlY3RzIHRoZQorICAgcmV0dXJuIGNvZGUgKHBlciB6bGliLmgpLiAgaW5mbGF0ZSgpIGFsd2F5cyB3cml0ZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSB0bworICAgc3RybS0+bmV4dF9vdXQsIGdpdmVuIHRoZSBzcGFjZSBhdmFpbGFibGUgYW5kIHRoZSBwcm92aWRlZCBpbnB1dC0tdGhlIGVmZmVjdAorICAgZG9jdW1lbnRlZCBpbiB6bGliLmggb2YgWl9TWU5DX0ZMVVNILiAgRnVydGhlcm1vcmUsIGluZmxhdGUoKSBhbHdheXMgZGVmZXJzCisgICB0aGUgYWxsb2NhdGlvbiBvZiBhbmQgY29weWluZyBpbnRvIGEgc2xpZGluZyB3aW5kb3cgdW50aWwgbmVjZXNzYXJ5LCB3aGljaAorICAgcHJvdmlkZXMgdGhlIGVmZmVjdCBkb2N1bWVudGVkIGluIHpsaWIuaCBmb3IgWl9GSU5JU0ggd2hlbiB0aGUgZW50aXJlIGlucHV0CisgICBzdHJlYW0gYXZhaWxhYmxlLiAgU28gdGhlIG9ubHkgdGhpbmcgdGhlIGZsdXNoIHBhcmFtZXRlciBhY3R1YWxseSBkb2VzIGlzOgorICAgd2hlbiBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIGluZmxhdGUoKSBjYW5ub3QgcmV0dXJuIFpfT0suICBJbnN0ZWFkIGl0CisgICB3aWxsIHJldHVybiBaX0JVRl9FUlJPUiBpZiBpdCBoYXMgbm90IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICovCisKK2ludCBaRVhQT1JUIGluZmxhdGUoc3RybSwgZmx1c2gpCit6X3N0cmVhbXAgc3RybTsKK2ludCBmbHVzaDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgaW4sIG91dDsgICAgICAgICAgIC8qIHNhdmUgc3RhcnRpbmcgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBjb3B5OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmZyb207ICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqLworICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCisgICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisjaWZkZWYgR1VOWklQCisgICAgdW5zaWduZWQgY2hhciBoYnVmWzRdOyAgICAgIC8qIGJ1ZmZlciBmb3IgZ3ppcCBoZWFkZXIgY3JjIGNhbGN1bGF0aW9uICovCisjZW5kaWYKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCisgICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+bmV4dF9vdXQgPT0gWl9OVUxMIHx8CisgICAgICAgIChzdHJtLT5uZXh0X2luID09IFpfTlVMTCAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT5tb2RlID09IFRZUEUpIHN0YXRlLT5tb2RlID0gVFlQRURPOyAgICAgIC8qIHNraXAgY2hlY2sgKi8KKyAgICBMT0FEKCk7CisgICAgaW4gPSBoYXZlOworICAgIG91dCA9IGxlZnQ7CisgICAgcmV0ID0gWl9PSzsKKyAgICBmb3IgKDs7KQorICAgICAgICBzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CisgICAgICAgIGNhc2UgSEVBRDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFRE87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBORUVEQklUUygxNik7CisjaWZkZWYgR1VOWklQCisgICAgICAgICAgICBpZiAoKHN0YXRlLT53cmFwICYgMikgJiYgaG9sZCA9PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovCisgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBGTEFHUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmRvbmUgPSAtMTsKKyAgICAgICAgICAgIGlmICghKHN0YXRlLT53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovCisjZWxzZQorICAgICAgICAgICAgaWYgKAorI2VuZGlmCisgICAgICAgICAgICAgICAgKChCSVRTKDgpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChCSVRTKDQpICE9IFpfREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyAgICAgICAgICAgIGxlbiA9IEJJVFMoNCkgKyA4OworICAgICAgICAgICAgaWYgKGxlbiA+IHN0YXRlLT53Yml0cykgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgd2luZG93IHNpemUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRtYXggPSAxVSA8PCBsZW47CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgY2FzZSBGTEFHUzoKKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgIHN0YXRlLT5mbGFncyA9IChpbnQpKGhvbGQpOworICAgICAgICAgICAgaWYgKChzdGF0ZS0+ZmxhZ3MgJiAweGZmKSAhPSBaX0RFRkxBVEVEKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4ZTAwMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gaGVhZGVyIGZsYWdzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT50ZXh0ID0gKGludCkoKGhvbGQgPj4gOCkgJiAxKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRJTUU7CisgICAgICAgIGNhc2UgVElNRToKKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnRpbWUgPSBob2xkOworICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDNChzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gT1M7CisgICAgICAgIGNhc2UgT1M6CisgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnhmbGFncyA9IChpbnQpKGhvbGQgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+b3MgPSAoaW50KShob2xkID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRVhMRU47CisgICAgICAgIGNhc2UgRVhMRU46CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwNDAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMTYpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpKGhvbGQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYV9sZW4gPSAodW5zaWduZWQpaG9sZDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmEgPSBaX05VTEw7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEVYVFJBOworICAgICAgICBjYXNlIEVYVFJBOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDQwMCkgeworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhICE9IFpfTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUtPmhlYWQtPmV4dHJhX2xlbiAtIHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT5oZWFkLT5leHRyYSArIGxlbiwgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLT5oZWFkLT5leHRyYV9tYXggPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmFfbWF4IC0gbGVuIDogY29weSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBOQU1FOworICAgICAgICBjYXNlIE5BTUU6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwODAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgY29weSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKG5leHRbY29weSsrXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZSAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIDwgc3RhdGUtPmhlYWQtPm5hbWVfbWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPm5hbWVbc3RhdGUtPmxlbmd0aCsrXSA9IGxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAobGVuKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZSA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT01NRU5UOworICAgICAgICBjYXNlIENPTU1FTlQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgxMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgY29weSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKG5leHRbY29weSsrXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIDwgc3RhdGUtPmhlYWQtPmNvbW1fbWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmNvbW1lbnRbc3RhdGUtPmxlbmd0aCsrXSA9IGxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAobGVuKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudCA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gSENSQzsKKyAgICAgICAgY2FzZSBIQ1JDOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgICAgICBpZiAoaG9sZCAhPSAoc3RhdGUtPmNoZWNrICYgMHhmZmZmKSkgeworICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJoZWFkZXIgY3JjIG1pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5oY3JjID0gKGludCkoKHN0YXRlLT5mbGFncyA+PiA5KSAmIDEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5kb25lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIERJQ1RJRDoKKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gUkVWRVJTRShob2xkKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJQ1Q7CisgICAgICAgIGNhc2UgRElDVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZWRpY3QgPT0gMCkgeworICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0JMT0NLKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBUWVBFRE86CisgICAgICAgICAgICBpZiAoc3RhdGUtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICBCWVRFQklUUygpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ0hFQ0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBORUVEQklUUygzKTsKKyAgICAgICAgICAgIHN0YXRlLT5sYXN0ID0gQklUUygxKTsKKyAgICAgICAgICAgIERST1BCSVRTKDEpOworICAgICAgICAgICAgc3dpdGNoIChCSVRTKDIpKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFNUT1JFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpOworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47ICAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUQUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRUQ6CisgICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPUFk7CisgICAgICAgIGNhc2UgQ09QWToKKyAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOworICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVEFCTEU6CisgICAgICAgICAgICBORUVEQklUUygxNCk7CisgICAgICAgICAgICBzdGF0ZS0+bmxlbiA9IEJJVFMoNSkgKyAyNTc7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uZGlzdCA9IEJJVFMoNSkgKyAxOworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmNvZGUgPSBCSVRTKDQpICsgNDsKKyAgICAgICAgICAgIERST1BCSVRTKDQpOworI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorICAgICAgICAgICAgaWYgKHN0YXRlLT5ubGVuID4gMjg2IHx8IHN0YXRlLT5uZGlzdCA+IDMwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkxFTlM7CisgICAgICAgIGNhc2UgTEVOTEVOUzoKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOworICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA3OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUtPmxlbnMsIDE5LCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09ERUxFTlM7CisgICAgICAgIGNhc2UgQ09ERUxFTlM6CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSB0aGlzLnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA9PSAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhbCA9PSAxNykgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAxMSArIEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgKyBjb3B5ID4gc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY29weS0tKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSAodW5zaWduZWQgc2hvcnQpbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqLworICAgICAgICAgICAgaWYgKHN0YXRlLT5tb2RlID09IEJBRCkgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzICovCisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBvdXQpOworICAgICAgICAgICAgICAgIExPQUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYmICh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKXRoaXMudmFsOworICAgICAgICAgICAgaWYgKChpbnQpKHRoaXMub3ApID09IDApIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHRoaXMudmFsID49IDB4MjAgJiYgdGhpcy52YWwgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgdGhpcy52YWwpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgMzIpIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5FWFQ7CisgICAgICAgIGNhc2UgTEVORVhUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJU1Q7CisgICAgICAgIGNhc2UgRElTVDoKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKXRoaXMudmFsOworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNURVhUOworICAgICAgICBjYXNlIERJU1RFWFQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IHN0YXRlLT5kbWF4KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IHN0YXRlLT53aGF2ZSArIG91dCAtIGxlZnQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBzdGF0ZS0+b2Zmc2V0KSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE1BVENIOworICAgICAgICBjYXNlIE1BVENIOgorICAgICAgICAgICAgaWYgKGxlZnQgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICBjb3B5ID0gb3V0IC0gbGVmdDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPm9mZnNldCAtIGNvcHk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+d3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d3JpdGU7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53c2l6ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53cml0ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSVQ6CisgICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hFQ0s6CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyYXApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICAgICAgb3V0IC09IGxlZnQ7CisgICAgICAgICAgICAgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OworICAgICAgICAgICAgICAgIGlmIChvdXQpCisgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHB1dCAtIG91dCwgb3V0KTsKKyAgICAgICAgICAgICAgICBvdXQgPSBsZWZ0OworICAgICAgICAgICAgICAgIGlmICgoCisjaWZkZWYgR1VOWklQCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgPyBob2xkIDoKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgUkVWRVJTRShob2xkKSkgIT0gc3RhdGUtPmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOR1RIOworICAgICAgICBjYXNlIExFTkdUSDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBzdGF0ZS0+ZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICAgICAgaWYgKGhvbGQgIT0gKHN0YXRlLT50b3RhbCAmIDB4ZmZmZmZmZmZVTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxuIikpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERPTkU7CisgICAgICAgIGNhc2UgRE9ORToKKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIEJBRDoKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIE1FTToKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgY2FzZSBTWU5DOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgICAgICB9CisKKyAgICAvKgorICAgICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLgorICAgICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXIKKyAgICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS4KKyAgICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuCisgICAgICovCisgIGluZl9sZWF2ZToKKyAgICBSRVNUT1JFKCk7CisgICAgaWYgKHN0YXRlLT53c2l6ZSB8fCAoc3RhdGUtPm1vZGUgPCBDSEVDSyAmJiBvdXQgIT0gc3RybS0+YXZhaWxfb3V0KSkKKyAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpKSB7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE1FTTsKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgfQorICAgIGluIC09IHN0cm0tPmF2YWlsX2luOworICAgIG91dCAtPSBzdHJtLT5hdmFpbF9vdXQ7CisgICAgc3RybS0+dG90YWxfaW4gKz0gaW47CisgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKKyAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OworICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBvdXQpCisgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KKyAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHN0cm0tPm5leHRfb3V0IC0gb3V0LCBvdXQpOworICAgIHN0cm0tPmRhdGFfdHlwZSA9IHN0YXRlLT5iaXRzICsgKHN0YXRlLT5sYXN0ID8gNjQgOiAwKSArCisgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IFRZUEUgPyAxMjggOiAwKTsKKyAgICBpZiAoKChpbiA9PSAwICYmIG91dCA9PSAwKSB8fCBmbHVzaCA9PSBaX0ZJTklTSCkgJiYgcmV0ID09IFpfT0spCisgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVFbmQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoc3RhdGUtPndpbmRvdyAhPSBaX05VTEwpIFpGUkVFKHN0cm0sIHN0YXRlLT53aW5kb3cpOworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOworICAgIHJldHVybiBaX09LOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQorel9zdHJlYW1wIHN0cm07Citjb25zdCBCeXRlZiAqZGljdGlvbmFyeTsKK3VJbnQgZGljdExlbmd0aDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGxvbmcgaWQ7CisKKyAgICAvKiBjaGVjayBzdGF0ZSAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoc3RhdGUtPndyYXAgIT0gMCAmJiBzdGF0ZS0+bW9kZSAhPSBESUNUKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IERJQ1QpIHsKKyAgICAgICAgaWQgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgICAgICBpZCA9IGFkbGVyMzIoaWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOworICAgICAgICBpZiAoaWQgIT0gc3RhdGUtPmNoZWNrKQorICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93ICovCisgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLT5hdmFpbF9vdXQpKSB7CisgICAgICAgIHN0YXRlLT5tb2RlID0gTUVNOworICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorICAgIGlmIChkaWN0TGVuZ3RoID4gc3RhdGUtPndzaXplKSB7CisgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgZGljdGlvbmFyeSArIGRpY3RMZW5ndGggLSBzdGF0ZS0+d3NpemUsCisgICAgICAgICAgICAgICAgc3RhdGUtPndzaXplKTsKKyAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPndzaXplIC0gZGljdExlbmd0aCwgZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICBkaWN0TGVuZ3RoKTsKKyAgICAgICAgc3RhdGUtPndoYXZlID0gZGljdExlbmd0aDsKKyAgICB9CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcbiIpKTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKQorel9zdHJlYW1wIHN0cm07Citnel9oZWFkZXJwIGhlYWQ7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGNoZWNrIHN0YXRlICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmICgoc3RhdGUtPndyYXAgJiAyKSA9PSAwKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi8KKyAgICBzdGF0ZS0+aGVhZCA9IGhlYWQ7CisgICAgaGVhZC0+ZG9uZSA9IDA7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qCisgICBTZWFyY2ggYnVmWzAuLmxlbi0xXSBmb3IgdGhlIHBhdHRlcm46IDAsIDAsIDB4ZmYsIDB4ZmYuICBSZXR1cm4gd2hlbiBmb3VuZAorICAgb3Igd2hlbiBvdXQgb2YgaW5wdXQuICBXaGVuIGNhbGxlZCwgKmhhdmUgaXMgdGhlIG51bWJlciBvZiBwYXR0ZXJuIGJ5dGVzCisgICBmb3VuZCBpbiBvcmRlciBzbyBmYXIsIGluIDAuLjMuICBPbiByZXR1cm4gKmhhdmUgaXMgdXBkYXRlZCB0byB0aGUgbmV3CisgICBzdGF0ZS4gIElmIG9uIHJldHVybiAqaGF2ZSBlcXVhbHMgZm91ciwgdGhlbiB0aGUgcGF0dGVybiB3YXMgZm91bmQgYW5kIHRoZQorICAgcmV0dXJuIHZhbHVlIGlzIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZCBpbmNsdWRpbmcgdGhlIGxhc3QgYnl0ZSBvZiB0aGUKKyAgIHBhdHRlcm4uICBJZiAqaGF2ZSBpcyBsZXNzIHRoYW4gZm91ciwgdGhlbiB0aGUgcGF0dGVybiBoYXMgbm90IGJlZW4gZm91bmQKKyAgIHlldCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBsZW4uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHN5bmNzZWFyY2goKSBjYW4gYmUKKyAgIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgZGF0YSBhbmQgdGhlICpoYXZlIHN0YXRlLiAgKmhhdmUgaXMgaW5pdGlhbGl6ZWQgdG8KKyAgIHplcm8gZm9yIHRoZSBmaXJzdCBjYWxsLgorICovCitsb2NhbCB1bnNpZ25lZCBzeW5jc2VhcmNoKGhhdmUsIGJ1ZiwgbGVuKQordW5zaWduZWQgRkFSICpoYXZlOwordW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKK3Vuc2lnbmVkIGxlbjsKK3sKKyAgICB1bnNpZ25lZCBnb3Q7CisgICAgdW5zaWduZWQgbmV4dDsKKworICAgIGdvdCA9ICpoYXZlOworICAgIG5leHQgPSAwOworICAgIHdoaWxlIChuZXh0IDwgbGVuICYmIGdvdCA8IDQpIHsKKyAgICAgICAgaWYgKChpbnQpKGJ1ZltuZXh0XSkgPT0gKGdvdCA8IDIgPyAwIDogMHhmZikpCisgICAgICAgICAgICBnb3QrKzsKKyAgICAgICAgZWxzZSBpZiAoYnVmW25leHRdKQorICAgICAgICAgICAgZ290ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290ID0gNCAtIGdvdDsKKyAgICAgICAgbmV4dCsrOworICAgIH0KKyAgICAqaGF2ZSA9IGdvdDsKKyAgICByZXR1cm4gbmV4dDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmMoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gbG9vayBhdCBvciBsb29rZWQgYXQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGluLCBvdXQ7ICAgICAgLyogdGVtcG9yYXJ5IHRvIHNhdmUgdG90YWxfaW4gYW5kIHRvdGFsX291dCAqLworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOyAgICAgICAvKiB0byByZXN0b3JlIGJpdCBidWZmZXIgdG8gYnl0ZSBzdHJpbmcgKi8KKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgLyogY2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBzdGF0ZS0+Yml0cyA8IDgpIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIC8qIGlmIGZpcnN0IHRpbWUsIHN0YXJ0IHNlYXJjaCBpbiBiaXQgYnVmZmVyICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IFNZTkMpIHsKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBTWU5DOworICAgICAgICBzdGF0ZS0+aG9sZCA8PD0gc3RhdGUtPmJpdHMgJiA3OworICAgICAgICBzdGF0ZS0+Yml0cyAtPSBzdGF0ZS0+Yml0cyAmIDc7CisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIHdoaWxlIChzdGF0ZS0+Yml0cyA+PSA4KSB7CisgICAgICAgICAgICBidWZbbGVuKytdID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlLT5ob2xkKTsKKyAgICAgICAgICAgIHN0YXRlLT5ob2xkID4+PSA4OworICAgICAgICAgICAgc3RhdGUtPmJpdHMgLT0gODsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgIHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIGJ1ZiwgbGVuKTsKKyAgICB9CisKKyAgICAvKiBzZWFyY2ggYXZhaWxhYmxlIGlucHV0ICovCisgICAgbGVuID0gc3luY3NlYXJjaCgmKHN0YXRlLT5oYXZlKSwgc3RybS0+bmV4dF9pbiwgc3RybS0+YXZhaWxfaW4pOworICAgIHN0cm0tPmF2YWlsX2luIC09IGxlbjsKKyAgICBzdHJtLT5uZXh0X2luICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBsZW47CisKKyAgICAvKiByZXR1cm4gbm8gam95IG9yIHNldCB1cCB0byByZXN0YXJ0IGluZmxhdGUoKSBvbiBhIG5ldyBibG9jayAqLworICAgIGlmIChzdGF0ZS0+aGF2ZSAhPSA0KSByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIGluID0gc3RybS0+dG90YWxfaW47ICBvdXQgPSBzdHJtLT50b3RhbF9vdXQ7CisgICAgaW5mbGF0ZVJlc2V0KHN0cm0pOworICAgIHN0cm0tPnRvdGFsX2luID0gaW47ICBzdHJtLT50b3RhbF9vdXQgPSBvdXQ7CisgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQgYnkKKyAgIFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBvbmUgUFBQCisgICBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGFuIGFkZGl0aW9uYWwgc2FmZXR5IGNoZWNrLiBQUFAgdXNlcworICAgWl9TWU5DX0ZMVVNIIGJ1dCByZW1vdmVzIHRoZSBsZW5ndGggYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBlbXB0eSBzdG9yZWQKKyAgIGJsb2NrLiBXaGVuIGRlY29tcHJlc3NpbmcsIFBQUCBjaGVja3MgdGhhdCBhdCB0aGUgZW5kIG9mIGlucHV0IHBhY2tldCwKKyAgIGluZmxhdGUgaXMgd2FpdGluZyBmb3IgdGhlc2UgbGVuZ3RoIGJ5dGVzLgorICovCitpbnQgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50KHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIHJldHVybiBzdGF0ZS0+bW9kZSA9PSBTVE9SRUQgJiYgc3RhdGUtPmJpdHMgPT0gMDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUNvcHkoZGVzdCwgc291cmNlKQorel9zdHJlYW1wIGRlc3Q7Cit6X3N0cmVhbXAgc291cmNlOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpjb3B5OworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7CisgICAgdW5zaWduZWQgd3NpemU7CisKKyAgICAvKiBjaGVjayBpbnB1dCAqLworICAgIGlmIChkZXN0ID09IFpfTlVMTCB8fCBzb3VyY2UgPT0gWl9OVUxMIHx8IHNvdXJjZS0+c3RhdGUgPT0gWl9OVUxMIHx8CisgICAgICAgIHNvdXJjZS0+emFsbG9jID09IChhbGxvY19mdW5jKTAgfHwgc291cmNlLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzb3VyY2UtPnN0YXRlOworCisgICAgLyogYWxsb2NhdGUgc3BhY2UgKi8KKyAgICBjb3B5ID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKQorICAgICAgICAgICBaQUxMT0Moc291cmNlLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoY29weSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB3aW5kb3cgPSBaX05VTEw7CisgICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMKSB7CisgICAgICAgIHdpbmRvdyA9ICh1bnNpZ25lZCBjaGFyIEZBUiAqKQorICAgICAgICAgICAgICAgICBaQUxMT0Moc291cmNlLCAxVSA8PCBzdGF0ZS0+d2JpdHMsIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisgICAgICAgIGlmICh3aW5kb3cgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICBaRlJFRShzb3VyY2UsIGNvcHkpOworICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBzdGF0ZSAqLworICAgIHptZW1jcHkoZGVzdCwgc291cmNlLCBzaXplb2Yoel9zdHJlYW0pKTsKKyAgICB6bWVtY3B5KGNvcHksIHN0YXRlLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUtPmxlbmNvZGUgPj0gc3RhdGUtPmNvZGVzICYmCisgICAgICAgIHN0YXRlLT5sZW5jb2RlIDw9IHN0YXRlLT5jb2RlcyArIEVOT1VHSCAtIDEpIHsKKyAgICAgICAgY29weS0+bGVuY29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5sZW5jb2RlIC0gc3RhdGUtPmNvZGVzKTsKKyAgICAgICAgY29weS0+ZGlzdGNvZGUgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+ZGlzdGNvZGUgLSBzdGF0ZS0+Y29kZXMpOworICAgIH0KKyAgICBjb3B5LT5uZXh0ID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPm5leHQgLSBzdGF0ZS0+Y29kZXMpOworICAgIGlmICh3aW5kb3cgIT0gWl9OVUxMKSB7CisgICAgICAgIHdzaXplID0gMVUgPDwgc3RhdGUtPndiaXRzOworICAgICAgICB6bWVtY3B5KHdpbmRvdywgc3RhdGUtPndpbmRvdywgd3NpemUpOworICAgIH0KKyAgICBjb3B5LT53aW5kb3cgPSB3aW5kb3c7CisgICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKWNvcHk7CisgICAgcmV0dXJuIFpfT0s7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9pbmZsYXRlLmggYi91c3Iva2xpYmMvemxpYi9pbmZsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiZDNlNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2luZmxhdGUuaApAQCAtMCwwICsxLDExNSBAQAorLyogaW5mbGF0ZS5oIC0tIGludGVybmFsIGluZmxhdGUgc3RhdGUgZGVmaW5pdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBkZWZpbmUgTk9fR1pJUCB3aGVuIGNvbXBpbGluZyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGd6aXAgaGVhZGVyIGFuZAorICAgdHJhaWxlciBkZWNvZGluZyBieSBpbmZsYXRlKCkuICBOT19HWklQIHdvdWxkIGJlIHVzZWQgdG8gYXZvaWQgbGlua2luZyBpbgorICAgdGhlIGNyYyBjb2RlIHdoZW4gaXQgaXMgbm90IG5lZWRlZC4gIEZvciBzaGFyZWQgbGlicmFyaWVzLCBnemlwIGRlY29kaW5nCisgICBzaG91bGQgYmUgbGVmdCBlbmFibGVkLiAqLworI2lmbmRlZiBOT19HWklQCisjICBkZWZpbmUgR1VOWklQCisjZW5kaWYKKworLyogUG9zc2libGUgaW5mbGF0ZSBtb2RlcyBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBIRUFELCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi8KKyAgICBGTEFHUywgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqLworICAgIFRJTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1vZGlmaWNhdGlvbiB0aW1lIChnemlwKSAqLworICAgIE9TLCAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqLworICAgIEVYTEVOLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi8KKyAgICBFWFRSQSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBieXRlcyAoZ3ppcCkgKi8KKyAgICBOQU1FLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqLworICAgIENPTU1FTlQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqLworICAgIEhDUkMsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGhlYWRlciBjcmMgKGd6aXApICovCisgICAgRElDVElELCAgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqLworICAgIERJQ1QsICAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqLworICAgICAgICBUWVBFLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovCisgICAgICAgIFRZUEVETywgICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi8KKyAgICAgICAgU1RPUkVELCAgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi8KKyAgICAgICAgQ09QWSwgICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgVEFCTEUsICAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovCisgICAgICAgIExFTkxFTlMsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgICAgICBDT0RFTEVOUywgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgY29kZSAqLworICAgICAgICAgICAgTEVORVhULCAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIERJU1QsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIERJU1RFWFQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIE1BVENILCAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqLworICAgICAgICAgICAgTElULCAgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi8KKyAgICBDSEVDSywgICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi8KKyAgICBMRU5HVEgsICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqLworICAgIERPTkUsICAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgQkFELCAgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIE1FTSwgICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVtb3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgU1lOQyAgICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovCit9IGluZmxhdGVfbW9kZTsKKworLyoKKyAgICBTdGF0ZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIGFib3ZlIG1vZGVzIC0KKworICAgIChtb3N0IG1vZGVzIGNhbiBnbyB0byB0aGUgQkFEIG9yIE1FTSBtb2RlIC0tIG5vdCBzaG93biBmb3IgY2xhcml0eSkKKworICAgIFByb2Nlc3MgaGVhZGVyOgorICAgICAgICBIRUFEIC0+IChnemlwKSBvciAoemxpYikKKyAgICAgICAgKGd6aXApIC0+IEZMQUdTIC0+IFRJTUUgLT4gT1MgLT4gRVhMRU4gLT4gRVhUUkEgLT4gTkFNRQorICAgICAgICBOQU1FIC0+IENPTU1FTlQgLT4gSENSQyAtPiBUWVBFCisgICAgICAgICh6bGliKSAtPiBESUNUSUQgb3IgVFlQRQorICAgICAgICBESUNUSUQgLT4gRElDVCAtPiBUWVBFCisgICAgUmVhZCBkZWZsYXRlIGJsb2NrczoKKyAgICAgICAgICAgIFRZUEUgLT4gU1RPUkVEIG9yIFRBQkxFIG9yIExFTiBvciBDSEVDSworICAgICAgICAgICAgU1RPUkVEIC0+IENPUFkgLT4gVFlQRQorICAgICAgICAgICAgVEFCTEUgLT4gTEVOTEVOUyAtPiBDT0RFTEVOUyAtPiBMRU4KKyAgICBSZWFkIGRlZmxhdGUgY29kZXM6CisgICAgICAgICAgICAgICAgTEVOIC0+IExFTkVYVCBvciBMSVQgb3IgVFlQRQorICAgICAgICAgICAgICAgIExFTkVYVCAtPiBESVNUIC0+IERJU1RFWFQgLT4gTUFUQ0ggLT4gTEVOCisgICAgICAgICAgICAgICAgTElUIC0+IExFTgorICAgIFByb2Nlc3MgdHJhaWxlcjoKKyAgICAgICAgQ0hFQ0sgLT4gTEVOR1RIIC0+IERPTkUKKyAqLworCisvKiBzdGF0ZSBtYWludGFpbmVkIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzLiAgQXBwcm94aW1hdGVseSA3SyBieXRlcy4gKi8KK3N0cnVjdCBpbmZsYXRlX3N0YXRlIHsKKyAgICBpbmZsYXRlX21vZGUgbW9kZTsgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi8KKyAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi8KKyAgICBpbnQgd3JhcDsgICAgICAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLworICAgIGludCBoYXZlZGljdDsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi8KKyAgICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqLworICAgIHVuc2lnbmVkIGRtYXg7ICAgICAgICAgICAgICAvKiB6bGliIGhlYWRlciBtYXggZGlzdGFuY2UgKElORkxBVEVfU1RSSUNUKSAqLworICAgIHVuc2lnbmVkIGxvbmcgY2hlY2s7ICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqLworICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7ICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi8KKyAgICBnel9oZWFkZXJwIGhlYWQ7ICAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqLworICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdiaXRzOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqLworICAgIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3aGF2ZTsgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdyaXRlOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KKyAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiAiaW4iICovCisgICAgICAgIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovCisgICAgdW5zaWduZWQgbGVuZ3RoOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqLworICAgIHVuc2lnbmVkIG9mZnNldDsgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgc3RyaW5nIGZyb20gKi8KKyAgICAgICAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovCisgICAgdW5zaWduZWQgZXh0cmE7ICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgbmVlZGVkICovCisgICAgICAgIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovCisgICAgY29kZSBjb25zdCBGQVIgKmxlbmNvZGU7ICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqLworICAgIGNvZGUgY29uc3QgRkFSICpkaXN0Y29kZTsgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi8KKyAgICB1bnNpZ25lZCBsZW5iaXRzOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqLworICAgIHVuc2lnbmVkIGRpc3RiaXRzOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqLworICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGJ1aWxkaW5nICovCisgICAgdW5zaWduZWQgbmNvZGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBubGVuOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBuZGlzdDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIGhhdmU7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqLworICAgIGNvZGUgRkFSICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovCisgICAgdW5zaWduZWQgc2hvcnQgbGVuc1szMjBdOyAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB3b3JrWzI4OF07ICAgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovCisgICAgY29kZSBjb2Rlc1tFTk9VR0hdOyAgICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqLworfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZnRyZWVzLmMgYi91c3Iva2xpYmMvemxpYi9pbmZ0cmVlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWMxM2YKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9pbmZ0cmVlcy5jCkBAIC0wLDAgKzEsMzI5IEBACisvKiBpbmZ0cmVlcy5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisKKyNkZWZpbmUgTUFYQklUUyAxNQorCitjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQorICAgIiBpbmZsYXRlIDEuMi4zIENvcHlyaWdodCAxOTk1LTIwMDUgTWFyayBBZGxlciAiOworLyoKKyAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQorICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CisgIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcworICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KKyAqLworCisvKgorICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KKyAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCisgICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAorICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKKyAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCisgICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQorICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKKyAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290CisgICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KKyAqLworaW50IGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgY29kZXMsIHRhYmxlLCBiaXRzLCB3b3JrKQorY29kZXR5cGUgdHlwZTsKK3Vuc2lnbmVkIHNob3J0IEZBUiAqbGVuczsKK3Vuc2lnbmVkIGNvZGVzOworY29kZSBGQVIgKiBGQVIgKnRhYmxlOwordW5zaWduZWQgRkFSICpiaXRzOwordW5zaWduZWQgc2hvcnQgRkFSICp3b3JrOworeworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqLworICAgIHVuc2lnbmVkIHN5bTsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi8KKyAgICB1bnNpZ25lZCBtaW4sIG1heDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCByb290OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi8KKyAgICB1bnNpZ25lZCBjdXJyOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi8KKyAgICB1bnNpZ25lZCBkcm9wOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqLworICAgIHVuc2lnbmVkIHVzZWQ7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqLworICAgIHVuc2lnbmVkIGh1ZmY7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqLworICAgIHVuc2lnbmVkIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqLworICAgIHVuc2lnbmVkIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovCisgICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi8KKyAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovCisgICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpiYXNlOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmV4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqLworICAgIGludCBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqLworICAgIHVuc2lnbmVkIHNob3J0IGNvdW50W01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLworICAgIHVuc2lnbmVkIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxiYXNlWzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi8KKyAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKKyAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsZXh0WzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovCisgICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LAorICAgICAgICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgMjAxLCAxOTZ9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi8KKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAorICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCisgICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZXh0WzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi8KKyAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsCisgICAgICAgIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LAorICAgICAgICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0fTsKKworICAgIC8qCisgICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQorICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCisgICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKKyAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCisgICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKKyAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAorICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKKyAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKKyAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgorCisgICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KKyAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgorICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0CisgICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KKworICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKKyAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKKyAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKKyAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKKyAgICAgICB0aGUgY2FsbGVyLgorCisgICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZworICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQorICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCisgICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzLgorICAgICAqLworCisgICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7CisKKyAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLworICAgIHJvb3QgPSAqYml0czsKKyAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKKyAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7CisgICAgaWYgKG1heCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqLworICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpMTsKKyAgICAgICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICAgICAgKigqdGFibGUpKysgPSB0aGlzOyAgICAgICAgICAgICAvKiBtYWtlIGEgdGFibGUgdG8gZm9yY2UgYW4gZXJyb3IgKi8KKyAgICAgICAgKigqdGFibGUpKysgPSB0aGlzOworICAgICAgICAqYml0cyA9IDE7CisgICAgICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqLworICAgIH0KKyAgICBmb3IgKG1pbiA9IDE7IG1pbiA8PSBNQVhCSVRTOyBtaW4rKykKKyAgICAgICAgaWYgKGNvdW50W21pbl0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPCBtaW4pIHJvb3QgPSBtaW47CisKKyAgICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KKyAgICBsZWZ0ID0gMTsKKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgeworICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICBsZWZ0IC09IGNvdW50W2xlbl07CisgICAgICAgIGlmIChsZWZ0IDwgMCkgcmV0dXJuIC0xOyAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovCisgICAgfQorICAgIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PSBDT0RFUyB8fCBtYXggIT0gMSkpCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi8KKworICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCisgICAgb2Zmc1sxXSA9IDA7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKKyAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07CisKKyAgICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovCisgICAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspCisgICAgICAgIGlmIChsZW5zW3N5bV0gIT0gMCkgd29ya1tvZmZzW2xlbnNbc3ltXV0rK10gPSAodW5zaWduZWQgc2hvcnQpc3ltOworCisgICAgLyoKKyAgICAgICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmcKKyAgICAgICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZgorICAgICAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcAorICAgICAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VyciwKKyAgICAgICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvCisgICAgICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuCisKKyAgICAgICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzCisgICAgICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXgKKyAgICAgICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYQorICAgICAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpcworICAgICAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC4KKworICAgICAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlCisgICAgICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGgKKyAgICAgICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZQorICAgICAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy4KKworICAgICAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlCisgICAgICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCB3aGVuIGEgTEVOUyB0YWJsZSBpcyBiZWluZyBtYWRlCisgICAgICAgYWdhaW5zdCB0aGUgc3BhY2UgaW4gKnRhYmxlLCBFTk9VR0gsIG1pbnVzIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCBieQorICAgICAgIHRoZSB3b3JzdCBjYXNlIGRpc3RhbmNlIGNvZGUsIE1BWEQuICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB0aGUKKyAgICAgICBzdWZmaWNpZW5jeSBvZiBFTk9VR0ggaGFzIG5vdCBiZWVuIHByb3ZlbiBleGhhdXN0aXZlbHksIGhlbmNlIHRoZSBjaGVjay4KKyAgICAgICBUaGlzIGFzc3VtZXMgdGhhdCB3aGVuIHR5cGUgPT0gTEVOUywgYml0cyA9PSA5LgorCisgICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgorICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCisgICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgorICAgICAqLworCisgICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENPREVTOgorICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KKyAgICAgICAgZW5kID0gMTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEVOUzoKKyAgICAgICAgYmFzZSA9IGxiYXNlOworICAgICAgICBiYXNlIC09IDI1NzsKKyAgICAgICAgZXh0cmEgPSBsZXh0OworICAgICAgICBleHRyYSAtPSAyNTc7CisgICAgICAgIGVuZCA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLworICAgICAgICBiYXNlID0gZGJhc2U7CisgICAgICAgIGV4dHJhID0gZGV4dDsKKyAgICAgICAgZW5kID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLworICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCisgICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCisgICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCisgICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLworICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KKyAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLworICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCisgICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KKyAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLworCisgICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCisgICAgaWYgKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSCAtIE1BWEQpCisgICAgICAgIHJldHVybiAxOworCisgICAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovCisgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKKyAgICAgICAgaWYgKChpbnQpKHdvcmtbc3ltXSkgPCBlbmQpIHsKKyAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikwOworICAgICAgICAgICAgdGhpcy52YWwgPSB3b3JrW3N5bV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGludCkod29ya1tzeW1dKSA+IGVuZCkgeworICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKShleHRyYVt3b3JrW3N5bV1dKTsKKyAgICAgICAgICAgIHRoaXMudmFsID0gYmFzZVt3b3JrW3N5bV1dOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKSgzMiArIDY0KTsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi8KKyAgICAgICAgICAgIHRoaXMudmFsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gZHJvcCk7CisgICAgICAgIGZpbGwgPSAxVSA8PCBjdXJyOworICAgICAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBmaWxsIC09IGluY3I7CisgICAgICAgICAgICBuZXh0WyhodWZmID4+IGRyb3ApICsgZmlsbF0gPSB0aGlzOworICAgICAgICB9IHdoaWxlIChmaWxsICE9IDApOworCisgICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7CisgICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKKyAgICAgICAgICAgIGluY3IgPj49IDE7CisgICAgICAgIGlmIChpbmNyICE9IDApIHsKKyAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7CisgICAgICAgICAgICBodWZmICs9IGluY3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaHVmZiA9IDA7CisKKyAgICAgICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovCisgICAgICAgIHN5bSsrOworICAgICAgICBpZiAoLS0oY291bnRbbGVuXSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGxlbiA9PSBtYXgpIGJyZWFrOworICAgICAgICAgICAgbGVuID0gbGVuc1t3b3JrW3N5bV1dOworICAgICAgICB9CisKKyAgICAgICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovCisgICAgICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi8KKyAgICAgICAgICAgIGlmIChkcm9wID09IDApCisgICAgICAgICAgICAgICAgZHJvcCA9IHJvb3Q7CisKKyAgICAgICAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi8KKyAgICAgICAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqLworCisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi8KKyAgICAgICAgICAgIGN1cnIgPSBsZW4gLSBkcm9wOworICAgICAgICAgICAgbGVmdCA9IChpbnQpKDEgPDwgY3Vycik7CisgICAgICAgICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKKyAgICAgICAgICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhazsKKyAgICAgICAgICAgICAgICBjdXJyKys7CisgICAgICAgICAgICAgICAgbGVmdCA8PD0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqLworICAgICAgICAgICAgdXNlZCArPSAxVSA8PCBjdXJyOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSCAtIE1BWEQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovCisgICAgICAgICAgICBsb3cgPSBodWZmICYgbWFzazsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10ub3AgPSAodW5zaWduZWQgY2hhciljdXJyOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpcm9vdDsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10udmFsID0gKHVuc2lnbmVkIHNob3J0KShuZXh0IC0gKnRhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICAgRmlsbCBpbiByZXN0IG9mIHRhYmxlIGZvciBpbmNvbXBsZXRlIGNvZGVzLiAgVGhpcyBsb29wIGlzIHNpbWlsYXIgdG8gdGhlCisgICAgICAgbG9vcCBhYm92ZSBpbiBpbmNyZW1lbnRpbmcgaHVmZiBmb3IgdGFibGUgaW5kaWNlcy4gIEl0IGlzIGFzc3VtZWQgdGhhdAorICAgICAgIGxlbiBpcyBlcXVhbCB0byBjdXJyICsgZHJvcCwgc28gdGhlcmUgaXMgbm8gbG9vcCBuZWVkZWQgdG8gaW5jcmVtZW50CisgICAgICAgdGhyb3VnaCBoaWdoIGluZGV4IGJpdHMuICBXaGVuIHRoZSBjdXJyZW50IHN1Yi10YWJsZSBpcyBmaWxsZWQsIHRoZSBsb29wCisgICAgICAgZHJvcHMgYmFjayB0byB0aGUgcm9vdCB0YWJsZSB0byBmaWxsIGluIGFueSByZW1haW5pbmcgZW50cmllcyB0aGVyZS4KKyAgICAgKi8KKyAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgICAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICB3aGlsZSAoaHVmZiAhPSAwKSB7CisgICAgICAgIC8qIHdoZW4gZG9uZSB3aXRoIHN1Yi10YWJsZSwgZHJvcCBiYWNrIHRvIHJvb3QgdGFibGUgKi8KKyAgICAgICAgaWYgKGRyb3AgIT0gMCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgZHJvcCA9IDA7CisgICAgICAgICAgICBsZW4gPSByb290OworICAgICAgICAgICAgbmV4dCA9ICp0YWJsZTsKKyAgICAgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKWxlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHB1dCBpbnZhbGlkIGNvZGUgbWFya2VyIGluIHRhYmxlICovCisgICAgICAgIG5leHRbaHVmZiA+PiBkcm9wXSA9IHRoaXM7CisKKyAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKKyAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQorICAgICAgICAgICAgaW5jciA+Pj0gMTsKKyAgICAgICAgaWYgKGluY3IgIT0gMCkgeworICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKKyAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBodWZmID0gMDsKKyAgICB9CisKKyAgICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi8KKyAgICAqdGFibGUgKz0gdXNlZDsKKyAgICAqYml0cyA9IHJvb3Q7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9pbmZ0cmVlcy5oIGIvdXNyL2tsaWJjL3psaWIvaW5mdHJlZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTEwNGM4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvaW5mdHJlZXMuaApAQCAtMCwwICsxLDU1IEBACisvKiBpbmZ0cmVlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mdHJlZXMuYworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBTdHJ1Y3R1cmUgZm9yIGRlY29kaW5nIHRhYmxlcy4gIEVhY2ggZW50cnkgcHJvdmlkZXMgZWl0aGVyIHRoZQorICAgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRvIHRoZSBvcGVyYXRpb24gcmVxdWVzdGVkIGJ5IHRoZSBjb2RlIHRoYXQKKyAgIGluZGV4ZWQgdGhhdCB0YWJsZSBlbnRyeSwgb3IgaXQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGFub3RoZXIKKyAgIHRhYmxlIHRoYXQgaW5kZXhlcyBtb3JlIGJpdHMgb2YgdGhlIGNvZGUuICBvcCBpbmRpY2F0ZXMgd2hldGhlcgorICAgdGhlIGVudHJ5IGlzIGEgcG9pbnRlciB0byBhbm90aGVyIHRhYmxlLCBhIGxpdGVyYWwsIGEgbGVuZ3RoIG9yCisgICBkaXN0YW5jZSwgYW4gZW5kLW9mLWJsb2NrLCBvciBhbiBpbnZhbGlkIGNvZGUuICBGb3IgYSB0YWJsZQorICAgcG9pbnRlciwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIG9mCisgICB0aGF0IHRhYmxlLiAgRm9yIGEgbGVuZ3RoIG9yIGRpc3RhbmNlLCB0aGUgbG93IGZvdXIgYml0cyBvZiBvcAorICAgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIGdldCBhZnRlciB0aGUgY29kZS4gIGJpdHMgaXMKKyAgIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3IgcGFydCBvZiB0aGUgY29kZSB0byBkcm9wIG9mZgorICAgb2YgdGhlIGJpdCBidWZmZXIuICB2YWwgaXMgdGhlIGFjdHVhbCBieXRlIHRvIG91dHB1dCBpbiB0aGUgY2FzZQorICAgb2YgYSBsaXRlcmFsLCB0aGUgYmFzZSBsZW5ndGggb3IgZGlzdGFuY2UsIG9yIHRoZSBvZmZzZXQgZnJvbQorICAgdGhlIGN1cnJlbnQgdGFibGUgdG8gdGhlIG5leHQgdGFibGUuICBFYWNoIGVudHJ5IGlzIGZvdXIgYnl0ZXMuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBvcDsgICAgICAgICAgIC8qIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgdGFibGUgYml0cyAqLworICAgIHVuc2lnbmVkIGNoYXIgYml0czsgICAgICAgICAvKiBiaXRzIGluIHRoaXMgcGFydCBvZiB0aGUgY29kZSAqLworICAgIHVuc2lnbmVkIHNob3J0IHZhbDsgICAgICAgICAvKiBvZmZzZXQgaW4gdGFibGUgb3IgY29kZSB2YWx1ZSAqLworfSBjb2RlOworCisvKiBvcCB2YWx1ZXMgYXMgc2V0IGJ5IGluZmxhdGVfdGFibGUoKToKKyAgICAwMDAwMDAwMCAtIGxpdGVyYWwKKyAgICAwMDAwdHR0dCAtIHRhYmxlIGxpbmssIHR0dHQgIT0gMCBpcyB0aGUgbnVtYmVyIG9mIHRhYmxlIGluZGV4IGJpdHMKKyAgICAwMDAxZWVlZSAtIGxlbmd0aCBvciBkaXN0YW5jZSwgZWVlZSBpcyB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMKKyAgICAwMTEwMDAwMCAtIGVuZCBvZiBibG9jaworICAgIDAxMDAwMDAwIC0gaW52YWxpZCBjb2RlCisgKi8KKworLyogTWF4aW11bSBzaXplIG9mIGR5bmFtaWMgdHJlZS4gIFRoZSBtYXhpbXVtIGZvdW5kIGluIGEgbG9uZyBidXQgbm9uLQorICAgZXhoYXVzdGl2ZSBzZWFyY2ggd2FzIDE0NDQgY29kZSBzdHJ1Y3R1cmVzICg4NTIgZm9yIGxlbmd0aC9saXRlcmFscworICAgYW5kIDU5MiBmb3IgZGlzdGFuY2VzLCB0aGUgbGF0dGVyIGFjdHVhbGx5IHRoZSByZXN1bHQgb2YgYW4KKyAgIGV4aGF1c3RpdmUgc2VhcmNoKS4gIFRoZSB0cnVlIG1heGltdW0gaXMgbm90IGtub3duLCBidXQgdGhlIHZhbHVlCisgICBiZWxvdyBpcyBtb3JlIHRoYW4gc2FmZS4gKi8KKyNkZWZpbmUgRU5PVUdIIDIwNDgKKyNkZWZpbmUgTUFYRCA1OTIKKworLyogVHlwZSBvZiBjb2RlIHRvIGJ1aWxkIGZvciBpbmZ0YWJsZSgpICovCit0eXBlZGVmIGVudW0geworICAgIENPREVTLAorICAgIExFTlMsCisgICAgRElTVFMKK30gY29kZXR5cGU7CisKK2V4dGVybiBpbnQgaW5mbGF0ZV90YWJsZSBPRigoY29kZXR5cGUgdHlwZSwgdW5zaWduZWQgc2hvcnQgRkFSICpsZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2RlcywgY29kZSBGQVIgKiBGQVIgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGQVIgKmJpdHMsIHVuc2lnbmVkIHNob3J0IEZBUiAqd29yaykpOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvdHJlZXMuYyBiL3Vzci9rbGliYy96bGliL3RyZWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1NzhhMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL3RyZWVzLmMKQEAgLTAsMCArMSwxMjE5IEBACisvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIHVzZXMgc2V2ZXJhbCBIdWZmbWFuIHRyZWVzLiBUaGUgbW9yZQorICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBiaXQgc2VxdWVuY2VzLgorICoKKyAqICAgICAgRWFjaCBjb2RlIHRyZWUgaXMgc3RvcmVkIGluIGEgY29tcHJlc3NlZCBmb3JtIHdoaWNoIGlzIGl0c2VsZgorICogYSBIdWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgY29kZSBzdHJpbmdzIChpbgorICogYXNjZW5kaW5nIG9yZGVyIGJ5IHNvdXJjZSB2YWx1ZXMpLiAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlCisgKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGxlbmd0aHMgaW4gdGhlIGluZmxhdGUgcHJvY2VzcywgYXMgZGVzY3JpYmVkCisgKiBpbiB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCInRGVmbGF0ZScgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KKyAqICAgICAgQXZhaWxhYmxlIGluIGZ0cC51dS5uZXQ6L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy9kZWZsYXRlLTEuMS5kb2MKKyAqCisgKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KKyAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCisgKgorICogICAgICBTZWRnZXdpY2ssIFIuCisgKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgorICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KKyAqLworCisvKiBAKCMpICRJZDogdHJlZXMuYyx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisvKiAjZGVmaW5lIEdFTl9UUkVFU19IICovCisKKyNpbmNsdWRlICJkZWZsYXRlLmgiCisKKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0YW50cworICovCisKKyNkZWZpbmUgTUFYX0JMX0JJVFMgNworLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqLworCisjZGVmaW5lIEVORF9CTE9DSyAyNTYKKy8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi8KKworI2RlZmluZSBSRVBfM182ICAgICAgMTYKKy8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzNfMTAgICAgMTcKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCisjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAorLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2xiaXRzW0xFTkdUSF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLworICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworICAgPSB7MCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM307CisKK2xvY2FsIGNvbnN0IGludCBleHRyYV9ibGJpdHNbQkxfQ09ERVNdLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDd9OworCitsb2NhbCBjb25zdCB1Y2ggYmxfb3JkZXJbQkxfQ09ERVNdCisgICA9IHsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1fTsKKy8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmcKKyAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLgorICovCisKKyNkZWZpbmUgQnVmX3NpemUgKDggKiAyKnNpemVvZihjaGFyKSkKKy8qIE51bWJlciBvZiBiaXRzIHVzZWQgd2l0aGluIGJpX2J1Zi4gKGJpX2J1ZiBtaWdodCBiZSBpbXBsZW1lbnRlZCBvbgorICogbW9yZSB0aGFuIDE2IGJpdHMgb24gc29tZSBzeXN0ZW1zLikKKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuCisgKi8KKworI2RlZmluZSBESVNUX0NPREVfTEVOICA1MTIgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovCisKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorLyogbm9uIEFOU0kgY29tcGlsZXJzIG1heSBub3QgYWNjZXB0IHRyZWVzLmggKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXTsKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0CisgKiBiZWxvdykuCisgKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107CisvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlCisgKiA1IGJpdHMuKQorICovCisKK3VjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dOworLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcworICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgorICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuCisgKi8KKwordWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOworLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLworCitsb2NhbCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2Rpc3RbRF9DT0RFU107CisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCisjZWxzZQorIyAgaW5jbHVkZSAidHJlZXMuaCIKKyNlbmRpZiAvKiBHRU5fVFJFRVNfSCAqLworCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHsKKyAgICBjb25zdCBjdF9kYXRhICpzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KKyAgICBjb25zdCBpbnRmICpleHRyYV9iaXRzOyAgICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCisgICAgaW50ICAgICBleHRyYV9iYXNlOyAgICAgICAgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCisgICAgaW50ICAgICBlbGVtczsgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCisgICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCit9OworCitsb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfbF9kZXNjID0KK3tzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUysxLCBMX0NPREVTLCBNQVhfQklUU307CisKK2xvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19kX2Rlc2MgPQore3N0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTfTsKKworbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2JsX2Rlc2MgPQoreyhjb25zdCBjdF9kYXRhICopMCwgZXh0cmFfYmxiaXRzLCAwLCAgIEJMX0NPREVTLCBNQVhfQkxfQklUU307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgKHN0YXRpYykgcm91dGluZXMgaW4gdGhpcyBmaWxlLgorICovCisKK2xvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgaW5pdF9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgcHFkb3duaGVhcCAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBrKSk7Citsb2NhbCB2b2lkIGdlbl9iaXRsZW4gICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB0cmVlX2Rlc2MgKmRlc2MpKTsKK2xvY2FsIHZvaWQgZ2VuX2NvZGVzICAgICAgT0YoKGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSwgdXNoZiAqYmxfY291bnQpKTsKK2xvY2FsIHZvaWQgYnVpbGRfdHJlZSAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBzY2FuX3RyZWUgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Citsb2NhbCB2b2lkIHNlbmRfdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBsY29kZXMsIGludCBkY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxjb2RlcykpOworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9kYXRhICpkdHJlZSkpOworbG9jYWwgdm9pZCBzZXRfZGF0YV90eXBlICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdW5zaWduZWQgYmlfcmV2ZXJzZSBPRigodW5zaWduZWQgdmFsdWUsIGludCBsZW5ndGgpKTsKK2xvY2FsIHZvaWQgYmlfd2luZHVwICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgYmlfZmx1c2ggICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgY29weV9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVuc2lnbmVkIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXIpKTsKKworI2lmZGVmIEdFTl9UUkVFU19ICitsb2NhbCB2b2lkIGdlbl90cmVlc19oZWFkZXIgT0YoKHZvaWQpKTsKKyNlbmRpZgorCisjaWZuZGVmIERFQlVHCisjICBkZWZpbmUgc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKQorICAgLyogU2VuZCBhIGNvZGUgb2YgdGhlIGdpdmVuIHRyZWUuIGMgYW5kIHRyZWUgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKworI2Vsc2UgLyogREVCVUcgKi8KKyMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgXAorICAgICB7IGlmICh6X3ZlcmJvc2U+MikgZnByaW50ZihzdGRlcnIsIlxuY2QgJTNkICIsKGMpKTsgXAorICAgICAgIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKTsgfQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uCisgKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuCisgKi8KKyNkZWZpbmUgcHV0X3Nob3J0KHMsIHcpIHsgXAorICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTsgXAorICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTsgXAorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLgorICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuCisgKi8KKyNpZmRlZiBERUJVRworbG9jYWwgdm9pZCBzZW5kX2JpdHMgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKSk7CisKK2xvY2FsIHZvaWQgc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgdmFsdWU7ICAvKiB2YWx1ZSB0byBzZW5kICovCisgICAgaW50IGxlbmd0aDsgLyogbnVtYmVyIG9mIGJpdHMgKi8KK3sKKyAgICBUcmFjZXZ2KChzdGRlcnIsIiBsICUyZCB2ICU0eCAiLCBsZW5ndGgsIHZhbHVlKSk7CisgICAgQXNzZXJ0KGxlbmd0aCA+IDAgJiYgbGVuZ3RoIDw9IDE1LCAiaW52YWxpZCBsZW5ndGgiKTsKKyAgICBzLT5iaXRzX3NlbnQgKz0gKHVsZylsZW5ndGg7CisKKyAgICAvKiBJZiBub3QgZW5vdWdoIHJvb20gaW4gYmlfYnVmLCB1c2UgKHZhbGlkKSBiaXRzIGZyb20gYmlfYnVmIGFuZAorICAgICAqICgxNiAtIGJpX3ZhbGlkKSBiaXRzIGZyb20gdmFsdWUsIGxlYXZpbmcgKHdpZHRoIC0gKDE2LWJpX3ZhbGlkKSkKKyAgICAgKiB1bnVzZWQgYml0cyBpbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuZ3RoKSB7CisgICAgICAgIHMtPmJpX2J1ZiB8PSAodmFsdWUgPDwgcy0+YmlfdmFsaWQpOworICAgICAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTsKKyAgICAgICAgcy0+YmlfYnVmID0gKHVzaCl2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLT5iaV92YWxpZCk7CisgICAgICAgIHMtPmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmJpX2J1ZiB8PSB2YWx1ZSA8PCBzLT5iaV92YWxpZDsKKyAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoOworICAgIH0KK30KKyNlbHNlIC8qICFERUJVRyAqLworCisjZGVmaW5lIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSBcCit7IGludCBsZW4gPSBsZW5ndGg7XAorICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuKSB7XAorICAgIGludCB2YWwgPSB2YWx1ZTtcCisgICAgcy0+YmlfYnVmIHw9ICh2YWwgPDwgcy0+YmlfdmFsaWQpO1wKKyAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTtcCisgICAgcy0+YmlfYnVmID0gKHVzaCl2YWwgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW4gLSBCdWZfc2l6ZTtcCisgIH0gZWxzZSB7XAorICAgIHMtPmJpX2J1ZiB8PSAodmFsdWUpIDw8IHMtPmJpX3ZhbGlkO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW47XAorICB9XAorfQorI2VuZGlmIC8qIERFQlVHICovCisKKworLyogdGhlIGFyZ3VtZW50cyBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuCisgKi8KK2xvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQoKQoreworI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCisgICAgc3RhdGljIGludCBzdGF0aWNfaW5pdF9kb25lID0gMDsKKyAgICBpbnQgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi8KKyAgICBpbnQgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqLworICAgIGludCBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqLworICAgIGludCBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi8KKyAgICB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07CisgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCisKKyAgICBpZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuOworCisgICAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqLworICAgIHN0YXRpY19sX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfbHRyZWU7CisgICAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7CisgICAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTsKKyAgICBzdGF0aWNfZF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9kYml0czsKKyAgICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBsZW5ndGggKDAuLjI1NSkgLT4gbGVuZ3RoIGNvZGUgKDAuLjI4KSAqLworICAgIGxlbmd0aCA9IDA7CisgICAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUy0xOyBjb2RlKyspIHsKKyAgICAgICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHsKKyAgICAgICAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChsZW5ndGggPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTYiKTsKKyAgICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAorICAgICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlCisgICAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOgorICAgICAqLworICAgIF9sZW5ndGhfY29kZVtsZW5ndGgtMV0gPSAodWNoKWNvZGU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi8KKyAgICBkaXN0ID0gMDsKKyAgICBmb3IgKGNvZGUgPSAwIDsgY29kZSA8IDE2OyBjb2RlKyspIHsKKyAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9kYml0c1tjb2RlXSk7IG4rKykgeworICAgICAgICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTYiKTsKKyAgICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KKyAgICBmb3IgKCA7IGNvZGUgPCBEX0NPREVTOyBjb2RlKyspIHsKKyAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PChleHRyYV9kYml0c1tjb2RlXS03KSk7IG4rKykgeworICAgICAgICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyIik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBibF9jb3VudFtiaXRzXSA9IDA7CisgICAgbiA9IDA7CisgICAgd2hpbGUgKG4gPD0gMTQzKSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIHdoaWxlIChuIDw9IDI1NSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOSwgYmxfY291bnRbOV0rKzsKKyAgICB3aGlsZSAobiA8PSAyNzkpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDcsIGJsX2NvdW50WzddKys7CisgICAgd2hpbGUgKG4gPD0gMjg3KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZQorICAgICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZQorICAgICAqIGFsbCBvbmVzKQorICAgICAqLworICAgIGdlbl9jb2RlcygoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgTF9DT0RFUysxLCBibF9jb3VudCk7CisKKyAgICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5MZW4gPSA1OworICAgICAgICBzdGF0aWNfZHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UoKHVuc2lnbmVkKW4sIDUpOworICAgIH0KKyAgICBzdGF0aWNfaW5pdF9kb25lID0gMTsKKworIyAgaWZkZWYgR0VOX1RSRUVTX0gKKyAgICBnZW5fdHJlZXNfaGVhZGVyKCk7CisjICBlbmRpZgorI2VuZGlmIC8qIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2VuZXJlcmF0ZSB0aGUgZmlsZSB0cmVlcy5oIGRlc2NyaWJpbmcgdGhlIHN0YXRpYyB0cmVlcy4KKyAqLworI2lmZGVmIEdFTl9UUkVFU19ICisjICBpZm5kZWYgREVCVUcKKyMgICAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGVuZGlmCisKKyMgIGRlZmluZSBTRVBBUkFUT1IoaSwgbGFzdCwgd2lkdGgpIFwKKyAgICAgICgoaSkgPT0gKGxhc3QpPyAiXG59O1xuXG4iIDogICAgXAorICAgICAgICgoaSkgJSAod2lkdGgpID09ICh3aWR0aCktMSA/ICIsXG4iIDogIiwgIikpCisKK3ZvaWQgZ2VuX3RyZWVzX2hlYWRlcigpCit7CisgICAgRklMRSAqaGVhZGVyID0gZm9wZW4oInRyZWVzLmgiLCAidyIpOworICAgIGludCBpOworCisgICAgQXNzZXJ0IChoZWFkZXIgIT0gTlVMTCwgIkNhbid0IG9wZW4gdHJlZXMuaCIpOworICAgIGZwcmludGYoaGVhZGVyLAorICAgICAgICAgICAgIi8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovXG5cbiIpOworCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IExfQ09ERVMrMjsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAie3slM3V9LHslM3V9fSVzIiwgc3RhdGljX2x0cmVlW2ldLkNvZGUsCisgICAgICAgICAgICAgICAgc3RhdGljX2x0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIExfQ09ERVMrMSwgNSkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRF9DT0RFUzsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAie3slMnV9LHslMnV9fSVzIiwgc3RhdGljX2R0cmVlW2ldLkNvZGUsCisgICAgICAgICAgICAgICAgc3RhdGljX2R0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIERfQ09ERVMtMSwgNSkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAiY29uc3QgdWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRElTVF9DT0RFX0xFTjsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfZGlzdF9jb2RlW2ldLAorICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBESVNUX0NPREVfTEVOLTEsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUFUQ0gtTUlOX01BVENIKzE7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUydSVzIiwgX2xlbmd0aF9jb2RlW2ldLAorICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBNQVhfTUFUQ0gtTUlOX01BVENILCAyMCkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTEVOR1RIX0NPREVTOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMXUlcyIsIGJhc2VfbGVuZ3RoW2ldLAorICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBMRU5HVEhfQ09ERVMtMSwgMjApKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGludCBiYXNlX2Rpc3RbRF9DT0RFU10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRF9DT0RFUzsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTV1JXMiLCBiYXNlX2Rpc3RbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIERfQ09ERVMtMSwgMTApKTsKKyAgICB9CisKKyAgICBmY2xvc2UoaGVhZGVyKTsKK30KKyNlbmRpZiAvKiBHRU5fVFJFRVNfSCAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS4KKyAqLwordm9pZCBfdHJfaW5pdChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgdHJfc3RhdGljX2luaXQoKTsKKworICAgIHMtPmxfZGVzYy5keW5fdHJlZSA9IHMtPmR5bl9sdHJlZTsKKyAgICBzLT5sX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19sX2Rlc2M7CisKKyAgICBzLT5kX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fZHRyZWU7CisgICAgcy0+ZF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfZF9kZXNjOworCisgICAgcy0+YmxfZGVzYy5keW5fdHJlZSA9IHMtPmJsX3RyZWU7CisgICAgcy0+YmxfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2JsX2Rlc2M7CisKKyAgICBzLT5iaV9idWYgPSAwOworICAgIHMtPmJpX3ZhbGlkID0gMDsKKyAgICBzLT5sYXN0X2VvYl9sZW4gPSA4OyAvKiBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlICovCisjaWZkZWYgREVCVUcKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOworICAgIHMtPmJpdHNfc2VudCA9IDBMOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KKyAgICBpbml0X2Jsb2NrKHMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCisgKi8KK2xvY2FsIHZvaWQgaW5pdF9ibG9jayhzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCisgICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHMtPmR5bl9sdHJlZVtuXS5GcmVxID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgcy0+ZHluX2R0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSBzLT5ibF90cmVlW25dLkZyZXEgPSAwOworCisgICAgcy0+ZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisgICAgcy0+b3B0X2xlbiA9IHMtPnN0YXRpY19sZW4gPSAwTDsKKyAgICBzLT5sYXN0X2xpdCA9IHMtPm1hdGNoZXMgPSAwOworfQorCisjZGVmaW5lIFNNQUxMRVNUIDEKKy8qIEluZGV4IHdpdGhpbiB0aGUgaGVhcCBhcnJheSBvZiBsZWFzdCBmcmVxdWVudCBub2RlIGluIHRoZSBIdWZmbWFuIHRyZWUgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSBoZWFwIGFuZCByZWNyZWF0ZSB0aGUgaGVhcCB3aXRoCisgKiBvbmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgorICovCisjZGVmaW5lIHBxcmVtb3ZlKHMsIHRyZWUsIHRvcCkgXAore1wKKyAgICB0b3AgPSBzLT5oZWFwW1NNQUxMRVNUXTsgXAorICAgIHMtPmhlYXBbU01BTExFU1RdID0gcy0+aGVhcFtzLT5oZWFwX2xlbi0tXTsgXAorICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KKyAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgorICovCisjZGVmaW5lIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIFwKKyAgICh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgfHwgXAorICAgKHRyZWVbbl0uRnJlcSA9PSB0cmVlW21dLkZyZXEgJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAorICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKKyAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAqIHR3byBzb25zKS4KKyAqLworbG9jYWwgdm9pZCBwcWRvd25oZWFwKHMsIHRyZWUsIGspCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqLworICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovCit7CisgICAgaW50IHYgPSBzLT5oZWFwW2tdOworICAgIGludCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLworICAgIHdoaWxlIChqIDw9IHMtPmhlYXBfbGVuKSB7CisgICAgICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCisgICAgICAgIGlmIChqIDwgcy0+aGVhcF9sZW4gJiYKKyAgICAgICAgICAgIHNtYWxsZXIodHJlZSwgcy0+aGVhcFtqKzFdLCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworICAgICAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIGJyZWFrOworCisgICAgICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisgICAgICAgIHMtPmhlYXBba10gPSBzLT5oZWFwW2pdOyAgayA9IGo7CisKKyAgICAgICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLworICAgICAgICBqIDw8PSAxOworICAgIH0KKyAgICBzLT5oZWFwW2tdID0gdjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aAorICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKKyAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlCisgKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCisgKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzCisgKiAgICAgbm90IG51bGwuCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbihzLCBkZXNjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBpbnQgbWF4X2NvZGUgICAgICAgICA9IGRlc2MtPm1heF9jb2RlOworICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKKyAgICBjb25zdCBpbnRmICpleHRyYSAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYml0czsKKyAgICBpbnQgYmFzZSAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYmFzZTsKKyAgICBpbnQgbWF4X2xlbmd0aCAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+bWF4X2xlbmd0aDsKKyAgICBpbnQgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi8KKyAgICBpbnQgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLworICAgIGludCB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqLworICAgIHVzaCBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovCisgICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqLworCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBzLT5ibF9jb3VudFtiaXRzXSA9IDA7CisKKyAgICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heQorICAgICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLgorICAgICAqLworICAgIHRyZWVbcy0+aGVhcFtzLT5oZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi8KKworICAgIGZvciAoaCA9IHMtPmhlYXBfbWF4KzE7IGggPCBIRUFQX1NJWkU7IGgrKykgeworICAgICAgICBuID0gcy0+aGVhcFtoXTsKKyAgICAgICAgYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7CisgICAgICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkgYml0cyA9IG1heF9sZW5ndGgsIG92ZXJmbG93Kys7CisgICAgICAgIHRyZWVbbl0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqLworCisgICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNvbnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KKworICAgICAgICBzLT5ibF9jb3VudFtiaXRzXSsrOworICAgICAgICB4Yml0cyA9IDA7CisgICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFbbi1iYXNlXTsKKyAgICAgICAgZiA9IHRyZWVbbl0uRnJlcTsKKyAgICAgICAgcy0+b3B0X2xlbiArPSAodWxnKWYgKiAoYml0cyArIHhiaXRzKTsKKyAgICAgICAgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuICs9ICh1bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CisgICAgfQorICAgIGlmIChvdmVyZmxvdyA9PSAwKSByZXR1cm47CisKKyAgICBUcmFjZSgoc3RkZXJyLCJcbmJpdCBsZW5ndGggb3ZlcmZsb3dcbiIpKTsKKyAgICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqLworCisgICAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi8KKyAgICBkbyB7CisgICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoLTE7CisgICAgICAgIHdoaWxlIChzLT5ibF9jb3VudFtiaXRzXSA9PSAwKSBiaXRzLS07CisgICAgICAgIHMtPmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovCisgICAgICAgIHMtPmJsX2NvdW50W2JpdHMrMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqLworICAgICAgICBzLT5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOworICAgICAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLAorICAgICAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KKyAgICAgICAgICovCisgICAgICAgIG92ZXJmbG93IC09IDI7CisgICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKKworICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAgICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsCisgICAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW4KKyAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9IDA7IGJpdHMtLSkgeworICAgICAgICBuID0gcy0+YmxfY291bnRbYml0c107CisgICAgICAgIHdoaWxlIChuICE9IDApIHsKKyAgICAgICAgICAgIG0gPSBzLT5oZWFwWy0taF07CisgICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpIHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgeworICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsImNvZGUgJWQgYml0cyAlZC0+JWRcbiIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7CisgICAgICAgICAgICAgICAgcy0+b3B0X2xlbiArPSAoKGxvbmcpYml0cyAtIChsb25nKXRyZWVbbV0uTGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsb25nKXRyZWVbbV0uRnJlcTsKKyAgICAgICAgICAgICAgICB0cmVlW21dLkxlbiA9ICh1c2gpYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKKyAqIG9wdGltYWwpLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3IKKyAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vbgorICogICAgIHplcm8gY29kZSBsZW5ndGguCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2NvZGVzICh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpCisgICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KKyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovCit7CisgICAgdXNoIG5leHRfY29kZVtNQVhfQklUUysxXTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgICB1c2ggY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovCisKKyAgICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXMKKyAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHsKKyAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAorICAgICAgICAgICAgImluY29uc2lzdGVudCBiaXQgY291bnRzIik7CisgICAgVHJhY2V2KChzdGRlcnIsIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOworCisgICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBpbnQgbGVuID0gdHJlZVtuXS5MZW47CisgICAgICAgIGlmIChsZW4gPT0gMCkgY29udGludWU7CisgICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCisgICAgICAgIHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTsKKworICAgICAgICBUcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLCJcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgIiwKKyAgICAgICAgICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KKyAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCisgKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKKyAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCisgKi8KK2xvY2FsIHZvaWQgYnVpbGRfdHJlZShzLCBkZXNjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7CisgICAgY29uc3QgY3RfZGF0YSAqc3RyZWUgID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKKyAgICBpbnQgZWxlbXMgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmVsZW1zOworICAgIGludCBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqLworICAgIGludCBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KKyAgICBpbnQgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqLworCisgICAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgorICAgICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgorICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCisgICAgICovCisgICAgcy0+aGVhcF9sZW4gPSAwLCBzLT5oZWFwX21heCA9IEhFQVBfU0laRTsKKworICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7CisgICAgICAgIGlmICh0cmVlW25dLkZyZXEgIT0gMCkgeworICAgICAgICAgICAgcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gbWF4X2NvZGUgPSBuOworICAgICAgICAgICAgcy0+ZGVwdGhbbl0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJlZVtuXS5MZW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKKyAgICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKKyAgICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAorICAgICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCisgICAgICovCisgICAgd2hpbGUgKHMtPmhlYXBfbGVuIDwgMikgeworICAgICAgICBub2RlID0gcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTsKKyAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gMTsKKyAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAwOworICAgICAgICBzLT5vcHRfbGVuLS07IGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiAtPSBzdHJlZVtub2RlXS5MZW47CisgICAgICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqLworICAgIH0KKyAgICBkZXNjLT5tYXhfY29kZSA9IG1heF9jb2RlOworCisgICAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLAorICAgICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgorICAgICAqLworICAgIGZvciAobiA9IHMtPmhlYXBfbGVuLzI7IG4gPj0gMTsgbi0tKSBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOworCisgICAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3bworICAgICAqIGZyZXF1ZW50IG5vZGVzLgorICAgICAqLworICAgIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLworICAgIGRvIHsKKyAgICAgICAgcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi8KKyAgICAgICAgbSA9IHMtPmhlYXBbU01BTExFU1RdOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLworCisgICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi8KKyAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbTsKKworICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLworICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7CisgICAgICAgIHMtPmRlcHRoW25vZGVdID0gKHVjaCkoKHMtPmRlcHRoW25dID49IHMtPmRlcHRoW21dID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVwdGhbbl0gOiBzLT5kZXB0aFttXSkgKyAxKTsKKyAgICAgICAgdHJlZVtuXS5EYWQgPSB0cmVlW21dLkRhZCA9ICh1c2gpbm9kZTsKKyNpZmRlZiBEVU1QX0JMX1RSRUUKKyAgICAgICAgaWYgKHRyZWUgPT0gcy0+YmxfdHJlZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBub2RlKys7CisgICAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOworCisgICAgfSB3aGlsZSAocy0+aGVhcF9sZW4gPj0gMik7CisKKyAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBzLT5oZWFwW1NNQUxMRVNUXTsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKKyAgICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuCisgICAgICovCisgICAgZ2VuX2JpdGxlbihzLCAodHJlZV9kZXNjICopZGVzYyk7CisKKyAgICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCisgICAgZ2VuX2NvZGVzICgoY3RfZGF0YSAqKXRyZWUsIG1heF9jb2RlLCBzLT5ibF9jb3VudCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcworICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4KKyAqLworbG9jYWwgdm9pZCBzY2FuX3RyZWUgKHMsIHRyZWUsIG1heF9jb2RlKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKKyAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCisgKiBibF90cmVlLgorICovCitsb2NhbCB2b2lkIHNlbmRfdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworCisgICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOworICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKyAgICAgICAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7CisgICAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IGNvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDIpOworCisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KKyAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICovCitsb2NhbCBpbnQgYnVpbGRfYmxfdHJlZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgcy0+bF9kZXNjLm1heF9jb2RlKTsKKyAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUsIHMtPmRfZGVzYy5tYXhfY29kZSk7CisKKyAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLworICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmJsX2Rlc2MpKSk7CisgICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAorICAgICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuCisgICAgICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKKyAgICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cworICAgICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKKyAgICAgKi8KKyAgICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMtMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkgeworICAgICAgICBpZiAocy0+YmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi8KKyAgICBzLT5vcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsgNSs1KzQ7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGQiLAorICAgICAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpOworCisgICAgcmV0dXJuIG1heF9ibGluZGV4OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZQorICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuCisgKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuCisgKi8KK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovCit7CisgICAgaW50IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqLworCisgICAgQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKKyAgICBBc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsCisgICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7CisgICAgc2VuZF9iaXRzKHMsIGxjb2Rlcy0yNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBzZW5kX2JpdHMocywgZGNvZGVzLTEsICAgNSk7CisgICAgc2VuZF9iaXRzKHMsIGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisgICAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgeworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKKyAgICAgICAgc2VuZF9iaXRzKHMsIHMtPmJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7CisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKKworICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgZGNvZGVzLTEpOyAvKiBkaXN0YW5jZSB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgc3RvcmVkIGJsb2NrCisgKi8KK3ZvaWQgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGVvZikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovCisgICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCisgICAgaW50IGVvZjsgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KK3sKKyAgICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSzw8MSkrZW9mLCAzKTsgIC8qIHNlbmQgYmxvY2sgdHlwZSAqLworI2lmZGVmIERFQlVHCisgICAgcy0+Y29tcHJlc3NlZF9sZW4gPSAocy0+Y29tcHJlc3NlZF9sZW4gKyAzICsgNykgJiAodWxnKX43TDsKKyAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAoc3RvcmVkX2xlbiArIDQpIDw8IDM7CisjZW5kaWYKKyAgICBjb3B5X2Jsb2NrKHMsIGJ1ZiwgKHVuc2lnbmVkKXN0b3JlZF9sZW4sIDEpOyAvKiB3aXRoIGhlYWRlciAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuCisgKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci4KKyAqIFRoZSBjdXJyZW50IGluZmxhdGUgY29kZSByZXF1aXJlcyA5IGJpdHMgb2YgbG9va2FoZWFkLiBJZiB0aGUKKyAqIGxhc3QgdHdvIGNvZGVzIGZvciB0aGUgcHJldmlvdXMgYmxvY2sgKHJlYWwgY29kZSBwbHVzIEVPQikgd2VyZSBjb2RlZAorICogb24gNSBiaXRzIG9yIGxlc3MsIGluZmxhdGUgbWF5IGhhdmUgb25seSA1KzMgYml0cyBvZiBsb29rYWhlYWQgdG8gZGVjb2RlCisgKiB0aGUgbGFzdCByZWFsIGNvZGUuIEluIHRoaXMgY2FzZSB3ZSBzZW5kIHR3byBlbXB0eSBzdGF0aWMgYmxvY2tzIGluc3RlYWQKKyAqIG9mIG9uZS4gKFRoZXJlIGFyZSBubyBwcm9ibGVtcyBpZiB0aGUgcHJldmlvdXMgYmxvY2sgaXMgc3RvcmVkIG9yIGZpeGVkLikKKyAqIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBhc3N1bWUgdGhlIHdvcnN0IGNhc2Ugb2YgbGFzdCByZWFsIGNvZGUgZW5jb2RlZAorICogb24gb25lIGJpdCBvbmx5LgorICovCit2b2lkIF90cl9hbGlnbihzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CisgICAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTsKKyNpZmRlZiBERUJVRworICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDEwTDsgLyogMyBmb3IgYmxvY2sgdHlwZSwgNyBmb3IgRU9CICovCisjZW5kaWYKKyAgICBiaV9mbHVzaChzKTsKKyAgICAvKiBPZiB0aGUgMTAgYml0cyBmb3IgdGhlIGVtcHR5IGJsb2NrLCB3ZSBoYXZlIGFscmVhZHkgc2VudAorICAgICAqICgxMCAtIGJpX3ZhbGlkKSBiaXRzLiBUaGUgbG9va2FoZWFkIGZvciB0aGUgbGFzdCByZWFsIGNvZGUgKGJlZm9yZQorICAgICAqIHRoZSBFT0Igb2YgdGhlIHByZXZpb3VzIGJsb2NrKSB3YXMgdGh1cyBhdCBsZWFzdCBvbmUgcGx1cyB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIEVPQiBwbHVzIHdoYXQgd2UgaGF2ZSBqdXN0IHNlbnQgb2YgdGhlIGVtcHR5IHN0YXRpYyBibG9jay4KKyAgICAgKi8KKyAgICBpZiAoMSArIHMtPmxhc3RfZW9iX2xlbiArIDEwIC0gcy0+YmlfdmFsaWQgPCA5KSB7CisgICAgICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOworICAgICAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDEwTDsKKyNlbmRpZgorICAgICAgICBiaV9mbHVzaChzKTsKKyAgICB9CisgICAgcy0+bGFzdF9lb2JfbGVuID0gNzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKKyAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS4KKyAqLwordm9pZCBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovCisgICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCisgICAgaW50IGVvZjsgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KK3sKKyAgICB1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCisgICAgaW50IG1heF9ibGluZGV4ID0gMDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworICAgIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi8KKyAgICBpZiAocy0+bGV2ZWwgPiAwKSB7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi8KKyAgICAgICAgaWYgKHN0b3JlZF9sZW4gPiAwICYmIHMtPnN0cm0tPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pCisgICAgICAgICAgICBzZXRfZGF0YV90eXBlKHMpOworCisgICAgICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKKyAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7CisKKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+ZF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisgICAgICAgICAgICAgICAgcy0+c3RhdGljX2xlbikpOworICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKyAgICAgICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKyAgICAgICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgICAgICAgICAqLworICAgICAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLworICAgICAgICBvcHRfbGVuYiA9IChzLT5vcHRfbGVuKzMrNyk+PjM7CisgICAgICAgIHN0YXRpY19sZW5iID0gKHMtPnN0YXRpY19sZW4rMys3KT4+MzsKKworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgIiwKKyAgICAgICAgICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisgICAgICAgICAgICAgICAgcy0+bGFzdF9saXQpKTsKKworICAgICAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKKyAgICAgICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqLworICAgIH0KKworI2lmZGVmIEZPUkNFX1NUT1JFRAorICAgIGlmIChidWYgIT0gKGNoYXIqKTApIHsgLyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCisjZWxzZQorICAgIGlmIChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIgJiYgYnVmICE9IChjaGFyKikwKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KKyNlbmRpZgorICAgICAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLgorICAgICAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCisgICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgorICAgICAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG8KKyAgICAgICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KKyAgICAgICAgICovCisgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpOworCisjaWZkZWYgRk9SQ0VfU1RBVElDCisgICAgfSBlbHNlIGlmIChzdGF0aWNfbGVuYiA+PSAwKSB7IC8qIGZvcmNlIHN0YXRpYyB0cmVlcyAqLworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKHMtPnN0cmF0ZWd5ID09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT0gb3B0X2xlbmIpIHsKKyNlbmRpZgorICAgICAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUzw8MSkrZW9mLCAzKTsKKyAgICAgICAgY29tcHJlc3NfYmxvY2socywgKGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsIChjdF9kYXRhICopc3RhdGljX2R0cmVlKTsKKyNpZmRlZiBERUJVRworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAzICsgcy0+c3RhdGljX2xlbjsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTPDwxKStlb2YsIDMpOworICAgICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLT5sX2Rlc2MubWF4X2NvZGUrMSwgcy0+ZF9kZXNjLm1heF9jb2RlKzEsCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9ibGluZGV4KzEpOworICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5vcHRfbGVuOworI2VuZGlmCisgICAgfQorICAgIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCAiYmFkIGNvbXByZXNzZWQgc2l6ZSIpOworICAgIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CCisgICAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuCisgICAgICovCisgICAgaW5pdF9ibG9jayhzKTsKKworICAgIGlmIChlb2YpIHsKKyAgICAgICAgYmlfd2luZHVwKHMpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDc7ICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisjZW5kaWYKKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsIlxuY29tcHJsZW4gJWx1KCVsdSkgIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsCisgICAgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqZW9mKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmCisgKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuCisgKi8KK2ludCBfdHJfdGFsbHkgKHMsIGRpc3QsIGxjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdW5zaWduZWQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovCit7CisgICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gKHVzaClkaXN0OworICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gKHVjaClsYzsKKyAgICBpZiAoZGlzdCA9PSAwKSB7CisgICAgICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqLworICAgICAgICBzLT5keW5fbHRyZWVbbGNdLkZyZXErKzsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tYXRjaGVzKys7CisgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKyAgICAgICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovCisgICAgICAgIEFzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmCisgICAgICAgICAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmCisgICAgICAgICAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgICJfdHJfdGFsbHk6IGJhZCBtYXRjaCIpOworCisgICAgICAgIHMtPmR5bl9sdHJlZVtfbGVuZ3RoX2NvZGVbbGNdK0xJVEVSQUxTKzFdLkZyZXErKzsKKyAgICAgICAgcy0+ZHluX2R0cmVlW2RfY29kZShkaXN0KV0uRnJlcSsrOworICAgIH0KKworI2lmZGVmIFRSVU5DQVRFX0JMT0NLCisgICAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovCisgICAgaWYgKChzLT5sYXN0X2xpdCAmIDB4MWZmZikgPT0gMCAmJiBzLT5sZXZlbCA+IDIpIHsKKyAgICAgICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovCisgICAgICAgIHVsZyBvdXRfbGVuZ3RoID0gKHVsZylzLT5sYXN0X2xpdCo4TDsKKyAgICAgICAgdWxnIGluX2xlbmd0aCA9ICh1bGcpKChsb25nKXMtPnN0cnN0YXJ0IC0gcy0+YmxvY2tfc3RhcnQpOworICAgICAgICBpbnQgZGNvZGU7CisgICAgICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHsKKyAgICAgICAgICAgIG91dF9sZW5ndGggKz0gKHVsZylzLT5keW5fZHRyZWVbZGNvZGVdLkZyZXEgKgorICAgICAgICAgICAgICAgICg1TCtleHRyYV9kYml0c1tkY29kZV0pOworICAgICAgICB9CisgICAgICAgIG91dF9sZW5ndGggPj49IDM7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCJcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSAiLAorICAgICAgICAgICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCwKKyAgICAgICAgICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7CisgICAgICAgIGlmIChzLT5tYXRjaGVzIDwgcy0+bGFzdF9saXQvMiAmJiBvdXRfbGVuZ3RoIDwgaW5fbGVuZ3RoLzIpIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7CisgICAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLCisgICAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG8KKyAgICAgKiA2NEstMSBieXRlcy4KKyAgICAgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXMKKyAqLworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovCisgICAgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi8KK3sKKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgaW50IGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi8KKyAgICB1bnNpZ25lZCBseCA9IDA7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKyAgICB1bnNpZ25lZCBjb2RlOyAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KKyAgICBpbnQgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi8KKworICAgIGlmIChzLT5sYXN0X2xpdCAhPSAwKSBkbyB7CisgICAgICAgIGRpc3QgPSBzLT5kX2J1ZltseF07CisgICAgICAgIGxjID0gcy0+bF9idWZbbHgrK107CisgICAgICAgIGlmIChkaXN0ID09IDApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLCIgJyVjJyAiLCBsYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLworICAgICAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107CisgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZStMSVRFUkFMUysxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTsKKyAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTsKKyAgICAgICAgICAgIEFzc2VydCAoY29kZSA8IERfQ09ERVMsICJiYWQgZF9jb2RlIik7CisKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdOworICAgICAgICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLworICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovCisKKyAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1ZiBpcyBvazogKi8KKyAgICAgICAgQXNzZXJ0KCh1SW50KShzLT5wZW5kaW5nKSA8IHMtPmxpdF9idWZzaXplICsgMipseCwKKyAgICAgICAgICAgICAgICJwZW5kaW5nQnVmIG92ZXJmbG93Iik7CisKKyAgICB9IHdoaWxlIChseCA8IHMtPmxhc3RfbGl0KTsKKworICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTsKKyAgICBzLT5sYXN0X2VvYl9sZW4gPSBsdHJlZVtFTkRfQkxPQ0tdLkxlbjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgdGhlIGRhdGEgdHlwZSB0byBCSU5BUlkgb3IgVEVYVCwgdXNpbmcgYSBjcnVkZSBhcHByb3hpbWF0aW9uOgorICogc2V0IGl0IHRvIFpfVEVYVCBpZiBhbGwgc3ltYm9scyBhcmUgZWl0aGVyIHByaW50YWJsZSBjaGFyYWN0ZXJzICgzMyB0byAyNTUpCisgKiBvciB3aGl0ZSBzcGFjZXMgKDkgdG8gMTMsIG9yIDMyKTsgb3Igc2V0IGl0IHRvIFpfQklOQVJZIG90aGVyd2lzZS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LgorICovCitsb2NhbCB2b2lkIHNldF9kYXRhX3R5cGUocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IDk7IG4rKykKKyAgICAgICAgaWYgKHMtPmR5bl9sdHJlZVtuXS5GcmVxICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAobiA9PSA5KQorICAgICAgICBmb3IgKG4gPSAxNDsgbiA8IDMyOyBuKyspCisgICAgICAgICAgICBpZiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICBzLT5zdHJtLT5kYXRhX3R5cGUgPSAobiA9PSAzMikgPyBaX1RFWFQgOiBaX0JJTkFSWTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlcgorICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKQorICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNQorICovCitsb2NhbCB1bnNpZ25lZCBiaV9yZXZlcnNlKGNvZGUsIGxlbikKKyAgICB1bnNpZ25lZCBjb2RlOyAvKiB0aGUgdmFsdWUgdG8gaW52ZXJ0ICovCisgICAgaW50IGxlbjsgICAgICAgLyogaXRzIGJpdCBsZW5ndGggKi8KK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCByZXMgPSAwOworICAgIGRvIHsKKyAgICAgICAgcmVzIHw9IGNvZGUgJiAxOworICAgICAgICBjb2RlID4+PSAxLCByZXMgPDw9IDE7CisgICAgfSB3aGlsZSAoLS1sZW4gPiAwKTsKKyAgICByZXR1cm4gcmVzID4+IDE7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuCisgKi8KK2xvY2FsIHZvaWQgYmlfZmx1c2gocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGlmIChzLT5iaV92YWxpZCA9PSAxNikgeworICAgICAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTsKKyAgICAgICAgcy0+YmlfYnVmID0gMDsKKyAgICAgICAgcy0+YmlfdmFsaWQgPSAwOworICAgIH0gZWxzZSBpZiAocy0+YmlfdmFsaWQgPj0gOCkgeworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPj49IDg7CisgICAgICAgIHMtPmJpX3ZhbGlkIC09IDg7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeQorICovCitsb2NhbCB2b2lkIGJpX3dpbmR1cChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaWYgKHMtPmJpX3ZhbGlkID4gOCkgeworICAgICAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTsKKyAgICB9IGVsc2UgaWYgKHMtPmJpX3ZhbGlkID4gMCkgeworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpOworICAgIH0KKyAgICBzLT5iaV9idWYgPSAwOworICAgIHMtPmJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworICAgIHMtPmJpdHNfc2VudCA9IChzLT5iaXRzX3NlbnQrNykgJiB+NzsKKyNlbmRpZgorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzCisgKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC4KKyAqLworbG9jYWwgdm9pZCBjb3B5X2Jsb2NrKHMsIGJ1ZiwgbGVuLCBoZWFkZXIpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi8KKyAgICBpbnQgICAgICBoZWFkZXI7ICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi8KK3sKKyAgICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisgICAgcy0+bGFzdF9lb2JfbGVuID0gODsgLyogZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZSAqLworCisgICAgaWYgKGhlYWRlcikgeworICAgICAgICBwdXRfc2hvcnQocywgKHVzaClsZW4pOworICAgICAgICBwdXRfc2hvcnQocywgKHVzaCl+bGVuKTsKKyNpZmRlZiBERUJVRworICAgICAgICBzLT5iaXRzX3NlbnQgKz0gMioxNjsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBERUJVRworICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbjw8MzsKKyNlbmRpZgorICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICBwdXRfYnl0ZShzLCAqYnVmKyspOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL3RyZWVzLmggYi91c3Iva2xpYmMvemxpYi90cmVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZGZhMTYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi90cmVlcy5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiBoZWFkZXIgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSCAqLworCitsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdID0gewore3sgMTJ9LHsgIDh9fSwge3sxNDB9LHsgIDh9fSwge3sgNzZ9LHsgIDh9fSwge3syMDR9LHsgIDh9fSwge3sgNDR9LHsgIDh9fSwKK3t7MTcyfSx7ICA4fX0sIHt7MTA4fSx7ICA4fX0sIHt7MjM2fSx7ICA4fX0sIHt7IDI4fSx7ICA4fX0sIHt7MTU2fSx7ICA4fX0sCit7eyA5Mn0seyAgOH19LCB7ezIyMH0seyAgOH19LCB7eyA2MH0seyAgOH19LCB7ezE4OH0seyAgOH19LCB7ezEyNH0seyAgOH19LAore3syNTJ9LHsgIDh9fSwge3sgIDJ9LHsgIDh9fSwge3sxMzB9LHsgIDh9fSwge3sgNjZ9LHsgIDh9fSwge3sxOTR9LHsgIDh9fSwKK3t7IDM0fSx7ICA4fX0sIHt7MTYyfSx7ICA4fX0sIHt7IDk4fSx7ICA4fX0sIHt7MjI2fSx7ICA4fX0sIHt7IDE4fSx7ICA4fX0sCit7ezE0Nn0seyAgOH19LCB7eyA4Mn0seyAgOH19LCB7ezIxMH0seyAgOH19LCB7eyA1MH0seyAgOH19LCB7ezE3OH0seyAgOH19LAore3sxMTR9LHsgIDh9fSwge3syNDJ9LHsgIDh9fSwge3sgMTB9LHsgIDh9fSwge3sxMzh9LHsgIDh9fSwge3sgNzR9LHsgIDh9fSwKK3t7MjAyfSx7ICA4fX0sIHt7IDQyfSx7ICA4fX0sIHt7MTcwfSx7ICA4fX0sIHt7MTA2fSx7ICA4fX0sIHt7MjM0fSx7ICA4fX0sCit7eyAyNn0seyAgOH19LCB7ezE1NH0seyAgOH19LCB7eyA5MH0seyAgOH19LCB7ezIxOH0seyAgOH19LCB7eyA1OH0seyAgOH19LAore3sxODZ9LHsgIDh9fSwge3sxMjJ9LHsgIDh9fSwge3syNTB9LHsgIDh9fSwge3sgIDZ9LHsgIDh9fSwge3sxMzR9LHsgIDh9fSwKK3t7IDcwfSx7ICA4fX0sIHt7MTk4fSx7ICA4fX0sIHt7IDM4fSx7ICA4fX0sIHt7MTY2fSx7ICA4fX0sIHt7MTAyfSx7ICA4fX0sCit7ezIzMH0seyAgOH19LCB7eyAyMn0seyAgOH19LCB7ezE1MH0seyAgOH19LCB7eyA4Nn0seyAgOH19LCB7ezIxNH0seyAgOH19LAore3sgNTR9LHsgIDh9fSwge3sxODJ9LHsgIDh9fSwge3sxMTh9LHsgIDh9fSwge3syNDZ9LHsgIDh9fSwge3sgMTR9LHsgIDh9fSwKK3t7MTQyfSx7ICA4fX0sIHt7IDc4fSx7ICA4fX0sIHt7MjA2fSx7ICA4fX0sIHt7IDQ2fSx7ICA4fX0sIHt7MTc0fSx7ICA4fX0sCit7ezExMH0seyAgOH19LCB7ezIzOH0seyAgOH19LCB7eyAzMH0seyAgOH19LCB7ezE1OH0seyAgOH19LCB7eyA5NH0seyAgOH19LAore3syMjJ9LHsgIDh9fSwge3sgNjJ9LHsgIDh9fSwge3sxOTB9LHsgIDh9fSwge3sxMjZ9LHsgIDh9fSwge3syNTR9LHsgIDh9fSwKK3t7ICAxfSx7ICA4fX0sIHt7MTI5fSx7ICA4fX0sIHt7IDY1fSx7ICA4fX0sIHt7MTkzfSx7ICA4fX0sIHt7IDMzfSx7ICA4fX0sCit7ezE2MX0seyAgOH19LCB7eyA5N30seyAgOH19LCB7ezIyNX0seyAgOH19LCB7eyAxN30seyAgOH19LCB7ezE0NX0seyAgOH19LAore3sgODF9LHsgIDh9fSwge3syMDl9LHsgIDh9fSwge3sgNDl9LHsgIDh9fSwge3sxNzd9LHsgIDh9fSwge3sxMTN9LHsgIDh9fSwKK3t7MjQxfSx7ICA4fX0sIHt7ICA5fSx7ICA4fX0sIHt7MTM3fSx7ICA4fX0sIHt7IDczfSx7ICA4fX0sIHt7MjAxfSx7ICA4fX0sCit7eyA0MX0seyAgOH19LCB7ezE2OX0seyAgOH19LCB7ezEwNX0seyAgOH19LCB7ezIzM30seyAgOH19LCB7eyAyNX0seyAgOH19LAore3sxNTN9LHsgIDh9fSwge3sgODl9LHsgIDh9fSwge3syMTd9LHsgIDh9fSwge3sgNTd9LHsgIDh9fSwge3sxODV9LHsgIDh9fSwKK3t7MTIxfSx7ICA4fX0sIHt7MjQ5fSx7ICA4fX0sIHt7ICA1fSx7ICA4fX0sIHt7MTMzfSx7ICA4fX0sIHt7IDY5fSx7ICA4fX0sCit7ezE5N30seyAgOH19LCB7eyAzN30seyAgOH19LCB7ezE2NX0seyAgOH19LCB7ezEwMX0seyAgOH19LCB7ezIyOX0seyAgOH19LAore3sgMjF9LHsgIDh9fSwge3sxNDl9LHsgIDh9fSwge3sgODV9LHsgIDh9fSwge3syMTN9LHsgIDh9fSwge3sgNTN9LHsgIDh9fSwKK3t7MTgxfSx7ICA4fX0sIHt7MTE3fSx7ICA4fX0sIHt7MjQ1fSx7ICA4fX0sIHt7IDEzfSx7ICA4fX0sIHt7MTQxfSx7ICA4fX0sCit7eyA3N30seyAgOH19LCB7ezIwNX0seyAgOH19LCB7eyA0NX0seyAgOH19LCB7ezE3M30seyAgOH19LCB7ezEwOX0seyAgOH19LAore3syMzd9LHsgIDh9fSwge3sgMjl9LHsgIDh9fSwge3sxNTd9LHsgIDh9fSwge3sgOTN9LHsgIDh9fSwge3syMjF9LHsgIDh9fSwKK3t7IDYxfSx7ICA4fX0sIHt7MTg5fSx7ICA4fX0sIHt7MTI1fSx7ICA4fX0sIHt7MjUzfSx7ICA4fX0sIHt7IDE5fSx7ICA5fX0sCit7ezI3NX0seyAgOX19LCB7ezE0N30seyAgOX19LCB7ezQwM30seyAgOX19LCB7eyA4M30seyAgOX19LCB7ezMzOX0seyAgOX19LAore3syMTF9LHsgIDl9fSwge3s0Njd9LHsgIDl9fSwge3sgNTF9LHsgIDl9fSwge3szMDd9LHsgIDl9fSwge3sxNzl9LHsgIDl9fSwKK3t7NDM1fSx7ICA5fX0sIHt7MTE1fSx7ICA5fX0sIHt7MzcxfSx7ICA5fX0sIHt7MjQzfSx7ICA5fX0sIHt7NDk5fSx7ICA5fX0sCit7eyAxMX0seyAgOX19LCB7ezI2N30seyAgOX19LCB7ezEzOX0seyAgOX19LCB7ezM5NX0seyAgOX19LCB7eyA3NX0seyAgOX19LAore3szMzF9LHsgIDl9fSwge3syMDN9LHsgIDl9fSwge3s0NTl9LHsgIDl9fSwge3sgNDN9LHsgIDl9fSwge3syOTl9LHsgIDl9fSwKK3t7MTcxfSx7ICA5fX0sIHt7NDI3fSx7ICA5fX0sIHt7MTA3fSx7ICA5fX0sIHt7MzYzfSx7ICA5fX0sIHt7MjM1fSx7ICA5fX0sCit7ezQ5MX0seyAgOX19LCB7eyAyN30seyAgOX19LCB7ezI4M30seyAgOX19LCB7ezE1NX0seyAgOX19LCB7ezQxMX0seyAgOX19LAore3sgOTF9LHsgIDl9fSwge3szNDd9LHsgIDl9fSwge3syMTl9LHsgIDl9fSwge3s0NzV9LHsgIDl9fSwge3sgNTl9LHsgIDl9fSwKK3t7MzE1fSx7ICA5fX0sIHt7MTg3fSx7ICA5fX0sIHt7NDQzfSx7ICA5fX0sIHt7MTIzfSx7ICA5fX0sIHt7Mzc5fSx7ICA5fX0sCit7ezI1MX0seyAgOX19LCB7ezUwN30seyAgOX19LCB7eyAgN30seyAgOX19LCB7ezI2M30seyAgOX19LCB7ezEzNX0seyAgOX19LAore3szOTF9LHsgIDl9fSwge3sgNzF9LHsgIDl9fSwge3szMjd9LHsgIDl9fSwge3sxOTl9LHsgIDl9fSwge3s0NTV9LHsgIDl9fSwKK3t7IDM5fSx7ICA5fX0sIHt7Mjk1fSx7ICA5fX0sIHt7MTY3fSx7ICA5fX0sIHt7NDIzfSx7ICA5fX0sIHt7MTAzfSx7ICA5fX0sCit7ezM1OX0seyAgOX19LCB7ezIzMX0seyAgOX19LCB7ezQ4N30seyAgOX19LCB7eyAyM30seyAgOX19LCB7ezI3OX0seyAgOX19LAore3sxNTF9LHsgIDl9fSwge3s0MDd9LHsgIDl9fSwge3sgODd9LHsgIDl9fSwge3szNDN9LHsgIDl9fSwge3syMTV9LHsgIDl9fSwKK3t7NDcxfSx7ICA5fX0sIHt7IDU1fSx7ICA5fX0sIHt7MzExfSx7ICA5fX0sIHt7MTgzfSx7ICA5fX0sIHt7NDM5fSx7ICA5fX0sCit7ezExOX0seyAgOX19LCB7ezM3NX0seyAgOX19LCB7ezI0N30seyAgOX19LCB7ezUwM30seyAgOX19LCB7eyAxNX0seyAgOX19LAore3syNzF9LHsgIDl9fSwge3sxNDN9LHsgIDl9fSwge3szOTl9LHsgIDl9fSwge3sgNzl9LHsgIDl9fSwge3szMzV9LHsgIDl9fSwKK3t7MjA3fSx7ICA5fX0sIHt7NDYzfSx7ICA5fX0sIHt7IDQ3fSx7ICA5fX0sIHt7MzAzfSx7ICA5fX0sIHt7MTc1fSx7ICA5fX0sCit7ezQzMX0seyAgOX19LCB7ezExMX0seyAgOX19LCB7ezM2N30seyAgOX19LCB7ezIzOX0seyAgOX19LCB7ezQ5NX0seyAgOX19LAore3sgMzF9LHsgIDl9fSwge3syODd9LHsgIDl9fSwge3sxNTl9LHsgIDl9fSwge3s0MTV9LHsgIDl9fSwge3sgOTV9LHsgIDl9fSwKK3t7MzUxfSx7ICA5fX0sIHt7MjIzfSx7ICA5fX0sIHt7NDc5fSx7ICA5fX0sIHt7IDYzfSx7ICA5fX0sIHt7MzE5fSx7ICA5fX0sCit7ezE5MX0seyAgOX19LCB7ezQ0N30seyAgOX19LCB7ezEyN30seyAgOX19LCB7ezM4M30seyAgOX19LCB7ezI1NX0seyAgOX19LAore3s1MTF9LHsgIDl9fSwge3sgIDB9LHsgIDd9fSwge3sgNjR9LHsgIDd9fSwge3sgMzJ9LHsgIDd9fSwge3sgOTZ9LHsgIDd9fSwKK3t7IDE2fSx7ICA3fX0sIHt7IDgwfSx7ICA3fX0sIHt7IDQ4fSx7ICA3fX0sIHt7MTEyfSx7ICA3fX0sIHt7ICA4fSx7ICA3fX0sCit7eyA3Mn0seyAgN319LCB7eyA0MH0seyAgN319LCB7ezEwNH0seyAgN319LCB7eyAyNH0seyAgN319LCB7eyA4OH0seyAgN319LAore3sgNTZ9LHsgIDd9fSwge3sxMjB9LHsgIDd9fSwge3sgIDR9LHsgIDd9fSwge3sgNjh9LHsgIDd9fSwge3sgMzZ9LHsgIDd9fSwKK3t7MTAwfSx7ICA3fX0sIHt7IDIwfSx7ICA3fX0sIHt7IDg0fSx7ICA3fX0sIHt7IDUyfSx7ICA3fX0sIHt7MTE2fSx7ICA3fX0sCit7eyAgM30seyAgOH19LCB7ezEzMX0seyAgOH19LCB7eyA2N30seyAgOH19LCB7ezE5NX0seyAgOH19LCB7eyAzNX0seyAgOH19LAore3sxNjN9LHsgIDh9fSwge3sgOTl9LHsgIDh9fSwge3syMjd9LHsgIDh9fQorfTsKKworbG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU10gPSB7Cit7eyAwfSx7IDV9fSwge3sxNn0seyA1fX0sIHt7IDh9LHsgNX19LCB7ezI0fSx7IDV9fSwge3sgNH0seyA1fX0sCit7ezIwfSx7IDV9fSwge3sxMn0seyA1fX0sIHt7Mjh9LHsgNX19LCB7eyAyfSx7IDV9fSwge3sxOH0seyA1fX0sCit7ezEwfSx7IDV9fSwge3syNn0seyA1fX0sIHt7IDZ9LHsgNX19LCB7ezIyfSx7IDV9fSwge3sxNH0seyA1fX0sCit7ezMwfSx7IDV9fSwge3sgMX0seyA1fX0sIHt7MTd9LHsgNX19LCB7eyA5fSx7IDV9fSwge3syNX0seyA1fX0sCit7eyA1fSx7IDV9fSwge3syMX0seyA1fX0sIHt7MTN9LHsgNX19LCB7ezI5fSx7IDV9fSwge3sgM30seyA1fX0sCit7ezE5fSx7IDV9fSwge3sxMX0seyA1fX0sIHt7Mjd9LHsgNX19LCB7eyA3fSx7IDV9fSwge3syM30seyA1fX0KK307CisKK2NvbnN0IHVjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dID0geworIDAsICAxLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAorIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLAorMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsICAwLCAgMCwgMTYsIDE3LAorMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LAorMjQsIDI0LCAyNCwgMjQsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LAorMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorMjcsIDI3LCAyNywgMjcsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LAorMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LAorMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LAorMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAorMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAorMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAorMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOQorfTsKKworY29uc3QgdWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7CisgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCisxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksCisxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsCisyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsCisyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsCisyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCisyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCisyNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyOAorfTsKKworbG9jYWwgY29uc3QgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU10gPSB7CiswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI0LCAyOCwgMzIsIDQwLCA0OCwgNTYsCis2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMAorfTsKKworbG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHsKKyAgICAwLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDYsICAgICA4LCAgICAxMiwgICAgMTYsICAgIDI0LAorICAgMzIsICAgIDQ4LCAgICA2NCwgICAgOTYsICAgMTI4LCAgIDE5MiwgICAyNTYsICAgMzg0LCAgIDUxMiwgICA3NjgsCisgMTAyNCwgIDE1MzYsICAyMDQ4LCAgMzA3MiwgIDQwOTYsICA2MTQ0LCAgODE5MiwgMTIyODgsIDE2Mzg0LCAyNDU3NgorfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL3VuY29tcHIuYyBiL3Vzci9rbGliYy96bGliL3VuY29tcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJlZTQzOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL3VuY29tcHIuYwpAQCAtMCwwICsxLDYxIEBACisvKiB1bmNvbXByLmMgLS0gZGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQ6IHVuY29tcHIuYyx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNpbmNsdWRlICJ6bGliLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCisgICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCisgICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCisgICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKKyAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCisgICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorCisgICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KKyovCitpbnQgWkVYUE9SVCB1bmNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKKyAgICBCeXRlZiAqZGVzdDsKKyAgICB1TG9uZ2YgKmRlc3RMZW47CisgICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCBlcnI7CisKKyAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOworICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICBpZiAoZXJyID09IFpfTkVFRF9ESUNUIHx8IChlcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDApKQorICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvemNvbmYuaW4uaCBiL3Vzci9rbGliYy96bGliL3pjb25mLmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1NzVlYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL3pjb25mLmluLmgKQEAgLTAsMCArMSwzMzIgQEAKKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkOiB6Y29uZi5pbi5oLHYgMS4xIDIwMDUvMDIvMjcgMjM6MTU6MzkgaHBhIEV4cCAkICovCisKKyNpZm5kZWYgWkNPTkZfSAorI2RlZmluZSBaQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqLworI2lmZGVmIFpfUFJFRklYCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQorIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCisjICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0CisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCisjICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAorIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5CisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKKyMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAorIyAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCisjICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAorIyAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisKKyMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCisjICBkZWZpbmUgZnJlZV9mdW5jICAgICAgICAgICAgIHpfZnJlZV9mdW5jCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYworIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCisjICBkZWZpbmUgQnl0ZSAgICAgICAgICAgICAgICAgIHpfQnl0ZQorIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1TG9uZyAgICAgICAgICAgICAgICAgel91TG9uZworIyAgZGVmaW5lIEJ5dGVmICAgICAgICAgICAgICAgICB6X0J5dGVmCisjICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBpbnRmICAgICAgICAgICAgICAgICAgel9pbnRmCisjICBkZWZpbmUgdUludGYgICAgICAgICAgICAgICAgIHpfdUludGYKKyMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCisjICBkZWZpbmUgTVNET1MKKyNlbmRpZgorI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKKyMgIGRlZmluZSBPUzIKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgV0lORE9XUworI2VuZGlmCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCisjICBpZm5kZWYgV0lOMzIKKyMgICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgorI2VuZGlmCisjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKKyMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKKyMgICAgaWZuZGVmIFNZUzE2QklUCisjICAgICAgZGVmaW5lIFNZUzE2QklUCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQorICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGRlZmluZSBNQVhTRUdfNjRLCisjZW5kaWYKKyNpZmRlZiBNU0RPUworIyAgZGVmaW5lIFVOQUxJR05FRF9PSworI2VuZGlmCisKKyNpZmRlZiBfX1NURENfVkVSU0lPTl9fCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKKyMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgICBpZm5kZWYgU1REQzk5CisjICAgICAgZGVmaW5lIFNUREM5OQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmbmRlZiBTVERDCisjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCisjICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisvKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLworI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLworI2lmbmRlZiBNQVhfTUVNX0xFVkVMCisjICBpZmRlZiBNQVhTRUdfNjRLCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgorICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcworICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5CisgKiBnemlwLikKKyAqLworI2lmbmRlZiBNQVhfV0JJVFMKKyMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KKyNlbmRpZgorCisvKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKKyAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCisgdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCisgcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKKyB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKKyAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgorIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCisKKyAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cworIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKKyBmb3Igc21hbGwgb2JqZWN0cy4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworIyAgaWZkZWYgU1REQworIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAorICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KKyAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQorICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAorICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQorICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX01TQ19WRVIKKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQorICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9fQk9STEFORENfXworIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KKyAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCisjICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKKyAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KKyAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgorICAgICovCisjICBpZmRlZiBaTElCX1dJTkFQSQorIyAgICBpZmRlZiBGQVIKKyMgICAgICB1bmRlZiBGQVIKKyMgICAgZW5kaWYKKyMgICAgaW5jbHVkZSA8d2luZG93cy5oPgorICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KKyAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KKyMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCisjICAgIGlmZGVmIFdJTjMyCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CRU9TX18pCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpFWFRFUk4KKyMgIGRlZmluZSBaRVhURVJOIGV4dGVybgorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlQKKyMgIGRlZmluZSBaRVhQT1JUCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVFZBCisjICBkZWZpbmUgWkVYUE9SVFZBCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyMgIGRlZmluZSBGQVIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCisKKyNpZmRlZiBTTUFMTF9NRURJVU0KKyAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCisjICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKKyNlbmRpZgordHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Cit0eXBlZGVmIGludCAgIEZBUiBpbnRmOwordHlwZWRlZiB1SW50ICBGQVIgdUludGY7Cit0eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7CisKKyNpZmRlZiBTVERDCisgICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKKyNlbmRpZgorCisjaWYgMCAgICAgICAgICAgLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLworIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLworIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgIC8qIGZvciBTRUVLXyogYW5kIG9mZl90ICovCisjICBpZmRlZiBWTVMKKyMgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgLyogZm9yIG9mZl90ICovCisjICBlbmRpZgorIyAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKKyNlbmRpZgorI2lmbmRlZiBTRUVLX1NFVAorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBsb25nCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKQorIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBpZmRlZiBGQVIKKyMgICAgdW5kZWYgRkFSCisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCisjaWYgZGVmaW5lZChfX01WU19fKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorIyAgIHByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKKyNlbmRpZgorCisjZW5kaWYgLyogWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvemxpYi4zIGIvdXNyL2tsaWJjL3psaWIvemxpYi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjgxNjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi96bGliLjMKQEAgLTAsMCArMSwxNTkgQEAKKy5USCBaTElCIDMgIjE4IEp1bHkgMjAwNSIKKy5TSCBOQU1FCit6bGliIFwtIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gbGlicmFyeQorLlNIIFNZTk9QU0lTCitbc2VlCisuSSB6bGliLmgKK2ZvciBmdWxsIGRlc2NyaXB0aW9uXQorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5JIHpsaWIKK2xpYnJhcnkgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorVGhlIGNvZGUgaXMgdGhyZWFkIHNhZmUuCitJdCBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLAoraW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQorYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlcgorYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZSBzdHJlYW0gaW50ZXJmYWNlLgorLkxQCitDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZSBlbm91Z2gKKyhmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLAorb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLgorSW4gdGhlIGxhdHRlciBjYXNlLAordGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyhwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisuTFAKK1RoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbgorLklSIGd6aXAgKDEpCisoLmd6KSBmb3JtYXQKK3dpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KKy5MUAorVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuCitUaGUgZGVjb2RlciBjaGVja3MgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsCitzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKy5MUAorQWxsIGZ1bmN0aW9ucyBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZQorLklSIHpsaWIuaCAuCitUaGUgZGlzdHJpYnV0aW9uIHNvdXJjZSBpbmNsdWRlcyBleGFtcGxlcyBvZiB1c2Ugb2YgdGhlIGxpYnJhcnkKK2luIHRoZSBmaWxlcworLkkgZXhhbXBsZS5jCithbmQKKy5JUiBtaW5pZ3ppcC5jIC4KKy5MUAorQ2hhbmdlcyB0byB0aGlzIHZlcnNpb24gYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKKy5JIENoYW5nZUxvZwordGhhdCBhY2NvbXBhbmllcyB0aGUgc291cmNlLAorYW5kIGFyZSBjb25jZXJuZWQgcHJpbWFyaWx5IHdpdGggYnVnIGZpeGVzIGFuZCBwb3J0YWJpbGl0eSBlbmhhbmNlbWVudHMuCisuTFAKK0EgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZgorLkkgemxpYgoraXMgYXZhaWxhYmxlIGluIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdCAxLjE6CisuSVAKK2h0dHA6Ly93d3cuamF2YXNvZnQuY29tL3Byb2R1Y3RzL0pESy8xLjEvZG9jcy9hcGkvUGFja2FnZS1qYXZhLnV0aWwuemlwLmh0bWwKKy5MUAorQSBQZXJsIGludGVyZmFjZSB0bworLklSIHpsaWIgLAord3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIChwbXFzQGNwYW4ub3JnKSwKK2lzIGF2YWlsYWJsZSBhdCBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcywKK2luY2x1ZGluZzoKKy5JUAoraHR0cDovL3d3dy5jcGFuLm9yZy9tb2R1bGVzL2J5LW1vZHVsZS9Db21wcmVzcy8KKy5MUAorQSBQeXRob24gaW50ZXJmYWNlIHRvCisuSVIgemxpYiAsCit3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgKGFta0BtYWduZXQuY29tKSwKK2lzIGF2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9uczoKKy5JUAoraHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9saWIvbW9kdWxlLXpsaWIuaHRtbAorLkxQCitBCisuSSB6bGliCitiaW5kaW5nIGZvcgorLklSIHRjbCAoMSksCit3cml0dGVuIGJ5IEFuZHJlYXMgS3VwcmllcyAoYS5rdXByaWVzQHdlc3RlbmQuY29tKSwKK2lzIGF2YWlsbGFibGUgYXQ6CisuSVAKK2h0dHA6Ly93d3cud2VzdGVuZC5jb20vfmt1cHJpZXMvZG9jL3RyZi9tYW4vbWFuLmh0bWwKKy5MUAorQW4gZXhwZXJpbWVudGFsIHBhY2thZ2UgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgaW4gLnppcCBmb3JtYXQsCit3cml0dGVuIG9uIHRvcCBvZgorLkkgemxpYgorYnkgR2lsbGVzIFZvbGxhbnQgKGluZm9Ad2luaW1hZ2UuY29tKSwKK2lzIGF2YWlsYWJsZSBhdDoKKy5JUAoraHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sCithbmQgYWxzbyBpbiB0aGUKKy5JIGNvbnRyaWIvbWluaXppcAorZGlyZWN0b3J5IG9mIHRoZSBtYWluCisuSSB6bGliCit3ZWIgc2l0ZS4KKy5TSCAiU0VFIEFMU08iCitUaGUKKy5JIHpsaWIKK3dlYiBzaXRlIGNhbiBiZSBmb3VuZCBhdCBlaXRoZXIgb2YgdGhlc2UgbG9jYXRpb25zOgorLklQCitodHRwOi8vd3d3LnpsaWIub3JnCisuYnIKK2h0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KKy5MUAorVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDCisoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXM6CisuSVAKK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0IChjb25jZXJuaW5nIHpsaWIgZm9ybWF0KQorLmJyCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dCAoY29uY2VybmluZyBkZWZsYXRlIGZvcm1hdCkKKy5icgoraHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1Mi50eHQgKGNvbmNlcm5pbmcgZ3ppcCBmb3JtYXQpCisuTFAKK1RoZXNlIGRvY3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gb3RoZXIgZm9ybWF0cyBmcm9tOgorLklQCitmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvemxpYi96ZG9jLWluZGV4Lmh0bWwKKy5MUAorTWFyayBOZWxzb24gKG1hcmtuQGllZWUub3JnKSB3cm90ZSBhbiBhcnRpY2xlIGFib3V0CisuSSB6bGliCitmb3IgdGhlIEphbi4gMTk5NyBpc3N1ZSBvZiAgRHIuIERvYmIncyBKb3VybmFsOworYSBjb3B5IG9mIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBhdDoKKy5JUAoraHR0cDovL2RvZ21hLm5ldC9tYXJrbi9hcnRpY2xlcy96bGlidG9vbC96bGlidG9vbC5odG0KKy5TSCAiUkVQT1JUSU5HIFBST0JMRU1TIgorQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sCitwbGVhc2UgY2hlY2sgdGhlCisuSSB6bGliCit3ZWIgc2l0ZSB0byB2ZXJpZnkgdGhhdCB5b3UgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YKKy5JUiB6bGliIDsKK290aGVyd2lzZSwKK29idGFpbiB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kIHNlZSBpZiB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMuCitQbGVhc2UgcmVhZCB0aGUKKy5JIHpsaWIKK0ZBUSBhdDoKKy5JUAoraHR0cDovL3d3dy5nemlwLm9yZy96bGliL3psaWJfZmFxLmh0bWwKKy5MUAorYmVmb3JlIGFza2luZyBmb3IgaGVscC4KK1NlbmQgcXVlc3Rpb25zIGFuZC9vciBjb21tZW50cyB0byB6bGliQGd6aXAub3JnLAorb3IgKGZvciB0aGUgV2luZG93cyBETEwgdmVyc2lvbikgdG8gR2lsbGVzIFZvbGxhbnQgKGluZm9Ad2luaW1hZ2UuY29tKS4KKy5TSCBBVVRIT1JTCitWZXJzaW9uIDEuMi4zCitDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5IChqbG91cEBnemlwLm9yZykKK2FuZCBNYXJrIEFkbGVyIChtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1KS4KKy5MUAorVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMtaXMsIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKK2FyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCitTZWUgdGhlIGRpc3RyaWJ1dGlvbiBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHJlcXVpcmVtZW50cworZ292ZXJuaW5nIHJlZGlzdHJpYnV0aW9uLgorVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkKKy5JIHpsaWIKK3dhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4KK1RoZSBkZWZsYXRlIGFuZAorLkkgemxpYgorc3BlY2lmaWNhdGlvbnMgd2VyZSB3cml0dGVuIGJ5IEwuIFBldGVyIERldXRzY2guCitUaGFua3MgdG8gYWxsIHRoZSBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cworaW1wcm92ZW1lbnRzIGluCisuSVIgemxpYiA7Cit3aG8gYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCisuTFAKK1VOSVggbWFudWFsIHBhZ2UgYnkgUi4gUC4gQy4gUm9kZ2VycywKK1UuUy4gTmF0aW9uYWwgTGlicmFyeSBvZiBNZWRpY2luZSAocm9kZ2Vyc0BubG0ubmloLmdvdikuCisuXCIgZW5kIG9mIG1hbiBwYWdlCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi96dXRpbC5jIGIvdXNyL2tsaWJjL3psaWIvenV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNlOTUzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvenV0aWwuYwpAQCAtMCwwICsxLDMxOCBAQAorLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZDogenV0aWwuYyx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKworI2lmbmRlZiBOT19EVU1NWV9ERUNMCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCitjb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdID0geworIm5lZWQgZGljdGlvbmFyeSIsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqLworInN0cmVhbSBlbmQiLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqLworIiIsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqLworImZpbGUgZXJyb3IiLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqLworInN0cmVhbSBlcnJvciIsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqLworImRhdGEgZXJyb3IiLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqLworImluc3VmZmljaWVudCBtZW1vcnkiLCAvKiBaX01FTV9FUlJPUiAgICAgKC00KSAqLworImJ1ZmZlciBlcnJvciIsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqLworImluY29tcGF0aWJsZSB2ZXJzaW9uIiwvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqLworIiJ9OworCisKK2NvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uKCkKK3sKKyAgICByZXR1cm4gWkxJQl9WRVJTSU9OOworfQorCit1TG9uZyBaRVhQT1JUIHpsaWJDb21waWxlRmxhZ3MoKQoreworICAgIHVMb25nIGZsYWdzOworCisgICAgZmxhZ3MgPSAwOworICAgIHN3aXRjaCAoc2l6ZW9mKHVJbnQpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMTsgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDI7ICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzOworICAgIH0KKyAgICBzd2l0Y2ggKHNpemVvZih1TG9uZykpIHsKKyAgICBjYXNlIDI6ICAgICBicmVhazsKKyAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDI7ICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDI7ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzIDw8IDI7CisgICAgfQorICAgIHN3aXRjaCAoc2l6ZW9mKHZvaWRwZikpIHsKKyAgICBjYXNlIDI6ICAgICBicmVhazsKKyAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDQ7ICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDQ7ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzIDw8IDQ7CisgICAgfQorICAgIHN3aXRjaCAoc2l6ZW9mKHpfb2ZmX3QpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCA2OyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCA2OyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCA2OworICAgIH0KKyNpZmRlZiBERUJVRworICAgIGZsYWdzICs9IDEgPDwgODsKKyNlbmRpZgorI2lmIGRlZmluZWQoQVNNVikgfHwgZGVmaW5lZChBU01JTkYpCisgICAgZmxhZ3MgKz0gMSA8PCA5OworI2VuZGlmCisjaWZkZWYgWkxJQl9XSU5BUEkKKyAgICBmbGFncyArPSAxIDw8IDEwOworI2VuZGlmCisjaWZkZWYgQlVJTERGSVhFRAorICAgIGZsYWdzICs9IDEgPDwgMTI7CisjZW5kaWYKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorICAgIGZsYWdzICs9IDEgPDwgMTM7CisjZW5kaWYKKyNpZmRlZiBOT19HWkNPTVBSRVNTCisgICAgZmxhZ3MgKz0gMUwgPDwgMTY7CisjZW5kaWYKKyNpZmRlZiBOT19HWklQCisgICAgZmxhZ3MgKz0gMUwgPDwgMTc7CisjZW5kaWYKKyNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorICAgIGZsYWdzICs9IDFMIDw8IDIwOworI2VuZGlmCisjaWZkZWYgRkFTVEVTVAorICAgIGZsYWdzICs9IDFMIDw8IDIxOworI2VuZGlmCisjaWZkZWYgU1REQworIyAgaWZkZWYgTk9fdnNucHJpbnRmCisgICAgICAgIGZsYWdzICs9IDFMIDw8IDI1OworIyAgICBpZmRlZiBIQVNfdnNwcmludGZfdm9pZAorICAgICAgICBmbGFncyArPSAxTCA8PCAyNjsKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWZkZWYgSEFTX3ZzbnByaW50Zl92b2lkCisgICAgICAgIGZsYWdzICs9IDFMIDw8IDI2OworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbHNlCisgICAgICAgIGZsYWdzICs9IDFMIDw8IDI0OworIyAgaWZkZWYgTk9fc25wcmludGYKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjU7CisjICAgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGlmZGVmIEhBU19zbnByaW50Zl92b2lkCisgICAgICAgIGZsYWdzICs9IDFMIDw8IDI2OworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorICAgIHJldHVybiBmbGFnczsKK30KKworI2lmZGVmIERFQlVHCisKKyMgIGlmbmRlZiB2ZXJib3NlCisjICAgIGRlZmluZSB2ZXJib3NlIDAKKyMgIGVuZGlmCitpbnQgel92ZXJib3NlID0gdmVyYm9zZTsKKwordm9pZCB6X2Vycm9yIChtKQorICAgIGNoYXIgKm07Cit7CisgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbSk7CisgICAgZXhpdCgxKTsKK30KKyNlbmRpZgorCisvKiBleHBvcnRlZCB0byBhbGxvdyBjb252ZXJzaW9uIG9mIGVycm9yIGNvZGUgdG8gc3RyaW5nIGZvciBjb21wcmVzcygpIGFuZAorICogdW5jb21wcmVzcygpCisgKi8KK2NvbnN0IGNoYXIgKiBaRVhQT1JUIHpFcnJvcihlcnIpCisgICAgaW50IGVycjsKK3sKKyAgICByZXR1cm4gRVJSX01TRyhlcnIpOworfQorCisjaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorICAgIC8qIFRoZSBNaWNyb3NvZnQgQyBSdW4tVGltZSBMaWJyYXJ5IGZvciBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZQorICAgICAqIGVycm5vLiAgV2UgZGVmaW5lIGl0IGFzIGEgZ2xvYmFsIHZhcmlhYmxlIHRvIHNpbXBsaWZ5IHBvcnRpbmcuCisgICAgICogSXRzIHZhbHVlIGlzIGFsd2F5cyAwIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuCisgICAgICovCisgICAgaW50IGVycm5vID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUVNQ1BZCisKK3ZvaWQgem1lbWNweShkZXN0LCBzb3VyY2UsIGxlbikKKyAgICBCeXRlZiogZGVzdDsKKyAgICBjb25zdCBCeXRlZiogc291cmNlOworICAgIHVJbnQgIGxlbjsKK3sKKyAgICBpZiAobGVuID09IDApIHJldHVybjsKKyAgICBkbyB7CisgICAgICAgICpkZXN0KysgPSAqc291cmNlKys7IC8qID8/PyB0byBiZSB1bnJvbGxlZCAqLworICAgIH0gd2hpbGUgKC0tbGVuICE9IDApOworfQorCitpbnQgem1lbWNtcChzMSwgczIsIGxlbikKKyAgICBjb25zdCBCeXRlZiogczE7CisgICAgY29uc3QgQnl0ZWYqIHMyOworICAgIHVJbnQgIGxlbjsKK3sKKyAgICB1SW50IGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgaWYgKHMxW2pdICE9IHMyW2pdKSByZXR1cm4gMiooczFbal0gPiBzMltqXSktMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgem1lbXplcm8oZGVzdCwgbGVuKQorICAgIEJ5dGVmKiBkZXN0OworICAgIHVJbnQgIGxlbjsKK3sKKyAgICBpZiAobGVuID09IDApIHJldHVybjsKKyAgICBkbyB7CisgICAgICAgICpkZXN0KysgPSAwOyAgLyogPz8/IHRvIGJlIHVucm9sbGVkICovCisgICAgfSB3aGlsZSAoLS1sZW4gIT0gMCk7Cit9CisjZW5kaWYKKworCisjaWZkZWYgU1lTMTZCSVQKKworI2lmZGVmIF9fVFVSQk9DX18KKy8qIFR1cmJvIEMgaW4gMTYtYml0IG1vZGUgKi8KKworIyAgZGVmaW5lIE1ZX1pDQUxMT0MKKworLyogVHVyYm8gQyBtYWxsb2MoKSBkb2VzIG5vdCBhbGxvdyBkeW5hbWljIGFsbG9jYXRpb24gb2YgNjRLIGJ5dGVzCisgKiBhbmQgZmFybWFsbG9jKDY0SykgcmV0dXJucyBhIHBvaW50ZXIgd2l0aCBhbiBvZmZzZXQgb2YgOCwgc28gd2UKKyAqIG11c3QgZml4IHRoZSBwb2ludGVyLiBXYXJuaW5nOiB0aGUgcG9pbnRlciBtdXN0IGJlIHB1dCBiYWNrIHRvIGl0cworICogb3JpZ2luYWwgZm9ybSBpbiBvcmRlciB0byBmcmVlIGl0LCB1c2UgemNmcmVlKCkuCisgKi8KKworI2RlZmluZSBNQVhfUFRSIDEwCisvKiAxMCo2NEsgPSA2NDBLICovCisKK2xvY2FsIGludCBuZXh0X3B0ciA9IDA7CisKK3R5cGVkZWYgc3RydWN0IHB0cl90YWJsZV9zIHsKKyAgICB2b2lkcGYgb3JnX3B0cjsKKyAgICB2b2lkcGYgbmV3X3B0cjsKK30gcHRyX3RhYmxlOworCitsb2NhbCBwdHJfdGFibGUgdGFibGVbTUFYX1BUUl07CisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIGZvcm0gb2YgcG9pbnRlcnMKKyAqIHRvIGxhcmdlIGJ1ZmZlcnMgKDY0SykuIFN1Y2ggcG9pbnRlcnMgYXJlIG5vcm1hbGl6ZWQgd2l0aCBhIHplcm8gb2Zmc2V0LgorICogU2luY2UgTVNET1MgaXMgbm90IGEgcHJlZW1wdGl2ZSBtdWx0aXRhc2tpbmcgT1MsIHRoaXMgdGFibGUgaXMgbm90CisgKiBwcm90ZWN0ZWQgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gVGhpcyBoYWNrIGRvZXNuJ3Qgd29yayBhbnl3YXkgb24KKyAqIGEgcHJvdGVjdGVkIHN5c3RlbSBsaWtlIE9TLzIuIFVzZSBNaWNyb3NvZnQgQyBpbnN0ZWFkLgorICovCisKK3ZvaWRwZiB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICB2b2lkcGYgYnVmID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KKyAgICB1bGcgYnNpemUgPSAodWxnKWl0ZW1zKnNpemU7CisKKyAgICAvKiBJZiB3ZSBhbGxvY2F0ZSBsZXNzIHRoYW4gNjU1MjAgYnl0ZXMsIHdlIGFzc3VtZSB0aGF0IGZhcm1hbGxvYworICAgICAqIHdpbGwgcmV0dXJuIGEgdXNhYmxlIHBvaW50ZXIgd2hpY2ggZG9lc24ndCBoYXZlIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgICovCisgICAgaWYgKGJzaXplIDwgNjU1MjBMKSB7CisgICAgICAgIGJ1ZiA9IGZhcm1hbGxvYyhic2l6ZSk7CisgICAgICAgIGlmICgqKHVzaCopJmJ1ZiAhPSAwKSByZXR1cm4gYnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiA9IGZhcm1hbGxvYyhic2l6ZSArIDE2TCk7CisgICAgfQorICAgIGlmIChidWYgPT0gTlVMTCB8fCBuZXh0X3B0ciA+PSBNQVhfUFRSKSByZXR1cm4gTlVMTDsKKyAgICB0YWJsZVtuZXh0X3B0cl0ub3JnX3B0ciA9IGJ1ZjsKKworICAgIC8qIE5vcm1hbGl6ZSB0aGUgcG9pbnRlciB0byBzZWc6MCAqLworICAgICooKHVzaCopJmJ1ZisxKSArPSAoKHVzaCkoKHVjaCopYnVmLTApICsgMTUpID4+IDQ7CisgICAgKih1c2gqKSZidWYgPSAwOworICAgIHRhYmxlW25leHRfcHRyKytdLm5ld19wdHIgPSBidWY7CisgICAgcmV0dXJuIGJ1ZjsKK30KKwordm9pZCAgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQoreworICAgIGludCBuOworICAgIGlmICgqKHVzaCopJnB0ciAhPSAwKSB7IC8qIG9iamVjdCA8IDY0SyAqLworICAgICAgICBmYXJmcmVlKHB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogRmluZCB0aGUgb3JpZ2luYWwgcG9pbnRlciAqLworICAgIGZvciAobiA9IDA7IG4gPCBuZXh0X3B0cjsgbisrKSB7CisgICAgICAgIGlmIChwdHIgIT0gdGFibGVbbl0ubmV3X3B0cikgY29udGludWU7CisKKyAgICAgICAgZmFyZnJlZSh0YWJsZVtuXS5vcmdfcHRyKTsKKyAgICAgICAgd2hpbGUgKCsrbiA8IG5leHRfcHRyKSB7CisgICAgICAgICAgICB0YWJsZVtuLTFdID0gdGFibGVbbl07CisgICAgICAgIH0KKyAgICAgICAgbmV4dF9wdHItLTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwdHIgPSBvcGFxdWU7IC8qIGp1c3QgdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLworICAgIEFzc2VydCgwLCAiemNmcmVlOiBwdHIgbm90IGZvdW5kIik7Cit9CisKKyNlbmRpZiAvKiBfX1RVUkJPQ19fICovCisKKworI2lmZGVmIE1fSTg2CisvKiBNaWNyb3NvZnQgQyBpbiAxNi1iaXQgbW9kZSAqLworCisjICBkZWZpbmUgTVlfWkNBTExPQworCisjaWYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPD0gNjAwKSkKKyMgIGRlZmluZSBfaGFsbG9jICBoYWxsb2MKKyMgIGRlZmluZSBfaGZyZWUgICBoZnJlZQorI2VuZGlmCisKK3ZvaWRwZiB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIF9oYWxsb2MoKGxvbmcpaXRlbXMsIHNpemUpOworfQorCit2b2lkICB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit7CisgICAgaWYgKG9wYXF1ZSkgb3BhcXVlID0gMDsgLyogdG8gbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIF9oZnJlZShwdHIpOworfQorCisjZW5kaWYgLyogTV9JODYgKi8KKworI2VuZGlmIC8qIFNZUzE2QklUICovCisKKworI2lmbmRlZiBNWV9aQ0FMTE9DIC8qIEFueSBzeXN0ZW0gd2l0aG91dCBhIHNwZWNpYWwgYWxsb2MgZnVuY3Rpb24gKi8KKworI2lmbmRlZiBTVERDCitleHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7CitleHRlcm4gdm9pZHAgIGNhbGxvYyBPRigodUludCBpdGVtcywgdUludCBzaXplKSk7CitleHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOworI2VuZGlmCisKK3ZvaWRwZiB6Y2FsbG9jIChvcGFxdWUsIGl0ZW1zLCBzaXplKQorICAgIHZvaWRwZiBvcGFxdWU7CisgICAgdW5zaWduZWQgaXRlbXM7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICBpZiAob3BhcXVlKSBpdGVtcyArPSBzaXplIC0gc2l6ZTsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIHJldHVybiBzaXplb2YodUludCkgPiAyID8gKHZvaWRwZiltYWxsb2MoaXRlbXMgKiBzaXplKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZHBmKWNhbGxvYyhpdGVtcywgc2l6ZSk7Cit9CisKK3ZvaWQgIHpjZnJlZSAob3BhcXVlLCBwdHIpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB2b2lkcGYgcHRyOworeworICAgIGZyZWUocHRyKTsKKyAgICBpZiAob3BhcXVlKSByZXR1cm47IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KK30KKworI2VuZGlmIC8qIE1ZX1pDQUxMT0MgKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL3p1dGlsLmggYi91c3Iva2xpYmMvemxpYi96dXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjUyYjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi96dXRpbC5oCkBAIC0wLDAgKzEsMjY5IEBACisvKiB6dXRpbC5oIC0tIGludGVybmFsIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogQCgjKSAkSWQ6IHp1dGlsLmgsdiAxLjEgMjAwNS8wMi8yNyAyMzoxNTozOSBocGEgRXhwICQgKi8KKworI2lmbmRlZiBaVVRJTF9ICisjZGVmaW5lIFpVVElMX0gKKworI2RlZmluZSBaTElCX0lOVEVSTkFMCisjaW5jbHVkZSAiemxpYi5oIgorCisjaWZkZWYgU1REQworIyAgaWZuZGVmIF9XSU4zMl9XQ0UKKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBlbmRpZgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIE5PX0VSUk5PX0gKKyMgICBpZmRlZiBfV0lOMzJfV0NFCisgICAgICAvKiBUaGUgTWljcm9zb2Z0IEMgUnVuLVRpbWUgTGlicmFyeSBmb3IgV2luZG93cyBDRSBkb2Vzbid0IGhhdmUKKyAgICAgICAqIGVycm5vLiAgV2UgZGVmaW5lIGl0IGFzIGEgZ2xvYmFsIHZhcmlhYmxlIHRvIHNpbXBsaWZ5IHBvcnRpbmcuCisgICAgICAgKiBJdHMgdmFsdWUgaXMgYWx3YXlzIDAgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gIFdlIHJlbmFtZSBpdCB0bworICAgICAgICogYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBsaWJyYXJpZXMgdGhhdCB1c2UgdGhlIHNhbWUgd29ya2Fyb3VuZC4KKyAgICAgICAqLworIyAgICAgZGVmaW5lIGVycm5vIHpfZXJybm8KKyMgICBlbmRpZgorICAgIGV4dGVybiBpbnQgZXJybm87CisjZWxzZQorIyAgaWZuZGVmIF9XSU4zMl9XQ0UKKyMgICAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBsb2NhbAorIyAgZGVmaW5lIGxvY2FsIHN0YXRpYworI2VuZGlmCisvKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Cit0eXBlZGVmIHVjaCBGQVIgdWNoZjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwordHlwZWRlZiB1c2ggRkFSIHVzaGY7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVsZzsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF07IC8qIGluZGV4ZWQgYnkgMi16bGliX2Vycm9yICovCisvKiAoc2l6ZSBnaXZlbiB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyB3aXRoIFZpc3VhbCBDKyspICovCisKKyNkZWZpbmUgRVJSX01TRyhlcnIpIHpfZXJybXNnW1pfTkVFRF9ESUNULShlcnIpXQorCisjZGVmaW5lIEVSUl9SRVRVUk4oc3RybSxlcnIpIFwKKyAgcmV0dXJuIChzdHJtLT5tc2cgPSAoY2hhciopRVJSX01TRyhlcnIpLCAoZXJyKSkKKy8qIFRvIGJlIHVzZWQgb25seSB3aGVuIHRoZSBzdGF0ZSBpcyBrbm93biB0byBiZSB2YWxpZCAqLworCisgICAgICAgIC8qIGNvbW1vbiBjb25zdGFudHMgKi8KKworI2lmbmRlZiBERUZfV0JJVFMKKyMgIGRlZmluZSBERUZfV0JJVFMgTUFYX1dCSVRTCisjZW5kaWYKKy8qIGRlZmF1bHQgd2luZG93Qml0cyBmb3IgZGVjb21wcmVzc2lvbi4gTUFYX1dCSVRTIGlzIGZvciBjb21wcmVzc2lvbiBvbmx5ICovCisKKyNpZiBNQVhfTUVNX0xFVkVMID49IDgKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKKyNlbHNlCisjICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAorI2VuZGlmCisvKiBkZWZhdWx0IG1lbUxldmVsICovCisKKyNkZWZpbmUgU1RPUkVEX0JMT0NLIDAKKyNkZWZpbmUgU1RBVElDX1RSRUVTIDEKKyNkZWZpbmUgRFlOX1RSRUVTICAgIDIKKy8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovCisKKyNkZWZpbmUgTUlOX01BVENIICAzCisjZGVmaW5lIE1BWF9NQVRDSCAgMjU4CisvKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovCisKKyNkZWZpbmUgUFJFU0VUX0RJQ1QgMHgyMCAvKiBwcmVzZXQgZGljdGlvbmFyeSBmbGFnIGluIHpsaWIgaGVhZGVyICovCisKKyAgICAgICAgLyogdGFyZ2V0IGRlcGVuZGVuY2llcyAqLworCisjaWYgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoV0lORE9XUykgJiYgIWRlZmluZWQoV0lOMzIpKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDAKKyMgIGlmIGRlZmluZWQoX19UVVJCT0NfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjICAgIGlmKF9fU1REQ19fID09IDEpICYmIChkZWZpbmVkKF9fTEFSR0VfXykgfHwgZGVmaW5lZChfX0NPTVBBQ1RfXykpCisgICAgICAgLyogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCAqLworICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7CisgICAgICAgdm9pZCAqX0NkZWNsIGZhcm1hbGxvYyggdW5zaWduZWQgbG9uZyBuYnl0ZXMgKTsKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgPGFsbG9jLmg+CisjICAgIGVuZGlmCisjICBlbHNlIC8qIE1TQyBvciBESkdQUCAqLworIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEFNSUdBCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZBWEMpIHx8IGRlZmluZWQoVk1TKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDIKKyMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgXAorICAgICBmb3BlbigobmFtZSksIChtb2RlKSwgIm1iYz02MCIsICJjdHg9c3RtIiwgInJmbT1maXgiLCAibXJzPTUxMiIpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoYXRhcmlzdCkKKyMgIGRlZmluZSBPU19DT0RFICAweDA1CisjZW5kaWYKKworI2lmZGVmIE9TMgorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDYKKyMgIGlmZGVmIE1fSTg2CisgICAgICNpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKKyMgIGRlZmluZSBPU19DT0RFICAweDA3CisjICBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCisjICAgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZkb3BlbiAqLworIyAgZWxzZQorIyAgICBpZm5kZWYgZmRvcGVuCisjICAgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBUT1BTMjAKKyMgIGRlZmluZSBPU19DT0RFICAweDBhCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjICBpZm5kZWYgX19DWUdXSU5fXyAgLyogQ3lnd2luIGlzIFVuaXgsIG5vdCBXaW4zMiAqLworIyAgICBkZWZpbmUgT1NfQ09ERSAgMHgwYgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX181MFNFUklFUyAvKiBQcmltZS9QUklNT1MgKi8KKyMgIGRlZmluZSBPU19DT0RFICAweDBmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0JFT1NfKSB8fCBkZWZpbmVkKFJJU0NPUykKKyMgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gNjAwKSkKKyMgIGlmIGRlZmluZWQoX1dJTjMyX1dDRSkKKyMgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjICAgIGlmbmRlZiBfUFRSRElGRl9UX0RFRklORUQKKyAgICAgICB0eXBlZGVmIGludCBwdHJkaWZmX3Q7CisjICAgICAgZGVmaW5lIF9QVFJESUZGX1RfREVGSU5FRAorIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBkZWZpbmUgZmRvcGVuKGZkLHR5cGUpICBfZmRvcGVuKGZkLHR5cGUpCisjICBlbmRpZgorI2VuZGlmCisKKyAgICAgICAgLyogY29tbW9uIGRlZmF1bHRzICovCisKKyNpZm5kZWYgT1NfQ09ERQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCisjZW5kaWYKKworI2lmbmRlZiBGX09QRU4KKyMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgZm9wZW4oKG5hbWUpLCAobW9kZSkpCisjZW5kaWYKKworICAgICAgICAgLyogZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKFNUREM5OSkgfHwgKGRlZmluZWQoX19UVVJCT0NfXykgJiYgX19UVVJCT0NfXyA+PSAweDU1MCkKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICBpZm5kZWYgSEFWRV9WU05QUklOVEYKKyMgICAgZGVmaW5lIEhBVkVfVlNOUFJJTlRGCisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBpZmRlZiBNU0RPUworICAgICAvKiB2c25wcmludGYgbWF5IGV4aXN0IG9uIHNvbWUgTVMtRE9TIGNvbXBpbGVycyAoREpHUFA/KSwKKyAgICAgICAgYnV0IGZvciBub3cgd2UganVzdCBhc3N1bWUgaXQgZG9lc24ndC4gKi8KKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fVFVSQk9DX18KKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmZGVmIFdJTjMyCisgICAgIC8qIEluIFdpbjMyLCB2c25wcmludGYgaXMgYXZhaWxhYmxlIGFzIHRoZSAibm9uLUFOU0kiIF92c25wcmludGYuICovCisjICAgIGlmICFkZWZpbmVkKHZzbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQorIyAgICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fU0FTQworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorI2VuZGlmCisjaWZkZWYgVk1TCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQocHlyKQorIyAgZGVmaW5lIE5PX01FTUNQWQorI2VuZGlmCisjaWYgZGVmaW5lZChTTUFMTF9NRURJVU0pICYmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX1NDX18pCisgLyogVXNlIG91ciBvd24gZnVuY3Rpb25zIGZvciBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIHdpdGggTVNDIDw9IDUuMC4KKyAgKiBZb3UgbWF5IGhhdmUgdG8gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IGZvciBCb3JsYW5kIEMgKHVudGVzdGVkKS4KKyAgKiBUaGUgX19TQ19fIGNoZWNrIGlzIGZvciBTeW1hbnRlYy4KKyAgKi8KKyMgIGRlZmluZSBOT19NRU1DUFkKKyNlbmRpZgorI2lmIGRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoSEFWRV9NRU1DUFkpICYmICFkZWZpbmVkKE5PX01FTUNQWSkKKyMgIGRlZmluZSBIQVZFX01FTUNQWQorI2VuZGlmCisjaWZkZWYgSEFWRV9NRU1DUFkKKyMgIGlmZGVmIFNNQUxMX01FRElVTSAvKiBNU0RPUyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIHptZW1jcHkgX2ZtZW1jcHkKKyMgICAgZGVmaW5lIHptZW1jbXAgX2ZtZW1jbXAKKyMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgX2ZtZW1zZXQoZGVzdCwgMCwgbGVuKQorIyAgZWxzZQorIyAgICBkZWZpbmUgem1lbWNweSBtZW1jcHkKKyMgICAgZGVmaW5lIHptZW1jbXAgbWVtY21wCisjICAgIGRlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pIG1lbXNldChkZXN0LCAwLCBsZW4pCisjICBlbmRpZgorI2Vsc2UKKyAgIGV4dGVybiB2b2lkIHptZW1jcHkgIE9GKChCeXRlZiogZGVzdCwgY29uc3QgQnl0ZWYqIHNvdXJjZSwgdUludCBsZW4pKTsKKyAgIGV4dGVybiBpbnQgIHptZW1jbXAgIE9GKChjb25zdCBCeXRlZiogczEsIGNvbnN0IEJ5dGVmKiBzMiwgdUludCBsZW4pKTsKKyAgIGV4dGVybiB2b2lkIHptZW16ZXJvIE9GKChCeXRlZiogZGVzdCwgdUludCBsZW4pKTsKKyNlbmRpZgorCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBpbmNsdWRlIDxzdGRpby5oPgorICAgZXh0ZXJuIGludCB6X3ZlcmJvc2U7CisgICBleHRlcm4gdm9pZCB6X2Vycm9yICAgIE9GKChjaGFyICptKSk7CisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KKyMgIGRlZmluZSBUcmFjZSh4KSB7aWYgKHpfdmVyYm9zZT49MCkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAoel92ZXJib3NlPjApIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh6X3ZlcmJvc2U+MSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh6X3ZlcmJvc2U+MCAmJiAoYykpIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHpfdmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKKyMgIGRlZmluZSBUcmFjZSh4KQorIyAgZGVmaW5lIFRyYWNldih4KQorIyAgZGVmaW5lIFRyYWNldnYoeCkKKyMgIGRlZmluZSBUcmFjZWMoYyx4KQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQorI2VuZGlmCisKKwordm9pZHBmIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKSk7Cit2b2lkICAgemNmcmVlICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikpOworCisjZGVmaW5lIFpBTExPQyhzdHJtLCBpdGVtcywgc2l6ZSkgXAorICAgICAgICAgICAoKigoc3RybSktPnphbGxvYykpKChzdHJtKS0+b3BhcXVlLCAoaXRlbXMpLCAoc2l6ZSkpCisjZGVmaW5lIFpGUkVFKHN0cm0sIGFkZHIpICAoKigoc3RybSktPnpmcmVlKSkoKHN0cm0pLT5vcGFxdWUsICh2b2lkcGYpKGFkZHIpKQorI2RlZmluZSBUUllfRlJFRShzLCBwKSB7aWYgKHApIFpGUkVFKHMsIHApO30KKworI2VuZGlmIC8qIFpVVElMX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9LYnVpbGQgYi91c3IvdXRpbHMvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjRiNTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvS2J1aWxkCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIGtsaWIgdXRpbHMKKyMKKworcHJvZ3MgOj0gY2hyb290IGRkIG1rZGlyIG1rZmlmbyBta25vZCBtb3VudCBwaXZvdF9yb290IHVtb3VudAorcHJvZ3MgKz0gdHJ1ZSBmYWxzZSBzbGVlcCBsbiBudWtlIG1pbmlwcyBjYXQKK3Byb2dzICs9IGluc21vZCB1bmFtZSBoYWx0IGtpbGwgcmVhZGxpbmsgY3BpbworCitzdGF0aWMteSA6PSAkKGFkZHByZWZpeCBzdGF0aWMvLCAkKHByb2dzKSkKK3NoYXJlZC15IDo9ICQoYWRkcHJlZml4IHNoYXJlZC8sICQocHJvZ3MpKQorCisjIFRoZSBiaW5hcnkgaXMgcGxhY2VkIGluIGEgc3ViZGlyLCBzbyB3ZSBuZWVkIHRvIHRlbGwga2J1aWxkIHRoaXMKK3N0YXRpYy9jaHJvb3QteSAgICAgOj0gY2hyb290Lm8KK3NoYXJlZC9jaHJvb3QteSAgICAgOj0gY2hyb290Lm8KK3N0YXRpYy9kZC15ICAgICAgICAgOj0gZGQubworc2hhcmVkL2RkLXkgICAgICAgICA6PSBkZC5vCitzdGF0aWMvbWtkaXIteSAgICAgIDo9IG1rZGlyLm8gZmlsZV9tb2RlLm8KK3NoYXJlZC9ta2Rpci15ICAgICAgOj0gbWtkaXIubyBmaWxlX21vZGUubworc3RhdGljL21rZmlmby15ICAgICA6PSBta2ZpZm8ubyBmaWxlX21vZGUubworc2hhcmVkL21rZmlmby15ICAgICA6PSBta2ZpZm8ubyBmaWxlX21vZGUubworc3RhdGljL21rbm9kLXkgICAgICA6PSBta25vZC5vIGZpbGVfbW9kZS5vCitzaGFyZWQvbWtub2QteSAgICAgIDo9IG1rbm9kLm8gZmlsZV9tb2RlLm8KK3N0YXRpYy9tb3VudC15ICAgICAgOj0gbW91bnRfbWFpbi5vIG1vdW50X29wdHMubworc2hhcmVkL21vdW50LXkgICAgICA6PSBtb3VudF9tYWluLm8gbW91bnRfb3B0cy5vCitzdGF0aWMvcGl2b3Rfcm9vdC15IDo9IHBpdm90X3Jvb3Qubworc2hhcmVkL3Bpdm90X3Jvb3QteSA6PSBwaXZvdF9yb290Lm8KK3N0YXRpYy91bW91bnQteSAgICAgOj0gdW1vdW50Lm8KK3NoYXJlZC91bW91bnQteSAgICAgOj0gdW1vdW50Lm8KK3N0YXRpYy90cnVlLXkgICAgICAgOj0gdHJ1ZS5vCitzaGFyZWQvdHJ1ZS15ICAgICAgIDo9IHRydWUubworc3RhdGljL2ZhbHNlLXkgICAgICA6PSBmYWxzZS5vCitzaGFyZWQvZmFsc2UteSAgICAgIDo9IGZhbHNlLm8KK3N0YXRpYy9zbGVlcC15ICAgICAgOj0gc2xlZXAubworc2hhcmVkL3NsZWVwLXkgICAgICA6PSBzbGVlcC5vCitzdGF0aWMvbG4teSAgICAgICAgIDo9IGxuLm8KK3NoYXJlZC9sbi15ICAgICAgICAgOj0gbG4ubworc3RhdGljL251a2UteSAgICAgICA6PSBudWtlLm8KK3NoYXJlZC9udWtlLXkgICAgICAgOj0gbnVrZS5vCitzdGF0aWMvbWluaXBzLXkgICAgIDo9IG1pbmlwcy5vCitzaGFyZWQvbWluaXBzLXkgICAgIDo9IG1pbmlwcy5vCitzdGF0aWMvY2F0LXkgICAgICAgIDo9IGNhdC5vCitzaGFyZWQvY2F0LXkgICAgICAgIDo9IGNhdC5vCitzdGF0aWMvaW5zbW9kLXkgICAgIDo9IGluc21vZC5vCitzaGFyZWQvaW5zbW9kLXkgICAgIDo9IGluc21vZC5vCitzdGF0aWMvdW5hbWUteSAgICAgIDo9IHVuYW1lLm8KK3NoYXJlZC91bmFtZS15ICAgICAgOj0gdW5hbWUubworc3RhdGljL2hhbHQteSAgICAgICA6PSBoYWx0Lm8KK3NoYXJlZC9oYWx0LXkgICAgICAgOj0gaGFsdC5vCitzdGF0aWMva2lsbC15ICAgICAgIDo9IGtpbGwubworc2hhcmVkL2tpbGwteSAgICAgICA6PSBraWxsLm8KK3N0YXRpYy9yZWFkbGluay15ICAgOj0gcmVhZGxpbmsubworc2hhcmVkL3JlYWRsaW5rLXkgICA6PSByZWFkbGluay5vCitzdGF0aWMvY3Bpby15CSAgICA6PSBjcGlvLm8KK3NoYXJlZC9jcGlvLXkgICAgICAgOj0gY3Bpby5vCisKKyMgQWRkaXRpb25hbGx5IGxpbmtlZCB0YXJnZXRzCithbHdheXMgOj0gc3RhdGljL3JlYm9vdCBzdGF0aWMvcG93ZXJvZmYgc2hhcmVkL3JlYm9vdCBzaGFyZWQvcG93ZXJvZmYKKworJChvYmopL3N0YXRpYy9yZWJvb3QgJChvYmopL3N0YXRpYy9wb3dlcm9mZjogJChvYmopL3N0YXRpYy9oYWx0CisJJChjYWxsIGNtZCxsbikKKyQob2JqKS9zaGFyZWQvcmVib290ICQob2JqKS9zaGFyZWQvcG93ZXJvZmY6ICQob2JqKS9zaGFyZWQvaGFsdAorCSQoY2FsbCBjbWQsbG4pCisKKyMgQ2xlYW4gZGVsZXRlcyB0aGUgc3RhdGljIGFuZCBzaGFyZWQgZGlyCitjbGVhbi1kaXJzIDo9IHN0YXRpYyBzaGFyZWQKKworIyBpbnN0YWxsIG9ubHkgaW5zdGFsbCB0aGUgc2hhcmVkIGJpbmFyaWVzCitpbnN0YWxsLXkgOj0gJChzaGFyZWQteSkgc2hhcmVkL3JlYm9vdCBzaGFyZWQvcG93ZXJvZmYKZGlmZiAtLWdpdCBhL3Vzci91dGlscy9jYXQuYyBiL3Vzci91dGlscy9jYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA4ZDJlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL2NhdC5jCkBAIC0wLDAgKzEsMzI5IEBACisvKiAkTmV0QlNEOiBjYXQuYyx2IDEuNDMgMjAwNC8wMS8wNCAwMzozMToyOCBqc2NoYXVtYSBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZXZpbiBGYWxsLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fQ09QWVJJR0hUCisjZGVmaW5lIF9fQ09QWVJJR0hUKGFyZykKKyNlbmRpZgorI2lmbmRlZiBfX1JDU0lECisjZGVmaW5lIF9fUkNTSUQoYXJnKQorI2VuZGlmCisKKyNpZiBIQVZFX05CVE9PTF9DT05GSUdfSAorI2luY2x1ZGUgIm5idG9vbF9jb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIF9fS0xJQkNfXworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2VuZGlmCisjaWYgIWRlZmluZWQobGludCkKK19fQ09QWVJJR0hUKCJAKCMpIENvcHlyaWdodCAoYykgMTk4OSwgMTk5M1xuXAorCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIik7CisjaWYgMAorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWNhdC5jCTguMiAoQmVya2VsZXkpIDQvMjcvOTUiOworI2Vsc2UKK19fUkNTSUQoIiROZXRCU0Q6IGNhdC5jLHYgMS40MyAyMDA0LzAxLzA0IDAzOjMxOjI4IGpzY2hhdW1hIEV4cCAkIik7CisjZW5kaWYKKyNlbmRpZgkJCQkvKiBub3QgbGludCAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZuZGVmIF9fS0xJQkNfXworI2luY2x1ZGUgPGVyci5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmbmRlZiBfX0tMSUJDX18KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBiZmxhZywgZWZsYWcsIGZmbGFnLCBsZmxhZywgbmZsYWcsIHNmbGFnLCB0ZmxhZywgdmZsYWc7CitpbnQgcnZhbDsKK2NvbnN0IGNoYXIgKmZpbGVuYW1lOworCitpbnQgbWFpbihpbnQsIGNoYXIgKltdKTsKK3ZvaWQgY29va19hcmdzKGNoYXIgKmFyZ3ZbXSk7Cit2b2lkIGNvb2tfYnVmKEZJTEUgKik7Cit2b2lkIHJhd19hcmdzKGNoYXIgKmFyZ3ZbXSk7Cit2b2lkIHJhd19jYXQoaW50KTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgY2g7CisJc3RydWN0IGZsb2NrIHN0ZG91dF9sb2NrOworCisjaWZuZGVmIF9fS0xJQkNfXworCXNldHByb2duYW1lKGFyZ3ZbMF0pOworCSh2b2lkKXNldGxvY2FsZShMQ19BTEwsICIiKTsKKyNlbmRpZgorCisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiYmVmbG5zdHV2IikpICE9IC0xKQorCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgJ2InOgorCQkJYmZsYWcgPSBuZmxhZyA9IDE7CS8qIC1iIGltcGxpZXMgLW4gKi8KKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCWVmbGFnID0gdmZsYWcgPSAxOwkvKiAtZSBpbXBsaWVzIC12ICovCisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlmZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlsZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQluZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQl0ZmxhZyA9IHZmbGFnID0gMTsJLyogLXQgaW1wbGllcyAtdiAqLworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorI2lmbmRlZiBfX0tMSUJDX18KKwkJCXNldGJ1ZihzdGRvdXQsIE5VTEwpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl2ZmxhZyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSAnPyc6CisJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKKwkJCQkgICAgICAidXNhZ2U6IGNhdCBbLWJlZmxuc3R1dl0gWy1dIFtmaWxlIC4uLl1cbiIpOworCQkJZXhpdCgxKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGxmbGFnKSB7CisJCXN0ZG91dF9sb2NrLmxfbGVuID0gMDsKKwkJc3Rkb3V0X2xvY2subF9zdGFydCA9IDA7CisJCXN0ZG91dF9sb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisJCXN0ZG91dF9sb2NrLmxfd2hlbmNlID0gU0VFS19TRVQ7CisJCWlmIChmY250bChTVERPVVRfRklMRU5PLCBGX1NFVExLVywgJnN0ZG91dF9sb2NrKSA9PSAtMSkgeworCQkJcGVycm9yKCJmY250bCIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWlmIChiZmxhZyB8fCBlZmxhZyB8fCBuZmxhZyB8fCBzZmxhZyB8fCB0ZmxhZyB8fCB2ZmxhZykKKwkJY29va19hcmdzKGFyZ3YpOworCWVsc2UKKwkJcmF3X2FyZ3MoYXJndik7CisJaWYgKGZjbG9zZShzdGRvdXQpKSB7CisJCXBlcnJvcigiZmNsb3NlIik7CisJCWV4aXQoMSk7CisJfQorCWV4aXQocnZhbCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCit2b2lkIGNvb2tfYXJncyhjaGFyICoqYXJndikKK3sKKwlGSUxFICpmcDsKKworCWZwID0gc3RkaW47CisJZmlsZW5hbWUgPSAic3RkaW4iOworCWRvIHsKKwkJaWYgKCphcmd2KSB7CisJCQlpZiAoIXN0cmNtcCgqYXJndiwgIi0iKSkKKwkJCQlmcCA9IHN0ZGluOworCQkJZWxzZSBpZiAoKGZwID0gZm9wZW4oKmFyZ3YsCisJCQkJCSAgICAgZmZsYWcgPyAicmYiIDogInIiKSkgPT0gTlVMTCkgeworCQkJCXBlcnJvcigiZm9wZW4iKTsKKwkJCQlydmFsID0gMTsKKwkJCQkrK2FyZ3Y7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmaWxlbmFtZSA9ICphcmd2Kys7CisJCX0KKwkJY29va19idWYoZnApOworCQlpZiAoZnAgIT0gc3RkaW4pCisJCQkodm9pZClmY2xvc2UoZnApOworCX0gd2hpbGUgKCphcmd2KTsKK30KKwordm9pZCBjb29rX2J1ZihGSUxFICogZnApCit7CisJaW50IGNoLCBnb2JibGUsIGxpbmUsIHByZXY7CisJaW50IHN0ZG91dF9lcnIgPSAwOworCisJbGluZSA9IGdvYmJsZSA9IDA7CisJZm9yIChwcmV2ID0gJ1xuJzsgKGNoID0gZ2V0YyhmcCkpICE9IEVPRjsgcHJldiA9IGNoKSB7CisJCWlmIChwcmV2ID09ICdcbicpIHsKKwkJCWlmIChjaCA9PSAnXG4nKSB7CisJCQkJaWYgKHNmbGFnKSB7CisJCQkJCWlmICghZ29iYmxlICYmIHB1dGNoYXIoY2gpID09IEVPRikKKwkJCQkJCWJyZWFrOworCQkJCQlnb2JibGUgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKG5mbGFnKSB7CisJCQkJCWlmICghYmZsYWcpIHsKKwkJCQkJCWlmIChmcHJpbnRmKHN0ZG91dCwKKwkJCQkJCQkgICAgIiU2ZFx0IiwKKwkJCQkJCQkgICAgKytsaW5lKSA8IDApIHsKKwkJCQkJCQlzdGRvdXRfZXJyKys7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoZWZsYWcpIHsKKwkJCQkJCWlmIChmcHJpbnRmKHN0ZG91dCwKKwkJCQkJCQkgICAgIiU2c1x0IiwgIiIpIDwgMCkgeworCQkJCQkJCXN0ZG91dF9lcnIrKzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAobmZsYWcpIHsKKwkJCQlpZiAoZnByaW50ZihzdGRvdXQsICIlNmRcdCIsICsrbGluZSkgPCAwKSB7CisJCQkJCXN0ZG91dF9lcnIrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWdvYmJsZSA9IDA7CisJCWlmIChjaCA9PSAnXG4nKSB7CisJCQlpZiAoZWZsYWcpCisJCQkJaWYgKHB1dGNoYXIoJyQnKSA9PSBFT0YpCisJCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGNoID09ICdcdCcpIHsKKwkJCWlmICh0ZmxhZykgeworCQkJCWlmIChwdXRjaGFyKCdeJykgPT0gRU9GIHx8IHB1dGNoYXIoJ0knKSA9PSBFT0YpCisJCQkJCWJyZWFrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgaWYgKHZmbGFnKSB7CisJCQlpZiAoIWlzYXNjaWkoY2gpKSB7CisJCQkJaWYgKHB1dGNoYXIoJ00nKSA9PSBFT0YgfHwgcHV0Y2hhcignLScpID09IEVPRikKKwkJCQkJYnJlYWs7CisJCQkJY2ggPSAoY2gpICYgMHg3ZjsKKwkJCX0KKwkJCWlmIChpc2NudHJsKGNoKSkgeworCQkJCWlmIChwdXRjaGFyKCdeJykgPT0gRU9GIHx8CisJCQkJICAgIHB1dGNoYXIoY2ggPT0gJ1wxNzcnID8gJz8nIDoKKwkJCQkJICAgIGNoIHwgMDEwMCkgPT0gRU9GKQorCQkJCQlicmVhazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAocHV0Y2hhcihjaCkgPT0gRU9GKQorCQkJYnJlYWs7CisJfQorCWlmIChzdGRvdXRfZXJyKSB7CisJCXBlcnJvcihmaWxlbmFtZSk7CisJCXJ2YWwgPSAxOworCX0KK30KKwordm9pZCByYXdfYXJncyhjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IGZpbGVubyhzdGRpbik7CisJZmlsZW5hbWUgPSAic3RkaW4iOworCWRvIHsKKwkJaWYgKCphcmd2KSB7CisJCQlpZiAoIXN0cmNtcCgqYXJndiwgIi0iKSkKKwkJCQlmZCA9IGZpbGVubyhzdGRpbik7CisJCQllbHNlIGlmIChmZmxhZykgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCWZkID0gb3BlbigqYXJndiwgT19SRE9OTFkgfCBPX05PTkJMT0NLLCAwKTsKKwkJCQlpZiAoZmQgPCAwKQorCQkJCQlnb3RvIHNraXA7CisKKwkJCQlpZiAoZnN0YXQoZmQsICZzdCkgPT0gLTEpIHsKKwkJCQkJY2xvc2UoZmQpOworCQkJCQlnb3RvIHNraXA7CisJCQkJfQorCQkJCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQkJCQljbG9zZShmZCk7CisJCQkJCWVycm5vID0gRUlOVkFMOworCQkJCQlnb3RvIHNraXBub21zZzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKChmZCA9IG9wZW4oKmFyZ3YsIE9fUkRPTkxZLCAwKSkgPCAwKSB7CisJCQkgICAgICBza2lwOgorCQkJCXBlcnJvcigqYXJndik7CisJCQkgICAgICBza2lwbm9tc2c6CisJCQkJcnZhbCA9IDE7CisJCQkJKythcmd2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZmlsZW5hbWUgPSAqYXJndisrOworCQl9CisJCXJhd19jYXQoZmQpOworCQlpZiAoZmQgIT0gZmlsZW5vKHN0ZGluKSkKKwkJCSh2b2lkKWNsb3NlKGZkKTsKKwl9IHdoaWxlICgqYXJndik7Cit9CisKK3ZvaWQgcmF3X2NhdChpbnQgcmZkKQoreworCXN0YXRpYyBjaGFyICpidWY7CisJc3RhdGljIGNoYXIgZmJfYnVmW0JVRlNJWl07CisJc3RhdGljIHNpemVfdCBic2l6ZTsKKworCXN0cnVjdCBzdGF0IHNidWY7CisJc3NpemVfdCBuciwgbncsIG9mZjsKKwlpbnQgd2ZkOworCisJd2ZkID0gZmlsZW5vKHN0ZG91dCk7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCWlmIChmc3RhdCh3ZmQsICZzYnVmKSA9PSAwKSB7CisJCQlic2l6ZSA9IHNidWYuc3RfYmxrc2l6ZSA+IEJVRlNJWiA/CisJCQkgICAgc2J1Zi5zdF9ibGtzaXplIDogQlVGU0laOworCQkJYnVmID0gbWFsbG9jKGJzaXplKTsKKwkJfQorCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCWJ1ZiA9IGZiX2J1ZjsKKwkJCWJzaXplID0gQlVGU0laOworCQl9CisJfQorCXdoaWxlICgobnIgPSByZWFkKHJmZCwgYnVmLCBic2l6ZSkpID4gMCkKKwkJZm9yIChvZmYgPSAwOyBucjsgbnIgLT0gbncsIG9mZiArPSBudykKKwkJCWlmICgobncgPSB3cml0ZSh3ZmQsIGJ1ZiArIG9mZiwgKHNpemVfdCkgbnIpKSA8IDApIHsKKwkJCQlwZXJyb3IoIndyaXRlIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwlpZiAobnIgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgbGVuZ3RoXG4iLCBmaWxlbmFtZSk7CisJCXJ2YWwgPSAxOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9jaHJvb3QuYyBiL3Vzci91dGlscy9jaHJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2U2NzkxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL2Nocm9vdC5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBieSBybWsKKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSkKK3sKKwlpZiAoYXJnYyA8IDMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgbmV3cm9vdCBjb21tYW5kLi4uXG4iLCBhcmd2WzBdKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGNocm9vdChhcmd2WzFdKSA9PSAtMSkgeworCQlwZXJyb3IoImNocm9vdCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZXhlY3ZlKGFyZ3ZbMl0sIGFyZ3YgKyAyLCBlbnZwKSA9PSAtMSkgeworCQlwZXJyb3IoImV4ZWN2ZSIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9jcGlvLmMgYi91c3IvdXRpbHMvY3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWY0MGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvY3Bpby5jCkBAIC0wLDAgKzEsMTEwMiBAQAorLyogY29weWluLmMgLSBleHRyYWN0IG9yIGxpc3QgYSBjcGlvIGFyY2hpdmUKKyAgIENvcHlyaWdodCAoQykgMTk5MCwxOTkxLDE5OTIsMjAwMSwyMDAyLDIwMDMsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGltZS5oPgorI2lmbmRlZglGTk1fUEFUSE5BTUUKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjZW5kaWYKKworI2lmbmRlZglPX0JJTkFSWQorIyBkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKyMgaWZuZGVmIERJUkVDVE9SWV9TRVBBUkFUT1IKKyMgIGRlZmluZSBESVJFQ1RPUllfU0VQQVJBVE9SICcvJworIyBlbmRpZgorCisjIGlmbmRlZiBJU1NMQVNICisjICBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09IERJUkVDVE9SWV9TRVBBUkFUT1IpCisjIGVuZGlmCisKKyMgaWZuZGVmIEZJTEVfU1lTVEVNX1BSRUZJWF9MRU4KKyMgIGRlZmluZSBGSUxFX1NZU1RFTV9QUkVGSVhfTEVOKEZpbGVuYW1lKSAwCisjIGVuZGlmCisKKyNpZm5kZWYgU1lNTElOS19VU0VTX1VNQVNLCisjIGRlZmluZSBVTUFTS0VEX1NZTUxJTksobmFtZTEsbmFtZTIsbW9kZSkgICAgc3ltbGluayhuYW1lMSxuYW1lMikKKyNlbHNlCisjIGRlZmluZSBVTUFTS0VEX1NZTUxJTksobmFtZTEsbmFtZTIsbW9kZSkgICAgdW1hc2tlZF9zeW1saW5rKG5hbWUxLG5hbWUyLG1vZGUpCisjZW5kaWYJCQkJLyogU1lNTElOS19VU0VTX1VNQVNLICovCisKKy8qIFJldHVybiAxIGlmIGFuIGFycmF5IG9mIE4gb2JqZWN0cywgZWFjaCBvZiBzaXplIFMsIGNhbm5vdCBleGlzdCBkdWUKKyAgIHRvIHNpemUgYXJpdGhtZXRpYyBvdmVyZmxvdy4gIFMgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgTiBtdXN0IGJlCisgICBub25uZWdhdGl2ZS4gIFRoaXMgaXMgYSBtYWNybywgbm90IGFuIGlubGluZSBmdW5jdGlvbiwgc28gdGhhdCBpdAorICAgd29ya3MgY29ycmVjdGx5IGV2ZW4gd2hlbiBTSVpFX01BWCA8IE4uCisKKyAgIEJ5IGdudWxpYiBjb252ZW50aW9uLCBTSVpFX01BWCByZXByZXNlbnRzIG92ZXJmbG93IGluIHNpemUKKyAgIGNhbGN1bGF0aW9ucywgc28gdGhlIGNvbnNlcnZhdGl2ZSBkaXZpZGVuZCB0byB1c2UgaGVyZSBpcworICAgU0laRV9NQVggLSAxLCBzaW5jZSBTSVpFX01BWCBtaWdodCByZXByZXNlbnQgYW4gb3ZlcmZsb3dlZCB2YWx1ZS4KKyAgIEhvd2V2ZXIsIG1hbGxvYyAoU0laRV9NQVgpIGZhaWxzIG9uIGFsbCBrbm93biBob3N0cyB3aGVyZQorICAgc2l6ZW9mIChwdHJkaWZmX3QpIDw9IHNpemVvZiAoc2l6ZV90KSwgc28gZG8gbm90IGJvdGhlciB0byB0ZXN0IGZvcgorICAgZXhhY3RseS1TSVpFX01BWCBhbGxvY2F0aW9ucyBvbiBzdWNoIGhvc3RzOyB0aGlzIGF2b2lkcyBhIHRlc3QgYW5kCisgICBicmFuY2ggd2hlbiBTIGlzIGtub3duIHRvIGJlIDEuICAqLworIyBkZWZpbmUgeGFsbG9jX292ZXJzaXplZChuLCBzKSBcCisgICAgKChzaXplX3QpIChzaXplb2YgKHB0cmRpZmZfdCkgPD0gc2l6ZW9mIChzaXplX3QpID8gLTEgOiAtMikgLyAocykgPCAobikpCisKKyNkZWZpbmUgRElTS19JT19CTE9DS19TSVpFCSg1MTIpCisKK2NoYXIgKnByb2duYW1lID0gTlVMTDsKKworLyogSWYgdHJ1ZSwgcHJpbnQgYSAuIGZvciBlYWNoIGZpbGUgcHJvY2Vzc2VkLiAoLVYpICovCitjaGFyIGRvdF9mbGFnID0gZmFsc2U7CisKKy8qIElucHV0IGFuZCBvdXRwdXQgYnVmZmVycy4gICovCitjaGFyICppbnB1dF9idWZmZXIsICpvdXRwdXRfYnVmZmVyOworCisvKiBUaGUgc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLiAgKi8KK2xvbmcgaW5wdXRfYnVmZmVyX3NpemU7CisKKy8qIEN1cnJlbnQgbG9jYXRpb25zIGluIGBpbnB1dF9idWZmZXInIGFuZCBgb3V0cHV0X2J1ZmZlcicuICAqLworY2hhciAqaW5fYnVmZiwgKm91dF9idWZmOworCisvKiBDdXJyZW50IG51bWJlciBvZiBieXRlcyBzdG9yZWQgYXQgYGlucHV0X2J1ZmYnIGFuZCBgb3V0cHV0X2J1ZmYnLiAgKi8KK2xvbmcgaW5wdXRfc2l6ZSwgb3V0cHV0X3NpemU7CisKKy8qIEJsb2NrIHNpemUgdmFsdWUsIGluaXRpYWxseSA1MTIuICAtQiBzZXRzIHRvIDUxMjAuICAqLworaW50IGlvX2Jsb2NrX3NpemUgPSA1MTI7CisKK3N0cnVjdCBuZXdfY3Bpb19oZWFkZXIgeworCXVuc2lnbmVkIHNob3J0IGNfbWFnaWM7CisJdW5zaWduZWQgbG9uZyBjX2lubzsKKwl1bnNpZ25lZCBsb25nIGNfbW9kZTsKKwl1bnNpZ25lZCBsb25nIGNfdWlkOworCXVuc2lnbmVkIGxvbmcgY19naWQ7CisJdW5zaWduZWQgbG9uZyBjX25saW5rOworCXVuc2lnbmVkIGxvbmcgY19tdGltZTsKKwl1bnNpZ25lZCBsb25nIGNfZmlsZXNpemU7CisJbG9uZyBjX2Rldl9tYWo7CisJbG9uZyBjX2Rldl9taW47CisJbG9uZyBjX3JkZXZfbWFqOworCWxvbmcgY19yZGV2X21pbjsKKwl1bnNpZ25lZCBsb25nIGNfbmFtZXNpemU7CisJdW5zaWduZWQgbG9uZyBjX2Noa3N1bTsKKwljaGFyICpjX25hbWU7CisJY2hhciAqY190YXJfbGlua25hbWU7Cit9OworCisvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBhbmQgd3JpdHRlbiBmb3IgYWxsIGZpbGVzLiAgCisgICBOb3cgdGhhdCBtYW55IHRhcGUgZHJpdmVzIGhvbGQgbW9yZSB0aGFuIDRHYiB3ZSBuZWVkIG1vcmUgdGhhbiAzMgorICAgYml0cyB0byBob2xkIGlucHV0X2J5dGVzIGFuZCBvdXRwdXRfYnl0ZXMuICBCdXQgaXQncyBub3Qgd29ydGgKKyAgIHRoZSB0cm91YmxlIG9mIGFkZGluZyBzcGVjaWFsIG11bHRpLXByZWNpc2lvbiBhcml0aG1ldGljIGlmIHRoZSAKKyAgIGNvbXBpbGVyIGRvZXNuJ3Qgc3VwcG9ydCA2NCBiaXQgaW50cyBzaW5jZSBpbnB1dF9ieXRlcyBhbmQKKyAgIG91dHB1dF9ieXRlcyBhcmUgb25seSB1c2VkIHRvIHByaW50IHRoZSBudW1iZXIgb2YgYmxvY2tzIGNvcGllZC4gICovCisjaWZkZWYgX19HTlVDX18KK2xvbmcgbG9uZyBpbnB1dF9ieXRlcywgb3V0cHV0X2J5dGVzOworI2Vsc2UKK2xvbmcgaW5wdXRfYnl0ZXMsIG91dHB1dF9ieXRlczsKKyNlbmRpZgorCisvKiBBbGxvY2F0ZSBOIGJ5dGVzIG9mIG1lbW9yeSBkeW5hbWljYWxseSwgd2l0aCBlcnJvciBjaGVja2luZy4gICovCisKK3ZvaWQgKnhtYWxsb2Moc2l6ZV90IG4pCit7CisJdm9pZCAqcDsKKwlpZiAoeGFsbG9jX292ZXJzaXplZChuLCAxKSB8fCAoIShwID0gbWFsbG9jKG4pKSAmJiBuICE9IDApKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG1lbW9yeSBleGhhdXN0ZWRcbiIsIHByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJcmV0dXJuIHA7CisvKiAgIHJldHVybiB4bm1hbGxvY19pbmxpbmUgKG4sIDEpOyAqLworfQorCisvKiBDaGFuZ2UgdGhlIHNpemUgb2YgYW4gYWxsb2NhdGVkIGJsb2NrIG9mIG1lbW9yeSBQIHRvIE4gYnl0ZXMsCisgICB3aXRoIGVycm9yIGNoZWNraW5nLiAgKi8KKwordm9pZCAqeHJlYWxsb2Modm9pZCAqcCwgc2l6ZV90IG4pCit7CisJaWYgKHhhbGxvY19vdmVyc2l6ZWQobiwgMSkgfHwgKCEocCA9IHJlYWxsb2MocCwgbikpICYmIG4gIT0gMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogbWVtb3J5IGV4aGF1c3RlZFxuIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gcDsKKy8qICAgcmV0dXJuIHhucmVhbGxvY19pbmxpbmUgKHAsIG4sIDEpOyAqLworfQorCisvKiBDbG9uZSBTVFJJTkcuICAqLworCitjaGFyICp4c3RyZHVwKGNoYXIgY29uc3QgKnN0cmluZykKK3sKKwlzaXplX3QgcyA9IHN0cmxlbihzdHJpbmcpICsgMTsKKwlyZXR1cm4gbWVtY3B5KHhtYWxsb2MocyksIHN0cmluZywgcyk7CisvKiAgIHJldHVybiB4bWVtZHVwX2lubGluZSAoc3RyaW5nLCBzdHJsZW4gKHN0cmluZykgKyAxKTsgKi8KK30KKworLyogQ29weSBOVU1fQllURVMgb2YgYnVmZmVyIGBpbl9idWZmJyBpbnRvIElOX0JVRi4KKyAgIGBpbl9idWZmJyBtYXkgYmUgcGFydGx5IGZ1bGwuCisgICBXaGVuIGBpbl9idWZmJyBpcyBleGhhdXN0ZWQsIHJlZmlsbCBpdCBmcm9tIGZpbGUgZGVzY3JpcHRvciBJTl9ERVMuICAqLworCitzdGF0aWMgdm9pZCB0YXBlX2ZpbGxfaW5wdXRfYnVmZmVyKGludCBpbl9kZXMsIGludCBudW1fYnl0ZXMpCit7CisJaW5fYnVmZiA9IGlucHV0X2J1ZmZlcjsKKwludW1fYnl0ZXMgPSAobnVtX2J5dGVzIDwgaW9fYmxvY2tfc2l6ZSkgPyBudW1fYnl0ZXMgOiBpb19ibG9ja19zaXplOworCWlucHV0X3NpemUgPSByZWFkKGluX2RlcywgaW5wdXRfYnVmZmVyLCBudW1fYnl0ZXMpOworCWlmIChpbnB1dF9zaXplIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiByZWFkIGVycm9yOiAlc1xuIiwgcHJvZ25hbWUsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKwlpZiAoaW5wdXRfc2l6ZSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHByZW1hdHVyZSBlbmQgb2YgZmlsZVxuIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKwlpbnB1dF9ieXRlcyArPSBpbnB1dF9zaXplOworfQorCisvKiBXcml0ZSBgb3V0cHV0X3NpemUnIGJ5dGVzIG9mIGBvdXRwdXRfYnVmZmVyJyB0byBmaWxlCisgICBkZXNjcmlwdG9yIE9VVF9ERVMgYW5kIHJlc2V0IGBvdXRwdXRfc2l6ZScgYW5kIGBvdXRfYnVmZicuCisgICBJZiBgc3dhcHBpbmdfaGFsZndvcmRzJyBvciBgc3dhcHBpbmdfYnl0ZXMnIGlzIHNldCwKKyAgIGRvIHRoZSBhcHByb3ByaWF0ZSBzd2FwcGluZyBmaXJzdC4gIE91ciBjYWxsZXJzIGhhdmUKKyAgIHRvIG1ha2Ugc3VyZSB0byBvbmx5IHNldCB0aGVzZSBmbGFncyBpZiBgb3V0cHV0X3NpemUnIAorICAgaXMgYXBwcm9wcmlhdGUgKGEgbXVsdGlwbGUgb2YgNCBmb3IgYHN3YXBwaW5nX2hhbGZ3b3JkcycsCisgICAyIGZvciBgc3dhcHBpbmdfYnl0ZXMnKS4gIFRoZSBmYWN0IHRoYXQgRElTS19JT19CTE9DS19TSVpFCisgICBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQgaGVscHMgdXMgKGFuZCBvdXIgY2FsbGVycykKKyAgIGluc3VyZSB0aGlzLiAgKi8KKwordm9pZCBkaXNrX2VtcHR5X291dHB1dF9idWZmZXIoaW50IG91dF9kZXMpCit7CisJaW50IGJ5dGVzX3dyaXR0ZW47CisKKwlieXRlc193cml0dGVuID0gd3JpdGUob3V0X2Rlcywgb3V0cHV0X2J1ZmZlciwgb3V0cHV0X3NpemUpOworCisJaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gb3V0cHV0X3NpemUpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZXJyb3I6ICVzXG4iLAorCQkJcHJvZ25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCW91dHB1dF9ieXRlcyArPSBvdXRwdXRfc2l6ZTsKKwlvdXRfYnVmZiA9IG91dHB1dF9idWZmZXI7CisJb3V0cHV0X3NpemUgPSAwOworfQorCisvKiBDb3B5IE5VTV9CWVRFUyBvZiBidWZmZXIgSU5fQlVGIHRvIGBvdXRfYnVmZicsIHdoaWNoIG1heSBiZSBwYXJ0bHkgZnVsbC4KKyAgIFdoZW4gYG91dF9idWZmJyBmaWxscyB1cCwgZmx1c2ggaXQgdG8gZmlsZSBkZXNjcmlwdG9yIE9VVF9ERVMuICAqLworCit2b2lkIGRpc2tfYnVmZmVyZWRfd3JpdGUoY2hhciAqaW5fYnVmLCBpbnQgb3V0X2RlcywgbG9uZyBudW1fYnl0ZXMpCit7CisJcmVnaXN0ZXIgbG9uZyBieXRlc19sZWZ0ID0gbnVtX2J5dGVzOwkvKiBCeXRlcyBuZWVkaW5nIHRvIGJlIGNvcGllZC4gICovCisJcmVnaXN0ZXIgbG9uZyBzcGFjZV9sZWZ0OwkvKiBSb29tIGxlZnQgaW4gb3V0cHV0IGJ1ZmZlci4gICovCisKKwl3aGlsZSAoYnl0ZXNfbGVmdCA+IDApIHsKKwkJc3BhY2VfbGVmdCA9IERJU0tfSU9fQkxPQ0tfU0laRSAtIG91dHB1dF9zaXplOworCQlpZiAoc3BhY2VfbGVmdCA9PSAwKQorCQkJZGlza19lbXB0eV9vdXRwdXRfYnVmZmVyKG91dF9kZXMpOworCQllbHNlIHsKKwkJCWlmIChieXRlc19sZWZ0IDwgc3BhY2VfbGVmdCkKKwkJCQlzcGFjZV9sZWZ0ID0gYnl0ZXNfbGVmdDsKKwkJCW1lbW1vdmUob3V0X2J1ZmYsIGluX2J1ZiwgKHVuc2lnbmVkKXNwYWNlX2xlZnQpOworCQkJb3V0X2J1ZmYgKz0gc3BhY2VfbGVmdDsKKwkJCW91dHB1dF9zaXplICs9IHNwYWNlX2xlZnQ7CisJCQlpbl9idWYgKz0gc3BhY2VfbGVmdDsKKwkJCWJ5dGVzX2xlZnQgLT0gc3BhY2VfbGVmdDsKKwkJfQorCX0KK30KKworLyogQ29weSBhIGZpbGUgdXNpbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycywgd2hpY2ggbWF5IHN0YXJ0IG91dAorICAgcGFydGx5IGZ1bGwuICBBZnRlciB0aGUgY29weSwgdGhlIGZpbGVzIGFyZSBub3QgY2xvc2VkIG5vciB0aGUgbGFzdAorICAgYmxvY2sgZmx1c2hlZCB0byBvdXRwdXQsIGFuZCB0aGUgaW5wdXQgYnVmZmVyIG1heSBzdGlsbCBiZSBwYXJ0bHkKKyAgIGZ1bGwuICBJZiBgY3JjX2lfZmxhZycgaXMgc2V0LCBhZGQgZWFjaCBieXRlIHRvIGBjcmMnLgorICAgSU5fREVTIGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGlucHV0OworICAgT1VUX0RFUyBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBvdXRwdXQ7CisgICBOVU1fQllURVMgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBjb3B5LiAgKi8KKwordm9pZCBjb3B5X2ZpbGVzX3RhcGVfdG9fZGlzayhpbnQgaW5fZGVzLCBpbnQgb3V0X2RlcywgbG9uZyBudW1fYnl0ZXMpCit7CisJbG9uZyBzaXplOworCisJd2hpbGUgKG51bV9ieXRlcyA+IDApIHsKKwkJaWYgKGlucHV0X3NpemUgPT0gMCkKKwkJCXRhcGVfZmlsbF9pbnB1dF9idWZmZXIoaW5fZGVzLCBpb19ibG9ja19zaXplKTsKKwkJc2l6ZSA9IChpbnB1dF9zaXplIDwgbnVtX2J5dGVzKSA/IGlucHV0X3NpemUgOiBudW1fYnl0ZXM7CisJCWRpc2tfYnVmZmVyZWRfd3JpdGUoaW5fYnVmZiwgb3V0X2Rlcywgc2l6ZSk7CisJCW51bV9ieXRlcyAtPSBzaXplOworCQlpbnB1dF9zaXplIC09IHNpemU7CisJCWluX2J1ZmYgKz0gc2l6ZTsKKwl9Cit9CisKKy8qIGlmIElOX0JVRiBpcyBOVUxMLCBTa2lwIHRoZSBuZXh0IE5VTV9CWVRFUyBieXRlcyBvZiBmaWxlIGRlc2NyaXB0b3IgSU5fREVTLiAqLwordm9pZCB0YXBlX2J1ZmZlcmVkX3JlYWQoY2hhciAqaW5fYnVmLCBpbnQgaW5fZGVzLCBsb25nIG51bV9ieXRlcykKK3sKKwlyZWdpc3RlciBsb25nIGJ5dGVzX2xlZnQgPSBudW1fYnl0ZXM7CS8qIEJ5dGVzIG5lZWRpbmcgdG8gYmUgY29waWVkLiAgKi8KKwlyZWdpc3RlciBsb25nIHNwYWNlX2xlZnQ7CS8qIEJ5dGVzIHRvIGNvcHkgZnJvbSBpbnB1dCBidWZmZXIuICAqLworCisJd2hpbGUgKGJ5dGVzX2xlZnQgPiAwKSB7CisJCWlmIChpbnB1dF9zaXplID09IDApCisJCQl0YXBlX2ZpbGxfaW5wdXRfYnVmZmVyKGluX2RlcywgaW9fYmxvY2tfc2l6ZSk7CisJCWlmIChieXRlc19sZWZ0IDwgaW5wdXRfc2l6ZSkKKwkJCXNwYWNlX2xlZnQgPSBieXRlc19sZWZ0OworCQllbHNlCisJCQlzcGFjZV9sZWZ0ID0gaW5wdXRfc2l6ZTsKKwkJaWYgKGluX2J1ZiAhPSBOVUxMKSB7CisJCQltZW1tb3ZlKGluX2J1ZiwgaW5fYnVmZiwgKHVuc2lnbmVkKXNwYWNlX2xlZnQpOworCQkJaW5fYnVmICs9IHNwYWNlX2xlZnQ7CisJCX0KKwkJaW5fYnVmZiArPSBzcGFjZV9sZWZ0OworCQlpbnB1dF9zaXplIC09IHNwYWNlX2xlZnQ7CisJCWJ5dGVzX2xlZnQgLT0gc3BhY2VfbGVmdDsKKwl9Cit9CisKKy8qIFNraXAgdGhlIG5leHQgTlVNX0JZVEVTIGJ5dGVzIG9mIGZpbGUgZGVzY3JpcHRvciBJTl9ERVMuICAqLworI2RlZmluZSB0YXBlX3Rvc3NfaW5wdXQoaW5fZGVzLG51bV9ieXRlcykgXAorKHRhcGVfYnVmZmVyZWRfcmVhZChOVUxMLChpbl9kZXMpLChudW1fYnl0ZXMpKSkKKworc3RydWN0IGRlZmVybWVudCB7CisJc3RydWN0IGRlZmVybWVudCAqbmV4dDsKKwlzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyIGhlYWRlcjsKK307CisKK3N0cnVjdCBkZWZlcm1lbnQgKmNyZWF0ZV9kZWZlcm1lbnQoc3RydWN0IG5ld19jcGlvX2hlYWRlciAqZmlsZV9oZHIpCit7CisJc3RydWN0IGRlZmVybWVudCAqZDsKKwlkID0gKHN0cnVjdCBkZWZlcm1lbnQgKil4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmZXJtZW50KSk7CisJZC0+aGVhZGVyID0gKmZpbGVfaGRyOworCWQtPmhlYWRlci5jX25hbWUgPSAoY2hhciAqKXhtYWxsb2Moc3RybGVuKGZpbGVfaGRyLT5jX25hbWUpICsgMSk7CisJc3RyY3B5KGQtPmhlYWRlci5jX25hbWUsIGZpbGVfaGRyLT5jX25hbWUpOworCXJldHVybiBkOworfQorCit2b2lkIGZyZWVfZGVmZXJtZW50KHN0cnVjdCBkZWZlcm1lbnQgKmQpCit7CisJZnJlZShkLT5oZWFkZXIuY19uYW1lKTsKKwlmcmVlKGQpOworfQorCitpbnQgbGlua190b19uYW1lKGNoYXIgKmxpbmtfbmFtZSwgY2hhciAqbGlua190YXJnZXQpCit7CisJaW50IHJlcyA9IGxpbmsobGlua190YXJnZXQsIGxpbmtfbmFtZSk7CisJcmV0dXJuIHJlczsKK30KKworc3RydWN0IGlub2RlX3ZhbCB7CisJdW5zaWduZWQgbG9uZyBpbm9kZTsKKwl1bnNpZ25lZCBsb25nIG1ham9yX251bTsKKwl1bnNpZ25lZCBsb25nIG1pbm9yX251bTsKKwljaGFyICpmaWxlX25hbWU7Cit9OworCisvKiBJbm9kZSBoYXNoIHRhYmxlLiAgQWxsb2NhdGVkIGJ5IGZpcnN0IGNhbGwgdG8gYWRkX2lub2RlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfdmFsICoqaGFzaF90YWJsZSA9IE5VTEw7CisKKy8qIFNpemUgb2YgY3VycmVudCBoYXNoIHRhYmxlLiAgSW5pdGlhbCBzaXplIGlzIDQ3LiAgKDQ3ID0gMioyMiArIDMpICovCitzdGF0aWMgaW50IGhhc2hfc2l6ZSA9IDIyOworCisvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY3VycmVudCBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyBpbnQgaGFzaF9udW07CisKKy8qIERvIHRoZSBoYXNoIGluc2VydC4gIFVzZWQgaW4gbm9ybWFsIGluc2VydHMgYW5kIHJlc2l6aW5nIHRoZSBoYXNoCisgICB0YWJsZS4gIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGVyZSBpcyByb29tIHRvIGluc2VydCB0aGUgaXRlbS4KKyAgIE5FV19WQUxVRSBpcyB0aGUgcG9pbnRlciB0byB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW5vZGUsIGZpbGUKKyAgIG5hbWUgYXNzb2NpYXRpb24gcmVjb3JkLiAgKi8KKworc3RhdGljIHZvaWQgaGFzaF9pbnNlcnQoc3RydWN0IGlub2RlX3ZhbCAqbmV3X3ZhbHVlKQoreworCWludCBzdGFydDsJCS8qIEhvbWUgcG9zaXRpb24gZm9yIHRoZSB2YWx1ZS4gICovCisJaW50IHRlbXA7CQkvKiBVc2VkIGZvciByZWhhc2hpbmcuICAqLworCisJLyogSGFzaCBmdW5jdGlvbiBpcyBub2RlIG51bWJlciBtb2R1bG8gdGhlIHRhYmxlIHNpemUuICAqLworCXN0YXJ0ID0gbmV3X3ZhbHVlLT5pbm9kZSAlIGhhc2hfc2l6ZTsKKworCS8qIERvIHRoZSBpbml0aWFsIGxvb2sgaW50byB0aGUgdGFibGUuICAqLworCWlmIChoYXNoX3RhYmxlW3N0YXJ0XSA9PSBOVUxMKSB7CisJCWhhc2hfdGFibGVbc3RhcnRdID0gbmV3X3ZhbHVlOworCQlyZXR1cm47CisJfQorCisJLyogSWYgd2UgZ2V0IHRvIGhlcmUsIHRoZSBob21lIHBvc2l0aW9uIGlzIGZ1bGwgd2l0aCBhIGRpZmZlcmVudCBpbm9kZQorCSAgIHJlY29yZC4gIERvIGEgbGluZWFyIHNlYXJjaCBmb3IgdGhlIGZpcnN0IE5VTEwgcG9pbnRlciBhbmQgaW5zZXJ0CisJICAgdGhlIG5ldyBpdGVtIHRoZXJlLiAgKi8KKwl0ZW1wID0gKHN0YXJ0ICsgMSkgJSBoYXNoX3NpemU7CisJd2hpbGUgKGhhc2hfdGFibGVbdGVtcF0gIT0gTlVMTCkKKwkJdGVtcCA9ICh0ZW1wICsgMSkgJSBoYXNoX3NpemU7CisKKwkvKiBJbnNlcnQgYXQgdGhlIE5VTEwuICAqLworCWhhc2hfdGFibGVbdGVtcF0gPSBuZXdfdmFsdWU7Cit9CisKKy8qIEFzc29jaWF0ZSBGSUxFX05BTUUgd2l0aCB0aGUgaW5vZGUgTk9ERV9OVU0uICAoSW5zZXJ0IGludG8gaGFzaCB0YWJsZS4pICAqLworCit2b2lkCithZGRfaW5vZGUodW5zaWduZWQgbG9uZyBub2RlX251bSwgY2hhciAqZmlsZV9uYW1lLCB1bnNpZ25lZCBsb25nIG1ham9yX251bSwKKwkgIHVuc2lnbmVkIGxvbmcgbWlub3JfbnVtKQoreworCXN0cnVjdCBpbm9kZV92YWwgKnRlbXA7CisKKwkvKiBDcmVhdGUgbmV3IGlub2RlIHJlY29yZC4gICovCisJdGVtcCA9IChzdHJ1Y3QgaW5vZGVfdmFsICopeG1hbGxvYyhzaXplb2Yoc3RydWN0IGlub2RlX3ZhbCkpOworCXRlbXAtPmlub2RlID0gbm9kZV9udW07CisJdGVtcC0+bWFqb3JfbnVtID0gbWFqb3JfbnVtOworCXRlbXAtPm1pbm9yX251bSA9IG1pbm9yX251bTsKKwl0ZW1wLT5maWxlX25hbWUgPSB4c3RyZHVwKGZpbGVfbmFtZSk7CisKKwkvKiBEbyB3ZSBoYXZlIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIChvciBpbml0aWFsbHkgYWxsb2NhdGUpCisJICAgdGhlIGhhc2ggdGFibGU/ICAqLworCWlmIChoYXNoX251bSA9PSBoYXNoX3NpemUgfHwgaGFzaF90YWJsZSA9PSBOVUxMKSB7CisJCXN0cnVjdCBpbm9kZV92YWwgKipvbGRfdGFibGU7CS8qIFBvaW50ZXIgdG8gb2xkIHRhYmxlLiAgKi8KKwkJaW50IGk7CQkvKiBJbmRleCBmb3IgcmUtaW5zZXJ0IGxvb3AuICAqLworCisJCS8qIFNhdmUgb2xkIHRhYmxlLiAgKi8KKwkJb2xkX3RhYmxlID0gaGFzaF90YWJsZTsKKwkJaWYgKG9sZF90YWJsZSA9PSBOVUxMKQorCQkJaGFzaF9udW0gPSAwOworCisJCS8qIENhbGN1bGF0ZSBuZXcgc2l6ZSBvZiB0YWJsZSBhbmQgYWxsb2NhdGUgaXQuCisJCSAgIFNlcXVlbmNlIG9mIHRhYmxlIHNpemVzIGlzIDQ3LCA5NywgMTk3LCAzOTcsIDc5NywgMTU5NywgMzE5NywgNjM5NyAuLi4KKwkJICAgd2hlcmUgMzE5NyBhbmQgbW9zdCBvZiB0aGUgc2l6ZXMgYWZ0ZXIgNjM5NyBhcmUgbm90IHByaW1lLiAgVGhlIG90aGVyCisJCSAgIG51bWJlcnMgbGlzdGVkIGFyZSBwcmltZS4gICovCisJCWhhc2hfc2l6ZSA9IDIgKiBoYXNoX3NpemUgKyAzOworCQloYXNoX3RhYmxlID0gKHN0cnVjdCBpbm9kZV92YWwgKiopCisJCSAgICB4bWFsbG9jKGhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgaW5vZGVfdmFsICopKTsKKwkJbWVtc2V0KGhhc2hfdGFibGUsIDAsIGhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgaW5vZGVfdmFsICopKTsKKworCQkvKiBJbnNlcnQgdGhlIHZhbHVlcyBmcm9tIHRoZSBvbGQgdGFibGUgaW50byB0aGUgbmV3IHRhYmxlLiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IGhhc2hfbnVtOyBpKyspCisJCQloYXNoX2luc2VydChvbGRfdGFibGVbaV0pOworCisJCWlmIChvbGRfdGFibGUgIT0gTlVMTCkKKwkJCWZyZWUob2xkX3RhYmxlKTsKKwl9CisKKwkvKiBJbnNlcnQgdGhlIG5ldyByZWNvcmQgYW5kIGluY3JlbWVudCB0aGUgY291bnQgb2YgZWxlbWVudHMgaW4gdGhlCisJICAgaGFzaCB0YWJsZS4gICovCisJaGFzaF9pbnNlcnQodGVtcCk7CisJaGFzaF9udW0rKzsKK30KKworY2hhciAqZmluZF9pbm9kZV9maWxlKHVuc2lnbmVkIGxvbmcgbm9kZV9udW0sIHVuc2lnbmVkIGxvbmcgbWFqb3JfbnVtLAorCQkgICAgICB1bnNpZ25lZCBsb25nIG1pbm9yX251bSkKK3sKKwlpbnQgc3RhcnQ7CQkvKiBJbml0aWFsIGhhc2ggbG9jYXRpb24uICAqLworCWludCB0ZW1wOwkJLyogUmVoYXNoIHNlYXJjaCB2YXJpYWJsZS4gICovCisKKwlpZiAoaGFzaF90YWJsZSAhPSBOVUxMKSB7CisJCS8qIEhhc2ggZnVuY3Rpb24gaXMgbm9kZSBudW1iZXIgbW9kdWxvIHRoZSB0YWJsZSBzaXplLiAgKi8KKwkJc3RhcnQgPSBub2RlX251bSAlIGhhc2hfc2l6ZTsKKworCQkvKiBJbml0aWFsIGxvb2sgaW50byB0aGUgdGFibGUuICAqLworCQlpZiAoaGFzaF90YWJsZVtzdGFydF0gPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoaGFzaF90YWJsZVtzdGFydF0tPmlub2RlID09IG5vZGVfbnVtCisJCSAgICAmJiBoYXNoX3RhYmxlW3N0YXJ0XS0+bWFqb3JfbnVtID09IG1ham9yX251bQorCQkgICAgJiYgaGFzaF90YWJsZVtzdGFydF0tPm1pbm9yX251bSA9PSBtaW5vcl9udW0pCisJCQlyZXR1cm4gaGFzaF90YWJsZVtzdGFydF0tPmZpbGVfbmFtZTsKKworCQkvKiBUaGUgaG9tZSBwb3NpdGlvbiBpcyBmdWxsIHdpdGggYSBkaWZmZXJlbnQgaW5vZGUgcmVjb3JkLgorCQkgICBEbyBhIGxpbmVhciBzZWFyY2ggdGVybWluYXRlZCBieSBhIE5VTEwgcG9pbnRlci4gICovCisJCWZvciAodGVtcCA9IChzdGFydCArIDEpICUgaGFzaF9zaXplOworCQkgICAgIGhhc2hfdGFibGVbdGVtcF0gIT0gTlVMTCAmJiB0ZW1wICE9IHN0YXJ0OworCQkgICAgIHRlbXAgPSAodGVtcCArIDEpICUgaGFzaF9zaXplKSB7CisJCQlpZiAoaGFzaF90YWJsZVt0ZW1wXS0+aW5vZGUgPT0gbm9kZV9udW0KKwkJCSAgICAmJiBoYXNoX3RhYmxlW3N0YXJ0XS0+bWFqb3JfbnVtID09IG1ham9yX251bQorCQkJICAgICYmIGhhc2hfdGFibGVbc3RhcnRdLT5taW5vcl9udW0gPT0gbWlub3JfbnVtKQorCQkJCXJldHVybiBoYXNoX3RhYmxlW3RlbXBdLT5maWxlX25hbWU7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFRyeSBhbmQgY3JlYXRlIGEgaGFyZCBsaW5rIGZyb20gRklMRV9OQU1FIHRvIGFub3RoZXIgZmlsZSAKKyAgIHdpdGggdGhlIGdpdmVuIG1ham9yL21pbm9yIGRldmljZSBudW1iZXIgYW5kIGlub2RlLiAgSWYgbm8gb3RoZXIKKyAgIGZpbGUgd2l0aCB0aGUgc2FtZSBtYWpvci9taW5vci9pbm9kZSBudW1iZXJzIGlzIGtub3duLCBhZGQgdGhpcyBmaWxlCisgICB0byB0aGUgbGlzdCBvZiBrbm93biBmaWxlcyBhbmQgYXNzb2NpYXRlZCBtYWpvci9taW5vci9pbm9kZSBudW1iZXJzCisgICBhbmQgcmV0dXJuIC0xLiAgSWYgYW5vdGhlciBmaWxlIHdpdGggdGhlIHNhbWUgbWFqb3IvbWlub3IvaW5vZGUKKyAgIG51bWJlcnMgaXMgZm91bmQsIHRyeSBhbmQgY3JlYXRlIGFub3RoZXIgbGluayB0byBpdCB1c2luZworICAgbGlua190b19uYW1lLCBhbmQgcmV0dXJuIDAgZm9yIHN1Y2Nlc3MgYW5kIC0xIGZvciBmYWlsdXJlLiAgKi8KKworaW50CitsaW5rX3RvX21hal9taW5faW5vKGNoYXIgKmZpbGVfbmFtZSwgaW50IHN0X2Rldl9tYWosIGludCBzdF9kZXZfbWluLCBpbnQgc3RfaW5vKQoreworCWludCBsaW5rX3JlczsKKwljaGFyICpsaW5rX25hbWU7CisJbGlua19yZXMgPSAtMTsKKwkvKiBJcyB0aGUgZmlsZSBhIGxpbmsgdG8gYSBwcmV2aW91c2x5IGNvcGllZCBmaWxlPyAgKi8KKwlsaW5rX25hbWUgPSBmaW5kX2lub2RlX2ZpbGUoc3RfaW5vLCBzdF9kZXZfbWFqLCBzdF9kZXZfbWluKTsKKwlpZiAobGlua19uYW1lID09IE5VTEwpCisJCWFkZF9pbm9kZShzdF9pbm8sIGZpbGVfbmFtZSwgc3RfZGV2X21haiwgc3RfZGV2X21pbik7CisJZWxzZQorCQlsaW5rX3JlcyA9IGxpbmtfdG9fbmFtZShmaWxlX25hbWUsIGxpbmtfbmFtZSk7CisJcmV0dXJuIGxpbmtfcmVzOworfQorCitzdGF0aWMgdm9pZCBjb3B5aW5fcmVndWxhcl9maWxlKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyLAorCQkJCWludCBpbl9maWxlX2Rlcyk7CisKK3ZvaWQgd2Fybl9qdW5rX2J5dGVzKGxvbmcgYnl0ZXNfc2tpcHBlZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nOiBza2lwcGVkICVsZCBieXRlKHMpIG9mIGp1bmtcbiIsCisJCXByb2duYW1lLCBieXRlc19za2lwcGVkKTsKK30KKworLyogU2tpcCB0aGUgcGFkZGluZyBvbiBJTl9GSUxFX0RFUyBhZnRlciBhIGhlYWRlciBvciBmaWxlLAorICAgdXAgdG8gdGhlIG5leHQgaGVhZGVyLgorICAgVGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkIGlzIGJhc2VkIG9uIE9GRlNFVCAtLSB0aGUgY3VycmVudCBvZmZzZXQKKyAgIGZyb20gdGhlIGxhc3Qgc3RhcnQgb2YgYSBoZWFkZXIgKG9yIGZpbGUpIC0tIGFuZCB0aGUgY3VycmVudAorICAgaGVhZGVyIHR5cGUuICAqLworCitzdGF0aWMgdm9pZCB0YXBlX3NraXBfcGFkZGluZyhpbnQgaW5fZmlsZV9kZXMsIGludCBvZmZzZXQpCit7CisJaW50IHBhZDsKKwlwYWQgPSAoNCAtIChvZmZzZXQgJSA0KSkgJSA0OworCisJaWYgKHBhZCAhPSAwKQorCQl0YXBlX3Rvc3NfaW5wdXQoaW5fZmlsZV9kZXMsIHBhZCk7Cit9CisKK3N0YXRpYyBpbnQKK3RyeV9leGlzdGluZ19maWxlKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyLCBpbnQgaW5fZmlsZV9kZXMsCisJCSAgaW50ICpleGlzdGluZ19kaXIpCit7CisJc3RydWN0IHN0YXQgZmlsZV9zdGF0OworCisJKmV4aXN0aW5nX2RpciA9IGZhbHNlOworCWlmIChsc3RhdChmaWxlX2hkci0+Y19uYW1lLCAmZmlsZV9zdGF0KSA9PSAwKSB7CisJCWlmIChTX0lTRElSKGZpbGVfc3RhdC5zdF9tb2RlKQorCQkgICAgJiYgKChmaWxlX2hkci0+Y19tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSkgeworCQkJLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGRpcmVjdG9yeSB0aGVyZSB0aGF0CisJCQkgICB3ZSBhcmUgdHJ5aW5nIHRvIGNyZWF0ZSwgZG9uJ3QgY29tcGxhaW4gYWJvdXQKKwkJCSAgIGl0LiAgKi8KKwkJCSpleGlzdGluZ19kaXIgPSB0cnVlOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoU19JU0RJUihmaWxlX3N0YXQuc3RfbW9kZSkKKwkJCSAgID8gcm1kaXIoZmlsZV9oZHItPmNfbmFtZSkKKwkJCSAgIDogdW5saW5rKGZpbGVfaGRyLT5jX25hbWUpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgcmVtb3ZlIGN1cnJlbnQgJXM6ICVzXG4iLAorCQkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJdGFwZV90b3NzX2lucHV0KGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJCQl0YXBlX3NraXBfcGFkZGluZyhpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCQkJcmV0dXJuIC0xOwkvKiBHbyB0byB0aGUgbmV4dCBmaWxlLiAgKi8KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogVGhlIG5ld2MgYW5kIGNyYyBmb3JtYXRzIHN0b3JlIG11bHRpcGx5IGxpbmtlZCBjb3BpZXMgb2YgdGhlIHNhbWUgZmlsZSAKKyAgIGluIHRoZSBhcmNoaXZlIG9ubHkgb25jZS4gIFRoZSBhY3R1YWwgZGF0YSBpcyBhdHRhY2hlZCB0byB0aGUgbGFzdCBsaW5rIAorICAgaW4gdGhlIGFyY2hpdmUsIGFuZCB0aGUgb3RoZXIgbGlua3MgYWxsIGhhdmUgYSBmaWxlc2l6ZSBvZiAwLiAgV2hlbiBhIAorICAgZmlsZSBpbiB0aGUgYXJjaGl2ZSBoYXMgbXVsdGlwbGUgbGlua3MgYW5kIGEgZmlsZXNpemUgb2YgMCwgaXRzIGRhdGEgaXMgCisgICBwcm9iYWJseSAiYXR0YXRjaGVkIiB0byBhbm90aGVyIGZpbGUgaW4gdGhlIGFyY2hpdmUsIHNvIHdlIGNhbid0IGNyZWF0ZQorICAgaXQgcmlnaHQgYXdheS4gIFdlIGhhdmUgdG8gImRlZmVyIiBjcmVhdGluZyBpdCB1bnRpbCB3ZSBoYXZlIGNyZWF0ZWQKKyAgIHRoZSBmaWxlIHRoYXQgaGFzIHRoZSBkYXRhICJhdHRhdGNoZWQiIHRvIGl0LiAgV2Uga2VlcCBhIGxpc3Qgb2YgdGhlCisgICAiZGVmZXJlZCIgbGlua3Mgb24gZGVmZXJtZW50cy4gICovCisKK3N0cnVjdCBkZWZlcm1lbnQgKmRlZmVybWVudHMgPSBOVUxMOworCisvKiBBZGQgYSBmaWxlIGhlYWRlciB0byB0aGUgZGVmZXJtZW50cyBsaXN0LiAgRm9yIG5vdyB0aGV5IGFsbCBqdXN0CisgICBnbyBvbiBvbmUgbGlzdCwgYWx0aG91Z2ggd2UgY291bGQgb3B0aW1pemUgdGhpcyBpZiBuZWNlc3NhcnkuICAqLworCitzdGF0aWMgdm9pZCBkZWZlcl9jb3B5aW4oc3RydWN0IG5ld19jcGlvX2hlYWRlciAqZmlsZV9oZHIpCit7CisJc3RydWN0IGRlZmVybWVudCAqZDsKKwlkID0gY3JlYXRlX2RlZmVybWVudChmaWxlX2hkcik7CisJZC0+bmV4dCA9IGRlZmVybWVudHM7CisJZGVmZXJtZW50cyA9IGQ7CisJcmV0dXJuOworfQorCisvKiBXZSBqdXN0IGNyZWF0ZWQgYSBmaWxlIHRoYXQgKHByb2JhYmx5KSBoYXMgc29tZSBvdGhlciBsaW5rcyB0byBpdAorICAgd2hpY2ggaGF2ZSBiZWVuIGRlZmVyZWQuICBHbyB0aHJvdWdoIGFsbCBvZiB0aGUgbGlua3Mgb24gdGhlIGRlZmVybWVudHMKKyAgIGxpc3QgYW5kIGNyZWF0ZSBhbnkgd2hpY2ggYXJlIGxpbmtzIHRvIHRoaXMgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZWZlcmVkX2xpbmtzKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyKQoreworCXN0cnVjdCBkZWZlcm1lbnQgKmQ7CisJc3RydWN0IGRlZmVybWVudCAqZF9wcmV2OworCWludCBpbm87CisJaW50IG1hajsKKwlpbnQgbWluOworCWludCBsaW5rX3JlczsKKwlpbm8gPSBmaWxlX2hkci0+Y19pbm87CisJbWFqID0gZmlsZV9oZHItPmNfZGV2X21hajsKKwltaW4gPSBmaWxlX2hkci0+Y19kZXZfbWluOworCWQgPSBkZWZlcm1lbnRzOworCWRfcHJldiA9IE5VTEw7CisJd2hpbGUgKGQgIT0gTlVMTCkgeworCQlpZiAoKGQtPmhlYWRlci5jX2lubyA9PSBpbm8pICYmIChkLT5oZWFkZXIuY19kZXZfbWFqID09IG1haikKKwkJICAgICYmIChkLT5oZWFkZXIuY19kZXZfbWluID09IG1pbikpIHsKKwkJCXN0cnVjdCBkZWZlcm1lbnQgKmRfZnJlZTsKKwkJCWxpbmtfcmVzID0KKwkJCSAgICBsaW5rX3RvX25hbWUoZC0+aGVhZGVyLmNfbmFtZSwgZmlsZV9oZHItPmNfbmFtZSk7CisJCQlpZiAobGlua19yZXMgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSIlczogY2Fubm90IGxpbmsgJXMgdG8gJXM6ICVzXG4iLAorCQkJCQlwcm9nbmFtZSwgZC0+aGVhZGVyLmNfbmFtZSwKKwkJCQkJZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCWlmIChkX3ByZXYgIT0gTlVMTCkKKwkJCQlkX3ByZXYtPm5leHQgPSBkLT5uZXh0OworCQkJZWxzZQorCQkJCWRlZmVybWVudHMgPSBkLT5uZXh0OworCQkJZF9mcmVlID0gZDsKKwkJCWQgPSBkLT5uZXh0OworCQkJZnJlZV9kZWZlcm1lbnQoZF9mcmVlKTsKKwkJfSBlbHNlIHsKKwkJCWRfcHJldiA9IGQ7CisJCQlkID0gZC0+bmV4dDsKKwkJfQorCX0KK30KKworLyogSWYgd2UgaGFkIGEgbXVsdGlwbHkgbGlua2VkIGZpbGUgdGhhdCByZWFsbHkgd2FzIGVtcHR5IHRoZW4gd2Ugd291bGQKKyAgIGhhdmUgZGVmZXJlZCBhbGwgb2YgaXRzIGxpbmtzLCBzaW5jZSB3ZSBuZXZlciBmb3VuZCBhbnkgd2l0aCBkYXRhCisgICAiYXR0YWNoZWQiLCBhbmQgdGhleSB3aWxsIHN0aWxsIGJlIG9uIHRoZSBkZWZlcm1lbnQgbGlzdCBldmVuIHdoZW4KKyAgIHdlIGFyZSBkb25lIHJlYWRpbmcgdGhlIHdob2xlIGFyY2hpdmUuICBXcml0ZSBvdXQgYWxsIG9mIHRoZXNlCisgICBlbXB0eSBsaW5rcyB0aGF0IGFyZSBzdGlsbCBvbiB0aGUgZGVmZXJtZW50cyBsaXN0LiAgKi8KKworc3RhdGljIHZvaWQgY3JlYXRlX2ZpbmFsX2RlZmVycygpCit7CisJc3RydWN0IGRlZmVybWVudCAqZDsKKwlpbnQgbGlua19yZXM7CisJaW50IG91dF9maWxlX2RlczsKKwlzdHJ1Y3QgdXRpbWJ1ZiB0aW1lczsJLyogRm9yIHNldHRpbmcgZmlsZSB0aW1lcy4gICovCisJLyogSW5pdGlhbGl6ZSB0aGlzIGluIGNhc2UgaXQgaGFzIG1lbWJlcnMgd2UgZG9uJ3Qga25vdyB0byBzZXQuICAqLworCW1lbXNldCgmdGltZXMsIDAsIHNpemVvZihzdHJ1Y3QgdXRpbWJ1ZikpOworCisJZm9yIChkID0gZGVmZXJtZW50czsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkgeworCQkvKiBEZWJpYW4gaGFjazogQSBsaW5lLCB3aGljaCBjb3VsZCBjYXVzZSBhbiBlbmRsZXNzIGxvb3AsIHdhcworCQkgICByZW1vdmVkICg5Ny8xLzIpLiAgSXQgd2FzIHJlcG9ydGVkIGJ5IFJvbmFsZCBGLiBHdWlsbWV0dGUgdG8KKwkJICAgdGhlIHVwc3RyZWFtIG1haW50YWluZXJzLiAtQkVNICovCisJCS8qIERlYmlhbiBoYWNrOiAgVGhpcyB3YXMgcmVwb3J0ZWQgYnkgSG9yc3QgS25vYmxvY2guIFRoaXMgYnVnIGhhcworCQkgICBiZWVuIHJlcG9ydGVkIHRvICJidWctZ251LXV0aWxzQHByZXAuYWkubWl0LmVkdSIuICg5OS8xLzYpIC1CRU0KKwkJICovCisJCWxpbmtfcmVzID0gbGlua190b19tYWpfbWluX2lubyhkLT5oZWFkZXIuY19uYW1lLAorCQkJCQkgICAgICAgZC0+aGVhZGVyLmNfZGV2X21haiwKKwkJCQkJICAgICAgIGQtPmhlYWRlci5jX2Rldl9taW4sCisJCQkJCSAgICAgICBkLT5oZWFkZXIuY19pbm8pOworCQlpZiAobGlua19yZXMgPT0gMCkgeworCQkJY29udGludWU7CisJCX0KKwkJb3V0X2ZpbGVfZGVzID0gb3BlbihkLT5oZWFkZXIuY19uYW1lLAorCQkJCSAgICBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0JJTkFSWSwgMDYwMCk7CisJCWlmIChvdXRfZmlsZV9kZXMgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuICVzOiAlc1xuIiwKKwkJCQlwcm9nbmFtZSwgZC0+aGVhZGVyLmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRmlsZSBpcyBub3cgY29waWVkOyBzZXQgYXR0cmlidXRlcy4gICovCisJCWlmICgoZmNob3duKG91dF9maWxlX2RlcywgZC0+aGVhZGVyLmNfdWlkLCBkLT5oZWFkZXIuY19naWQpIDwgMCkKKwkJICAgICYmIGVycm5vICE9IEVQRVJNKQorCQkJZnByaW50ZihzdGRlcnIsICIlczogZmNob3duICVzOiAlc1xuIiwKKwkJCQlwcm9nbmFtZSwgZC0+aGVhZGVyLmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogY2hvd24gbWF5IGhhdmUgdHVybmVkIG9mZiBzb21lIHBlcm1pc3Npb25zIHdlIHdhbnRlZC4gKi8KKwkJaWYgKGZjaG1vZChvdXRfZmlsZV9kZXMsIChpbnQpZC0+aGVhZGVyLmNfbW9kZSkgPCAwKQorCQkJZnByaW50ZihzdGRlcnIsICIlczogZmNobW9kICVzOiAlc1xuIiwKKwkJCQlwcm9nbmFtZSwgZC0+aGVhZGVyLmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCQlpZiAoY2xvc2Uob3V0X2ZpbGVfZGVzKSA8IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjbG9zZSAlczogJXNcbiIsCisJCQkJcHJvZ25hbWUsIGQtPmhlYWRlci5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5aW5fcmVndWxhcl9maWxlKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyLCBpbnQgaW5fZmlsZV9kZXMpCit7CisJaW50IG91dF9maWxlX2RlczsJLyogT3V0cHV0IGZpbGUgZGVzY3JpcHRvci4gICovCisKKwkvKiBDYW4gdGhlIGN1cnJlbnQgZmlsZSBiZSBsaW5rZWQgdG8gYSBwcmV2aW91c2x5IGNvcGllZCBmaWxlPyAqLworCWlmIChmaWxlX2hkci0+Y19ubGluayA+IDEpIHsKKwkJaW50IGxpbmtfcmVzOworCQlpZiAoZmlsZV9oZHItPmNfZmlsZXNpemUgPT0gMCkgeworCQkJLyogVGhlIG5ld2MgYW5kIGNyYyBmb3JtYXRzIHN0b3JlIG11bHRpcGx5IGxpbmtlZCBjb3BpZXMKKwkJCSAgIG9mIHRoZSBzYW1lIGZpbGUgaW4gdGhlIGFyY2hpdmUgb25seSBvbmNlLiAgVGhlCisJCQkgICBhY3R1YWwgZGF0YSBpcyBhdHRhY2hlZCB0byB0aGUgbGFzdCBsaW5rIGluIHRoZQorCQkJICAgYXJjaGl2ZSwgYW5kIHRoZSBvdGhlciBsaW5rcyBhbGwgaGF2ZSBhIGZpbGVzaXplCisJCQkgICBvZiAwLiAgU2luY2UgdGhpcyBmaWxlIGhhcyBtdWx0aXBsZSBsaW5rcyBhbmQgYQorCQkJICAgZmlsZXNpemUgb2YgMCwgaXRzIGRhdGEgaXMgcHJvYmFibHkgYXR0YXRjaGVkIHRvCisJCQkgICBhbm90aGVyIGZpbGUgaW4gdGhlIGFyY2hpdmUuICBTYXZlIHRoZSBsaW5rLCBhbmQKKwkJCSAgIHByb2Nlc3MgaXQgbGF0ZXIgd2hlbiB3ZSBnZXQgdGhlIGFjdHVhbCBkYXRhLiAgV2UKKwkJCSAgIGNhbid0IGp1c3QgY3JlYXRlIGl0IHdpdGggbGVuZ3RoIDAgYW5kIGFkZCB0aGUKKwkJCSAgIGRhdGEgbGF0ZXIsIGluIGNhc2UgdGhlIGZpbGUgaXMgcmVhZG9ubHkuICBXZSBzdGlsbAorCQkJICAgbG9zZSBpZiBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyByZWFkb25seSAoYW5kIHdlIGFyZW4ndAorCQkJICAgcnVubmluZyBhcyByb290KSwgYnV0IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQKKwkJCSAgIHRoYXQuICAqLworCQkJZGVmZXJfY29weWluKGZpbGVfaGRyKTsKKwkJCXRhcGVfdG9zc19pbnB1dChpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCQkJdGFwZV9za2lwX3BhZGRpbmcoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBJZiB0aGUgZmlsZSBoYXMgZGF0YSAoZmlsZXNpemUgIT0gMCksIHRoZW4gcHJlc3VtYWJseQorCQkgICBhbnkgb3RoZXIgbGlua3MgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmZXJfY29weWluJ2VkKCksCisJCSAgIGJ1dCBHTlUgY3BpbyB2ZXJzaW9uIDIuMC0yLjIgZGlkbid0IGRvIHRoYXQsIHNvIHdlCisJCSAgIHN0aWxsIGhhdmUgdG8gY2hlY2sgZm9yIGxpbmtzIGhlcmUgKGFuZCBhbHNvIGluIGNhc2UKKwkJICAgdGhlIGFyY2hpdmUgd2FzIGNyZWF0ZWQgYW5kIGxhdGVyIGFwcGVuZWRlZCB0bykuICovCisJCS8qIERlYmlhbiBoYWNrOiAoOTcvMS8yKSBUaGlzIHdhcyByZXBvcnRlZCBieSBSb25hbGQKKwkJICAgRi4gR3VpbG1ldHRlIHRvIHRoZSB1cHN0cmVhbSBtYWludGFpbmVycy4gLUJFTSAqLworCQlsaW5rX3JlcyA9IGxpbmtfdG9fbWFqX21pbl9pbm8oZmlsZV9oZHItPmNfbmFtZSwKKwkJCQkJICAgICAgIGZpbGVfaGRyLT5jX2Rldl9tYWosCisJCQkJCSAgICAgICBmaWxlX2hkci0+Y19kZXZfbWluLAorCQkJCQkgICAgICAgZmlsZV9oZHItPmNfaW5vKTsKKwkJaWYgKGxpbmtfcmVzID09IDApIHsKKwkJCXRhcGVfdG9zc19pbnB1dChpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCQkJdGFwZV9za2lwX3BhZGRpbmcoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIElmIG5vdCBsaW5rZWQsIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLiAgKi8KKwlvdXRfZmlsZV9kZXMgPSBvcGVuKGZpbGVfaGRyLT5jX25hbWUsCisJCQkgICAgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19CSU5BUlksIDA2MDApOworCisJaWYgKG91dF9maWxlX2RlcyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogb3BlbiAlczogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJdGFwZV90b3NzX2lucHV0KGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJCXRhcGVfc2tpcF9wYWRkaW5nKGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJCXJldHVybjsKKwl9CisKKwljb3B5X2ZpbGVzX3RhcGVfdG9fZGlzayhpbl9maWxlX2Rlcywgb3V0X2ZpbGVfZGVzLAorCQkJCWZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwlkaXNrX2VtcHR5X291dHB1dF9idWZmZXIob3V0X2ZpbGVfZGVzKTsKKworCWlmIChjbG9zZShvdXRfZmlsZV9kZXMpIDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2xvc2UgJXM6ICVzXG4iLAorCQkJcHJvZ25hbWUsIGZpbGVfaGRyLT5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBGaWxlIGlzIG5vdyBjb3BpZWQ7IHNldCBhdHRyaWJ1dGVzLiAgKi8KKwlpZiAoKGNob3duKGZpbGVfaGRyLT5jX25hbWUsIGZpbGVfaGRyLT5jX3VpZCwgZmlsZV9oZHItPmNfZ2lkKSA8IDApCisJICAgICYmIGVycm5vICE9IEVQRVJNKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjaG93biAlczogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIGNob3duIG1heSBoYXZlIHR1cm5lZCBvZmYgc29tZSBwZXJtaXNzaW9ucyB3ZSB3YW50ZWQuICovCisJaWYgKGNobW9kKGZpbGVfaGRyLT5jX25hbWUsIChpbnQpZmlsZV9oZHItPmNfbW9kZSkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjaG1vZCAlczogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCXRhcGVfc2tpcF9wYWRkaW5nKGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJaWYgKGZpbGVfaGRyLT5jX25saW5rID4gMSkgeworCQkvKiAoc2VlIGNvbW1lbnQgYWJvdmUgZm9yIGhvdyB0aGUgbmV3YyBhbmQgY3JjIGZvcm1hdHMgCisJCSAgIHN0b3JlIG11bHRpcGxlIGxpbmtzKS4gIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGRhdGEgCisJCSAgIGZvciB0aGlzIGZpbGUsIGNyZWF0ZSBhbnkgb3RoZXIgbGlua3MgdG8gaXQgd2hpY2gKKwkJICAgd2UgZGVmZXJlZC4gICovCisJCWNyZWF0ZV9kZWZlcmVkX2xpbmtzKGZpbGVfaGRyKTsKKwl9Cit9CisKKy8qIEluIGdlbmVyYWwsIHdlIGNhbid0IHVzZSB0aGUgYnVpbHRpbiBgYmFzZW5hbWUnIGZ1bmN0aW9uIGlmIGF2YWlsYWJsZSwKKyAgIHNpbmNlIGl0IGhhcyBkaWZmZXJlbnQgbWVhbmluZ3MgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy4KKyAgIEluIHNvbWUgZW52aXJvbm1lbnRzIHRoZSBidWlsdGluIGBiYXNlbmFtZScgbW9kaWZpZXMgaXRzIGFyZ3VtZW50LgorCisgICBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgZmlsZSBuYW1lIGNvbXBvbmVudCBvZiBOQU1FLiAgSWYKKyAgIE5BTUUgaGFzIG5vIGZpbGUgbmFtZSBjb21wb25lbnRzIGJlY2F1c2UgaXQgaXMgYWxsIHNsYXNoZXMsIHJldHVybgorICAgTkFNRSBpZiBpdCBpcyBlbXB0eSwgdGhlIGFkZHJlc3Mgb2YgaXRzIGxhc3Qgc2xhc2ggb3RoZXJ3aXNlLiAgKi8KKworY2hhciAqYmFzZV9uYW1lKGNoYXIgY29uc3QgKm5hbWUpCit7CisJY2hhciBjb25zdCAqYmFzZSA9IG5hbWUgKyBGSUxFX1NZU1RFTV9QUkVGSVhfTEVOKG5hbWUpOworCWNoYXIgY29uc3QgKnA7CisKKwlmb3IgKHAgPSBiYXNlOyAqcDsgcCsrKSB7CisJCWlmIChJU1NMQVNIKCpwKSkgeworCQkJLyogVHJlYXQgbXVsdGlwbGUgYWRqYWNlbnQgc2xhc2hlcyBsaWtlIGEgc2luZ2xlIHNsYXNoLiAgKi8KKwkJCWRvCisJCQkJcCsrOworCQkJd2hpbGUgKElTU0xBU0goKnApKTsKKworCQkJLyogSWYgdGhlIGZpbGUgbmFtZSBlbmRzIGluIHNsYXNoLCB1c2UgdGhlIHRyYWlsaW5nIHNsYXNoIGFzCisJCQkgICB0aGUgYmFzZW5hbWUgaWYgbm8gbm9uLXNsYXNoZXMgaGF2ZSBiZWVuIGZvdW5kLiAgKi8KKwkJCWlmICghKnApIHsKKwkJCQlpZiAoSVNTTEFTSCgqYmFzZSkpCisJCQkJCWJhc2UgPSBwIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogKlAgaXMgYSBub24tc2xhc2ggcHJlY2VkZWQgYnkgYSBzbGFzaC4gICovCisJCQliYXNlID0gcDsKKwkJfQorCX0KKworCXJldHVybiAoY2hhciAqKWJhc2U7Cit9CisKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIG9mIHRoZSBiYXNlbmFtZSBOQU1FLiAgVHlwaWNhbGx5IE5BTUUgaXMgdGhlCisgICB2YWx1ZSByZXR1cm5lZCBieSBiYXNlX25hbWUuICBBY3QgbGlrZSBzdHJsZW4gKE5BTUUpLCBleGNlcHQgb21pdAorICAgcmVkdW5kYW50IHRyYWlsaW5nIHNsYXNoZXMuICAqLworCitzaXplX3QgYmFzZV9sZW4oY2hhciBjb25zdCAqbmFtZSkKK3sKKwlzaXplX3QgbGVuOworCisJZm9yIChsZW4gPSBzdHJsZW4obmFtZSk7IDEgPCBsZW4gJiYgSVNTTEFTSChuYW1lW2xlbiAtIDFdKTsgbGVuLS0pCisJCWNvbnRpbnVlOworCisJcmV0dXJuIGxlbjsKK30KKworLyogUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBQQVRILgorICAgUmV0dXJuIHRydWUgaWYgYSB0cmFpbGluZyBzbGFzaCB3YXMgcmVtb3ZlZC4KKyAgIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNpbmcgZmlsZW5hbWUgY29tcGxldGlvbiBmcm9tIGEgc2hlbGwgdGhhdAorICAgYWRkcyBhICIvIiBhZnRlciBkaXJlY3RvcnkgbmFtZXMgKHN1Y2ggYXMgdGNzaCBhbmQgYmFzaCksIGJlY2F1c2UKKyAgIHRoZSBVbml4IHJlbmFtZSBhbmQgcm1kaXIgc3lzdGVtIGNhbGxzIHJldHVybiBhbiAiSW52YWxpZCBhcmd1bWVudCIgZXJyb3IKKyAgIHdoZW4gZ2l2ZW4gYSBwYXRoIHRoYXQgZW5kcyBpbiAiLyIgKGV4Y2VwdCBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5KS4gICovCisKK2Jvb2wgc3RyaXBfdHJhaWxpbmdfc2xhc2hlcyhjaGFyICpwYXRoKQoreworCWNoYXIgKmJhc2UgPSBiYXNlX25hbWUocGF0aCk7CisJY2hhciAqYmFzZV9saW0gPSBiYXNlICsgYmFzZV9sZW4oYmFzZSk7CisJYm9vbCBoYWRfc2xhc2ggPSAoKmJhc2VfbGltICE9ICdcMCcpOworCSpiYXNlX2xpbSA9ICdcMCc7CisJcmV0dXJuIGhhZF9zbGFzaDsKK30KKworc3RhdGljIHZvaWQgY29weWluX2RpcmVjdG9yeShzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkciwgaW50IGV4aXN0aW5nX2RpcikKK3sKKwlpbnQgcmVzOwkJLyogUmVzdWx0IG9mIHZhcmlvdXMgZnVuY3Rpb24gY2FsbHMuICAqLworCisJLyogU3RyaXAgYW55IHRyYWlsaW5nIGAvJ3Mgb2ZmIHRoZSBmaWxlbmFtZTsgdGFyIHB1dHMKKwkgICB0aGVtIG9uLiAgV2UgbWlnaHQgYXMgd2VsbCBkbyBpdCBoZXJlIGluIGNhc2UgYW55Ym9keQorCSAgIGVsc2UgZG9lcyB0b28sIHNpbmNlIHRoZXkgY2F1c2Ugc3RyYW5nZSB0aGluZ3MgdG8gaGFwcGVuLiAgKi8KKwlzdHJpcF90cmFpbGluZ19zbGFzaGVzKGZpbGVfaGRyLT5jX25hbWUpOworCisJLyogSWdub3JlIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEl0IG11c3QgYWxyZWFkeSBleGlzdCwKKwkgICBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXRzIHBlcm1pc3Npb24sIG93bmVyc2hpcAorCSAgIG9yIHRpbWUuICAqLworCWlmIChmaWxlX2hkci0+Y19uYW1lWzBdID09ICcuJyAmJiBmaWxlX2hkci0+Y19uYW1lWzFdID09ICdcMCcpIHsKKwkJcmV0dXJuOworCX0KKworCWlmICghZXhpc3RpbmdfZGlyKQorCXsKKwkJcmVzID0gbWtkaXIoZmlsZV9oZHItPmNfbmFtZSwgZmlsZV9oZHItPmNfbW9kZSk7CisJfSBlbHNlCisJCXJlcyA9IDA7CisJaWYgKHJlcyA8IDApIHsKKwkJLyogSW4gc29tZSBvZGQgY2FzZXMgd2hlcmUgdGhlIGZpbGVfaGRyLT5jX25hbWUgaW5jbHVkZXMgYC4nLAorCQkgICB0aGUgZGlyZWN0b3J5IG1heSBoYXZlIGFjdHVhbGx5IGJlZW4gY3JlYXRlZCBieQorCQkgICBjcmVhdGVfYWxsX2RpcmVjdG9yaWVzKCksIHNvIHRoZSBta2RpciB3aWxsIGZhaWwKKwkJICAgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4gIElmIHRoYXQncyB0aGUgY2FzZSwKKwkJICAgZG9uJ3QgY29tcGxhaW4gYWJvdXQgaXQuICAqLworCQlzdHJ1Y3Qgc3RhdCBmaWxlX3N0YXQ7CisJCWlmICgoZXJybm8gIT0gRUVYSVNUKSB8fAorCQkgICAgKGxzdGF0KGZpbGVfaGRyLT5jX25hbWUsICZmaWxlX3N0YXQpICE9IDApIHx8CisJCSAgICAhKFNfSVNESVIoZmlsZV9zdGF0LnN0X21vZGUpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogbHN0YXQgJXM6ICVzXG4iLAorCQkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmICgoY2hvd24oZmlsZV9oZHItPmNfbmFtZSwgZmlsZV9oZHItPmNfdWlkLCBmaWxlX2hkci0+Y19naWQpIDwgMCkKKwkgICAgJiYgZXJybm8gIT0gRVBFUk0pCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNob3duICVzOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCS8qIGNob3duIG1heSBoYXZlIHR1cm5lZCBvZmYgc29tZSBwZXJtaXNzaW9ucyB3ZSB3YW50ZWQuICovCisJaWYgKGNobW9kKGZpbGVfaGRyLT5jX25hbWUsIChpbnQpZmlsZV9oZHItPmNfbW9kZSkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjaG1vZCAlczogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQgY29weWluX2RldmljZShzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkcikKK3sKKwlpbnQgcmVzOwkJLyogUmVzdWx0IG9mIHZhcmlvdXMgZnVuY3Rpb24gY2FsbHMuICAqLworCisJaWYgKGZpbGVfaGRyLT5jX25saW5rID4gMSkgeworCQlpbnQgbGlua19yZXM7CisJCS8qIERlYmlhbiBoYWNrOiAgVGhpcyB3YXMgcmVwb3J0ZWQgYnkgSG9yc3QKKwkJICAgS25vYmxvY2guIFRoaXMgYnVnIGhhcyBiZWVuIHJlcG9ydGVkIHRvCisJCSAgICJidWctZ251LXV0aWxzQHByZXAuYWkubWl0LmVkdSIuICg5OS8xLzYpIC1CRU0gKi8KKwkJbGlua19yZXMgPSBsaW5rX3RvX21hal9taW5faW5vKGZpbGVfaGRyLT5jX25hbWUsCisJCQkJCSAgICAgICBmaWxlX2hkci0+Y19kZXZfbWFqLAorCQkJCQkgICAgICAgZmlsZV9oZHItPmNfZGV2X21pbiwKKwkJCQkJICAgICAgIGZpbGVfaGRyLT5jX2lubyk7CisJCWlmIChsaW5rX3JlcyA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlyZXMgPSBta25vZChmaWxlX2hkci0+Y19uYW1lLCBmaWxlX2hkci0+Y19tb2RlLAorCQkgICAgbWFrZWRldihmaWxlX2hkci0+Y19yZGV2X21haiwgZmlsZV9oZHItPmNfcmRldl9taW4pKTsKKwlpZiAocmVzIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBta25vZCAlczogJXNcbiIsIHByb2duYW1lLAorCQkJZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKGNob3duKGZpbGVfaGRyLT5jX25hbWUsIGZpbGVfaGRyLT5jX3VpZCwgZmlsZV9oZHItPmNfZ2lkKSA8IDApCisJICAgICYmIGVycm5vICE9IEVQRVJNKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjaG93biAlczogJXNcbiIsIHByb2duYW1lLAorCQkJZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkvKiBjaG93biBtYXkgaGF2ZSB0dXJuZWQgb2ZmIHNvbWUgcGVybWlzc2lvbnMgd2Ugd2FudGVkLiAqLworCWlmIChjaG1vZChmaWxlX2hkci0+Y19uYW1lLCBmaWxlX2hkci0+Y19tb2RlKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNobW9kICVzOiAlc1xuIiwgcHJvZ25hbWUsCisJCQlmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgdm9pZCBjb3B5aW5fbGluayhzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkciwgaW50IGluX2ZpbGVfZGVzKQoreworCWNoYXIgKmxpbmtfbmFtZSA9IE5VTEw7CS8qIE5hbWUgb2YgaGFyZCBhbmQgc3ltYm9saWMgbGlua3MuICAqLworCWludCByZXM7CQkvKiBSZXN1bHQgb2YgdmFyaW91cyBmdW5jdGlvbiBjYWxscy4gICovCisKKwlsaW5rX25hbWUgPSAoY2hhciAqKXhtYWxsb2MoKHVuc2lnbmVkIGludClmaWxlX2hkci0+Y19maWxlc2l6ZSArIDEpOworCWxpbmtfbmFtZVtmaWxlX2hkci0+Y19maWxlc2l6ZV0gPSAnXDAnOworCXRhcGVfYnVmZmVyZWRfcmVhZChsaW5rX25hbWUsIGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJdGFwZV9za2lwX3BhZGRpbmcoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKworCXJlcyA9IFVNQVNLRURfU1lNTElOSyhsaW5rX25hbWUsIGZpbGVfaGRyLT5jX25hbWUsIGZpbGVfaGRyLT5jX21vZGUpOworCWlmIChyZXMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IFVNQVNLRURfU1lNTElOSyAlczogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZnJlZShsaW5rX25hbWUpOworCQlyZXR1cm47CisJfQorCWlmICgobGNob3duKGZpbGVfaGRyLT5jX25hbWUsIGZpbGVfaGRyLT5jX3VpZCwgZmlsZV9oZHItPmNfZ2lkKSA8IDApCisJICAgICYmIGVycm5vICE9IEVQRVJNKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGxjaG93biAlczogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJZnJlZShsaW5rX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBjb3B5aW5fZmlsZShzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkciwgaW50IGluX2ZpbGVfZGVzKQoreworCWludCBleGlzdGluZ19kaXI7CisKKwlpZiAodHJ5X2V4aXN0aW5nX2ZpbGUoZmlsZV9oZHIsIGluX2ZpbGVfZGVzLCAmZXhpc3RpbmdfZGlyKSA8IDApCisJCXJldHVybjsKKworCS8qIERvIHRoZSByZWFsIGNvcHkgb3IgbGluay4gICovCisJc3dpdGNoIChmaWxlX2hkci0+Y19tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQljb3B5aW5fcmVndWxhcl9maWxlKGZpbGVfaGRyLCBpbl9maWxlX2Rlcyk7CisJCWJyZWFrOworCisJY2FzZSBTX0lGRElSOgorCQljb3B5aW5fZGlyZWN0b3J5KGZpbGVfaGRyLCBleGlzdGluZ19kaXIpOworCQlicmVhazsKKworCWNhc2UgU19JRkNIUjoKKwljYXNlIFNfSUZCTEs6CisjaWZkZWYgU19JRlNPQ0sKKwljYXNlIFNfSUZTT0NLOgorI2VuZGlmCisjaWZkZWYgU19JRklGTworCWNhc2UgU19JRklGTzoKKyNlbmRpZgorCQljb3B5aW5fZGV2aWNlKGZpbGVfaGRyKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBTX0lGTE5LCisJY2FzZSBTX0lGTE5LOgorCQljb3B5aW5fbGluayhmaWxlX2hkciwgaW5fZmlsZV9kZXMpOworCQlicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICIlczogJXM6IHVua25vd24gZmlsZSB0eXBlXG4iLAorCQkJcHJvZ25hbWUsIGZpbGVfaGRyLT5jX25hbWUpOworCQl0YXBlX3Rvc3NfaW5wdXQoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwkJdGFwZV9za2lwX3BhZGRpbmcoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwl9Cit9CisKKy8qIEZpbGwgaW4gRklMRV9IRFIgYnkgcmVhZGluZyBhIG5ldy1mb3JtYXQgQVNDSUkgZm9ybWF0IGNwaW8gaGVhZGVyIGZyb20KKyAgIGZpbGUgZGVzY3JpcHRvciBJTl9ERVMsIGV4Y2VwdCBmb3IgdGhlIG1hZ2ljIG51bWJlciwgd2hpY2ggaXMKKyAgIGFscmVhZHkgZmlsbGVkIGluLiAgKi8KKwordm9pZCByZWFkX2luX25ld19hc2NpaShzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkciwgaW50IGluX2RlcykKK3sKKwljaGFyIGFzY2lpX2hlYWRlclsxMTJdOworCisJdGFwZV9idWZmZXJlZF9yZWFkKGFzY2lpX2hlYWRlciwgaW5fZGVzLCAxMDRMKTsKKwlhc2NpaV9oZWFkZXJbMTA0XSA9ICdcMCc7CisJc3NjYW5mKGFzY2lpX2hlYWRlciwKKwkgICAgICAgIiU4bHglOGx4JThseCU4bHglOGx4JThseCU4bHglOGx4JThseCU4bHglOGx4JThseCU4bHgiLAorCSAgICAgICAmZmlsZV9oZHItPmNfaW5vLCAmZmlsZV9oZHItPmNfbW9kZSwgJmZpbGVfaGRyLT5jX3VpZCwKKwkgICAgICAgJmZpbGVfaGRyLT5jX2dpZCwgJmZpbGVfaGRyLT5jX25saW5rLCAmZmlsZV9oZHItPmNfbXRpbWUsCisJICAgICAgICZmaWxlX2hkci0+Y19maWxlc2l6ZSwgJmZpbGVfaGRyLT5jX2Rldl9tYWosCisJICAgICAgICZmaWxlX2hkci0+Y19kZXZfbWluLCAmZmlsZV9oZHItPmNfcmRldl9tYWosCisJICAgICAgICZmaWxlX2hkci0+Y19yZGV2X21pbiwgJmZpbGVfaGRyLT5jX25hbWVzaXplLAorCSAgICAgICAmZmlsZV9oZHItPmNfY2hrc3VtKTsKKwkvKiBSZWFkIGZpbGUgbmFtZSBmcm9tIGlucHV0LiAgKi8KKwlpZiAoZmlsZV9oZHItPmNfbmFtZSAhPSBOVUxMKQorCQlmcmVlKGZpbGVfaGRyLT5jX25hbWUpOworCWZpbGVfaGRyLT5jX25hbWUgPSAoY2hhciAqKXhtYWxsb2MoZmlsZV9oZHItPmNfbmFtZXNpemUpOworCXRhcGVfYnVmZmVyZWRfcmVhZChmaWxlX2hkci0+Y19uYW1lLCBpbl9kZXMsCisJCQkgICAobG9uZylmaWxlX2hkci0+Y19uYW1lc2l6ZSk7CisKKwkvKiBJbiBTVlI0IEFTQ0lJIGZvcm1hdCwgdGhlIGFtb3VudCBvZiBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBoZWFkZXIKKwkgICBpcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGxvbmctd29yZCwgc28gd2UgbWlnaHQgbmVlZCB0byBkcm9wCisJICAgMS0zIGJ5dGVzLiAgKi8KKwl0YXBlX3NraXBfcGFkZGluZyhpbl9kZXMsIGZpbGVfaGRyLT5jX25hbWVzaXplICsgMTEwKTsKK30KKworLyogUmV0dXJuIDE2LWJpdCBpbnRlZ2VyIEkgd2l0aCB0aGUgYnl0ZXMgc3dhcHBlZC4gICovCisjZGVmaW5lIHN3YWJfc2hvcnQoaSkgKCgoKGkpIDw8IDgpICYgMHhmZjAwKSB8ICgoKGkpID4+IDgpICYgMHgwMGZmKSkKKworLyogUmVhZCB0aGUgaGVhZGVyLCBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIGZyb20gZmlsZQorICAgZGVzY3JpcHRvciBJTl9ERVMgaW50byBGSUxFX0hEUi4gICovCisKK3ZvaWQgcmVhZF9pbl9oZWFkZXIoc3RydWN0IG5ld19jcGlvX2hlYWRlciAqZmlsZV9oZHIsIGludCBpbl9kZXMpCit7CisJbG9uZyBieXRlc19za2lwcGVkID0gMDsJLyogQnl0ZXMgb2YganVuayBmb3VuZCBiZWZvcmUgbWFnaWMgbnVtYmVyLiAgKi8KKworCS8qIFNlYXJjaCBmb3IgYSB2YWxpZCBtYWdpYyBudW1iZXIuICAqLworCisJZmlsZV9oZHItPmNfdGFyX2xpbmtuYW1lID0gTlVMTDsKKworCXRhcGVfYnVmZmVyZWRfcmVhZCgoY2hhciAqKWZpbGVfaGRyLCBpbl9kZXMsIDZMKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoIXN0cm5jbXAoKGNoYXIgKilmaWxlX2hkciwgIjA3MDcwMiIsIDYpCisJCSAgICB8fCAhc3RybmNtcCgoY2hhciAqKWZpbGVfaGRyLCAiMDcwNzAxIiwgNikpCisJCXsKKwkJCWlmIChieXRlc19za2lwcGVkID4gMCkKKwkJCQl3YXJuX2p1bmtfYnl0ZXMoYnl0ZXNfc2tpcHBlZCk7CisKKwkJCXJlYWRfaW5fbmV3X2FzY2lpKGZpbGVfaGRyLCBpbl9kZXMpOworCQkJYnJlYWs7CisJCX0KKwkJYnl0ZXNfc2tpcHBlZCsrOworCQltZW1tb3ZlKChjaGFyICopZmlsZV9oZHIsIChjaGFyICopZmlsZV9oZHIgKyAxLCA1KTsKKwkJdGFwZV9idWZmZXJlZF9yZWFkKChjaGFyICopZmlsZV9oZHIgKyA1LCBpbl9kZXMsIDFMKTsKKwl9Cit9CisKKy8qIFJlYWQgdGhlIGNvbGxlY3Rpb24gZnJvbSBzdGFuZGFyZCBpbnB1dCBhbmQgY3JlYXRlIGZpbGVzCisgICBpbiB0aGUgZmlsZSBzeXN0ZW0uICAqLworCit2b2lkIHByb2Nlc3NfY29weV9pbigpCit7CisJY2hhciBkb25lID0gZmFsc2U7CS8qIFRydWUgaWYgdHJhaWxlciByZWFjaGVkLiAgKi8KKwlzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyIGZpbGVfaGRyOwkvKiBPdXRwdXQgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KKwlpbnQgaW5fZmlsZV9kZXM7CS8qIElucHV0IGZpbGUgZGVzY3JpcHRvci4gICovCisKKwkvKiBJbml0aWFsaXplIHRoZSBjb3B5IGluLiAgKi8KKwlmaWxlX2hkci5jX25hbWUgPSBOVUxMOworCisJLyogb25seSBmcm9tIHN0ZGluICovCisJaW5fZmlsZV9kZXMgPSAwOworCisJLyogV2hpbGUgdGhlcmUgaXMgbW9yZSBpbnB1dCBpbiB0aGUgY29sbGVjdGlvbiwgcHJvY2VzcyB0aGUgaW5wdXQuICAqLworCXdoaWxlICghZG9uZSkgeworCQkvKiBTdGFydCBwcm9jZXNzaW5nIHRoZSBuZXh0IGZpbGUgYnkgcmVhZGluZyB0aGUgaGVhZGVyLiAgKi8KKwkJcmVhZF9pbl9oZWFkZXIoJmZpbGVfaGRyLCBpbl9maWxlX2Rlcyk7CisKKwkJLyogSXMgdGhpcyB0aGUgaGVhZGVyIGZvciB0aGUgVFJBSUxFUiBmaWxlPyAgKi8KKwkJaWYgKHN0cmNtcCgiVFJBSUxFUiEhISIsIGZpbGVfaGRyLmNfbmFtZSkgPT0gMCkgeworCQkJZG9uZSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIENvcHkgdGhlIGlucHV0IGZpbGUgaW50byB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4gICovCisKKwkJY29weWluX2ZpbGUoJmZpbGVfaGRyLCBpbl9maWxlX2Rlcyk7CisKKwkJaWYgKGRvdF9mbGFnKQorCQkJZnB1dGMoJy4nLCBzdGRlcnIpOworCX0KKworCWlmIChkb3RfZmxhZykKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKworCWNyZWF0ZV9maW5hbF9kZWZlcnMoKTsKKworfQorCisvKiBJbml0aWFsaXplIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgdG8gdGhlaXIgcHJvcGVyIHNpemUgYW5kCisgICBpbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBhbmQgb3V0cHV0CisgICBidWZmZXJzLiAgKi8KKwordm9pZCBpbml0aWFsaXplX2J1ZmZlcnMoKQoreworCWludCBpbl9idWZfc2l6ZSwgb3V0X2J1Zl9zaXplOworCisJLyogTWFrZSBzdXJlIHRoZSBpbnB1dCBidWZmZXIgY2FuIGFsd2F5cyBob2xkIDIgYmxvY2tzIGFuZCB0aGF0IGl0CisJICAgaXMgYmlnIGVub3VnaCB0byBob2xkIDEgdGFyIHJlY29yZCAoNTEyIGJ5dGVzKSBldmVuIGlmIGl0CisJICAgaXMgbm90IGFsaWduZWQgb24gYSBibG9jayBib3VuZGFyeS4gIFRoZSBleHRyYSBidWZmZXIgc3BhY2UKKwkgICBpcyBuZWVkZWQgYnkgcHJvY2Vzc19jb3B5aW4gYW5kIHBlZWtfaW5fYnVmIHRvIGF1dG9tYXRpY2FsbHkKKwkgICBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBhcmNoaXZlIGl0IGlzIHJlYWRpbmcuICAqLworCWlmIChpb19ibG9ja19zaXplID49IDUxMikKKwkJaW5fYnVmX3NpemUgPSAyICogaW9fYmxvY2tfc2l6ZTsKKwllbHNlCisJCWluX2J1Zl9zaXplID0gMTAyNDsKKwlvdXRfYnVmX3NpemUgPSBESVNLX0lPX0JMT0NLX1NJWkU7CisKKwlpbnB1dF9idWZmZXIgPSAoY2hhciAqKXhtYWxsb2MoaW5fYnVmX3NpemUpOworCWluX2J1ZmYgPSBpbnB1dF9idWZmZXI7CisJaW5wdXRfYnVmZmVyX3NpemUgPSBpbl9idWZfc2l6ZTsKKwlpbnB1dF9zaXplID0gMDsKKwlpbnB1dF9ieXRlcyA9IDA7CisKKwlvdXRwdXRfYnVmZmVyID0gKGNoYXIgKil4bWFsbG9jKG91dF9idWZfc2l6ZSk7CisJb3V0X2J1ZmYgPSBvdXRwdXRfYnVmZmVyOworCW91dHB1dF9zaXplID0gMDsKKwlvdXRwdXRfYnl0ZXMgPSAwOworCit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGM7CisJaW50IGV4dHJhY3RfZmxhZyA9IGZhbHNlOworCisJcHJvZ25hbWUgPSBhcmd2WzBdOworCisJZG8geworCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpViIpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1YnOgorCQkJZG90X2ZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisKKwkJY2FzZSAnaSc6CisJCQlleHRyYWN0X2ZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiVzOiBub3QgaW1wbGVtZW50ZWQgb3IgaW52YWxpZCBvcHRpb24gLSVjXG4iLAorCQkJCXByb2duYW1lLCBvcHRvcHQpOworCQkJZXhpdCgxKTsKKworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoZXh0cmFjdF9mbGFnKSB7CisJCWluaXRpYWxpemVfYnVmZmVycygpOworCisJCXByb2Nlc3NfY29weV9pbigpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstVl0gLWkgWzwgYXJjaGl2ZV1cbiIsIHByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9kZC5jIGIvdXNyL3V0aWxzL2RkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyZTJjZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9kZC5jCkBAIC0wLDAgKzEsNTMzIEBACisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBBUlJBWV9TSVpFKHgpCShzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisKK3N0YXRpYyBjaGFyICpwcm9nbmFtZTsKKworc3RydWN0IG9wdGlvbiB7CisJY29uc3QgY2hhciAqb3B0OworCWNoYXIgKnN0cjsKKwljaGFyICphcmc7Cit9OworCitzdHJ1Y3QgY29udiB7CisJY29uc3QgY2hhciBzdHJbOF07CisJdW5zaWduZWQgaW50IHNldDsKKwl1bnNpZ25lZCBpbnQgZXhjbHVkZTsKK307CisKKyNkZWZpbmUgQ09OVl9CTE9DSwkoMTw8MCkKKyNkZWZpbmUgQ09OVl9VTkJMT0NLCSgxPDwxKQorCisjZGVmaW5lIENPTlZfTENBU0UJKDE8PDIpCisjZGVmaW5lIENPTlZfVUNBU0UJKDE8PDMpCisKKyNkZWZpbmUgQ09OVl9TV0FCCSgxPDw0KQorI2RlZmluZSBDT05WX05PRVJST1IJKDE8PDUpCisjZGVmaW5lIENPTlZfTk9UUlVOQwkoMTw8NikKKyNkZWZpbmUgQ09OVl9TWU5DCSgxPDw3KQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJeyJicyIsIE5VTEwsIE5VTEx9LAorI2RlZmluZSBPUFRfQlMJCSgmb3B0aW9uc1swXSkKKwl7ImNicyIsIE5VTEwsIE5VTEx9LAorI2RlZmluZSBPUFRfQ0JTCQkoJm9wdGlvbnNbMV0pCisJeyJjb252IiwgTlVMTCwgTlVMTH0sCisjZGVmaW5lIE9QVF9DT05WCSgmb3B0aW9uc1syXSkKKwl7ImNvdW50IiwgTlVMTCwgTlVMTH0sCisjZGVmaW5lIE9QVF9DT1VOVAkoJm9wdGlvbnNbM10pCisJeyJpYnMiLCBOVUxMLCBOVUxMfSwKKyNkZWZpbmUgT1BUX0lCUwkJKCZvcHRpb25zWzRdKQorCXsiaWYiLCBOVUxMLCBOVUxMfSwKKyNkZWZpbmUgT1BUX0lGCQkoJm9wdGlvbnNbNV0pCisJeyJvYnMiLCBOVUxMLCBOVUxMfSwKKyNkZWZpbmUgT1BUX09CUwkJKCZvcHRpb25zWzZdKQorCXsib2YiLCBOVUxMLCBOVUxMfSwKKyNkZWZpbmUgT1BUX09GCQkoJm9wdGlvbnNbN10pCisJeyJzZWVrIiwgTlVMTCwgTlVMTH0sCisjZGVmaW5lIE9QVF9TRUVLCSgmb3B0aW9uc1s4XSkKKwl7InNraXAiLCBOVUxMLCBOVUxMfQorI2RlZmluZSBPUFRfU0tJUAkoJm9wdGlvbnNbOV0pCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnYgY29udl9vcHRzW10gPSB7CisJeyJibG9jayIsIENPTlZfQkxPQ0ssIENPTlZfVU5CTE9DS30sCisJeyJ1bmJsb2NrIiwgQ09OVl9VTkJMT0NLLCBDT05WX0JMT0NLfSwKKwl7ImxjYXNlIiwgQ09OVl9MQ0FTRSwgQ09OVl9VQ0FTRX0sCisJeyJ1Y2FzZSIsIENPTlZfVUNBU0UsIENPTlZfTENBU0V9LAorCXsic3dhYiIsIENPTlZfU1dBQiwgMH0sCisJeyJub2Vycm9yIiwgQ09OVl9OT0VSUk9SLCAwfSwKKwl7Im5vdHJ1bmMiLCBDT05WX05PVFJVTkMsIDB9LAorCXsic3luYyIsIENPTlZfU1lOQywgMH0sCit9OworCitzdGF0aWMgc2l6ZV90IGNiczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29udjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY291bnQ7CitzdGF0aWMgc2l6ZV90IGlicyA9IDUxMjsKK3N0YXRpYyBzaXplX3Qgb2JzID0gNTEyOworc3RhdGljIHVuc2lnbmVkIGludCBzZWVrOworc3RhdGljIHVuc2lnbmVkIGludCBza2lwOworc3RhdGljIGNoYXIgKmluX2J1ZjsKK3N0YXRpYyBjaGFyICpvdXRfYnVmOworCitzdGF0aWMgc2l6ZV90IHBhcnNlX2JzKHN0cnVjdCBvcHRpb24gKm9wdCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCwgcmVhbHZhbCA9IDE7CisJY2hhciAqc3RyID0gb3B0LT5zdHI7CisJaW50IGVyciA9IDA7CisKKwlkbyB7CisJCWNoYXIgKnMgPSBzdHI7CisJCXZhbCA9IHN0cnRvdWwoc3RyLCAmc3RyLCAxMCk7CisJCWlmIChzID09IHN0ciB8fCAodmFsID09IFVMT05HX01BWCAmJiBlcnJubyA9PSBFUkFOR0UpKSB7CisJCQllcnIgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBUaGlzIG9wdGlvbiBtYXkgYmUgZm9sbG93ZWQgYnkKKwkJICogJ2InLCAnaycgb3IgJ3gnCisJCSAqLworCQlpZiAoKnN0ciA9PSAnYicpIHsKKwkJCXZhbCAqPSA1MTI7CisJCQlzdHIrKzsKKwkJfSBlbHNlIGlmICgqc3RyID09ICdrJykgeworCQkJdmFsICo9IDEwMjQ7CisJCQlzdHIrKzsKKwkJfQorCQlyZWFsdmFsICo9IHZhbDsKKwkJaWYgKCpzdHIgIT0gJ3gnKQorCQkJYnJlYWs7CisJCXN0cisrOworCX0gd2hpbGUgKDEpOworCisJaWYgKCpzdHIgIT0gJ1wwJykKKwkJZXJyID0gMTsKKworCWlmIChlcnIpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogYmFkIG9wZXJhbmQgYCVzJ1xuIiwgcHJvZ25hbWUsIG9wdC0+YXJnKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gKHNpemVfdCkgcmVhbHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwYXJzZV9udW0oc3RydWN0IG9wdGlvbiAqb3B0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWNoYXIgKnN0ciA9IG9wdC0+c3RyOworCisJdmFsID0gc3RydG91bChzdHIsICZzdHIsIDEwKTsKKwlpZiAoc3RyID09IG9wdC0+c3RyIHx8ICh2YWwgPT0gVUxPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkgfHwKKwkgICAgdmFsID4gVUlOVF9NQVgpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogYmFkIG9wZXJhbmQgYCVzJ1xuIiwgcHJvZ25hbWUsIG9wdC0+YXJnKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCl2YWw7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKnAsICpzOworCWludCBhcmc7CisKKwkvKgorCSAqIFdlIGNoZWF0IGhlcmU7IHdlIGRvbid0IHBhcnNlIHRoZSBvcGVyYW5kIHZhbHVlcworCSAqIHRoZW1zZWx2ZXMgaGVyZS4gIFdlIG1lcmVseSBzcGxpdCB0aGUgb3BlcmFuZHMKKwkgKiB1cC4gIFRoaXMgbWVhbnMgdGhhdCBicz1mb28gYnM9MSB3b24ndCBwcm9kdWNlCisJICogYW4gZXJyb3IuCisJICovCisJZm9yIChhcmcgPSAxOyBhcmcgPCBhcmdjOyBhcmcrKykgeworCQl1bnNpZ25lZCBpbnQgbGVuOworCisJCXMgPSBzdHJjaHIoYXJndlthcmddLCAnPScpOworCQlpZiAoIXMpCisJCQlzID0gYXJndlthcmddOwkvKiBkb24ndCByZWNvZ25pc2UgdGhpcyBhcmcgKi8KKworCQlsZW4gPSBzIC0gYXJndlthcmddOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvcHRpb25zKTsgaSsrKSB7CisJCQlpZiAoc3RybmNtcChvcHRpb25zW2ldLm9wdCwgYXJndlthcmddLCBsZW4pICE9IDApCisJCQkJY29udGludWU7CisKKwkJCW9wdGlvbnNbaV0uc3RyID0gcyArIDE7CisJCQlvcHRpb25zW2ldLmFyZyA9IGFyZ3ZbYXJnXTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gQVJSQVlfU0laRShvcHRpb25zKSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogYmFkIG9wZXJhbmQgYCVzJ1xuIiwKKwkJCQlwcm9nbmFtZSwgYXJndlthcmddKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyoKKwkgKiBUcmFuc2xhdGUgbnVtZXJpYyBvcGVyYW5kcy4KKwkgKi8KKwlpZiAoT1BUX0lCUy0+c3RyKQorCQlpYnMgPSBwYXJzZV9icyhPUFRfSUJTKTsKKwlpZiAoT1BUX09CUy0+c3RyKQorCQlvYnMgPSBwYXJzZV9icyhPUFRfT0JTKTsKKwlpZiAoT1BUX0NCUy0+c3RyKQorCQljYnMgPSBwYXJzZV9icyhPUFRfQ0JTKTsKKwlpZiAoT1BUX0NPVU5ULT5zdHIpCisJCWNvdW50ID0gcGFyc2VfbnVtKE9QVF9DT1VOVCk7CisJaWYgKE9QVF9TRUVLLT5zdHIpCisJCXNlZWsgPSBwYXJzZV9udW0oT1BUX1NFRUspOworCWlmIChPUFRfU0tJUC0+c3RyKQorCQlza2lwID0gcGFyc2VfbnVtKE9QVF9TS0lQKTsKKworCS8qCisJICogSWYgYnM9IGlzIHNwZWNpZmllZCwgaXQgb3ZlcnJpZGVzIGlicz0gYW5kIG9icz0KKwkgKi8KKwlpZiAoT1BUX0JTLT5zdHIpCisJCWlicyA9IG9icyA9IHBhcnNlX2JzKE9QVF9CUyk7CisKKwkvKgorCSAqIEFuZCBmaW5hbGx5IGNvbnY9CisJICovCisJaWYgKE9QVF9DT05WLT5zdHIpIHsKKwkJcCA9IE9QVF9DT05WLT5zdHI7CisKKwkJd2hpbGUgKChzID0gc3Ryc2VwKCZwLCAiLCIpKSAhPSBOVUxMKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb252X29wdHMpOyBpKyspIHsKKwkJCQlpZiAoc3RyY21wKHMsIGNvbnZfb3B0c1tpXS5zdHIpICE9IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWNvbnYgJj0gfmNvbnZfb3B0c1tpXS5leGNsdWRlOworCQkJCWNvbnYgfD0gY29udl9vcHRzW2ldLnNldDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGkgPT0gQVJSQVlfU0laRShjb252X29wdHMpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogYmFkIGNvbnZlcnNpb24gYCVzJ1xuIiwKKwkJCQkJcHJvZ25hbWUsIHMpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJaWYgKGNvbnYgJiAoQ09OVl9CTE9DSyB8IENPTlZfVU5CTE9DSykgJiYgY2JzID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogYmxvY2svdW5ibG9jayBjb252ZXJzaW9uIHdpdGggemVybyBjYnNcbiIsCisJCQlwcm9nbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhZmVfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCwgY291bnQgPSAwOworCWNoYXIgKnAgPSBidWY7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlyZXQgPSByZWFkKGZkLCBwLCBzaXplKTsKKworCQkvKgorCQkgKiBJZiB3ZSBnb3QgRUlOVFIsIGdvIGFnYWluLgorCQkgKi8KKwkJaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIElmIHdlIGVuY291bnRlcmVkIGFuIGVycm9yIGNvbmRpdGlvbgorCQkgKiBvciByZWFkIDAgYnl0ZXMgKEVPRikgcmV0dXJuIHdoYXQgd2UKKwkJICogaGF2ZS4KKwkJICovCisJCWlmIChyZXQgPT0gLTEgfHwgcmV0ID09IDApCisJCQlyZXR1cm4gY291bnQgPyBjb3VudCA6IHJldDsKKworCQkvKgorCQkgKiBXZSByZWFkIHNvbWUgYnl0ZXMuCisJCSAqLworCQljb3VudCArPSByZXQ7CisJCXNpemUgLT0gcmV0OworCQlwICs9IHJldDsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc2tpcF9ibG9ja3MoaW50IGZkLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBibGtzLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgYmxrOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBUcnkgdG8gc2Vlay4KKwkgKi8KKwlmb3IgKGJsayA9IDA7IGJsayA8IGJsa3M7IGJsaysrKSB7CisJCXJldCA9IGxzZWVrKGZkLCBzaXplLCBTRUVLX0NVUik7CisJCWlmIChyZXQgPT0gLTEpCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHdlIGZhaWxlZCB0byBzZWVrLCByZWFkIGluc3RlYWQuCisJICogRklYTUU6IHdlIGRvbid0IGhhbmRsZSBzaG9ydCByZWFkcyBoZXJlLCBvcgorCSAqIEVJTlRSIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAoYmxrID09IDAgJiYgcmV0ID09IC0xICYmIGVycm5vID09IEVTUElQRSkgeworCQlmb3IgKGJsayA9IDA7IGJsayA8IGJsa3M7IGJsaysrKSB7CisJCQlyZXQgPSBzYWZlX3JlYWQoZmQsIGJ1Ziwgc2l6ZSk7CisJCQlpZiAocmV0ICE9IChpbnQpc2l6ZSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXQgPT0gLTEpIHsKKwkJcGVycm9yKCJzZWVrL3NraXAiKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3RhdHMgeworCXVuc2lnbmVkIGludCBpbl9mdWxsOworCXVuc2lnbmVkIGludCBpbl9wYXJ0aWFsOworCXVuc2lnbmVkIGludCBvdXRfZnVsbDsKKwl1bnNpZ25lZCBpbnQgb3V0X3BhcnRpYWw7CisJdW5zaWduZWQgaW50IHRydW5jYXRlZDsKK307CisKK3N0YXRpYyBpbnQgZG9fZGQoaW50IHJkLCBpbnQgd3IsIHN0cnVjdCBzdGF0cyAqc3RhdHMpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKwlpbnQgZmlsbF92YWwgPSAwOworCXNpemVfdCBvdXRfc2l6ZSA9IDA7CisJc2l6ZV90IGluX3NpemU7CisJY2hhciAqYnVmOworCisJaWYgKGNvbnYgJiAoQ09OVl9CTE9DSyB8IENPTlZfVU5CTE9DSykpCisJCWZpbGxfdmFsID0gJyAnOworCisJd2hpbGUgKCFPUFRfQ09VTlQtPnN0ciB8fCBjb3VudC0tICE9IDApIHsKKwkJYnVmID0gaW5fYnVmOworCisJCS8qCisJCSAqIDEuIHJlYWQgaWJzLXNpemVkIGJ1ZmZlcgorCQkgKi8KKwkJaW5fc2l6ZSA9IHJldCA9IHJlYWQocmQsIGluX2J1ZiwgaWJzKTsKKwkJaWYgKHJldCA9PSAtMSB8fCAocmV0ID09IDAgJiYgKGNvbnYgJiBDT05WX05PRVJST1IpID09IDApKQorCQkJYnJlYWs7CisKKwkJaWYgKGluX3NpemUgPT0gaWJzKSB7CisJCQlzdGF0cy0+aW5fZnVsbCsrOworCQl9IGVsc2UgeworCQkJc3RhdHMtPmluX3BhcnRpYWwrKzsKKworCQkJLyoKKwkJCSAqIDIuIHplcm8gKG9yIGFwcGVuZCBzcGFjZXMpCisJCQkgKi8KKwkJCWlmIChjb252ICYgQ09OVl9TWU5DKSB7CisJCQkJbWVtc2V0KGluX2J1ZiArIGluX3NpemUsIGZpbGxfdmFsLAorCQkJCSAgICAgICBpYnMgLSBpbl9zaXplKTsKKwkJCQlpbl9zaXplID0gaWJzOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogNC4gc3dhYiBjb252ZXJzaW9uLiAgV2l0aCBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLAorCQkgKiBsYXN0IGJ5dGUgZG9lcyBub3QgZ2V0IHN3YXBwZWQuCisJCSAqLworCQlpZiAoY29udiAmIENPTlZfU1dBQikgeworCQkJY2hhciBjOworCisJCQlmb3IgKGkgPSAxOyBpIDwgaW5fc2l6ZTsgaSArPSAyKSB7CisJCQkJYyA9IGluX2J1ZltpIC0gMV07CisJCQkJaW5fYnVmW2kgLSAxXSA9IGluX2J1ZltpXTsKKwkJCQlpbl9idWZbaV0gPSBjOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogNS4gcmVtYWluaW5nIGNvbnZlcnNpb25zLgorCQkgKi8KKwkJaWYgKGNvbnYgJiBDT05WX0xDQVNFKQorCQkJZm9yIChpID0gMDsgaSA8IGluX3NpemU7IGkrKykKKwkJCQlpbl9idWZbaV0gPSB0b2xvd2VyKGluX2J1ZltpXSk7CisKKwkJaWYgKGNvbnYgJiBDT05WX1VDQVNFKQorCQkJZm9yIChpID0gMDsgaSA8IGluX3NpemU7IGkrKykKKwkJCQlpbl9idWZbaV0gPSB0b3VwcGVyKGluX2J1ZltpXSk7CisKKwkJLyogYmxvY2svdW5ibG9jayA/ICovCisKKwkJLyoKKwkJICogNi4gQWdncmVnYXRlIGludG8gb2JzIHNpemVkIGJ1ZmZlcnMuCisJCSAqIElmIHRoZSBpbl9zaXplIGlzIG9icy1zaXplZCBhbmQgd2UgaGF2ZSBubworCQkgKiBkYXRhIHdhaXRpbmcsIGp1c3Qgd3JpdGUgImJ1ZiIgdG8gdGhlIG91dHB1dC4KKwkJICovCisJCWlmIChvdXRfc2l6ZSA9PSAwICYmIGluX3NpemUgPT0gb2JzKSB7CisJCQl3cml0ZSh3ciwgYnVmLCBvYnMpOworCQkJc3RhdHMtPm91dF9mdWxsKys7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgaGFkIGRhdGEgd2FpdGluZywgb3Igd2UgZGlkbid0IGhhdmUgYW4KKwkJCSAqIG9icy1zaXplZCBpbnB1dCBibG9jay4gIFdlIG5lZWQgdG8gYXBwZW5kCisJCQkgKiB0aGUgaW5wdXQgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKwkJCSAqLworCQkJdW5zaWduZWQgaW50IHNwYWNlOworCQkJY2hhciAqaW5fcHRyID0gaW5fYnVmOworCisJCQlkbyB7CisJCQkJc3BhY2UgPSBvYnMgLSBvdXRfc2l6ZTsKKwkJCQlpZiAoc3BhY2UgPiBpbl9zaXplKQorCQkJCQlzcGFjZSA9IGluX3NpemU7CisKKwkJCQltZW1jcHkob3V0X2J1ZiArIG91dF9zaXplLCBpbl9wdHIsIHNwYWNlKTsKKwkJCQlvdXRfc2l6ZSArPSBzcGFjZTsKKwkJCQlpbl9zaXplIC09IHNwYWNlOworCQkJCWluX3B0ciArPSBzcGFjZTsKKworCQkJCWlmIChvdXRfc2l6ZSA9PSBvYnMpIHsKKwkJCQkJd3JpdGUod3IsIG91dF9idWYsIG9icyk7CisJCQkJCXN0YXRzLT5vdXRfZnVsbCsrOworCQkJCQlvdXRfc2l6ZSA9IDA7CisJCQkJfQorCQkJfSB3aGlsZSAob3V0X3NpemUgPT0gMCAmJiBpbl9zaXplKTsKKworCQkJaWYgKGluX3NpemUpIHsKKwkJCQltZW1jcHkob3V0X2J1ZiwgaW5fcHRyLCBpbl9zaXplKTsKKwkJCQlvdXRfc2l6ZSA9IGluX3NpemU7CisJCQl9CisJCX0KKwl9CisKKwlpZiAob3V0X3NpemUpIHsKKwkJd3JpdGUod3IsIG91dF9idWYsIG91dF9zaXplKTsKKwkJc3RhdHMtPm91dF9wYXJ0aWFsKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaWdqbXBfYnVmIGptcDsKKworc3RhdGljIHZvaWQgc2lnaW50X2hhbmRsZXIoaW50IHNpZykKK3sKKwlzaWdsb25nam1wKGptcCwgLXNpZyk7Cit9CisKK3N0YXRpYyBpbnQgZGQoaW50IHJkX2ZkLCBpbnQgd3JfZmQsIHN0cnVjdCBzdGF0cyAqc3RhdHMpCit7CisJaW50IHJldDsKKworCXJldCA9IHNpZ3NldGptcChqbXAsIDEpOworCWlmIChyZXQgPT0gMCkgeworCQlzeXN2X3NpZ25hbChTSUdJTlQsIHNpZ2ludF9oYW5kbGVyKTsKKwkJcmV0ID0gZG9fZGQocmRfZmQsIHdyX2ZkLCBzdGF0cyk7CisJfQorCisJc3lzdl9zaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBzdGF0cyBzdGF0czsKKwlpbnQgcmV0OworCWludCByZF9mZCA9IDAsIHdyX2ZkID0gMTsKKworCXByb2duYW1lID0gYXJndlswXTsKKworCXJldCA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjb252ICYgKENPTlZfQkxPQ0sgfCBDT05WX1VOQkxPQ0spKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJsb2NrL3VuYmxvY2sgbm90IGltcGxlbWVudGVkXG4iLAorCQkJcHJvZ25hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpbl9idWYgPSBtYWxsb2MoaWJzKTsKKwlpZiAoIWluX2J1ZikgeworCQlwZXJyb3IoIm1hbGxvYyBpYnMiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJb3V0X2J1ZiA9IG1hbGxvYyhvYnMpOworCWlmICghb3V0X2J1ZikgeworCQlwZXJyb3IoIm1hbGxvYyBvYnMiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBPcGVuIHRoZSBpbnB1dCBmaWxlLCBpZiBzcGVjaWZpZWQuCisJICovCisJaWYgKE9QVF9JRi0+c3RyKSB7CisJCXJkX2ZkID0gb3BlbihPUFRfSUYtPnN0ciwgT19SRE9OTFkpOworCQlpZiAocmRfZmQgPT0gLTEpIHsKKwkJCXBlcnJvcigib3BlbiBpbnB1dCBmaWxlIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qCisJICogT3BlbiB0aGUgb3V0cHV0IGZpbGUsIGlmIHNwZWNpZmllZC4KKwkgKi8KKwlpZiAoT1BUX09GLT5zdHIpIHsKKwkJaW50IGZsYWdzID0gT19XUk9OTFl8T19DUkVBVDsKKwkJZmxhZ3MgfD0gKGNvbnYgJiBDT05WX05PVFJVTkMpID8gMCA6IE9fVFJVTkM7CisJCXdyX2ZkID0gb3BlbihPUFRfT0YtPnN0ciwgZmxhZ3MsIDA2NjYpOworCQlpZiAod3JfZmQgPT0gLTEpIHsKKwkJCXBlcnJvcigib3BlbiBvdXRwdXQgZmlsZSIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKgorCSAqIFNraXAgb2JzLXNpemVkIGJsb2NrcyBvZiBvdXRwdXQgZmlsZS4KKwkgKi8KKwlpZiAoT1BUX1NFRUstPnN0ciAmJiBza2lwX2Jsb2Nrcyh3cl9mZCwgb3V0X2J1Ziwgc2Vlaywgb2JzKSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIFNraXAgaWJzLXNpemVkIGJsb2NrcyBvZiBpbnB1dCBmaWxlLgorCSAqLworCWlmIChPUFRfU0tJUC0+c3RyICYmIHNraXBfYmxvY2tzKHJkX2ZkLCBpbl9idWYsIHNraXAsIGlicykpCisJCXJldHVybiAxOworCisJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CisKKwkvKgorCSAqIERvIHRoZSByZWFsIHdvcmsKKwkgKi8KKwlyZXQgPSBkZChyZF9mZCwgd3JfZmQsICZzdGF0cyk7CisKKwlpZiAoY2xvc2UocmRfZmQpID09IC0xKQorCQlwZXJyb3IoT1BUX0lGLT5zdHIgPyBPUFRfSUYtPnN0ciA6ICJzdGRpbiIpOworCWlmIChjbG9zZSh3cl9mZCkgPT0gLTEpCisJCXBlcnJvcihPUFRfT0YtPnN0ciA/IE9QVF9PRi0+c3RyIDogInN0ZG91dCIpOworCisJZnByaW50ZihzdGRlcnIsICIldSsldSByZWNvcmRzIGluXG4iLCBzdGF0cy5pbl9mdWxsLCBzdGF0cy5pbl9wYXJ0aWFsKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiV1KyV1IHJlY29yZHMgb3V0XG4iLAorCQlzdGF0cy5vdXRfZnVsbCwgc3RhdHMub3V0X3BhcnRpYWwpOworCWlmIChzdGF0cy50cnVuY2F0ZWQpCisJCWZwcmludGYoc3RkZXJyLCAiJXUgdHJ1bmNhdGVkIHJlY29yZCVzXG4iLAorCQkJc3RhdHMudHJ1bmNhdGVkLCBzdGF0cy50cnVuY2F0ZWQgPT0gMSA/ICIiIDogInMiKTsKKworCS8qCisJICogcmV0IHdpbGwgYmUgLVNJR0lOVCBpZiB3ZSBnb3QgYSBTSUdJTlQuICBSYWlzZQorCSAqIHRoZSBzaWduYWwgYWdhaW4gdG8gY2F1c2UgdXMgdG8gdGVybWluYXRlIHdpdGgKKwkgKiBTSUdJTlQgc3RhdHVzLgorCSAqLworCWlmIChyZXQgPT0gLVNJR0lOVCkKKwkJcmFpc2UoU0lHSU5UKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvZmFsc2UuYyBiL3Vzci91dGlscy9mYWxzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzI0M2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvZmFsc2UuYwpAQCAtMCwwICsxLDQgQEAKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvZmlsZV9tb2RlLmMgYi91c3IvdXRpbHMvZmlsZV9tb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmN2Y0MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9maWxlX21vZGUuYwpAQCAtMCwwICsxLDE0MyBAQAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJmaWxlX21vZGUuaCIKKworZXh0ZXJuIGNoYXIgKnByb2duYW1lOworCittb2RlX3QgcGFyc2VfZmlsZV9tb2RlKGNoYXIgKmFyZywgbW9kZV90IG1vZGUsIG1vZGVfdCBzdW1hc2spCit7CisJY2hhciAqY2xhdXNlOworCisJaWYgKGlzZGlnaXQoKmFyZykgJiYgKmFyZyA8ICc4JykgeworCQl1bnNpZ25lZCBsb25nIG51bTsKKworCQludW0gPSBzdHJ0b3VsKGFyZywgTlVMTCwgOCk7CisJCWlmICgobnVtID09IFVMT05HX01BWCAmJiBlcnJubyA9PSBFUkFOR0UpIHx8IG51bSA+IDA3Nzc3KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG1vZGUgYCVzJ1xuIiwgcHJvZ25hbWUsCisJCQkJYXJnKTsKKwkJCWV4aXQoMjU1KTsKKwkJfQorCQlyZXR1cm4gKG1vZGVfdCkgbnVtOworCX0KKworCXdoaWxlICgoY2xhdXNlID0gc3Ryc2VwKCZhcmcsICIsIikpICE9IE5VTEwpIHsKKwkJbW9kZV90IHdobyA9IDA7CisJCWludCBhY3Rpb247CisJCWNoYXIgKnAgPSBjbGF1c2U7CisKKwkJLyoKKwkJICogUGFyc2UgdGhlIHdobyBsaXN0LiAgT3B0aW9uYWwuCisJCSAqLworCQl3aGlsZSAoMSkgeworCQkJc3dpdGNoICgqcCsrKSB7CisJCQljYXNlICd1JzoKKwkJCQl3aG8gfD0gU19JUldYVSB8IFNfSVNVSUQ7CisJCQkJY29udGludWU7CisJCQljYXNlICdnJzoKKwkJCQl3aG8gfD0gU19JUldYRyB8IFNfSVNHSUQ7CisJCQkJY29udGludWU7CisJCQljYXNlICdvJzoKKwkJCQl3aG8gfD0gU19JUldYTyB8IFNfSVNWVFg7CisJCQkJY29udGludWU7CisJCQljYXNlICdhJzoKKwkJCQl3aG8gPQorCQkJCSAgICBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8gfCBTX0lTVUlEIHwKKwkJCQkgICAgU19JU0dJRCB8IFNfSVNWVFg7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiB1bmRvIHRoZSBpbmNyZW1lbnQgYWJvdmUgKi8KKwkJCXAtLTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHdobyA9PSAwKQorCQkJd2hvID0gKH5zdW1hc2spIHwgU19JU1ZUWDsKKworCQkvKgorCQkgKiBQYXJzZSBhbiBhY3Rpb24gbGlzdC4gIE11c3QgYmUgYXQgbGVhc3Qgb25lIGFjdGlvbi4KKwkJICovCisJCXdoaWxlICgqcCkgeworCQkJbW9kZV90IHBlcm0gPSAwOworCisJCQkvKgorCQkJICogUGFyc2UgdGhlIGFjdGlvbgorCQkJICovCisJCQlhY3Rpb24gPSAqcDsKKwkJCWlmIChhY3Rpb24gPT0gJysnIHx8IGFjdGlvbiA9PSAnLScgfHwgYWN0aW9uID09ICc9JykKKwkJCQlwKys7CisKKwkJCS8qCisJCQkgKiBQYXJzZSBwZXJtCisJCQkgKi8KKwkJCXdoaWxlICgqcCkgeworCQkJCXN3aXRjaCAoKnArKykgeworCQkJCWNhc2UgJ3InOgorCQkJCQlwZXJtIHw9IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSAndyc6CisJCQkJCXBlcm0gfD0gU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIOworCQkJCQljb250aW51ZTsKKwkJCQljYXNlICd4JzoKKwkJCQkJcGVybSB8PSBTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEg7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJ1gnOgorCQkJCQlwZXJtIHw9IFNfSVNWVFg7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJ3MnOgorCQkJCQlwZXJtIHw9IFNfSVNVSUQgfCBTX0lTR0lEOworCQkJCQljb250aW51ZTsKKwkJCQljYXNlICd1JzoKKwkJCQkJcGVybSA9IG1vZGUgJiBTX0lSV1hVOworCQkJCQlwZXJtIHw9IHBlcm0gPj4gMyB8IHBlcm0gPj4gNjsKKwkJCQkJaWYgKG1vZGUgJiBTX0lTVUlEKQorCQkJCQkJcGVybSB8PSBTX0lTR0lEOworCQkJCQljb250aW51ZTsKKwkJCQljYXNlICdnJzoKKwkJCQkJcGVybSA9IG1vZGUgJiBTX0lSV1hHOworCQkJCQlwZXJtIHw9IHBlcm0gPDwgMyB8IHBlcm0gPj4gMzsKKwkJCQkJaWYgKG1vZGUgJiBTX0lTR0lEKQorCQkJCQkJcGVybSB8PSBTX0lTVUlEOworCQkJCQljb250aW51ZTsKKwkJCQljYXNlICdvJzoKKwkJCQkJcGVybSA9IG1vZGUgJiBTX0lSV1hPOworCQkJCQlwZXJtIHw9IHBlcm0gPDwgNiB8IHBlcm0gPDwgMzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIHVuZG8gdGhlIGluY3JlbWVudCBhYm92ZSAqLworCQkJCXAtLTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcGVybSAmPSB3aG87CisKKwkJCXN3aXRjaCAoYWN0aW9uKSB7CisJCQljYXNlICcrJzoKKwkJCQltb2RlIHw9IHBlcm07CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJy0nOgorCQkJCW1vZGUgJj0gfnBlcm07CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJz0nOgorCQkJCW1vZGUgJj0gfndobzsKKwkJCQltb2RlIHw9IHBlcm07CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghYWN0aW9uKQorCQkJCWJyZWFrOworCQkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBtb2RlIGAlcydcbiIsIHByb2duYW1lLAorCQkJCWNsYXVzZSk7CisJCQlleGl0KDI1NSk7CisJCX0KKwl9CisKKwlyZXR1cm4gbW9kZTsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9maWxlX21vZGUuaCBiL3Vzci91dGlscy9maWxlX21vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRmNjAzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL2ZpbGVfbW9kZS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBVVElMU19GSUxFX01PREVfSAorI2RlZmluZSBVVElMU19GSUxFX01PREVfSAorCittb2RlX3QgcGFyc2VfZmlsZV9tb2RlKGNoYXIgKmFyZywgbW9kZV90IG1vZGUsIG1vZGVfdCBzdW1hc2spOworCisjZW5kaWYgLyogVVRJTFNfRklMRV9NT0RFX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9oYWx0LmMgYi91c3IvdXRpbHMvaGFsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjU2YjUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvaGFsdC5jCkBAIC0wLDAgKzEsNTUgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvcmVib290Lmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworc3RhdGljIF9fbm9yZXR1cm4gdXNhZ2Uodm9pZCkKK3sKKyAgICAgICBzdGF0aWMgY2hhciBtZXNnW10gPSAiVXNhZ2U6IHtoYWx0fHJlYm9vdHxwb3dlcm9mZn0gWy1uXVxuIjsKKyAgICAgICB3cml0ZSgyLCBtZXNnLCBzaXplb2YobWVzZykgLSAxKTsKKyAgICAgICBleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgICAgIGludCBjbWQgPSAwOyAvKiBpbml0YWxpemUgdG8gc2h1dCBnY2MgdXAgKi8KKyAgICAgICBpbnQgZG9fc3luYyA9IDE7CisgICAgICAgY2hhciAqcHRyLCAqcHRyMjsKKworICAgICAgIC8qIFdoaWNoIGFjdGlvbiAocHJvZ3JhbSBuYW1lKT8gKi8KKyAgICAgICBwdHIyID0gcHRyID0gYXJndlswXTsKKyAgICAgICB3aGlsZSAoKnB0cjIpCisgICAgICAgICAgICAgICBpZiAoKnB0cjIrKyA9PSAnLycpCisgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHB0cjI7CisgICAgICAgaWYgKCpwdHIgPT0gJ3InKQorICAgICAgICAgICAgICAgY21kID0gTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUOworICAgICAgIGVsc2UgaWYgKCpwdHIgPT0gJ2gnKQorICAgICAgICAgICAgICAgY21kID0gTElOVVhfUkVCT09UX0NNRF9IQUxUOworICAgICAgIGVsc2UgaWYgKCpwdHIgPT0gJ3AnKQorICAgICAgICAgICAgICAgY21kID0gTElOVVhfUkVCT09UX0NNRF9QT1dFUl9PRkY7CisgICAgICAgZWxzZQorICAgICAgICAgICAgICAgdXNhZ2UoKTsKKworICAgICAgIC8qIFdhbGsgb3B0aW9ucyAqLworICAgICAgIHdoaWxlICgqKythcmd2ICYmICoqYXJndiA9PSAnLScpCisgICAgICAgICAgICAgICBzd2l0Y2ggKCorKyphcmd2KSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOiBicmVhazsgLyogLWYgYXNzdW1lZCAqLworICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzogZG9fc3luYyA9IDA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgaWYgKCphcmd2KQorICAgICAgICAgICAgICAgdXNhZ2UoKTsgLyogYW55IGFyZ3MgPT0gZXJyb3IgKi8KKworICAgICAgIGlmIChkb19zeW5jKQorICAgICAgICAgICAgICAgc3luYygpOworICAgICAgIHJlYm9vdChMSU5VWF9SRUJPT1RfQ01EX0NBRF9PRkYpOyAvKiBFbmFibGUgQ1RSTCtBTFQrREVMICovCisgICAgICAgaWYgKCFyZWJvb3QoY21kKSkgeworICAgICAgICAgICAgICAgLyogU3VjY2Vzcy4gQ3VycmVudGx5LCBDTURfSEFMVCByZXR1cm5zLCBzbyBzdG9wIHRoZSB3b3JsZCAqLworICAgICAgICAgICAgICAgLyoga2lsbCgtMSwgU0lHU1RPUCk7ICovCisgICAgICAgICAgICAgICBraWxsKGdldHBpZCgpLCBTSUdTVE9QKTsKKyAgICAgICB9CisgICAgICAgd3JpdGUoMiwgImZhaWxlZC5cbiIsIDgpOworICAgICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2luc21vZC5jIGIvdXNyL3V0aWxzL2luc21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjU4ODAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvaW5zbW9kLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGluc21vZC5jOiBpbnNlcnQgYSBtb2R1bGUgaW50byB0aGUga2VybmVsLgorICAgIENvcHlyaWdodCAoQykgMjAwMSAgUnVzdHkgUnVzc2VsbC4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgIFJ1c3R5IFJ1c3NlbGwsIElCTSBDb3Jwb3JhdGlvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjZGVmaW5lIHN0cmVxKGEsYikgKHN0cmNtcCgoYSksKGIpKSA9PSAwKQorCisvKiBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSBpbiBhIGhlYWRlciBmaWxlLi4uICovCitleHRlcm4gbG9uZyBpbml0X21vZHVsZSh2b2lkICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGZpbGVuYW1lIFthcmdzXVxuIiwgcHJvZ25hbWUpOworCWV4aXQoMSk7Cit9CisKKy8qIFdlIHVzZSBlcnJvciBudW1iZXJzIGluIGEgbG9vc2UgdHJhbnNsYXRpb24uLi4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICptb2RlcnJvcihpbnQgZXJyKQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSBFTk9FWEVDOgorCQlyZXR1cm4gIkludmFsaWQgbW9kdWxlIGZvcm1hdCI7CisJY2FzZSBFTk9FTlQ6CisJCXJldHVybiAiVW5rbm93biBzeW1ib2wgaW4gbW9kdWxlIjsKKwljYXNlIEVTUkNIOgorCQlyZXR1cm4gIk1vZHVsZSBoYXMgd3Jvbmcgc3ltYm9sIHZlcnNpb24iOworCWNhc2UgRUlOVkFMOgorCQlyZXR1cm4gIkludmFsaWQgcGFyYW1ldGVycyI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHN0cmVycm9yKGVycik7CisJfQorfQorCitzdGF0aWMgdm9pZCAqZ3JhYl9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXVuc2lnbmVkIGludCBtYXggPSAxNjM4NDsKKwlpbnQgcmV0LCBmZDsKKwl2b2lkICpidWZmZXIgPSBtYWxsb2MobWF4KTsKKworCWlmIChzdHJlcShmaWxlbmFtZSwgIi0iKSkKKwkJZmQgPSBkdXAoU1RESU5fRklMRU5PKTsKKwllbHNlCisJCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFksIDApOworCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqc2l6ZSA9IDA7CisJd2hpbGUgKChyZXQgPSByZWFkKGZkLCBidWZmZXIgKyAqc2l6ZSwgbWF4IC0gKnNpemUpKSA+IDApIHsKKwkJKnNpemUgKz0gcmV0OworCQlpZiAoKnNpemUgPT0gbWF4KQorCQkJYnVmZmVyID0gcmVhbGxvYyhidWZmZXIsIG1heCAqPSAyKTsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZnJlZShidWZmZXIpOworCQlidWZmZXIgPSBOVUxMOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKwlsb25nIGludCByZXQ7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdm9pZCAqZmlsZTsKKwljaGFyICpmaWxlbmFtZSwgKm9wdGlvbnMgPSBzdHJkdXAoIiIpOworCWNoYXIgKnByb2duYW1lID0gYXJndlswXTsKKworCWlmIChhcmd2WzFdICYmIChzdHJlcShhcmd2WzFdLCAiLS12ZXJzaW9uIikgfHwgc3RyZXEoYXJndlsxXSwgIi1WIikpKSB7CisJCXB1dHMoImtsaWJjIGluc21vZCIpOworCQlleGl0KDApOworCX0KKworCS8qIElnbm9yZSBvbGQgb3B0aW9ucywgZm9yIGJhY2t3YXJkcyBjb21wYXQuICovCisJd2hpbGUgKGFyZ3ZbMV0gJiYgKHN0cmVxKGFyZ3ZbMV0sICItcCIpCisJCQkgICB8fCBzdHJlcShhcmd2WzFdLCAiLXMiKQorCQkJICAgfHwgc3RyZXEoYXJndlsxXSwgIi1mIikpKSB7CisJCWFyZ3YrKzsKKwkJYXJnYy0tOworCX0KKworCWZpbGVuYW1lID0gYXJndlsxXTsKKwlpZiAoIWZpbGVuYW1lKQorCQlwcmludF91c2FnZShwcm9nbmFtZSk7CisKKwkvKiBSZXN0IGlzIG9wdGlvbnMgKi8KKwlmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSsrKSB7CisJCW9wdGlvbnMgPSByZWFsbG9jKG9wdGlvbnMsCisJCQkJICBzdHJsZW4ob3B0aW9ucykgKyAyICsgc3RybGVuKGFyZ3ZbaV0pICsgMik7CisJCS8qIFNwYWNlcyBoYW5kbGVkIGJ5ICIiIHBhaXJzLCBidXQgbm8gd2F5IG9mIGVzY2FwaW5nCisJCSAgIHF1b3RlcyAqLworCQlpZiAoc3RyY2hyKGFyZ3ZbaV0sICcgJykpCisJCQlzdHJjYXQob3B0aW9ucywgIlwiIik7CisJCXN0cmNhdChvcHRpb25zLCBhcmd2W2ldKTsKKwkJaWYgKHN0cmNocihhcmd2W2ldLCAnICcpKQorCQkJc3RyY2F0KG9wdGlvbnMsICJcIiIpOworCQlzdHJjYXQob3B0aW9ucywgIiAiKTsKKwl9CisKKwlmaWxlID0gZ3JhYl9maWxlKGZpbGVuYW1lLCAmbGVuKTsKKwlpZiAoIWZpbGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbnNtb2Q6IGNhbid0IHJlYWQgJyVzJzogJXNcbiIsCisJCQlmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXQgPSBpbml0X21vZHVsZShmaWxlLCBsZW4sIG9wdGlvbnMpOworCWlmIChyZXQgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImluc21vZDogZXJyb3IgaW5zZXJ0aW5nICclcyc6ICVsaSAlc1xuIiwKKwkJCWZpbGVuYW1lLCByZXQsIG1vZGVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMva2lsbC5jIGIvdXNyL3V0aWxzL2tpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY4ZmFhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL2tpbGwuYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqcHJvZ25hbWU7CisKK3N0YXRpYyBfX25vcmV0dXJuIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgcGlkXG4iLCBwcm9nbmFtZSk7CisJZXhpdCgxKTsKK30KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSkKK3sKKwlsb25nIHBpZDsKKwljaGFyICplbmRwOworCisJcHJvZ25hbWUgPSBhcmd2WzBdOworCWlmIChhcmdjICE9IDIpCisJCXVzYWdlKCk7CisKKwlwaWQgPSBzdHJ0b2woYXJndlsxXSwgJmVuZHAsIDEwKTsKKwlpZiAoKmVuZHAgIT0gJ1wwJykgeworCQlwZXJyb3IoInBpZCIpOworCQl1c2FnZSgpOworCX0KKworCWlmIChraWxsKHBpZCwgU0lHVEVSTSkgPT0gLTEpIHsKKwkJcGVycm9yKCJraWxsIik7CisJCWV4aXQoLTEpOworCX0KKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2xuLmMgYi91c3IvdXRpbHMvbG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI2ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL2xuLmMKQEAgLTAsMCArMSw3NyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjLCBzLCBmOworCWNoYXIgKnA7CisJc3RydWN0IHN0YXQgc2I7CisKKwlzID0gZiA9IDA7CisJZG8geworCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJzZiIpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKworCQljYXNlICdzJzoKKwkJCXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG9wdGlvbiAtJWNcbiIsCisJCQkJYXJndlswXSwgb3B0b3B0KTsKKwkJCXJldHVybiAxOworCQl9CisKKwl9IHdoaWxlICgxKTsKKworCWlmIChvcHRpbmQgPT0gYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLXNdIFstZl0gdGFyZ2V0IGxpbmtcbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwltZW1zZXQoJnNiLCAwLCBzaXplb2Yoc3RydWN0IHN0YXQpKTsKKwlpZiAoc3RhdChhcmd2W2FyZ2MgLSAxXSwgJnNiKSA8IDAgJiYgYXJnYyAtIG9wdGluZCA+IDIpIHsKKwkJaWYgKCEoU19JU0RJUihzYi5zdF9tb2RlKSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJtdWx0aXBsZSB0YXJnZXRzIGFuZCAlcyBpcyBub3QgYSBkaXJlY3RvcnlcbiIsCisJCQkJYXJndlthcmdjIC0gMV0pOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlmb3IgKGMgPSBvcHRpbmQ7IGMgPCBhcmdjIC0gMTsgYysrKSB7CisJCWNoYXIgdGFyZ2V0W1BBVEhfTUFYXTsKKworCQlwID0gc3RycmNocihhcmd2W2NdLCAnLycpOworCQlwKys7CisKKwkJaWYgKFNfSVNESVIoc2Iuc3RfbW9kZSkpCisJCQlzbnByaW50Zih0YXJnZXQsIFBBVEhfTUFYLCAiJXMvJXMiLCBhcmd2W2FyZ2MgLSAxXSwgcCk7CisJCWVsc2UKKwkJCXNucHJpbnRmKHRhcmdldCwgUEFUSF9NQVgsICIlcyIsIGFyZ3ZbYXJnYyAtIDFdKTsKKworCQlpZiAoZikKKwkJCXVubGluayh0YXJnZXQpOworCisJCWlmIChzKSB7CisJCQlpZiAoc3ltbGluayhhcmd2W2NdLCB0YXJnZXQpID09IC0xKQorCQkJCXBlcnJvcih0YXJnZXQpOworCQl9IGVsc2UgeworCQkJaWYgKGxpbmsoYXJndltjXSwgdGFyZ2V0KSA9PSAtMSkKKwkJCQlwZXJyb3IodGFyZ2V0KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL21pbmlwcy5jIGIvdXNyL3V0aWxzL21pbmlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYmY4YjYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbWluaXBzLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OCBieSBBbGJlcnQgQ2FoYWxhbjsgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgZmlsZSBtYXkgYmUgdXNlZCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBvciBhbnkgbGF0ZXIgdmVyc2lvbgorICogYXQgeW91ciBvcHRpb24sIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogVGhpcyBpcyBhIG1pbmltYWwgL2Jpbi9wcywgZGVzaWduZWQgdG8gYmUgc21hbGxlciB0aGFuIHRoZSBvbGQgcHMKKyAqIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgc29tZSBvZiB0aGUgbW9yZSBpbXBvcnRhbnQgZmVhdHVyZXMgb2YgdGhlCisgKiBuZXcgcHMuIChmb3IgdG90YWwgc2l6ZSwgbm90ZSB0aGF0IHRoaXMgcHMgZG9lcyBub3QgbmVlZCBsaWJwcm9jKQorICogSXQgaXMgc3VpdGFibGUgZm9yIExpbnV4LW9uLWEtZmxvcHB5IHN5c3RlbXMgb25seS4KKyAqCisgKiBNYWludGFpbmVyczogZG8gbm90IGNvbXBpbGUgb3IgaW5zdGFsbCBmb3Igbm9ybWFsIHN5c3RlbXMuCisgKiBBbnlvbmUgbmVlZGluZyB0aGlzIHdpbGwgd2FudCB0byB0d2VhayB0aGVpciBjb21waWxlciBhbnl3YXkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CQkvKiBIWiAqLworCitzdGF0aWMgaW50IFBfZXVpZDsKK3N0YXRpYyBpbnQgUF9waWQ7CitzdGF0aWMgY2hhciBQX2NtZFsxNl07CitzdGF0aWMgY2hhciBQX3N0YXRlOworc3RhdGljIGludCBQX3BwaWQsIFBfcGdycCwgUF9zZXNzaW9uLCBQX3R0eSwgUF90cGdpZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBfZmxhZ3MsIFBfbWluX2ZsdCwgUF9jbWluX2ZsdCwgUF9tYWpfZmx0LCBQX2NtYWpfZmx0LAorICAgIFBfdXRpbWUsIFBfc3RpbWU7CitzdGF0aWMgbG9uZyBQX2N1dGltZSwgUF9jc3RpbWUsIFBfcHJpb3JpdHksIFBfbmljZSwgUF90aW1lb3V0LCBQX2l0X3JlYWxfdmFsdWU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBQX3N0YXJ0X3RpbWUsIFBfdnNpemU7CitzdGF0aWMgbG9uZyBQX3JzczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBfcnNzX3JsaW0sIFBfc3RhcnRfY29kZSwgUF9lbmRfY29kZSwgUF9zdGFydF9zdGFjaywKKyAgICBQX2tzdGtfZXNwLCBQX2tzdGtfZWlwOworc3RhdGljIHVuc2lnbmVkIFBfc2lnbmFsLCBQX2Jsb2NrZWQsIFBfc2lnaWdub3JlLCBQX3NpZ2NhdGNoOworc3RhdGljIHVuc2lnbmVkIGxvbmcgUF93Y2hhbiwgUF9uc3dhcCwgUF9jbnN3YXA7CisKKyNpZiAwCitzdGF0aWMgaW50IHNjcmVlbl9jb2xzID0gODA7CitzdGF0aWMgaW50IHdfY291bnQ7CisjZW5kaWYKKworc3RhdGljIGludCB3YW50X29uZV9waWQ7CitzdGF0aWMgY29uc3QgY2hhciAqd2FudF9vbmVfY29tbWFuZDsKK3N0YXRpYyBpbnQgc2VsZWN0X25vdHR5Oworc3RhdGljIGludCBzZWxlY3RfYWxsOworCitzdGF0aWMgaW50IHBzX2Zvcm1hdDsKK3N0YXRpYyBpbnQgb2xkX2hfb3B0aW9uOworCisvKiB3ZSBvbmx5IHByZXRlbmQgdG8gc3VwcG9ydCB0aGlzICovCitzdGF0aWMgaW50IHNob3dfYXJnczsJCS8qIGltcGxpY2l0IHdpdGggLWYgYW5kIGFsbCBCU0Qgb3B0aW9ucyAqLworc3RhdGljIGludCBic2RfY19vcHRpb247CS8qIHRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgYWJvdmUgKi8KKworc3RhdGljIGludCBwc19hcmdjOwkJLyogZ2xvYmFsIGFyZ2MgKi8KK3N0YXRpYyBjaGFyICoqcHNfYXJndjsJCS8qIGdsb2JhbCBhcmd2ICovCitzdGF0aWMgaW50IHRoaXNhcmc7CQkvKiBpbmRleCBpbnRvIHBzX2FyZ3YgKi8KK3N0YXRpYyBjaGFyICpmbGFncHRyOwkJLyogY3VycmVudCBsb2NhdGlvbiBpbiBwc19hcmd2W3RoaXNhcmddICovCisKKyNpZm5kZWYgSFoKKyN3YXJuaW5nIEhaIG5vdCBkZWZpbmVkLCBhc3N1bWluZyBpdCBpcyAxMDAKKyNkZWZpbmUgSFogMTAwCisjZW5kaWYKKworaW50IHBhZ2Vfc2hpZnQ7CQkJLyogUGFnZSBzaXplIGFzIHNoaWZ0IGNvdW50ICovCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSItQyAgIHNlbGVjdCBieSBjb21tYW5kIG5hbWUgKG1pbmltYWwgcHMgb25seSBhY2NlcHRzIG9uZSlcbiIKKwkJIi1wICAgc2VsZWN0IGJ5IHByb2Nlc3MgSUQgKG1pbmltYWwgcHMgb25seSBhY2NlcHRzIG9uZSlcbiIKKwkJIi1lICAgYWxsIHByb2Nlc3NlcyAoc2FtZSBhcyBheClcbiIKKwkJImEgICAgYWxsIHByb2Nlc3NlcyB3LyB0dHksIGluY2x1ZGluZyBvdGhlciB1c2Vyc1xuIgorCQkieCAgICBwcm9jZXNzZXMgdy9vIGNvbnRyb2xsaW5nIHR0eXNcbiIKKwkJIi1mICAgZnVsbCBmb3JtYXRcbiIKKwkJIi1qLGogam9iIGNvbnRyb2wgZm9ybWF0XG4iCisJCSJ2ICAgIHZpcnR1YWwgbWVtb3J5IGZvcm1hdFxuIgorCQkiLWwsbCBsb25nIGZvcm1hdFxuIgorCQkidSAgICB1c2VyLW9yaWVudGVkIGZvcm1hdFxuIgorCQkiLW8gICB1c2VyLWRlZmluZWQgZm9ybWF0IChsaW1pdGVkIHN1cHBvcnQsIG9ubHkgXCJwcyAtbyBwaWQ9XCIpXG4iCisJCSJoICAgIG5vIGhlYWRlclxuIgorLyoKKyAgICAiLUEgICBhbGwgcHJvY2Vzc2VzIChzYW1lIGFzIGF4KVxuIgorICAgICJjICAgIHRydWUgY29tbWFuZCBuYW1lXG4iCisgICAgIi13LHcgd2lkZSBvdXRwdXRcbiIKKyovCisJICAgICk7CisJZXhpdCgxKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbmV4dCBhcmd1bWVudCwgb3IgY2FsbCB0aGUgdXNhZ2UgZnVuY3Rpb24uCisgKiBUaGlzIGhhbmRsZXMgYm90aDogICAtb0ZPTyAgIC1vIEZPTworICovCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X29wdF9hcmcodm9pZCkKK3sKKwljb25zdCBjaGFyICpyZXQ7CisJcmV0ID0gZmxhZ3B0ciArIDE7CS8qIGFzc3VtZSBhcmd1bWVudCBpcyBwYXJ0IG9mIHBzX2FyZ3ZbdGhpc2FyZ10gKi8KKwlpZiAoKnJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoKyt0aGlzYXJnID49IHBzX2FyZ2MpCisJCXVzYWdlKCk7CS8qIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCAqLworCS8qIGFyZ3VtZW50IGlzIHRoZSBuZXcgcHNfYXJndlt0aGlzYXJnXSAqLworCXJldCA9IHBzX2FyZ3ZbdGhpc2FyZ107CisJaWYgKCFyZXQgfHwgISpyZXQpCisJCXVzYWdlKCk7CisJcmV0dXJuIHJldDsKK30KKworLyogcmV0dXJuIHRoZSBQSUQsIG9yIDAgaWYgbm90aGluZyBnb29kICovCitzdGF0aWMgdm9pZCBwYXJzZV9waWQoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKmVuZHA7CisJaW50IG51bTsKKwlpZiAoIXN0cikKKwkJZ290byBiYWQ7CisJbnVtID0gc3RydG9sKHN0ciwgJmVuZHAsIDApOworCWlmICgqZW5kcCAhPSAnXDAnKQorCQlnb3RvIGJhZDsKKwlpZiAobnVtIDwgMSkKKwkJZ290byBiYWQ7CisJaWYgKHdhbnRfb25lX3BpZCkKKwkJZ290byBiYWQ7CisJd2FudF9vbmVfcGlkID0gbnVtOworCXJldHVybjsKKyAgICAgIGJhZDoKKwl1c2FnZSgpOworfQorCisvKioqKioqKioqKioqKioqKiogcGFyc2UgU3lzViBvcHRpb25zLCBpbmNsdWRpbmcgVW5peDk4ICAqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3N5c3Zfb3B0aW9uKHZvaWQpCit7CisJZG8geworCQlzd2l0Y2ggKCpmbGFncHRyKSB7CisgICAgLyoqKiogc2VsZWN0aW9uICoqKiovCisJCWNhc2UgJ0MnOgkvKiBlbmQgKi8KKwkJCWlmICh3YW50X29uZV9jb21tYW5kKQorCQkJCXVzYWdlKCk7CisJCQl3YW50X29uZV9jb21tYW5kID0gZ2V0X29wdF9hcmcoKTsKKwkJCXJldHVybjsJLyogY2FuJ3QgaGF2ZSBhbnkgbW9yZSBvcHRpb25zICovCisJCWNhc2UgJ3AnOgkvKiBlbmQgKi8KKwkJCXBhcnNlX3BpZChnZXRfb3B0X2FyZygpKTsKKwkJCXJldHVybjsJLyogY2FuJ3QgaGF2ZSBhbnkgbW9yZSBvcHRpb25zICovCisJCWNhc2UgJ0EnOgorCQljYXNlICdlJzoKKwkJCXNlbGVjdF9hbGwrKzsKKwkJCXNlbGVjdF9ub3R0eSsrOworCQljYXNlICd3JzoJLyogaGVyZSBmb3Igbm93LCBzaW5jZSB0aGUgcmVhbCBvbmUgaXMgbm90IHVzZWQgKi8KKwkJCWJyZWFrOworICAgIC8qKioqIG91dHB1dCBmb3JtYXQgKioqKi8KKwkJY2FzZSAnZic6CisJCQlzaG93X2FyZ3MgPSAxOworCQkJLyogRkFMTCBUSFJPVUdIICovCisJCWNhc2UgJ2onOgorCQljYXNlICdsJzoKKwkJCWlmIChwc19mb3JtYXQpCisJCQkJdXNhZ2UoKTsKKwkJCXBzX2Zvcm1hdCA9ICpmbGFncHRyOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgkvKiBlbmQgKi8KKwkJCS8qIFdlIG9ubHkgc3VwcG9ydCBhIGxpbWl0ZWQgZm9ybTogInBzIC1vIHBpZD0iICAoeWVzLCBqdXN0ICJwaWQ9IikgKi8KKwkJCWlmIChzdHJjbXAoZ2V0X29wdF9hcmcoKSwgInBpZD0iKSkKKwkJCQl1c2FnZSgpOworCQkJaWYgKHBzX2Zvcm1hdCkKKwkJCQl1c2FnZSgpOworCQkJcHNfZm9ybWF0ID0gJ28nOworCQkJb2xkX2hfb3B0aW9uKys7CisJCQlyZXR1cm47CS8qIGNhbid0IGhhdmUgYW55IG1vcmUgb3B0aW9ucyAqLworICAgIC8qKioqIG90aGVyIHN0dWZmICoqKiovCisjaWYgMAorCQljYXNlICd3JzoKKwkJCXdfY291bnQrKzsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CQkvKiBzd2l0Y2ggKi8KKwl9IHdoaWxlICgqKytmbGFncHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogcGFyc2UgQlNEIG9wdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2JzZF9vcHRpb24odm9pZCkKK3sKKwlkbyB7CisJCXN3aXRjaCAoKmZsYWdwdHIpIHsKKyAgICAvKioqKiBzZWxlY3Rpb24gKioqKi8KKwkJY2FzZSAnYSc6CisJCQlzZWxlY3RfYWxsKys7CisJCQlicmVhazsKKwkJY2FzZSAneCc6CisJCQlzZWxlY3Rfbm90dHkrKzsKKwkJCWJyZWFrOworCQljYXNlICdwJzoJLyogZW5kICovCisJCQlwYXJzZV9waWQoZ2V0X29wdF9hcmcoKSk7CisJCQlyZXR1cm47CS8qIGNhbid0IGhhdmUgYW55IG1vcmUgb3B0aW9ucyAqLworICAgIC8qKioqIG91dHB1dCBmb3JtYXQgKioqKi8KKwkJY2FzZSAnaic6CisJCWNhc2UgJ2wnOgorCQljYXNlICd1JzoKKwkJY2FzZSAndic6CisJCQlpZiAocHNfZm9ybWF0KQorCQkJCXVzYWdlKCk7CisJCQlwc19mb3JtYXQgPSAweDgwIHwgKmZsYWdwdHI7CS8qIHVzZSAweDgwIHRvIHRlbGwgQlNEIGZyb20gU3lzViAqLworCQkJYnJlYWs7CisgICAgLyoqKiogb3RoZXIgc3R1ZmYgKioqKi8KKwkJY2FzZSAnYyc6CisJCQlic2RfY19vcHRpb24rKzsKKyNpZiAwCisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlICd3JzoKKyNpZiAwCisJCQl3X2NvdW50Kys7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCW9sZF9oX29wdGlvbisrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CQkvKiBzd2l0Y2ggKi8KKwl9IHdoaWxlICgqKytmbGFncHRyKTsKK30KKworI2lmIDAKKy8qIG5vdCB1c2VkIHlldCAqLworc3RhdGljIHZvaWQgY2hvb3NlX2RpbWVuc2lvbnModm9pZCkKK3sKKwlzdHJ1Y3Qgd2luc2l6ZSB3czsKKwljaGFyICpjb2x1bW5zOworCS8qIHNjcmVlbl9jb2xzIGlzIDgwIGJ5IGRlZmF1bHQgKi8KKwlpZiAoaW9jdGwoMSwgVElPQ0dXSU5TWiwgJndzKSAhPSAtMSAmJiB3cy53c19jb2wgPiAzMCkKKwkJc2NyZWVuX2NvbHMgPSB3cy53c19jb2w7CisJY29sdW1ucyA9IGdldGVudigiQ09MVU1OUyIpOworCWlmIChjb2x1bW5zICYmICpjb2x1bW5zKSB7CisJCWxvbmcgdDsKKwkJY2hhciAqZW5kcHRyOworCQl0ID0gc3RydG9sKGNvbHVtbnMsICZlbmRwdHIsIDApOworCQlpZiAoISplbmRwdHIgJiYgKHQgPiAzMCkgJiYgKHQgPCAobG9uZyk5OTk5OTk5OTkpKQorCQkJc2NyZWVuX2NvbHMgPSAoaW50KXQ7CisJfQorCWlmICh3X2NvdW50ICYmIChzY3JlZW5fY29scyA8IDEzMikpCisJCXNjcmVlbl9jb2xzID0gMTMyOworCWlmICh3X2NvdW50ID4gMSkKKwkJc2NyZWVuX2NvbHMgPSA5OTk5OTk5OTk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXJnX3BhcnNlKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHNlbCA9IDA7CQkvKiB0byB2ZXJpZnkgb3B0aW9uIHNhbml0eSAqLworCXBzX2FyZ2MgPSBhcmdjOworCXBzX2FyZ3YgPSBhcmd2OworCXRoaXNhcmcgPSAwOworICAvKioqKiBpdGVyYXRlIG92ZXIgdGhlIGFyZ3MgKioqKi8KKwl3aGlsZSAoKyt0aGlzYXJnIDwgcHNfYXJnYykgeworCQlmbGFncHRyID0gcHNfYXJndlt0aGlzYXJnXTsKKwkJc3dpdGNoICgqZmxhZ3B0cikgeworCQljYXNlICcwJy4uLic5JzoKKwkJCXNob3dfYXJncyA9IDE7CisJCQlwYXJzZV9waWQoZmxhZ3B0cik7CisJCQlicmVhazsKKwkJY2FzZSAnLSc6CisJCQlmbGFncHRyKys7CisJCQlwYXJzZV9zeXN2X29wdGlvbigpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzaG93X2FyZ3MgPSAxOworCQkJcGFyc2VfYnNkX29wdGlvbigpOworCQkJYnJlYWs7CisJCX0KKwl9CisgIC8qKioqIHNhbml0eSBjaGVjayBhbmQgY2xlYW4tdXAgKioqKi8KKwlpZiAod2FudF9vbmVfcGlkKQorCQlzZWwrKzsKKwlpZiAod2FudF9vbmVfY29tbWFuZCkKKwkJc2VsKys7CisJaWYgKHNlbGVjdF9ub3R0eSB8fCBzZWxlY3RfYWxsKQorCQlzZWwrKzsKKwlpZiAoc2VsID4gMSB8fCBzZWxlY3Rfbm90dHkgPiAxIHx8IHNlbGVjdF9hbGwgPiAxIHx8IGJzZF9jX29wdGlvbiA+IDEKKwkgICAgfHwgb2xkX2hfb3B0aW9uID4gMSkKKwkJdXNhZ2UoKTsKKwlpZiAoYnNkX2Nfb3B0aW9uKQorCQlzaG93X2FyZ3MgPSAwOworfQorCisvKiByZXR1cm4gMSBpZiBpdCB3b3Jrcywgb3IgMCBmb3IgZmFpbHVyZSAqLworc3RhdGljIGludCBzdGF0MnByb2MoaW50IHBpZCkKK3sKKwljaGFyIGJ1Zls4MDBdOwkJLyogYWJvdXQgNDAgZmllbGRzLCA2NC1iaXQgZGVjaW1hbCBpcyBhYm91dCAyMCBjaGFycyAqLworCWludCBudW07CisJaW50IGZkOworCWNoYXIgKnRtcDsKKwlzdHJ1Y3Qgc3RhdCBzYjsJCS8qIHN0YXQoKSB1c2VkIHRvIGdldCBFVUlEICovCisJc25wcmludGYoYnVmLCAzMiwgIi9wcm9jLyVkL3N0YXQiLCBwaWQpOworCWlmICgoZmQgPSBvcGVuKGJ1ZiwgT19SRE9OTFksIDApKSA9PSAtMSkKKwkJcmV0dXJuIDA7CisJbnVtID0gcmVhZChmZCwgYnVmLCBzaXplb2YgYnVmIC0gMSk7CisJZnN0YXQoZmQsICZzYik7CisJUF9ldWlkID0gc2Iuc3RfdWlkOworCWNsb3NlKGZkKTsKKwlpZiAobnVtIDwgODApCisJCXJldHVybiAwOworCWJ1ZltudW1dID0gJ1wwJzsKKwl0bXAgPSBzdHJyY2hyKGJ1ZiwgJyknKTsJLyogc3BsaXQgaW50byAiUElEIChjbWQiIGFuZCAiPHJlc3Q+IiAqLworCSp0bXAgPSAnXDAnOwkJLyogcmVwbGFjZSB0cmFpbGluZyAnKScgd2l0aCBOVUwgKi8KKwkvKiBwYXJzZSB0aGVzZSB0d28gc3RyaW5ncyBzZXBhcmF0ZWx5LCBza2lwcGluZyB0aGUgbGVhZGluZyAiKCIuICovCisJbWVtc2V0KFBfY21kLCAwLCBzaXplb2YgUF9jbWQpOwkvKiBjbGVhciAqLworCXNzY2FuZihidWYsICIlZCAoJTE1YyIsICZQX3BpZCwgUF9jbWQpOwkvKiBjb21tWzE2XSBpbiBrZXJuZWwgKi8KKwludW0gPSBzc2NhbmYodG1wICsgMiwJLyogc2tpcCBzcGFjZSBhZnRlciAnKScgdG9vICovCisJCSAgICAgIiVjICIgIiVkICVkICVkICVkICVkICIgIiVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAiICIlbGQgJWxkICVsZCAlbGQgJWxkICVsZCAiICIlbHUgJWx1ICIgIiVsZCAiICIlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAiICIldSAldSAldSAldSAiCS8qIG5vIHVzZSBmb3IgUlQgc2lnbmFscyAqLworCQkgICAgICIlbHUgJWx1ICVsdSIsCisJCSAgICAgJlBfc3RhdGUsCisJCSAgICAgJlBfcHBpZCwgJlBfcGdycCwgJlBfc2Vzc2lvbiwgJlBfdHR5LCAmUF90cGdpZCwKKwkJICAgICAmUF9mbGFncywgJlBfbWluX2ZsdCwgJlBfY21pbl9mbHQsICZQX21hal9mbHQsICZQX2NtYWpfZmx0LAorCQkgICAgICZQX3V0aW1lLCAmUF9zdGltZSwgJlBfY3V0aW1lLCAmUF9jc3RpbWUsICZQX3ByaW9yaXR5LAorCQkgICAgICZQX25pY2UsICZQX3RpbWVvdXQsICZQX2l0X3JlYWxfdmFsdWUsICZQX3N0YXJ0X3RpbWUsCisJCSAgICAgJlBfdnNpemUsICZQX3JzcywgJlBfcnNzX3JsaW0sICZQX3N0YXJ0X2NvZGUsICZQX2VuZF9jb2RlLAorCQkgICAgICZQX3N0YXJ0X3N0YWNrLCAmUF9rc3RrX2VzcCwgJlBfa3N0a19laXAsICZQX3NpZ25hbCwKKwkJICAgICAmUF9ibG9ja2VkLCAmUF9zaWdpZ25vcmUsICZQX3NpZ2NhdGNoLCAmUF93Y2hhbiwgJlBfbnN3YXAsCisJCSAgICAgJlBfY25zd2FwKTsKKy8qICAgIGZwcmludGYoc3RkZXJyLCAic3RhdDJwcm9jIGNvbnZlcnRlZCAlZCBmaWVsZHMuXG4iLG51bSk7ICovCisJUF92c2l6ZSAvPSAxMDI0OworCVBfcnNzIDw8PSBwYWdlX3NoaWZ0IC0gMTA7CisJaWYgKG51bSA8IDMwKQorCQlyZXR1cm4gMDsKKwlpZiAoUF9waWQgIT0gcGlkKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRvX3RpbWUodW5zaWduZWQgbG9uZyB0KQoreworCWludCBoaCwgbW0sIHNzOworCXN0YXRpYyBjaGFyIGJ1ZlszMl07CisJaW50IGNudCA9IDA7CisJdCAvPSBIWjsKKwlzcyA9IHQgJSA2MDsKKwl0IC89IDYwOworCW1tID0gdCAlIDYwOworCXQgLz0gNjA7CisJaGggPSB0ICUgMjQ7CisJdCAvPSAyNDsKKwlpZiAodCkKKwkJY250ID0gc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJWQtIiwgKGludCl0KTsKKwlzbnByaW50ZihjbnQgKyBidWYsIHNpemVvZihidWYpIC0gY250LCAiJTAyZDolMDJkOiUwMmQiLCBoaCwgbW0sIHNzKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wcm9jKHZvaWQpCit7CisJY2hhciB0dHlbMTZdOworCXNucHJpbnRmKHR0eSwgc2l6ZW9mIHR0eSwgIiUzZCwlLTNkIiwgKFBfdHR5ID4+IDgpICYgMHhmZiwKKwkJIFBfdHR5ICYgMHhmZik7CisJc3dpdGNoIChwc19mb3JtYXQpIHsKKwljYXNlIDA6CisJCXByaW50ZigiJTVkICVzICVzIiwgUF9waWQsIHR0eSwgZG9fdGltZShQX3V0aW1lICsgUF9zdGltZSkpOworCQlicmVhazsKKwljYXNlICdvJzoKKwkJcHJpbnRmKCIlZFxuIiwgUF9waWQpOworCQlyZXR1cm47CQkvKiBkb24ndCB3YW50IHRoZSBjb21tYW5kICovCisJY2FzZSAnbCc6CisJCXByaW50ZigiJTAzeCAlYyAlNWQgJTVkICU1ZCAgLSAlM2QgJTNkIC0gIgorCQkgICAgICAgIiU1bGQgJTA2eCAlcyAlcyIsCisJCSAgICAgICAodW5zaWduZWQpUF9mbGFncyAmIDB4Nzc3LCBQX3N0YXRlLCBQX2V1aWQsIFBfcGlkLAorCQkgICAgICAgUF9wcGlkLCAoaW50KVBfcHJpb3JpdHksIChpbnQpUF9uaWNlLAorCQkgICAgICAgUF92c2l6ZSA+PiAocGFnZV9zaGlmdCAtIDEwKSwKKwkJICAgICAgICh1bnNpZ25lZCkoUF93Y2hhbiAmIDB4ZmZmZmZmKSwgdHR5LAorCQkgICAgICAgZG9fdGltZShQX3V0aW1lICsgUF9zdGltZSkKKwkJICAgICk7CisJCWJyZWFrOworCWNhc2UgJ2YnOgorCQlwcmludGYoIiU1ZCAlNWQgJTVkICAtICAgLSAgICVzICVzIiwKKwkJICAgICAgIFBfZXVpZCwgUF9waWQsIFBfcHBpZCwgdHR5LCBkb190aW1lKFBfdXRpbWUgKyBQX3N0aW1lKQorCQkgICAgKTsKKwkJYnJlYWs7CisJY2FzZSAnaic6CisJCXByaW50ZigiJTVkICU1ZCAlNWQgJXMgJXMiLAorCQkgICAgICAgUF9waWQsIFBfcGdycCwgUF9zZXNzaW9uLCB0dHksIGRvX3RpbWUoUF91dGltZSArIFBfc3RpbWUpCisJCSAgICApOworCQlicmVhazsKKwljYXNlICd1JyB8IDB4ODA6CisJCXByaW50ZigiJTVkICU1ZCAgICAtICAgIC0gJTVsZCAlNWxkICVzICVjICAgLSAgICVzIiwKKwkJICAgICAgIFBfZXVpZCwgUF9waWQsIFBfdnNpemUsIFBfcnNzLCB0dHksIFBfc3RhdGUsCisJCSAgICAgICBkb190aW1lKFBfdXRpbWUgKyBQX3N0aW1lKQorCQkgICAgKTsKKwkJYnJlYWs7CisJY2FzZSAndicgfCAweDgwOgorCQlwcmludGYoIiU1ZCAlcyAlYyAlcyAlNmQgICAtICAgLSAlNWQgICAgLSIsCisJCSAgICAgICBQX3BpZCwgdHR5LCBQX3N0YXRlLCBkb190aW1lKFBfdXRpbWUgKyBQX3N0aW1lKSwKKwkJICAgICAgIChpbnQpUF9tYWpfZmx0LCAoaW50KVBfcnNzKTsKKwkJYnJlYWs7CisJY2FzZSAnaicgfCAweDgwOgorCQlwcmludGYoIiU1ZCAlNWQgJTVkICU1ZCAlcyAlNWQgJWMgJTVkICVzIiwKKwkJICAgICAgIFBfcHBpZCwgUF9waWQsIFBfcGdycCwgUF9zZXNzaW9uLCB0dHksIFBfdHBnaWQsIFBfc3RhdGUsCisJCSAgICAgICBQX2V1aWQsIGRvX3RpbWUoUF91dGltZSArIFBfc3RpbWUpCisJCSAgICApOworCQlicmVhazsKKwljYXNlICdsJyB8IDB4ODA6CisJCXByaW50ZigiJTAzeCAlNWQgJTVkICU1ZCAlM2QgJTNkICIKKwkJICAgICAgICIlNWxkICU0bGQgJTA2eCAlYyAlcyAlcyIsCisJCSAgICAgICAodW5zaWduZWQpUF9mbGFncyAmIDB4Nzc3LCBQX2V1aWQsIFBfcGlkLCBQX3BwaWQsCisJCSAgICAgICAoaW50KVBfcHJpb3JpdHksIChpbnQpUF9uaWNlLCBQX3ZzaXplLCBQX3JzcywKKwkJICAgICAgICh1bnNpZ25lZCkoUF93Y2hhbiAmIDB4ZmZmZmZmKSwgUF9zdGF0ZSwgdHR5LAorCQkgICAgICAgZG9fdGltZShQX3V0aW1lICsgUF9zdGltZSkKKwkJICAgICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlpZiAoc2hvd19hcmdzKQorCQlwcmludGYoIiBbJXNdXG4iLCBQX2NtZCk7CisJZWxzZQorCQlwcmludGYoIiAlc1xuIiwgUF9jbWQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWFyZ19wYXJzZShhcmdjLCBhcmd2KTsKKworCXBhZ2Vfc2hpZnQgPSBfX2dldHBhZ2VzaGlmdCgpOworCisjaWYgMAorCWNob29zZV9kaW1lbnNpb25zKCk7CisjZW5kaWYKKwlpZiAoIW9sZF9oX29wdGlvbikgeworCQljb25zdCBjaGFyICpoZWFkOworCQlzd2l0Y2ggKHBzX2Zvcm1hdCkgeworCQlkZWZhdWx0OgkvKiBjYW4ndCBoYXBwZW4gKi8KKwkJY2FzZSAwOgorCQkJaGVhZCA9ICIgIFBJRCBUVFkgICAgICAgICBUSU1FIENNRCI7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQloZWFkID0KKwkJCSAgICAiICBGIFMgICBVSUQgICBQSUQgIFBQSUQgIEMgUFJJICBOSSBBRERSIFNaIFdDSEFOICAgIFRUWSAgICAgICBUSU1FIENNRCI7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQloZWFkID0KKwkJCSAgICAiICBVSUQgICBQSUQgIFBQSUQgIEMgU1RJTUUgICBUVFkgICAgICAgVElNRSBDTUQiOworCQkJYnJlYWs7CisJCWNhc2UgJ2onOgorCQkJaGVhZCA9ICIgIFBJRCAgUEdJRCAgIFNJRCBUVFkgICAgICAgICBUSU1FIENNRCI7CisJCQlicmVhazsKKwkJY2FzZSAndScgfCAweDgwOgorCQkJaGVhZCA9CisJCQkgICAgIiAgVUlEICAgUElEICVDUFUgJU1FTSAgIFZTWiAgIFJTUyAgIFRUWSAgIFMgU1RBUlQgICAgIFRJTUUgQ09NTUFORCI7CisJCQlicmVhazsKKwkJY2FzZSAndicgfCAweDgwOgorCQkJaGVhZCA9CisJCQkgICAgIiAgUElEICAgVFRZICAgUyAgICAgVElNRSAgTUFKRkwgVFJTIERSUyAgIFJTUyAlTUVNIENPTU1BTkQiOworCQkJYnJlYWs7CisJCWNhc2UgJ2onIHwgMHg4MDoKKwkJCWhlYWQgPQorCQkJICAgICIgUFBJRCAgIFBJRCAgUEdJRCAgIFNJRCAgIFRUWSAgIFRQR0lEIFMgICBVSUQgICAgIFRJTUUgQ09NTUFORCI7CisJCQlicmVhazsKKwkJY2FzZSAnbCcgfCAweDgwOgorCQkJaGVhZCA9CisJCQkgICAgIiAgRiAgIFVJRCAgIFBJRCAgUFBJRCBQUkkgIE5JICAgVlNaICBSU1MgV0NIQU4gIFMgICBUVFkgICAgICAgVElNRSBDT01NQU5EIjsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ZigiJXNcbiIsIGhlYWQpOworCX0KKwlpZiAod2FudF9vbmVfcGlkKSB7CisJCWlmIChzdGF0MnByb2Mod2FudF9vbmVfcGlkKSkKKwkJCXByaW50X3Byb2MoKTsKKwkJZWxzZQorCQkJZXhpdCgxKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGlyZW50ICplbnQ7CS8qIGRpcmVudCBoYW5kbGUgKi8KKwkJRElSICpkaXI7CisJCWludCBvdXJ1aWQ7CisJCWludCBmb3VuZF9hX3Byb2M7CisJCWZvdW5kX2FfcHJvYyA9IDA7CisJCW91cnVpZCA9IGdldHVpZCgpOworCQlkaXIgPSBvcGVuZGlyKCIvcHJvYyIpOworCQlpZiAoIWRpcikKKwkJCWV4aXQoMSk7CisJCXdoaWxlICgoZW50ID0gcmVhZGRpcihkaXIpKSkgeworCQkJaWYgKCplbnQtPmRfbmFtZSA8ICcwJyB8fCAqZW50LT5kX25hbWUgPiAnOScpCisJCQkJY29udGludWU7CisJCQlpZiAoIXN0YXQycHJvYyhhdG9pKGVudC0+ZF9uYW1lKSkpCisJCQkJY29udGludWU7CisJCQlpZiAod2FudF9vbmVfY29tbWFuZCkgeworCQkJCWlmIChzdHJjbXAod2FudF9vbmVfY29tbWFuZCwgUF9jbWQpKQorCQkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFzZWxlY3Rfbm90dHkgJiYgUF90dHkgPT0gLTEpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghc2VsZWN0X2FsbCAmJiBQX2V1aWQgIT0gb3VydWlkKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZvdW5kX2FfcHJvYysrOworCQkJcHJpbnRfcHJvYygpOworCQl9CisJCWNsb3NlZGlyKGRpcik7CisJCWV4aXQoIWZvdW5kX2FfcHJvYyk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL21rZGlyLmMgYi91c3IvdXRpbHMvbWtkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjI0MWVmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL21rZGlyLmMKQEAgLTAsMCArMSwxNTQgQEAKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZmlsZV9tb2RlLmgiCisKK3N0YXRpYyBtb2RlX3QgbGVhZl9tb2RlLCBzdWJkaXJfbW9kZTsKK3N0YXRpYyBpbnQgcF9mbGFnOworCitjaGFyICpwcm9nbmFtZTsKKworc3RhdGljIF9fbm9yZXR1cm4gdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLXBdIFstbSBtb2RlXSBkaXIuLi5cbiIsIHByb2duYW1lKTsKKwlleGl0KDEpOworfQorCitzdGF0aWMgaW50IG1ha2Vfb25lX2RpcihjaGFyICpkaXIsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBzdGF0IHN0YnVmOworCisJaWYgKG1rZGlyKGRpciwgbW9kZSkgPT0gLTEpIHsKKwkJaW50IGVyciA9IGVycm5vOworCisJCS8qCisJCSAqIElnbm9yZSB0aGUgZXJyb3IgaWYgaXQgYWxsIG9mIHRoZSBmb2xsb3dpbmcKKwkJICogYXJlIHNhdGlzZmllZDoKKwkJICogIC0gZXJyb3Igd2FzIEVFWElTVAorCQkgKiAgLSAtcCB3YXMgc3BlY2lmaWVkCisJCSAqICAtIHN0YXQgaW5kaWNhdGVzIHRoYXQgaXRzIGEgZGlyZWN0b3J5CisJCSAqLworCQlpZiAocF9mbGFnICYmIGVycm5vID09IEVFWElTVCAmJgorCQkgICAgc3RhdChkaXIsICZzdGJ1ZikgPT0gMCAmJiBTX0lTRElSKHN0YnVmLnN0X21vZGUpKQorCQkJcmV0dXJuIDE7CisJCWVycm5vID0gZXJyOworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisJCXBlcnJvcihkaXIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2VfZGlyKGNoYXIgKmRpcikKK3sKKwlpbnQgcmV0OworCisJaWYgKHBfZmxhZykgeworCQljaGFyICpzLCAqcDsKKworCQkvKgorCQkgKiBSZWN1cnNlIGVhY2ggZGlyZWN0b3J5LCB0cnlpbmcgdG8gbWFrZSBpdAorCQkgKiBhcyB3ZSBnby4gIFNob3VsZCB3ZSBjaGVjayB0byBzZWUgaWYgaXQKKwkJICogZXhpc3RzLCBhbmQgaWYgc28gaWYgaXQncyBhIGRpcmVjdG9yeQorCQkgKiBiZWZvcmUgY2FsbGluZyBta2Rpcj8KKwkJICovCisJCXMgPSBkaXI7CisJCXdoaWxlICgocCA9IHN0cmNocihzLCAnLycpKSAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogSWdub3JlIHRoZSBsZWFkaW5nIC8KKwkJCSAqLworCQkJaWYgKHAgIT0gZGlyKSB7CisJCQkJKnAgPSAnXDAnOworCisJCQkJLyoKKwkJCQkgKiBNYWtlIHRoZSBpbnRlcm1lZGlhcnkgZGlyZWN0b3J5LiAgUE9TSVgKKwkJCQkgKiBzYXlzIHRoYXQgdGhlc2UgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQKKwkJCQkgKiB3aXRoIHVtYXNrLHUrd3gKKwkJCQkgKi8KKwkJCQlpZiAobWFrZV9vbmVfZGlyKGRpciwgc3ViZGlyX21vZGUpID09IC0xKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCQkqcCA9ICcvJzsKKwkJCX0KKwkJCXMgPSBwICsgMTsKKwkJfQorCX0KKworCS8qCisJICogTWFrZSB0aGUgZmluYWwgdGFyZ2V0LiAgT25seSBjb21wbGFpbiBpZiB0aGUKKwkgKiB0YXJnZXQgYWxyZWFkeSBleGlzdHMgaWYgLXAgd2FzIG5vdCBzcGVjaWZpZWQuCisJICogVGhpcyBpcyBjcmVhdGVkIHdpdGggdGhlIGFza2VkIGZvciBtb2RlICYgfnVtYXNrCisJICovCisJcmV0ID0gbWFrZV9vbmVfZGlyKGRpciwgbGVhZl9tb2RlKTsKKwlpZiAocmV0ID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIFdlIG1pZ2h0IG5vdCBzZXQgYWxsIHRoZSBwZXJtaXNzaW9uIGJpdHMuICBEbyB0aGF0CisJICogaGVyZSAoYnV0IG9ubHkgaWYgd2UgZGlkIGNyZWF0ZSBpdC4pCisJICovCisJaWYgKHJldCA9PSAwICYmIGNobW9kKGRpciwgbGVhZl9tb2RlKSA9PSAtMSkgeworCQlpbnQgZXJyX3NhdmUgPSBlcnJubzsKKworCQkvKgorCQkgKiBXZSBmYWlsZWQsIHJlbW92ZSB0aGUgZGlyZWN0b3J5IHdlIGNyZWF0ZWQKKwkJICovCisJCXJtZGlyKGRpcik7CisJCWVycm5vID0gZXJyX3NhdmU7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKKwkJcGVycm9yKGRpcik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGMsIHJldCA9IDA7CisJbW9kZV90IHNhdmVkX3VtYXNrOworCisJcHJvZ25hbWUgPSBhcmd2WzBdOworCisJc2F2ZWRfdW1hc2sgPSB1bWFzaygwKTsKKwlsZWFmX21vZGUgPSAoU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKSAmIH5zYXZlZF91bWFzazsKKwlzdWJkaXJfbW9kZSA9IChzYXZlZF91bWFzayBeIChTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pKQorCSAgICB8IFNfSVdVU1IgfCBTX0lYVVNSOworCisJZG8geworCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJwbToiKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkJYnJlYWs7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdtJzoKKwkJCWxlYWZfbW9kZSA9CisJCQkgICAgcGFyc2VfZmlsZV9tb2RlKG9wdGFyZywgbGVhZl9tb2RlLCBzYXZlZF91bWFzayk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwX2ZsYWcgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG9wdGlvbiAtJWNcbiIsCisJCQkJcHJvZ25hbWUsIG9wdG9wdCk7CisJCQl1c2FnZSgpOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAob3B0aW5kID09IGFyZ2MpCisJCXVzYWdlKCk7CisKKwl3aGlsZSAob3B0aW5kIDwgYXJnYykgeworCQlpZiAobWFrZV9kaXIoYXJndltvcHRpbmRdKSkKKwkJCXJldCA9IDI1NTsJLyogc2VlbXMgdG8gYmUgd2hhdCBnbnUgbWtkaXIgZG9lcyAqLworCQlvcHRpbmQrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL21rZmlmby5jIGIvdXNyL3V0aWxzL21rZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYWMzNWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbWtmaWZvLmMKQEAgLTAsMCArMSw3MSBAQAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJmaWxlX21vZGUuaCIKKworc3RhdGljIG1vZGVfdCBsZWFmX21vZGU7CisKK2NoYXIgKnByb2duYW1lOworCitzdGF0aWMgaW50IG1ha2VfZmlmbyhjaGFyICpkaXIpCit7CisJaWYgKG1rZmlmbyhkaXIsIGxlYWZfbW9kZSkpIHsKKwkJLyoKKwkJICogV2UgZmFpbGVkLCByZW1vdmUgdGhlIGRpcmVjdG9yeSB3ZSBjcmVhdGVkLgorCQkgKi8KKwkJZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ25hbWUpOworCQlwZXJyb3IoZGlyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgYywgcmV0ID0gMDsKKwltb2RlX3Qgc2F2ZWRfdW1hc2s7CisKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKwlzYXZlZF91bWFzayA9IHVtYXNrKDApOworCWxlYWZfbW9kZSA9CisJICAgIChTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCB8IFNfSVdPVEgpICYKKwkgICAgfnNhdmVkX3VtYXNrOworCisJZG8geworCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJtOiIpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ20nOgorCQkJbGVhZl9tb2RlID0KKwkJCSAgICBwYXJzZV9maWxlX21vZGUob3B0YXJnLCBsZWFmX21vZGUsIHNhdmVkX3VtYXNrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJz8nOgorCQkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBvcHRpb24gLSVjXG4iLAorCQkJCXByb2duYW1lLCBvcHRvcHQpOworCQkJZXhpdCgxKTsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKG9wdGluZCA9PSBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstbSBtb2RlXSBmaWxlLi4uXG4iLCBwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKKwkJaWYgKG1ha2VfZmlmbyhhcmd2W29wdGluZF0pKQorCQkJcmV0ID0gMjU1OwkvKiBzZWVtcyB0byBiZSB3aGF0IGdudSBta2RpciBkb2VzICovCisJCW9wdGluZCsrOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbWtub2QuYyBiL3Vzci91dGlscy9ta25vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDU0NTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbWtub2QuYwpAQCAtMCwwICsxLDcwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCitjaGFyICpwcm9nbmFtZTsKKworc3RhdGljIF9fbm9yZXR1cm4gdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBuYW1lIHtifGN8cH0gbWFqb3IgbWlub3JcbiIsIHByb2duYW1lKTsKKwlleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKm5hbWUsICp0eXBlLCB0eXBlYywgKmVuZHA7CisJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKKwltb2RlX3QgbW9kZTsKKwlkZXZfdCBkZXY7CisKKwlwcm9nbmFtZSA9ICphcmd2Kys7CisKKwluYW1lID0gKmFyZ3YrKzsKKwlpZiAoIW5hbWUpCisJCXVzYWdlKCk7CisKKwl0eXBlID0gKmFyZ3YrKzsKKwlpZiAoIXR5cGUgfHwgIXR5cGVbMF0gfHwgdHlwZVsxXSkKKwkJdXNhZ2UoKTsKKwl0eXBlYyA9IHR5cGVbMF07CisKKwltb2RlID0gMDsKKwlzd2l0Y2ggKHR5cGVbMF0pIHsKKwljYXNlICdjJzoKKwkJbW9kZSA9IFNfSUZDSFI7CisJCWJyZWFrOworCWNhc2UgJ2InOgorCQltb2RlID0gU19JRkJMSzsKKwkJYnJlYWs7CisJY2FzZSAncCc6CisJCW1vZGUgPSBTX0lGSUZPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1c2FnZSgpOworCX0KKworCWlmIChtb2RlID09IFNfSUZJRk8pIHsKKwkJZGV2ID0gMDsKKwl9IGVsc2UgeworCQlpZiAoIWFyZ3ZbMF0gfHwgIWFyZ3ZbMV0pCisJCQl1c2FnZSgpOworCisJCW1ham9yID0gc3RydG9sKCphcmd2KyssICZlbmRwLCAwKTsKKwkJaWYgKCplbmRwICE9ICdcMCcpCisJCQl1c2FnZSgpOworCQltaW5vciA9IHN0cnRvbCgqYXJndisrLCAmZW5kcCwgMCk7CisJCWlmICgqZW5kcCAhPSAnXDAnKQorCQkJdXNhZ2UoKTsKKwkJZGV2ID0gbWFrZWRldihtYWpvciwgbWlub3IpOworCX0KKworCWlmICgqYXJndikKKwkJdXNhZ2UoKTsKKworCWlmIChta25vZChuYW1lLCBtb2RlfDA2NjYsIGRldikgPT0gLTEpIHsKKwkJcGVycm9yKCJta25vZCIpOworCQlleGl0KDEpOworCX0KKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbW91bnRfbWFpbi5jIGIvdXNyL3V0aWxzL21vdW50X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUyMmNkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL21vdW50X21haW4uYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIGJ5IHJtaworICovCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibW91bnRfb3B0cy5oIgorCitjaGFyICpwcm9nbmFtZTsKKworc3RhdGljIHN0cnVjdCBleHRyYV9vcHRzIGV4dHJhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcndmbGFnOworCitzdGF0aWMgaW50Citkb19tb3VudChjaGFyICpkZXYsIGNoYXIgKmRpciwgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyByd2ZsYWcsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqczsKKwlpbnQgZXJyb3IgPSAwOworCisJd2hpbGUgKChzID0gc3Ryc2VwKCZ0eXBlLCAiLCIpKSAhPSBOVUxMKSB7CisJICAgICAgcmV0cnk6CisJCWlmIChtb3VudChkZXYsIGRpciwgcywgcndmbGFnLCBkYXRhKSA9PSAtMSkgeworCQkJZXJyb3IgPSBlcnJubzsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlsZXN5c3RlbSBpcyBub3QgZm91bmQsIG9yIHRoZQorCQkJICogc3VwZXJibG9jayBpcyBpbnZhbGlkLCB0cnkgdGhlIG5leHQuCisJCQkgKi8KKwkJCWlmIChlcnJvciA9PSBFTk9ERVYgfHwgZXJyb3IgPT0gRUlOVkFMKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogSWYgd2UgZ2V0IEVBQ0NFU1MsIGFuZCB3ZSdyZSB0cnlpbmcgdG8KKwkJCSAqIG1vdW50IHJlYWR3cml0ZSBhbmQgdGhpcyBpc24ndCBhIHJlbW91bnQsCisJCQkgKiB0cnkgcmVhZCBvbmx5LgorCQkJICovCisJCQlpZiAoZXJyb3IgPT0gRUFDQ0VTICYmCisJCQkgICAgKHJ3ZmxhZyAmIChNU19SRU1PVU5UIHwgTVNfUkRPTkxZKSkgPT0gMCkgeworCQkJCXJ3ZmxhZyB8PSBNU19SRE9OTFk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGVycm9yKSB7CisJCWVycm5vID0gZXJyb3I7CisJCXBlcnJvcigibW91bnQiKTsKKwkJcmV0dXJuIDI1NTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICp0eXBlID0gTlVMTDsKKwlpbnQgYzsKKworCXByb2duYW1lID0gYXJndlswXTsKKwlyd2ZsYWcgPSBNU19WRVJCT1NFOworCisJZG8geworCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJvOnJ0OnciKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkJYnJlYWs7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdvJzoKKwkJCXJ3ZmxhZyA9IHBhcnNlX21vdW50X29wdGlvbnMob3B0YXJnLCByd2ZsYWcsICZleHRyYSk7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyd2ZsYWcgfD0gTVNfUkRPTkxZOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJdHlwZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXJ3ZmxhZyAmPSB+TVNfUkRPTkxZOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBvcHRpb24gLSVjXG4iLAorCQkJCXByb2duYW1lLCBvcHRvcHQpOworCQkJZXhpdCgxKTsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJLyoKKwkgKiBJZiByZW1vdW50LCBiaW5kIG9yIG1vdmUgd2FzIHNwZWNpZmllZCwgdGhlbiB3ZSBkb24ndAorCSAqIGhhdmUgYSAidHlwZSIgYXMgc3VjaC4gIFVzZSB0aGUgZHVtbXkgIm5vbmUiIHR5cGUuCisJICovCisJaWYgKHJ3ZmxhZyAmIE1TX1RZUEUpCisJCXR5cGUgPSAibm9uZSI7CisKKwlpZiAob3B0aW5kICsgMiAhPSBhcmdjIHx8IHR5cGUgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLXJdIFstd10gWy1vIG9wdGlvbnNdIFstdCB0eXBlXSAiCisJCQkiZGV2aWNlIGRpcmVjdG9yeVxuIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiBkb19tb3VudChhcmd2W29wdGluZF0sIGFyZ3Zbb3B0aW5kICsgMV0sIHR5cGUsIHJ3ZmxhZywKKwkJCWV4dHJhLnN0cik7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbW91bnRfb3B0cy5jIGIvdXNyL3V0aWxzL21vdW50X29wdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY1OGNmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL21vdW50X29wdHMuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogYnkgcm1rCisgKgorICogRGVjb2RlIG1vdW50IG9wdGlvbnMuCisgKi8KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm1vdW50X29wdHMuaCIKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpCShzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW91bnRfb3B0cyBvcHRpb25zW10gPSB7CisJLyogbmFtZSAgICAgICAgIG1hc2sgICAgICAgICAgICBzZXQgICAgICAgICAgICAgbm9zZXQgICAgICAgICAgICovCisJeyJhc3luYyIsIE1TX1NZTkNIUk9OT1VTLCAwLCBNU19TWU5DSFJPTk9VU30sCisJeyJhdGltZSIsIE1TX05PQVRJTUUsIDAsIE1TX05PQVRJTUV9LAorCXsiYmluZCIsIE1TX1RZUEUsIE1TX0JJTkQsIDAsfSwKKwl7ImRldiIsIE1TX05PREVWLCAwLCBNU19OT0RFVn0sCisJeyJkaXJhdGltZSIsIE1TX05PRElSQVRJTUUsIDAsIE1TX05PRElSQVRJTUV9LAorCXsiZGlyc3luYyIsIE1TX0RJUlNZTkMsIE1TX0RJUlNZTkMsIDB9LAorCXsiZXhlYyIsIE1TX05PRVhFQywgMCwgTVNfTk9FWEVDfSwKKwl7Im1vdmUiLCBNU19UWVBFLCBNU19NT1ZFLCAwfSwKKwl7InJlY3Vyc2UiLCBNU19SRUMsIE1TX1JFQywgMH0sCisJeyJyZW1vdW50IiwgTVNfVFlQRSwgTVNfUkVNT1VOVCwgMH0sCisJeyJybyIsIE1TX1JET05MWSwgTVNfUkRPTkxZLCAwfSwKKwl7InJ3IiwgTVNfUkRPTkxZLCAwLCBNU19SRE9OTFl9LAorCXsic3VpZCIsIE1TX05PU1VJRCwgMCwgTVNfTk9TVUlEfSwKKwl7InN5bmMiLCBNU19TWU5DSFJPTk9VUywgTVNfU1lOQ0hST05PVVMsIDB9LAorCXsidmVyYm9zZSIsIE1TX1ZFUkJPU0UsIE1TX1ZFUkJPU0UsIDB9LAorfTsKKworc3RhdGljIHZvaWQgYWRkX2V4dHJhX29wdGlvbihzdHJ1Y3QgZXh0cmFfb3B0cyAqZXh0cmEsIGNoYXIgKnMpCit7CisJaW50IGxlbiA9IHN0cmxlbihzKTsKKwlpbnQgbmV3bGVuID0gZXh0cmEtPnVzZWRfc2l6ZSArIGxlbjsKKworCWlmIChleHRyYS0+c3RyKQorCQlsZW4rKzsJCS8qICsxIGZvciAnLCcgKi8KKworCWlmIChuZXdsZW4gPj0gZXh0cmEtPmFsbG9jX3NpemUpIHsKKwkJY2hhciAqbmV3OworCisJCW5ldyA9IHJlYWxsb2MoZXh0cmEtPnN0ciwgbmV3bGVuICsgMSk7CS8qICsxIGZvciBOVUwgKi8KKwkJaWYgKCFuZXcpCisJCQlyZXR1cm47CisKKwkJZXh0cmEtPnN0ciA9IG5ldzsKKwkJZXh0cmEtPmVuZCA9IGV4dHJhLT5zdHIgKyBleHRyYS0+dXNlZF9zaXplOworCQlleHRyYS0+YWxsb2Nfc2l6ZSA9IG5ld2xlbjsKKwl9CisKKwlpZiAoZXh0cmEtPnVzZWRfc2l6ZSkgeworCQkqZXh0cmEtPmVuZCA9ICcsJzsKKwkJZXh0cmEtPmVuZCsrOworCX0KKwlzdHJjcHkoZXh0cmEtPmVuZCwgcyk7CisJZXh0cmEtPnVzZWRfc2l6ZSArPSBsZW47CisKK30KKwordW5zaWduZWQgbG9uZworcGFyc2VfbW91bnRfb3B0aW9ucyhjaGFyICphcmcsIHVuc2lnbmVkIGxvbmcgcndmbGFnLCBzdHJ1Y3QgZXh0cmFfb3B0cyAqZXh0cmEpCit7CisJY2hhciAqczsKKworCXdoaWxlICgocyA9IHN0cnNlcCgmYXJnLCAiLCIpKSAhPSBOVUxMKSB7CisJCWNoYXIgKm9wdCA9IHM7CisJCXVuc2lnbmVkIGludCBpOworCQlpbnQgcmVzLCBubyA9IHNbMF0gPT0gJ24nICYmIHNbMV0gPT0gJ28nOworCisJCWlmIChubykKKwkJCXMgKz0gMjsKKworCQlmb3IgKGkgPSAwLCByZXMgPSAxOyBpIDwgQVJSQVlfU0laRShvcHRpb25zKTsgaSsrKSB7CisJCQlyZXMgPSBzdHJjbXAocywgb3B0aW9uc1tpXS5zdHIpOworCisJCQlpZiAocmVzID09IDApIHsKKwkJCQlyd2ZsYWcgJj0gfm9wdGlvbnNbaV0ucndtYXNrOworCQkJCWlmIChubykKKwkJCQkJcndmbGFnIHw9IG9wdGlvbnNbaV0ucndub3NldDsKKwkJCQllbHNlCisJCQkJCXJ3ZmxhZyB8PSBvcHRpb25zW2ldLnJ3c2V0OworCQkJfQorCQkJaWYgKHJlcyA8PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJlcyAhPSAwICYmIHNbMF0pCisJCQlhZGRfZXh0cmFfb3B0aW9uKGV4dHJhLCBvcHQpOworCX0KKworCXJldHVybiByd2ZsYWc7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbW91bnRfb3B0cy5oIGIvdXNyL3V0aWxzL21vdW50X29wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ3Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL21vdW50X29wdHMuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIFVUSUxTX01PVU5UX09QVFNfSAorI2RlZmluZSBVVElMU19NT1VOVF9PUFRTX0gKKworc3RydWN0IG1vdW50X29wdHMgeworCWNvbnN0IGNoYXIgc3RyWzhdOworCXVuc2lnbmVkIGxvbmcgcndtYXNrOworCXVuc2lnbmVkIGxvbmcgcndzZXQ7CisJdW5zaWduZWQgbG9uZyByd25vc2V0OworfTsKKworc3RydWN0IGV4dHJhX29wdHMgeworCWNoYXIgKnN0cjsKKwljaGFyICplbmQ7CisJaW50IHVzZWRfc2l6ZTsKKwlpbnQgYWxsb2Nfc2l6ZTsKK307CisKKy8qCisgKiBUaGVzZSBvcHRpb25zIGRlZmluZSB0aGUgZnVuY3Rpb24gb2YgIm1vdW50KDIpIi4KKyAqLworI2RlZmluZSBNU19UWVBFCShNU19SRU1PVU5UfE1TX0JJTkR8TVNfTU9WRSkKKwordW5zaWduZWQgbG9uZworcGFyc2VfbW91bnRfb3B0aW9ucyhjaGFyICphcmcsIHVuc2lnbmVkIGxvbmcgcndmbGFnLCBzdHJ1Y3QgZXh0cmFfb3B0cyAqZXh0cmEpOworCisjZW5kaWYgLyogVVRJTFNfTU9VTlRfT1BUU19IICovCmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbnVrZS5jIGIvdXNyL3V0aWxzL251a2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjliZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL251a2UuYwpAQCAtMCwwICsxLDEyMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tCisgKiAgIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICBjb25kaXRpb25zOgorICoKKyAqICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwKKyAqICAgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNpbXBsZSBwcm9ncmFtIHdoaWNoIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgcm0gLXJmLCBleGNlcHQgaXQgdGFrZXMKKyAqIG5vIG9wdGlvbnMgYW5kIGNhbiB0aGVyZWZvcmUgbm90IGdldCBjb25mdXNlZCBieSBmaWxlbmFtZXMgc3RhcnRpbmcKKyAqIHdpdGggLS4gIFNpbWlsYXJseSwgYW4gZW1wdHkgbGlzdCBvZiBpbnB1dHMgaXMgYXNzdW1lZCB0byBtZWFuIGRvbid0CisgKiBkbyBhbnl0aGluZy4KKyAqLworCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqcHJvZ3JhbTsKKworc3RhdGljIGludCBudWtlKGNvbnN0IGNoYXIgKndoYXQpOworCitzdGF0aWMgaW50IG51a2VfZGlyZW50KGludCBsZW4sIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgYnl0ZXMgPSBsZW4gKyBzdHJsZW4obmFtZSkgKyAyOworCWNoYXIgcGF0aFtieXRlc107CisJaW50IHhsZW47CisKKwl4bGVuID0gc25wcmludGYocGF0aCwgYnl0ZXMsICIlcy8lcyIsIGRpciwgbmFtZSk7CisJYXNzZXJ0KHhsZW4gPCBieXRlcyk7CisKKwlyZXR1cm4gbnVrZShwYXRoKTsKK30KKworLyogV2lwZSB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnksIGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYgKi8KK3N0YXRpYyBpbnQgbnVrZV9kaXIoY29uc3QgY2hhciAqd2hhdCkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHdoYXQpOworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIShkaXIgPSBvcGVuZGlyKHdoYXQpKSkgeworCQkvKiBFQUNDRVMgbWVhbnMgd2UgY2FuJ3QgcmVhZCBpdC4gIE1pZ2h0IGJlIGVtcHR5IGFuZCByZW1vdmFibGU7CisJCSAgIGlmIG5vdCwgdGhlIHJtZGlyKCkgaW4gbnVrZSgpIHdpbGwgdHJpZ2dlciBhbiBlcnJvci4gKi8KKwkJcmV0dXJuIChlcnJubyA9PSBFQUNDRVMpID8gMCA6IGVycm5vOworCX0KKworCXdoaWxlICgoZCA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJLyogU2tpcCAuIGFuZCAuLiAqLworCQlpZiAoZC0+ZF9uYW1lWzBdID09ICcuJyAmJgorCQkgICAgKGQtPmRfbmFtZVsxXSA9PSAnXDAnIHx8CisJCSAgICAgKGQtPmRfbmFtZVsxXSA9PSAnLicgJiYgZC0+ZF9uYW1lWzJdID09ICdcMCcpKSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IG51a2VfZGlyZW50KGxlbiwgd2hhdCwgZC0+ZF9uYW1lKTsKKwkJaWYgKGVycikgeworCQkJY2xvc2VkaXIoZGlyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwljbG9zZWRpcihkaXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnVrZShjb25zdCBjaGFyICp3aGF0KQoreworCWludCBydjsKKwlpbnQgZXJyID0gMDsKKworCXJ2ID0gdW5saW5rKHdoYXQpOworCWlmIChydiA8IDApIHsKKwkJaWYgKGVycm5vID09IEVJU0RJUikgeworCQkJLyogSXQncyBhIGRpcmVjdG9yeS4gKi8KKwkJCWVyciA9IG51a2VfZGlyKHdoYXQpOworCQkJaWYgKCFlcnIpCisJCQkJcm1kaXIod2hhdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKworCXByb2dyYW0gPSBhcmd2WzBdOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJbnVrZShhcmd2W2ldKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL3Bpdm90X3Jvb3QuYyBiL3Vzci91dGlscy9waXZvdF9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiMmVhMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9waXZvdF9yb290LmMKQEAgLTAsMCArMSwxOSBAQAorLyogQ2hhbmdlIHRoZSByb290IGZpbGUgc3lzdGVtICovCisKKy8qIFdyaXR0ZW4gMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYyAhPSAzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIG5ld19yb290IHB1dF9vbGRcbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBpdm90X3Jvb3QoYXJndlsxXSwgYXJndlsyXSkgPCAwKSB7CisJCXBlcnJvcigicGl2b3Rfcm9vdCIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvcmVhZGxpbmsuYyBiL3Vzci91dGlscy9yZWFkbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzJhMWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvcmVhZGxpbmsuYwpAQCAtMCwwICsxLDM4IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCitjaGFyICpwcm9nbmFtZTsKKworc3RhdGljIF9fbm9yZXR1cm4gdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBsaW5rXG4iLCBwcm9nbmFtZSk7CisJZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICpuYW1lLCAqbGluayA9IE5VTEw7CisJc2l6ZV90IG1heF9zaXogPSAxMjg7CisKKwlwcm9nbmFtZSA9ICphcmd2Kys7CisKKwluYW1lID0gKmFyZ3YrKzsKKwlpZiAoIW5hbWUpCisJCXVzYWdlKCk7CisKKwlsaW5rID0gbWFsbG9jKG1heF9zaXopOworCWlmICghbGluaykgeworCQlwZXJyb3IoIm1hbGxvYyIpOworCQlleGl0KDEpOworCX0KKworCWlmIChyZWFkbGluayhuYW1lLCBsaW5rLCBtYXhfc2l6KSA9PSAtMSkgeworCQlwZXJyb3IoInJlYWRsaW5rIik7CisJCWV4aXQoMSk7CisJfQorCXByaW50ZigiJXNcbiIsIGxpbmspOworCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9zbGVlcC5jIGIvdXNyL3V0aWxzL3NsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmNmFlZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9zbGVlcC5jCkBAIC0wLDAgKzEsMjUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwljaGFyICpwOworCisJaWYgKGFyZ2MgIT0gMikKKwkJZ290byBlcnI7CisKKwlwID0gc3RydG90aW1lc3BlYyhhcmd2WzFdLCAmdHMpOworCWlmICgqcCkKKwkJZ290byBlcnI7CisKKwl3aGlsZSAobmFub3NsZWVwKCZ0cywgJnRzKSA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgOworCisJcmV0dXJuIDA7CisKKyAgICAgIGVycjoKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBzZWNvbmRzWy5mcmFjdGlvbl1cbiIsIGFyZ3ZbMF0pOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL3RydWUuYyBiL3Vzci91dGlscy90cnVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkYmY0NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy90cnVlLmMKQEAgLTAsMCArMSw0IEBACitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL3Vtb3VudC5jIGIvdXNyL3V0aWxzL3Vtb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NDk3YTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvdW1vdW50LmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIGJ5IHJtaworICovCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitjaGFyICpwcm9nbmFtZTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgYywgZmxhZyA9IDA7CisKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgImZsIik7CisJCWlmIChjID09IEVPRikKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZic6CisJCQlmbGFnIHw9IE1OVF9GT1JDRTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWZsYWcgfD0gTU5UX0RFVEFDSDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgb3B0aW9uIC0lY1xuIiwKKwkJCQlwcm9nbmFtZSwgb3B0b3B0KTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmIChvcHRpbmQgKyAxICE9IGFyZ2MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1mXSBbLWxdIG1udHBvaW50XG4iLCBwcm9nbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmICh1bW91bnQyKGFyZ3Zbb3B0aW5kXSwgZmxhZykgPT0gLTEpIHsKKwkJcGVycm9yKCJ1bW91bnQyIik7CisJCXJldHVybiAyNTU7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvdW5hbWUuYyBiL3Vzci91dGlscy91bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWVkYjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvdW5hbWUuYwpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIGJ5IHRsaAorICoKKyAqIFRoZSB1bmFtZSBwcm9ncmFtIGZvciBzeXN0ZW0gaW5mb3JtYXRpb246IGtlcm5lbCBuYW1lLCBrZXJuZWwKKyAqIHJlbGVhc2UsIGtlcm5lbCByZWxlYXNlLCBtYWNoaW5lLCBwcm9jZXNzb3IsIHBsYXRmb3JtLCBvcyBhbmQKKyAqIGhvc3RuYW1lLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworZW51bSB1bmFtZV9maWVsZHMgeworCVVOX1NZU05BTUUsCisJVU5fTk9ERU5BTUUsCisJVU5fUkVMRUFTRSwKKwlVTl9WRVJTSU9OLAorCVVOX01BQ0hJTkUsCisjaWYgTk9UX0lNUExFTUVOVEVEX1BST0NFU1NPUgorCVVOX1BST0NFU1NPUiwKKyNlbmRpZgorCVVOX0hBUkRXQVJFLAorI2lmIE5PVF9JTVBMRU1FTlRFRF9PUworCVVOX09TLAorI2VuZGlmCisJVU5fTlJfRklFTERTCit9OworCit2b2lkIHVzYWdlKEZJTEUgKiBzdHJlYW0sIGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCWZwcmludGYoc3RyZWFtLAorCQkiVXNhZ2U6ICVzIFtPUFRJT05dIC4gLiAuXG4iCisJCSJQcmludCBzeXN0ZW0gaW5mb3JtYXRpb24sICBObyBvcHRpb25zIGRlZmF1bHRzIHRvIC1zLlxuIgorCQkiXG4iCisJCSIgIC1hICAgcHJpbnQgYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2FtZSBvcmRlciBhcyBmb2xsb3dzIGJlbG93XG4iCisJCSIgIC1zICAga2VybmVsIG5hbWVcbiIKKwkJIiAgLW4gICBuZXR3b3JrIG5vZGUgbmFtZSAoaG9zdG5hbWUpXG4iCisJCSIgIC1yICAga2VybmVsIHJlbGVhc2VcbiIKKwkJIiAgLXYgICBrZXJuZWwgdmVyc2lvblxuIiAiICAtbSAgIG1hY2hpbmUgaGFyZHdhcmUgbmFtZVxuIgorI2lmIE5PVF9JTVBMRU1FTlRFRF9QUk9DRVNTT1IKKwkJIiAgLXAgICBwcm9jZXNzb3IgdHlwZVxuIgorI2VuZGlmCisJCSIgIC1pICAgaGFyZHdhcmUgcGxhdGZvcm1cbiIKKyNpZiBOT1RfSU1QTEVNRU5URURfT1MKKwkJIiAgLW8gICBvcGVyYXRpbmcgc3lzdGVtXG4iCisjZW5kaWYKKwkJIlxuIiAiICAtaCAgIGhlbHAvdXNhZ2VcbiIgIlxuIiwgcHJvZ25hbWUpOworfQorCitjaGFyICptYWtlX2hhcmR3YXJlKGNvbnN0IGNoYXIgKm1hY2hpbmUpCit7CisJY2hhciAqaGFyZHdhcmU7CisKKwlpZiAoIShoYXJkd2FyZSA9IHN0cmR1cChtYWNoaW5lKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJzdHJkdXAoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGVuZDsKKwl9CisJaWYgKHN0cmxlbihoYXJkd2FyZSkgPT0gNAorCSAgICAmJiBoYXJkd2FyZVswXSA9PSAnaScgJiYgaGFyZHdhcmVbMl0gPT0gJzgnICYmIGhhcmR3YXJlWzNdID09ICc2JykgeworCQloYXJkd2FyZVsxXSA9ICczJzsKKwl9CisgICAgICBlbmQ6CisJcmV0dXJuIGhhcmR3YXJlOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBlYyA9IDE7CisJaW50IG9wdDsKKwlpbnQgaTsKKwlpbnQgbnJfcHI7CisJc3RydWN0IHV0c25hbWUgYnVmOworCWNoYXIgKnVuYW1lX2ZpZWxkc1tVTl9OUl9GSUVMRFNdID0geyBOVUxMIH07CisKKwlpZiAoLTEgPT0gdW5hbWUoJmJ1ZikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1bmFtZSgpIGZhaWx1cmU6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoMSA9PSBhcmdjKQorCQkvKiBubyBvcHRpb25zIGdpdmVuIC0gZGVmYXVsdCB0byAtcyAqLworCQl1bmFtZV9maWVsZHNbVU5fU1lTTkFNRV0gPSBidWYuc3lzbmFtZTsKKworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhc25ydm1waW9oIikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ2EnOgorCQkJdW5hbWVfZmllbGRzW1VOX1NZU05BTUVdID0gYnVmLnN5c25hbWU7CisJCQl1bmFtZV9maWVsZHNbVU5fTk9ERU5BTUVdID0gYnVmLm5vZGVuYW1lOworCQkJdW5hbWVfZmllbGRzW1VOX1JFTEVBU0VdID0gYnVmLnJlbGVhc2U7CisJCQl1bmFtZV9maWVsZHNbVU5fVkVSU0lPTl0gPSBidWYudmVyc2lvbjsKKwkJCXVuYW1lX2ZpZWxkc1tVTl9NQUNISU5FXSA9IGJ1Zi5tYWNoaW5lOworCQkJdW5hbWVfZmllbGRzW1VOX0hBUkRXQVJFXSA9IG1ha2VfaGFyZHdhcmUoYnVmLm1hY2hpbmUpOworCQkJaWYgKCF1bmFtZV9maWVsZHNbVU5fSEFSRFdBUkVdKQorCQkJCWdvdG8gZW5kOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJdW5hbWVfZmllbGRzW1VOX1NZU05BTUVdID0gYnVmLnN5c25hbWU7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQl1bmFtZV9maWVsZHNbVU5fTk9ERU5BTUVdID0gYnVmLm5vZGVuYW1lOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJdW5hbWVfZmllbGRzW1VOX1JFTEVBU0VdID0gYnVmLnJlbGVhc2U7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl1bmFtZV9maWVsZHNbVU5fVkVSU0lPTl0gPSBidWYudmVyc2lvbjsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCXVuYW1lX2ZpZWxkc1tVTl9NQUNISU5FXSA9IGJ1Zi5tYWNoaW5lOworCQkJYnJlYWs7CisjaWYgTk9UX0lNUExFTUVOVEVEX1BST0NFU1NPUgorCQljYXNlICdwJzoKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgJ2knOgorCQkJdW5hbWVfZmllbGRzW1VOX0hBUkRXQVJFXSA9IG1ha2VfaGFyZHdhcmUoYnVmLm1hY2hpbmUpOworCQkJaWYgKCF1bmFtZV9maWVsZHNbVU5fSEFSRFdBUkVdKQorCQkJCWdvdG8gZW5kOworCQkJYnJlYWs7CisjaWYgTk9UX0lNUExFTUVOVEVEX09TCisJCWNhc2UgJ28nOgorCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAnaCc6CisJCQl1c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOworCQkJZWMgPSAwOworCQkJZ290byBlbmQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKHN0ZGVyciwgYXJndlswXSk7CisJCQlnb3RvIGVuZDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChucl9wciA9IDAsIGkgPSBVTl9TWVNOQU1FOyBpIDwgVU5fTlJfRklFTERTOyBpKyspIHsKKwkJaWYgKCF1bmFtZV9maWVsZHNbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKG5yX3ByKQorCQkJZnB1dGMoJyAnLCBzdGRvdXQpOworCQlmcHV0cyh1bmFtZV9maWVsZHNbaV0sIHN0ZG91dCk7CisJCW5yX3ByKys7CisJfQorCWZwdXRjKCdcbicsIHN0ZG91dCk7CisKKwllYyA9IDA7CisKKyAgICAgIGVuZDoKKwlpZiAodW5hbWVfZmllbGRzW1VOX0hBUkRXQVJFXSkKKwkJZnJlZSh1bmFtZV9maWVsZHNbVU5fSEFSRFdBUkVdKTsKKwlyZXR1cm4gZWM7Cit9Cg==