ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBmMmJhZDkzLi5jZTRlZjEzIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0zNyw2ICszNyw5IEBACiAgICAtIGptY0BjdnMub3BlbmJzZC5vcmcgMjAxMC8wMi8xMSAxMzoyMzoyOQogICAgICBbc3NoLjFdCiAgICAgIGxpYmFyYXJ5IC0+IGxpYnJhcnk7CisgLSAoZGptKSBbSU5TVEFMTCBNYWtlZmlsZS5pbiBSRUFETUUuc21hcnRjYXJkIGNvbmZpZ3VyZS5hYyBzY2FyZC1vcGVuc2MuY10KKyAgIFtzY2FyZC5jIHNjYXJkLmggcGtjczExLmggc2NhcmQvTWFrZWZpbGUuaW4gc2NhcmQvU3NoLmJpbi51dSBzY2FyZC9Tc2guamF2YV0KKyAgIFJlbW92ZSBvYnNvbGV0ZSBzbWFydGNhcmQgc3VwcG9ydAogCiAyMDEwMDIxMAogIC0gKGRqbSkgYWRkIC1sc2VsaW51eCB0byBMSUJTIGJlZm9yZSBjYWxsaW5nIEFDX0NIRUNLX0ZVTkNTIGZvcgpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKaW5kZXggMDAxZWJiNi4uMDlkZmQ2NiAxMDA2NDQKLS0tIGEvSU5TVEFMTAorKysgYi9JTlNUQUxMCkBAIC0yMDgsMTAgKzIwOCw2IEBACiAtLXdpdGgtNGluNiBDaGVjayBmb3IgSVB2NCBpbiBJUHY2IG1hcHBlZCBhZGRyZXNzZXMgYW5kIGNvbnZlcnQgdGhlbSB0bwogcmVhbCAoQUZfSU5FVCkgSVB2NCBhZGRyZXNzZXMuIFdvcmtzIGFyb3VuZCBzb21lIHF1aXJrcyBvbiBMaW51eC4KIAotLS13aXRoLW9wZW5zYz1ESVIKLS0td2l0aC1zZWN0b2s9RElSIGFsbG93cyBmb3IgT3BlblNDIG9yIHNlY3RvayBzbWFydGNhcmQgbGlicmFyaWVzIHRvCi1iZSB1c2VkIHdpdGggT3BlblNTSC4gIFNlZSAnUkVBRE1FLnNtYXJ0Y2FyZCcgZm9yIG1vcmUgZGV0YWlscy4KLQogSWYgeW91IG5lZWQgdG8gcGFzcyBzcGVjaWFsIG9wdGlvbnMgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciwgeW91CiBjYW4gc3BlY2lmeSB0aGVzZSBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHJ1bm5pbmcgLi9jb25maWd1cmUuCiBGb3IgZXhhbXBsZToKQEAgLTI2Niw0ICsyNjIsNCBAQAogaHR0cDovL3d3dy5vcGVuc3NoLmNvbS8KIAogCi0kSWQ6IElOU1RBTEwsdiAxLjg0IDIwMDcvMDgvMTcgMTI6NTI6MDUgZHR1Y2tlciBFeHAgJAorJElkOiBJTlNUQUxMLHYgMS44NSAyMDEwLzAyLzExIDIyOjM0OjIyIGRqbSBFeHAgJApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCAwYzQ1YmZjLi4xZTRmNjRhIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDQgQEAKLSMgJElkOiBNYWtlZmlsZS5pbix2IDEuMzA0IDIwMTAvMDIvMTEgMjI6MjE6MDIgZGptIEV4cCAkCisjICRJZDogTWFrZWZpbGUuaW4sdiAxLjMwNSAyMDEwLzAyLzExIDIyOjM0OjIyIGRqbSBFeHAgJAogCiAjIHVuY29tbWVudCBpZiB5b3UgcnVuIGEgbm9uIGJvdXJuZSBjb21wYXRhYmxlIHNoZWxsLiBJZS4gY3NoCiAjU0hFTEwgPSBAU0hACkBAIC03Miw4ICs3Miw4IEBACiAJcmVhZHBhc3MubyByc2EubyB0dHltb2Rlcy5vIHhtYWxsb2MubyBhZGRybWF0Y2gubyBcCiAJYXRvbWljaW8ubyBrZXkubyBkaXNwYXRjaC5vIGtleC5vIG1hYy5vIHVpZHN3YXAubyB1dWVuY29kZS5vIG1pc2MubyBcCiAJbW9uaXRvcl9mZHBhc3MubyByaWpuZGFlbC5vIHNzaC1kc3MubyBzc2gtcnNhLm8gZGgubyBrZXhkaC5vIFwKLQlrZXhnZXgubyBrZXhkaGMubyBrZXhnZXhjLm8gc2NhcmQubyBtc2cubyBwcm9ncmVzc21ldGVyLm8gZG5zLm8gXAotCWVudHJvcHkubyBzY2FyZC1vcGVuc2MubyBnc3MtZ2Vuci5vIHVtYWMubyBqcGFrZS5vIHNjaG5vcnIubyBcCisJa2V4Z2V4Lm8ga2V4ZGhjLm8ga2V4Z2V4Yy5vIG1zZy5vIHByb2dyZXNzbWV0ZXIubyBkbnMubyBcCisJZW50cm9weS5vIGdzcy1nZW5yLm8gdW1hYy5vIGpwYWtlLm8gc2Nobm9yci5vIFwKIAlzc2gtcGtjczExLm8KIAogU1NIT0JKUz0gc3NoLm8gcmVhZGNvbmYubyBjbGllbnRsb29wLm8gc3NodHR5Lm8gXApAQCAtMjE1LDcgKzIxNSw2IEBACiAJcm0gLWYgc3VydmV5LnNoIG9wZW5ic2QtY29tcGF0L3JlZ3Jlc3MvTWFrZWZpbGUgKn4gCiAJcm0gLXJmIGF1dG9tNHRlLmNhY2hlCiAJKGNkIG9wZW5ic2QtY29tcGF0ICYmICQoTUFLRSkgZGlzdGNsZWFuKQotCShjZCBzY2FyZCAmJiAkKE1BS0UpIGRpc3RjbGVhbikKIAlpZiB0ZXN0IC1kIHBrZyA7IHRoZW4gXAogCQlybSAtZnIgcGtnIDsgXAogCWZpCkBAIC0yMzgsNyArMjM3LDYgQEAKIGRpc3RwcmVwOiBjYXRtYW4tZG8KIAkkKEFVVE9SRUNPTkYpCiAJLXJtIC1yZiBhdXRvbTR0ZS5jYWNoZQotCShjZCBzY2FyZCAmJiAkKE1BS0UpIC1mIE1ha2VmaWxlLmluIGRpc3RwcmVwKQogCiBpbnN0YWxsOiAkKENPTkZJR0ZJTEVTKSBzc2hfcHJuZ19jbWRzLm91dCAkKE1BTlBBR0VTKSAkKFRBUkdFVFMpIGluc3RhbGwtZmlsZXMgaW5zdGFsbC1zeXNjb25mIGhvc3Qta2V5IGNoZWNrLWNvbmZpZwogaW5zdGFsbC1ub2tleXM6ICQoQ09ORklHRklMRVMpIHNzaF9wcm5nX2NtZHMub3V0ICQoTUFOUEFHRVMpICQoVEFSR0VUUykgaW5zdGFsbC1maWxlcyBpbnN0YWxsLXN5c2NvbmYKQEAgLTI0NywxMCArMjQ1LDcgQEAKIGNoZWNrLWNvbmZpZzoKIAktJChERVNURElSKSQoc2JpbmRpcikvc3NoZCAtdCAtZiAkKERFU1RESVIpJChzeXNjb25mZGlyKS9zc2hkX2NvbmZpZwogCi1zY2FyZC1pbnN0YWxsOgotCShjZCBzY2FyZCAmJiBlbnYgREVTVERJUj0kKERFU1RESVIpICQoTUFLRSkgREVTVERJUj0kKERFU1RESVIpIGluc3RhbGwpCi0KLWluc3RhbGwtZmlsZXM6IHNjYXJkLWluc3RhbGwKK2luc3RhbGwtZmlsZXM6CiAJJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQoYmluZGlyKQogCSQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoREVTVERJUikkKHNiaW5kaXIpCiAJJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChERVNURElSKSQobWFuZGlyKQpkaWZmIC0tZ2l0IGEvUkVBRE1FLnNtYXJ0Y2FyZCBiL1JFQURNRS5zbWFydGNhcmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjgzZWMuLjAwMDAwMDAKLS0tIGEvUkVBRE1FLnNtYXJ0Y2FyZAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLUhvdyB0byB1c2Ugc21hcnRjYXJkcyB3aXRoIE9wZW5TU0g/Ci0KLU9wZW5TU0ggY29udGFpbnMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGF1dGhlbnRpY2F0aW9uIHVzaW5nCi1DeWJlcmZsZXggc21hcnRjYXJkcyBhbmQgVE9ET1MgY2FyZCByZWFkZXJzLCBpbiBhZGRpdGlvbiB0byB0aGUgY2FyZHMKLXdpdGggUEtDUyMxNSBzdHJ1Y3R1cmUgc3VwcG9ydGVkIGJ5IE9wZW5TQy4gVG8gZW5hYmxlIHRoaXMgeW91Ci1uZWVkIHRvOgotCi1Vc2luZyBsaWJzZWN0b2s6Ci0KLSgxKSBlbmFibGUgc2VjdG9rIHN1cHBvcnQgaW4gT3BlblNTSDoKLQotCSQgLi9jb25maWd1cmUgLS13aXRoLXNlY3RvawotCi0oMikgSWYgeW91IGhhdmUgdXNlZCBhIHByZXZpb3VzIHZlcnNpb24gb2Ygc3NoIHdpdGggeW91ciBjYXJkLCB5b3UKLSAgICBtdXN0IHJlbW92ZSB0aGUgb2xkIGFwcGxldCBhbmQga2V5cy4KLQotCSQgc2VjdG9rCi0Jc2VjdG9rPiBsb2dpbiAtZAotCXNlY3Rvaz4ganVubG9hZCBTc2guYmluCi0Jc2VjdG9rPiBkZWxldGUgMDAxMgotCXNlY3Rvaz4gZGVsZXRlIHNoCi0Jc2VjdG9rPiBxdWl0Ci0KLSgzKSBsb2FkIHRoZSBKYXZhIENhcmRsZXQgdG8gdGhlIEN5YmVyZmxleCBjYXJkIGFuZCBzZXQgY2FyZCBwYXNzcGhyYXNlOgotCi0JJCBzZWN0b2sKLQlzZWN0b2s+IGxvZ2luIC1kCi0Jc2VjdG9rPiBqbG9hZCAvdXNyL2xpYmRhdGEvc3NoL1NzaC5iaW4KLQlzZWN0b2s+IHNldHBhc3MKLQlFbnRlciBuZXcgQVVUMCBwYXNzcGhyYXNlOgotCVJlLWVudGVyIHBhc3NwaHJhc2U6Ci0Jc2VjdG9rPiBxdWl0Ci0KLQlEbyBub3QgZm9yZ2V0IHRoZSBwYXNzcGhyYXNlLiAgVGhlcmUgaXMgbm8gd2F5IHRvCi0JcmVjb3ZlciBpZiB5b3UgZG8uCi0KLQlJTVBPUlRBTlQgV0FSTklORzogSWYgeW91IGF0dGVtcHQgdG8gbG9naW4gd2l0aCB0aGUKLQl3cm9uZyBwYXNzcGhyYXNlIHRocmVlIHRpbWVzIGluIGEgcm93LCB5b3Ugd2lsbAotCWRlc3Ryb3kgeW91ciBjYXJkLgotCi0oNCkgbG9hZCBhIFJTQSBrZXkgdG8gdGhlIGNhcmQ6Ci0KLQkkIHNzaC1rZXlnZW4gLWYgL3BhdGgvdG8vcnNha2V5IC1VIDEKLQkod2hlcmUgMSBpcyB0aGUgcmVhZGVyIG51bWJlciwgeW91IGNhbiBhbHNvIHRyeSAwKQotCi0JSW4gc3BpdGUgb2YgdGhlIG5hbWUsIHRoaXMgZG9lcyBub3QgZ2VuZXJhdGUgYSBrZXkuCi0JSXQganVzdCBsb2FkcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGtleSBvbiB0byB0aGUgY2FyZC4KLQotKDUpIE9wdGlvbmFsOiBJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgYSBjYXJkIHBhc3NwaHJhc2UsIGNoYW5nZSB0aGUKLSAgICBhY2wgb24gdGhlIHByaXZhdGUga2V5IGZpbGU6Ci0KLQkkIHNlY3RvawotCXNlY3Rvaz4gbG9naW4gLWQKLQlzZWN0b2s+IGFjbCAwMDEyIHdvcmxkOiB3Ci0JIHdvcmxkOiB3Ci0JIEFVVDA6IHcgaW52YWwKLQlzZWN0b2s+IHF1aXQKLQotCUlmIHlvdSBkbyB0aGlzLCBhbnlvbmUgd2hvIGhhcyBhY2Nlc3MgdG8geW91ciBjYXJkCi0JY2FuIGFzc3VtZSB5b3VyIGlkZW50aXR5LiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuCi0KLQotVXNpbmcgT3BlblNDOgotCi0oMSkgaW5zdGFsbCBPcGVuU0M6Ci0KLQlTb3VyY2VzIGFuZCBpbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSBmcm9tCi0JaHR0cDovL3d3dy5vcGVuc2Mub3JnLwotCi0oMikgZW5hYmxlIE9wZW5TQyBzdXBwb3J0IGluIE9wZW5TU0g6Ci0KLQkkIC4vY29uZmlndXJlIC0td2l0aC1vcGVuc2NbPS9wYXRoL3RvL29wZW5zY10gW29wdGlvbnNdCi0KLSgzKSBsb2FkIGEgUlNBIGtleSB0byB0aGUgY2FyZDoKLQotCU5vdCBzdXBwb3J0ZWQgeWV0LgotCi0KLUNvbW1vbiBvcGVyYXRpb25zOgotCi0oMSkgdGVsbCB0aGUgc3NoIGNsaWVudCB0byB1c2UgdGhlIGNhcmQgcmVhZGVyOgotCi0JJCBzc2ggLUkgMSBvdGhlcmhvc3QKLQotKDIpIG9yIHRlbGwgdGhlIGFnZW50IChkb24ndCBmb3JnZXQgdG8gcmVzdGFydCkgdG8gdXNlIHRoZSBzbWFydGNhcmQ6Ci0KLQkkIHNzaC1hZGQgLXMgMQotCi0KLS1tYXJrdXMsCi1UdWUgSnVsIDE3IDIzOjU0OjUxIENFU1QgMjAwMQotCi0kT3BlbkJTRDogUkVBRE1FLnNtYXJ0Y2FyZCx2IDEuOSAyMDAzLzExLzIxIDExOjU3OjAyIGRqbSBFeHAgJApkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDcxN2QzMTUuLjQwYjU4YzYgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTEsNCArMSw0IEBACi0jICRJZDogY29uZmlndXJlLmFjLHYgMS40NDEgMjAxMC8wMi8xMSAyMjoyMTowMiBkam0gRXhwICQKKyMgJElkOiBjb25maWd1cmUuYWMsdiAxLjQ0MiAyMDEwLzAyLzExIDIyOjM0OjIyIGRqbSBFeHAgJAogIwogIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBEYW1pZW4gTWlsbGVyCiAjCkBAIC0xNSw3ICsxNSw3IEBACiAjIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAKIEFDX0lOSVQoT3BlblNTSCwgUG9ydGFibGUsIG9wZW5zc2gtdW5peC1kZXZAbWluZHJvdC5vcmcpCi1BQ19SRVZJU0lPTigkUmV2aXNpb246IDEuNDQxICQpCitBQ19SRVZJU0lPTigkUmV2aXNpb246IDEuNDQyICQpCiBBQ19DT05GSUdfU1JDRElSKFtzc2guY10pCiAKIEFDX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCkBAIC0zMjYzLDczICszMjYzLDYgQEAKIAlBQ19ERUZJTkUoSEFWRV9TWVNfTkVSUiwgMSwgW0RlZmluZSBpZiB5b3VyIHN5c3RlbSBkZWZpbmVzIHN5c19uZXJyXSkKIGZpCiAKLVNDQVJEX01TRz0ibm8iCi0jIENoZWNrIHdoZXRoZXIgdXNlciB3YW50cyBzZWN0b2sgc3VwcG9ydAotQUNfQVJHX1dJVEgoc2VjdG9rLAotCVsgIC0td2l0aC1zZWN0b2sgICAgICAgICAgIEVuYWJsZSBzbWFydGNhcmQgc3VwcG9ydCB1c2luZyBsaWJzZWN0b2tdLAotCVsKLQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieG5vIiA7IHRoZW4KLQkJCWlmIHRlc3QgIngkd2l0aHZhbCIgIT0gInh5ZXMiIDsgdGhlbgotCQkJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkke3dpdGh2YWx9IgotCQkJCUxERkxBR1M9IiRMREZMQUdTIC1MJHt3aXRodmFsfSIKLQkJCQlpZiB0ZXN0ICEgLXogIiRuZWVkX2Rhc2hfciIgOyB0aGVuCi0JCQkJCUxERkxBR1M9IiRMREZMQUdTIC1SJHt3aXRodmFsfSIKLQkJCQlmaQotCQkJCWlmIHRlc3QgISAteiAiJGJsaWJwYXRoIiA7IHRoZW4KLQkJCQkJYmxpYnBhdGg9IiRibGlicGF0aDoke3dpdGh2YWx9IgotCQkJCWZpCi0JCQlmaQotCQkJQUNfQ0hFQ0tfSEVBREVSUyhzZWN0b2suaCkKLQkJCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc2VjdG9rX2giICE9IHllczsgdGhlbgotCQkJCUFDX01TR19FUlJPUihDYW4ndCBmaW5kIHNlY3Rvay5oKQotCQkJZmkKLQkJCUFDX0NIRUNLX0xJQihzZWN0b2ssIHNlY3Rva19vcGVuKQotCQkJaWYgdGVzdCAiJGFjX2N2X2xpYl9zZWN0b2tfc2VjdG9rX29wZW4iICE9IHllczsgdGhlbgotCQkJCUFDX01TR19FUlJPUihDYW4ndCBmaW5kIGxpYnNlY3RvaykKLQkJCWZpCi0JCQlBQ19ERUZJTkUoU01BUlRDQVJELCAxLAotCQkJCVtEZWZpbmUgaWYgeW91IHdhbnQgc21hcnRjYXJkIHN1cHBvcnRdKQotCQkJQUNfREVGSU5FKFVTRV9TRUNUT0ssIDEsCi0JCQkJW0RlZmluZSBpZiB5b3Ugd2FudCBzbWFydGNhcmQgc3VwcG9ydAotCQkJCXVzaW5nIHNlY3Rva10pCi0JCQlTQ0FSRF9NU0c9InllcywgdXNpbmcgc2VjdG9rIgotCQlmaQotCV0KLSkKLQotIyBDaGVjayB3aGV0aGVyIHVzZXIgd2FudHMgT3BlblNDIHN1cHBvcnQKLU9QRU5TQ19DT05GSUc9Im5vIgotQUNfQVJHX1dJVEgob3BlbnNjLAotCVsgIC0td2l0aC1vcGVuc2NbWz1QRlhdXSAgICAgRW5hYmxlIHNtYXJ0Y2FyZCBzdXBwb3J0IHVzaW5nIE9wZW5TQyAob3B0aW9uYWxseSBpbiBQQVRIKV0sCi0JWwotCSAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiICE9ICJ4bm8iIDsgdGhlbgotCQlBQ19QQVRIX1BST0coUEtHQ09ORklHLCBwa2ctY29uZmlnLCBubykKLQkJQUNfTVNHX0NIRUNLSU5HKGhvdyB0byBnZXQgb3BlbnNjIGNvbmZpZykKLQkJaWYgdGVzdCAieCR3aXRodmFsIiAhPSAieHllcyIgLWEgIngkUEtHQ09ORklHIiA9ICJ4bm8iOyB0aGVuCi0JCQlPUEVOU0NfQ09ORklHPSIkd2l0aHZhbC9iaW4vb3BlbnNjLWNvbmZpZyIKLQkJZWxpZiB0ZXN0IC1mICIkd2l0aHZhbC9zcmMvbGlib3BlbnNjL2xpYm9wZW5zYy5wYyI7IHRoZW4KLQkJCU9QRU5TQ19DT05GSUc9IiRQS0dDT05GSUcgJHdpdGh2YWwvc3JjL2xpYm9wZW5zYy9saWJvcGVuc2MucGMiCi0JCWVsaWYgdGVzdCAieCRQS0dDT05GSUciICE9ICJ4bm8iOyB0aGVuCi0JCQlPUEVOU0NfQ09ORklHPSIkUEtHQ09ORklHIGxpYm9wZW5zYyIKLQkJZWxzZQotCQkJQUNfUEFUSF9QUk9HKE9QRU5TQ19DT05GSUcsIG9wZW5zYy1jb25maWcsIG5vKQotCQlmaQotCQlBQ19NU0dfUkVTVUxUKCRPUEVOU0NfQ09ORklHKQotCQlpZiB0ZXN0ICIkT1BFTlNDX0NPTkZJRyIgIT0gIm5vIjsgdGhlbgotCQkJTElCT1BFTlNDX0NGTEFHUz1gJE9QRU5TQ19DT05GSUcgLS1jZmxhZ3NgCi0JCQlMSUJPUEVOU0NfTElCUz1gJE9QRU5TQ19DT05GSUcgLS1saWJzYAotCQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAkTElCT1BFTlNDX0NGTEFHUyIKLQkJCUxJQlM9IiRMSUJTICRMSUJPUEVOU0NfTElCUyIKLQkJCUFDX0RFRklORShTTUFSVENBUkQpCi0JCQlBQ19ERUZJTkUoVVNFX09QRU5TQywgMSwKLQkJCQlbRGVmaW5lIGlmIHlvdSB3YW50IHNtYXJ0Y2FyZCBzdXBwb3J0Ci0JCQkJdXNpbmcgT3BlblNDXSkKLQkJCVNDQVJEX01TRz0ieWVzLCB1c2luZyBPcGVuU0MiCi0JCWZpCi0JICAgIGZpCi0JXQotKQotCiAjIENoZWNrIGxpYnJhcmllcyBuZWVkZWQgYnkgRE5TIGZpbmdlcnByaW50IHN1cHBvcnQKIEFDX1NFQVJDSF9MSUJTKGdldHJyc2V0YnluYW1lLCByZXNvbHYsCiAJW0FDX0RFRklORShIQVZFX0dFVFJSU0VUQllOQU1FLCAxLApAQCAtNDIwNCw3ICs0MTM3LDcgQEAKIEFDX0VYRUVYVAogQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBidWlsZHBrZy5zaCBvcGVuc3NoZC5pbml0IG9wZW5zc2gueG1sIFwKIAlvcGVuYnNkLWNvbXBhdC9NYWtlZmlsZSBvcGVuYnNkLWNvbXBhdC9yZWdyZXNzL01ha2VmaWxlIFwKLQlzY2FyZC9NYWtlZmlsZSBzc2hfcHJuZ19jbWRzIHN1cnZleS5zaF0pCisJc3NoX3BybmdfY21kcyBzdXJ2ZXkuc2hdKQogQUNfT1VUUFVUCiAKICMgUHJpbnQgc3VtbWFyeSBvZiBvcHRpb25zCmRpZmYgLS1naXQgYS9wa2NzMTEuaCBiL3BrY3MxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyM2YyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9wa2NzMTEuaApAQCAtMCwwICsxLDEzNTYgQEAKKy8qIHBrY3MxMS5oCisgICBDb3B5cmlnaHQgMjAwNiwgMjAwNyBnMTAgQ29kZSBHbWJICisgICBDb3B5cmlnaHQgMjAwNiBBbmRyZWFzIEplbGxpbmdoYXVzCisKKyAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoZSBhdXRob3IgZ2l2ZXMKKyAgIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorICAgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbgorICAgdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICAgUFVSUE9TRS4gICovCisKKy8qIFBsZWFzZSBzdWJtaXQgY2hhbmdlcyBiYWNrIHRvIHRoZSBTY3V0ZSBwcm9qZWN0IGF0CisgICBodHRwOi8vd3d3LnNjdXRlLm9yZy8gKG9yIHNlbmQgdGhlbSB0byBtYXJjdXNAZzEwY29kZS5jb20pLCBzbyB0aGF0CisgICB0aGV5IGNhbiBiZSBwaWNrZWQgdXAgYnkgb3RoZXIgcHJvamVjdHMgZnJvbSB0aGVyZSBhcyB3ZWxsLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBLQ1MgIzExIHN0YW5kYXJkIGJ5CisgICBSU0EgU2VjdXJpdHkgSW5jLiAgSXQgaXMgbW9zdGx5IGEgZHJvcC1pbiByZXBsYWNlbWVudCwgd2l0aCB0aGUKKyAgIGZvbGxvd2luZyBjaGFuZ2U6CisKKyAgIFRoaXMgaGVhZGVyIGZpbGUgZG9lcyBub3QgcmVxdWlyZSBhbnkgbWFjcm8gZGVmaW5pdGlvbnMgYnkgdGhlIHVzZXIKKyAgIChsaWtlIENLX0RFRklORV9GVU5DVElPTiBldGMpLiAgSW4gZmFjdCwgaXQgZGVmaW5lcyB0aG9zZSBtYWNyb3MKKyAgIGZvciB5b3UgKGlmIHVzZWZ1bCwgc29tZSBhcmUgbWlzc2luZywgbGV0IG1lIGtub3cgaWYgeW91IG5lZWQKKyAgIG1vcmUpLgorCisgICBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsIEFQSSBhdmFpbGFibGUgdGhhdCBkb2VzIGNvbXBseSBiZXR0ZXIgdG8gdGhlCisgICBHTlUgY29kaW5nIHN0YW5kYXJkLiAgSXQgY2FuIGJlIHN3aXRjaGVkIG9uIGJ5IGRlZmluaW5nCisgICBDUllQVE9LSV9HTlUgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlciBmaWxlLiAgRm9yIHRoaXMsIHRoZQorICAgZm9sbG93aW5nIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIHNwZWNpZmljYXRpb246CisKKyAgIEFsbCBzdHJ1Y3R1cmUgdHlwZXMgYXJlIGNoYW5nZWQgdG8gYSAic3RydWN0IGNrX2ZvbyIgd2hlcmUgQ0tfRk9PCisgICBpcyB0aGUgdHlwZSBuYW1lIGluIFBLQ1MgIzExLgorCisgICBBbGwgbm9uLXN0cnVjdHVyZSB0eXBlcyBhcmUgY2hhbmdlZCB0byBja19mb29fdCB3aGVyZSBDS19GT08gaXMgdGhlCisgICBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGUgdHlwZSBuYW1lIGluIFBLQ1MgIzExLiAgVGhlIGJhc2ljIHR5cGVzCisgICAoQ0tfVUxPTkcgZXQgYWwuKSBhcmUgcmVtb3ZlZCB3aXRob3V0IHN1YnN0aXR1dGUuCisKKyAgIEFsbCBtZW1iZXJzIG9mIHN0cnVjdHVyZXMgYXJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgd2F5OiBUeXBlCisgICBpbmRpY2F0aW9uIHByZWZpeGVzIGFyZSByZW1vdmVkLCBhbmQgdW5kZXJzY29yZSBjaGFyYWN0ZXJzIGFyZQorICAgaW5zZXJ0ZWQgYmVmb3JlIHdvcmRzLiAgVGhlbiB0aGUgcmVzdWx0IGlzIGxvd2VyY2FzZWQuCisKKyAgIE5vdGUgdGhhdCBmdW5jdGlvbiBuYW1lcyBhcmUgc3RpbGwgaW4gdGhlIG9yaWdpbmFsIGNhc2UsIGFzIHRoZXkKKyAgIG5lZWQgZm9yIEFCSSBjb21wYXRpYmlsaXR5LgorCisgICBDS19GQUxTRSwgQ0tfVFJVRSBhbmQgTlVMTF9QVFIgYXJlIHJlbW92ZWQgd2l0aG91dCBzdWJzdGl0dXRlLiAgVXNlCisgICA8c3RkYm9vbC5oPi4KKworICAgSWYgQ1JZUFRPS0lfQ09NUEFUIGlzIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlciBmaWxlLAorICAgdGhlbiBub25lIG9mIHRoZSBBUEkgY2hhbmdlcyBhYm92ZSB0YWtlIHBsYWNlLCBhbmQgdGhlIEFQSSBpcyB0aGUKKyAgIG9uZSBkZWZpbmVkIGJ5IHRoZSBQS0NTICMxMSBzdGFuZGFyZC4gICovCisKKyNpZm5kZWYgUEtDUzExX0gKKyNkZWZpbmUgUEtDUzExX0ggMQorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogVGhlIHZlcnNpb24gb2YgY3J5cHRva2kgd2UgaW1wbGVtZW50LiAgVGhlIHJldmlzaW9uIGlzIGNoYW5nZWQgd2l0aAorICAgZWFjaCBtb2RpZmljYXRpb24gb2YgdGhpcyBmaWxlLiAgSWYgeW91IGRvIG5vdCB1c2UgdGhlICJvZmZpY2lhbCIKKyAgIHZlcnNpb24gb2YgdGhpcyBmaWxlLCBwbGVhc2UgY29uc2lkZXIgZGVsZXRpbmcgdGhlIHJldmlzaW9uIG1hY3JvCisgICAoeW91IG1heSB1c2UgYSBtYWNybyB3aXRoIGEgZGlmZmVyZW50IG5hbWUgdG8ga2VlcCB0cmFjayBvZiB5b3VyCisgICB2ZXJzaW9ucykuICAqLworI2RlZmluZSBDUllQVE9LSV9WRVJTSU9OX01BSk9SCQkyCisjZGVmaW5lIENSWVBUT0tJX1ZFUlNJT05fTUlOT1IJCTIwCisjZGVmaW5lIENSWVBUT0tJX1ZFUlNJT05fUkVWSVNJT04JNgorCisKKy8qIENvbXBhdGliaWxpdHkgaW50ZXJmYWNlIGlzIGRlZmF1bHQsIHVubGVzcyBDUllQVE9LSV9HTlUgaXMKKyAgIGdpdmVuLiAgKi8KKyNpZm5kZWYgQ1JZUFRPS0lfR05VCisjaWZuZGVmIENSWVBUT0tJX0NPTVBBVAorI2RlZmluZSBDUllQVE9LSV9DT01QQVQgMQorI2VuZGlmCisjZW5kaWYKKworLyogU3lzdGVtIGRlcGVuZGVuY2llcy4gICovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChDUllQVE9LSV9GT1JDRV9XSU4zMikKKworLyogVGhlcmUgaXMgYSBtYXRjaGluZyBwb3AgYmVsb3cuICAqLworI3ByYWdtYSBwYWNrKHB1c2gsIGNyeXB0b2tpLCAxKQorCisjaWZkZWYgQ1JZUFRPS0lfRVhQT1JUUworI2RlZmluZSBDS19TUEVDIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2Vsc2UKKyNkZWZpbmUgQ0tfU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgorCisjZWxzZQorCisjZGVmaW5lIENLX1NQRUMKKworI2VuZGlmCisKKworI2lmZGVmIENSWVBUT0tJX0NPTVBBVAorICAvKiBJZiB3ZSBhcmUgaW4gY29tcGF0aWJpbGl0eSBtb2RlLCBzd2l0Y2ggYWxsIGV4cG9zZWQgbmFtZXMgdG8gdGhlCisgICAgIFBLQ1MgIzExIHZhcmlhbnQuICBUaGVyZSBhcmUgY29ycmVzcG9uZGluZyAjdW5kZWZzIGJlbG93LiAgKi8KKworI2RlZmluZSBja19mbGFnc190IENLX0ZMQUdTCisjZGVmaW5lIGNrX3ZlcnNpb24gX0NLX1ZFUlNJT04KKworI2RlZmluZSBja19pbmZvIF9DS19JTkZPCisjZGVmaW5lIGNyeXB0b2tpX3ZlcnNpb24gY3J5cHRva2lWZXJzaW9uCisjZGVmaW5lIG1hbnVmYWN0dXJlcl9pZCBtYW51ZmFjdHVyZXJJRAorI2RlZmluZSBsaWJyYXJ5X2Rlc2NyaXB0aW9uIGxpYnJhcnlEZXNjcmlwdGlvbgorI2RlZmluZSBsaWJyYXJ5X3ZlcnNpb24gbGlicmFyeVZlcnNpb24KKworI2RlZmluZSBja19ub3RpZmljYXRpb25fdCBDS19OT1RJRklDQVRJT04KKyNkZWZpbmUgY2tfc2xvdF9pZF90IENLX1NMT1RfSUQKKworI2RlZmluZSBja19zbG90X2luZm8gX0NLX1NMT1RfSU5GTworI2RlZmluZSBzbG90X2Rlc2NyaXB0aW9uIHNsb3REZXNjcmlwdGlvbgorI2RlZmluZSBoYXJkd2FyZV92ZXJzaW9uIGhhcmR3YXJlVmVyc2lvbgorI2RlZmluZSBmaXJtd2FyZV92ZXJzaW9uIGZpcm13YXJlVmVyc2lvbgorCisjZGVmaW5lIGNrX3Rva2VuX2luZm8gX0NLX1RPS0VOX0lORk8KKyNkZWZpbmUgc2VyaWFsX251bWJlciBzZXJpYWxOdW1iZXIKKyNkZWZpbmUgbWF4X3Nlc3Npb25fY291bnQgdWxNYXhTZXNzaW9uQ291bnQKKyNkZWZpbmUgc2Vzc2lvbl9jb3VudCB1bFNlc3Npb25Db3VudAorI2RlZmluZSBtYXhfcndfc2Vzc2lvbl9jb3VudCB1bE1heFJ3U2Vzc2lvbkNvdW50CisjZGVmaW5lIHJ3X3Nlc3Npb25fY291bnQgdWxSd1Nlc3Npb25Db3VudAorI2RlZmluZSBtYXhfcGluX2xlbiB1bE1heFBpbkxlbgorI2RlZmluZSBtaW5fcGluX2xlbiB1bE1pblBpbkxlbgorI2RlZmluZSB0b3RhbF9wdWJsaWNfbWVtb3J5IHVsVG90YWxQdWJsaWNNZW1vcnkKKyNkZWZpbmUgZnJlZV9wdWJsaWNfbWVtb3J5IHVsRnJlZVB1YmxpY01lbW9yeQorI2RlZmluZSB0b3RhbF9wcml2YXRlX21lbW9yeSB1bFRvdGFsUHJpdmF0ZU1lbW9yeQorI2RlZmluZSBmcmVlX3ByaXZhdGVfbWVtb3J5IHVsRnJlZVByaXZhdGVNZW1vcnkKKyNkZWZpbmUgdXRjX3RpbWUgdXRjVGltZQorCisjZGVmaW5lIGNrX3Nlc3Npb25faGFuZGxlX3QgQ0tfU0VTU0lPTl9IQU5ETEUKKyNkZWZpbmUgY2tfdXNlcl90eXBlX3QgQ0tfVVNFUl9UWVBFCisjZGVmaW5lIGNrX3N0YXRlX3QgQ0tfU1RBVEUKKworI2RlZmluZSBja19zZXNzaW9uX2luZm8gX0NLX1NFU1NJT05fSU5GTworI2RlZmluZSBzbG90X2lkIHNsb3RJRAorI2RlZmluZSBkZXZpY2VfZXJyb3IgdWxEZXZpY2VFcnJvcgorCisjZGVmaW5lIGNrX29iamVjdF9oYW5kbGVfdCBDS19PQkpFQ1RfSEFORExFCisjZGVmaW5lIGNrX29iamVjdF9jbGFzc190IENLX09CSkVDVF9DTEFTUworI2RlZmluZSBja19od19mZWF0dXJlX3R5cGVfdCBDS19IV19GRUFUVVJFX1RZUEUKKyNkZWZpbmUgY2tfa2V5X3R5cGVfdCBDS19LRVlfVFlQRQorI2RlZmluZSBja19jZXJ0aWZpY2F0ZV90eXBlX3QgQ0tfQ0VSVElGSUNBVEVfVFlQRQorI2RlZmluZSBja19hdHRyaWJ1dGVfdHlwZV90IENLX0FUVFJJQlVURV9UWVBFCisKKyNkZWZpbmUgY2tfYXR0cmlidXRlIF9DS19BVFRSSUJVVEUKKyNkZWZpbmUgdmFsdWUgcFZhbHVlCisjZGVmaW5lIHZhbHVlX2xlbiB1bFZhbHVlTGVuCisKKyNkZWZpbmUgY2tfZGF0ZSBfQ0tfREFURQorCisjZGVmaW5lIGNrX21lY2hhbmlzbV90eXBlX3QgQ0tfTUVDSEFOSVNNX1RZUEUKKworI2RlZmluZSBja19tZWNoYW5pc20gX0NLX01FQ0hBTklTTQorI2RlZmluZSBwYXJhbWV0ZXIgcFBhcmFtZXRlcgorI2RlZmluZSBwYXJhbWV0ZXJfbGVuIHVsUGFyYW1ldGVyTGVuCisKKyNkZWZpbmUgY2tfbWVjaGFuaXNtX2luZm8gX0NLX01FQ0hBTklTTV9JTkZPCisjZGVmaW5lIG1pbl9rZXlfc2l6ZSB1bE1pbktleVNpemUKKyNkZWZpbmUgbWF4X2tleV9zaXplIHVsTWF4S2V5U2l6ZQorCisjZGVmaW5lIGNrX3J2X3QgQ0tfUlYKKyNkZWZpbmUgY2tfbm90aWZ5X3QgQ0tfTk9USUZZCisKKyNkZWZpbmUgY2tfZnVuY3Rpb25fbGlzdCBfQ0tfRlVOQ1RJT05fTElTVAorCisjZGVmaW5lIGNrX2NyZWF0ZW11dGV4X3QgQ0tfQ1JFQVRFTVVURVgKKyNkZWZpbmUgY2tfZGVzdHJveW11dGV4X3QgQ0tfREVTVFJPWU1VVEVYCisjZGVmaW5lIGNrX2xvY2ttdXRleF90IENLX0xPQ0tNVVRFWAorI2RlZmluZSBja191bmxvY2ttdXRleF90IENLX1VOTE9DS01VVEVYCisKKyNkZWZpbmUgY2tfY19pbml0aWFsaXplX2FyZ3MgX0NLX0NfSU5JVElBTElaRV9BUkdTCisjZGVmaW5lIGNyZWF0ZV9tdXRleCBDcmVhdGVNdXRleAorI2RlZmluZSBkZXN0cm95X211dGV4IERlc3Ryb3lNdXRleAorI2RlZmluZSBsb2NrX211dGV4IExvY2tNdXRleAorI2RlZmluZSB1bmxvY2tfbXV0ZXggVW5sb2NrTXV0ZXgKKyNkZWZpbmUgcmVzZXJ2ZWQgcFJlc2VydmVkCisKKyNlbmRpZgkvKiBDUllQVE9LSV9DT01QQVQgKi8KKworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19mbGFnc190OworCitzdHJ1Y3QgY2tfdmVyc2lvbgoreworICB1bnNpZ25lZCBjaGFyIG1ham9yOworICB1bnNpZ25lZCBjaGFyIG1pbm9yOworfTsKKworCitzdHJ1Y3QgY2tfaW5mbworeworICBzdHJ1Y3QgY2tfdmVyc2lvbiBjcnlwdG9raV92ZXJzaW9uOworICB1bnNpZ25lZCBjaGFyIG1hbnVmYWN0dXJlcl9pZFszMl07CisgIGNrX2ZsYWdzX3QgZmxhZ3M7CisgIHVuc2lnbmVkIGNoYXIgbGlicmFyeV9kZXNjcmlwdGlvblszMl07CisgIHN0cnVjdCBja192ZXJzaW9uIGxpYnJhcnlfdmVyc2lvbjsKK307CisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX25vdGlmaWNhdGlvbl90OworCisjZGVmaW5lIENLTl9TVVJSRU5ERVIJKDApCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX3Nsb3RfaWRfdDsKKworCitzdHJ1Y3QgY2tfc2xvdF9pbmZvCit7CisgIHVuc2lnbmVkIGNoYXIgc2xvdF9kZXNjcmlwdGlvbls2NF07CisgIHVuc2lnbmVkIGNoYXIgbWFudWZhY3R1cmVyX2lkWzMyXTsKKyAgY2tfZmxhZ3NfdCBmbGFnczsKKyAgc3RydWN0IGNrX3ZlcnNpb24gaGFyZHdhcmVfdmVyc2lvbjsKKyAgc3RydWN0IGNrX3ZlcnNpb24gZmlybXdhcmVfdmVyc2lvbjsKK307CisKKworI2RlZmluZSBDS0ZfVE9LRU5fUFJFU0VOVAkoMSA8PCAwKQorI2RlZmluZSBDS0ZfUkVNT1ZBQkxFX0RFVklDRQkoMSA8PCAxKQorI2RlZmluZSBDS0ZfSFdfU0xPVAkJKDEgPDwgMikKKyNkZWZpbmUgQ0tGX0FSUkFZX0FUVFJJQlVURQkoMSA8PCAzMCkKKworCitzdHJ1Y3QgY2tfdG9rZW5faW5mbworeworICB1bnNpZ25lZCBjaGFyIGxhYmVsWzMyXTsKKyAgdW5zaWduZWQgY2hhciBtYW51ZmFjdHVyZXJfaWRbMzJdOworICB1bnNpZ25lZCBjaGFyIG1vZGVsWzE2XTsKKyAgdW5zaWduZWQgY2hhciBzZXJpYWxfbnVtYmVyWzE2XTsKKyAgY2tfZmxhZ3NfdCBmbGFnczsKKyAgdW5zaWduZWQgbG9uZyBtYXhfc2Vzc2lvbl9jb3VudDsKKyAgdW5zaWduZWQgbG9uZyBzZXNzaW9uX2NvdW50OworICB1bnNpZ25lZCBsb25nIG1heF9yd19zZXNzaW9uX2NvdW50OworICB1bnNpZ25lZCBsb25nIHJ3X3Nlc3Npb25fY291bnQ7CisgIHVuc2lnbmVkIGxvbmcgbWF4X3Bpbl9sZW47CisgIHVuc2lnbmVkIGxvbmcgbWluX3Bpbl9sZW47CisgIHVuc2lnbmVkIGxvbmcgdG90YWxfcHVibGljX21lbW9yeTsKKyAgdW5zaWduZWQgbG9uZyBmcmVlX3B1YmxpY19tZW1vcnk7CisgIHVuc2lnbmVkIGxvbmcgdG90YWxfcHJpdmF0ZV9tZW1vcnk7CisgIHVuc2lnbmVkIGxvbmcgZnJlZV9wcml2YXRlX21lbW9yeTsKKyAgc3RydWN0IGNrX3ZlcnNpb24gaGFyZHdhcmVfdmVyc2lvbjsKKyAgc3RydWN0IGNrX3ZlcnNpb24gZmlybXdhcmVfdmVyc2lvbjsKKyAgdW5zaWduZWQgY2hhciB1dGNfdGltZVsxNl07Cit9OworCisKKyNkZWZpbmUgQ0tGX1JORwkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgQ0tGX1dSSVRFX1BST1RFQ1RFRAkJCSgxIDw8IDEpCisjZGVmaW5lIENLRl9MT0dJTl9SRVFVSVJFRAkJCSgxIDw8IDIpCisjZGVmaW5lIENLRl9VU0VSX1BJTl9JTklUSUFMSVpFRAkJKDEgPDwgMykKKyNkZWZpbmUgQ0tGX1JFU1RPUkVfS0VZX05PVF9ORUVERUQJCSgxIDw8IDUpCisjZGVmaW5lIENLRl9DTE9DS19PTl9UT0tFTgkJCSgxIDw8IDYpCisjZGVmaW5lIENLRl9QUk9URUNURURfQVVUSEVOVElDQVRJT05fUEFUSAkoMSA8PCA4KQorI2RlZmluZSBDS0ZfRFVBTF9DUllQVE9fT1BFUkFUSU9OUwkJKDEgPDwgOSkKKyNkZWZpbmUgQ0tGX1RPS0VOX0lOSVRJQUxJWkVECQkJKDEgPDwgMTApCisjZGVmaW5lIENLRl9TRUNPTkRBUllfQVVUSEVOVElDQVRJT04JCSgxIDw8IDExKQorI2RlZmluZSBDS0ZfVVNFUl9QSU5fQ09VTlRfTE9XCQkJKDEgPDwgMTYpCisjZGVmaW5lIENLRl9VU0VSX1BJTl9GSU5BTF9UUlkJCQkoMSA8PCAxNykKKyNkZWZpbmUgQ0tGX1VTRVJfUElOX0xPQ0tFRAkJCSgxIDw8IDE4KQorI2RlZmluZSBDS0ZfVVNFUl9QSU5fVE9fQkVfQ0hBTkdFRAkJKDEgPDwgMTkpCisjZGVmaW5lIENLRl9TT19QSU5fQ09VTlRfTE9XCQkJKDEgPDwgMjApCisjZGVmaW5lIENLRl9TT19QSU5fRklOQUxfVFJZCQkJKDEgPDwgMjEpCisjZGVmaW5lIENLRl9TT19QSU5fTE9DS0VECQkJKDEgPDwgMjIpCisjZGVmaW5lIENLRl9TT19QSU5fVE9fQkVfQ0hBTkdFRAkJKDEgPDwgMjMpCisKKyNkZWZpbmUgQ0tfVU5BVkFJTEFCTEVfSU5GT1JNQVRJT04JKCh1bnNpZ25lZCBsb25nKSAtMSkKKyNkZWZpbmUgQ0tfRUZGRUNUSVZFTFlfSU5GSU5JVEUJCSgwKQorCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19zZXNzaW9uX2hhbmRsZV90OworCisjZGVmaW5lIENLX0lOVkFMSURfSEFORExFCSgwKQorCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja191c2VyX3R5cGVfdDsKKworI2RlZmluZSBDS1VfU08JCQkoMCkKKyNkZWZpbmUgQ0tVX1VTRVIJCSgxKQorI2RlZmluZSBDS1VfQ09OVEVYVF9TUEVDSUZJQwkoMikKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfc3RhdGVfdDsKKworI2RlZmluZSBDS1NfUk9fUFVCTElDX1NFU1NJT04JKDApCisjZGVmaW5lIENLU19ST19VU0VSX0ZVTkNUSU9OUwkoMSkKKyNkZWZpbmUgQ0tTX1JXX1BVQkxJQ19TRVNTSU9OCSgyKQorI2RlZmluZSBDS1NfUldfVVNFUl9GVU5DVElPTlMJKDMpCisjZGVmaW5lIENLU19SV19TT19GVU5DVElPTlMJKDQpCisKKworc3RydWN0IGNrX3Nlc3Npb25faW5mbworeworICBja19zbG90X2lkX3Qgc2xvdF9pZDsKKyAgY2tfc3RhdGVfdCBzdGF0ZTsKKyAgY2tfZmxhZ3NfdCBmbGFnczsKKyAgdW5zaWduZWQgbG9uZyBkZXZpY2VfZXJyb3I7Cit9OworCisjZGVmaW5lIENLRl9SV19TRVNTSU9OCQkoMSA8PCAxKQorI2RlZmluZSBDS0ZfU0VSSUFMX1NFU1NJT04JKDEgPDwgMikKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfb2JqZWN0X2hhbmRsZV90OworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19vYmplY3RfY2xhc3NfdDsKKworI2RlZmluZSBDS09fREFUQQkJKDApCisjZGVmaW5lIENLT19DRVJUSUZJQ0FURQkJKDEpCisjZGVmaW5lIENLT19QVUJMSUNfS0VZCQkoMikKKyNkZWZpbmUgQ0tPX1BSSVZBVEVfS0VZCQkoMykKKyNkZWZpbmUgQ0tPX1NFQ1JFVF9LRVkJCSg0KQorI2RlZmluZSBDS09fSFdfRkVBVFVSRQkJKDUpCisjZGVmaW5lIENLT19ET01BSU5fUEFSQU1FVEVSUwkoNikKKyNkZWZpbmUgQ0tPX01FQ0hBTklTTQkJKDcpCisjZGVmaW5lIENLT19WRU5ET1JfREVGSU5FRAkoKHVuc2lnbmVkIGxvbmcpICgxIDw8IDMxKSkKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfaHdfZmVhdHVyZV90eXBlX3Q7CisKKyNkZWZpbmUgQ0tIX01PTk9UT05JQ19DT1VOVEVSCSgxKQorI2RlZmluZSBDS0hfQ0xPQ0sJCSgyKQorI2RlZmluZSBDS0hfVVNFUl9JTlRFUkZBQ0UJKDMpCisjZGVmaW5lIENLSF9WRU5ET1JfREVGSU5FRAkoKHVuc2lnbmVkIGxvbmcpICgxIDw8IDMxKSkKKworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2tfa2V5X3R5cGVfdDsKKworI2RlZmluZSBDS0tfUlNBCQkJKDApCisjZGVmaW5lIENLS19EU0EJCQkoMSkKKyNkZWZpbmUgQ0tLX0RICQkJKDIpCisjZGVmaW5lIENLS19FQ0RTQQkJKDMpCisjZGVmaW5lIENLS19FQwkJCSgzKQorI2RlZmluZSBDS0tfWDlfNDJfREgJCSg0KQorI2RlZmluZSBDS0tfS0VBCQkJKDUpCisjZGVmaW5lIENLS19HRU5FUklDX1NFQ1JFVAkoMHgxMCkKKyNkZWZpbmUgQ0tLX1JDMgkJCSgweDExKQorI2RlZmluZSBDS0tfUkM0CQkJKDB4MTIpCisjZGVmaW5lIENLS19ERVMJCQkoMHgxMykKKyNkZWZpbmUgQ0tLX0RFUzIJCSgweDE0KQorI2RlZmluZSBDS0tfREVTMwkJKDB4MTUpCisjZGVmaW5lIENLS19DQVNUCQkoMHgxNikKKyNkZWZpbmUgQ0tLX0NBU1QzCQkoMHgxNykKKyNkZWZpbmUgQ0tLX0NBU1QxMjgJCSgweDE4KQorI2RlZmluZSBDS0tfUkM1CQkJKDB4MTkpCisjZGVmaW5lIENLS19JREVBCQkoMHgxYSkKKyNkZWZpbmUgQ0tLX1NLSVBKQUNLCQkoMHgxYikKKyNkZWZpbmUgQ0tLX0JBVE9OCQkoMHgxYykKKyNkZWZpbmUgQ0tLX0pVTklQRVIJCSgweDFkKQorI2RlZmluZSBDS0tfQ0RNRgkJKDB4MWUpCisjZGVmaW5lIENLS19BRVMJCQkoMHgxZikKKyNkZWZpbmUgQ0tLX0JMT1dGSVNICQkoMHgyMCkKKyNkZWZpbmUgQ0tLX1RXT0ZJU0gJCSgweDIxKQorI2RlZmluZSBDS0tfVkVORE9SX0RFRklORUQJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBja19jZXJ0aWZpY2F0ZV90eXBlX3Q7CisKKyNkZWZpbmUgQ0tDX1hfNTA5CQkoMCkKKyNkZWZpbmUgQ0tDX1hfNTA5X0FUVFJfQ0VSVAkoMSkKKyNkZWZpbmUgQ0tDX1dUTFMJCSgyKQorI2RlZmluZSBDS0NfVkVORE9SX0RFRklORUQJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX2F0dHJpYnV0ZV90eXBlX3Q7CisKKyNkZWZpbmUgQ0tBX0NMQVNTCQkJKDApCisjZGVmaW5lIENLQV9UT0tFTgkJCSgxKQorI2RlZmluZSBDS0FfUFJJVkFURQkJCSgyKQorI2RlZmluZSBDS0FfTEFCRUwJCQkoMykKKyNkZWZpbmUgQ0tBX0FQUExJQ0FUSU9OCQkJKDB4MTApCisjZGVmaW5lIENLQV9WQUxVRQkJCSgweDExKQorI2RlZmluZSBDS0FfT0JKRUNUX0lECQkJKDB4MTIpCisjZGVmaW5lIENLQV9DRVJUSUZJQ0FURV9UWVBFCQkoMHg4MCkKKyNkZWZpbmUgQ0tBX0lTU1VFUgkJCSgweDgxKQorI2RlZmluZSBDS0FfU0VSSUFMX05VTUJFUgkJKDB4ODIpCisjZGVmaW5lIENLQV9BQ19JU1NVRVIJCQkoMHg4MykKKyNkZWZpbmUgQ0tBX09XTkVSCQkJKDB4ODQpCisjZGVmaW5lIENLQV9BVFRSX1RZUEVTCQkJKDB4ODUpCisjZGVmaW5lIENLQV9UUlVTVEVECQkJKDB4ODYpCisjZGVmaW5lIENLQV9DRVJUSUZJQ0FURV9DQVRFR09SWQkoMHg4NykKKyNkZWZpbmUgQ0tBX0pBVkFfTUlEUF9TRUNVUklUWV9ET01BSU4JKDB4ODgpCisjZGVmaW5lIENLQV9VUkwJCQkJKDB4ODkpCisjZGVmaW5lIENLQV9IQVNIX09GX1NVQkpFQ1RfUFVCTElDX0tFWQkoMHg4YSkKKyNkZWZpbmUgQ0tBX0hBU0hfT0ZfSVNTVUVSX1BVQkxJQ19LRVkJKDB4OGIpCisjZGVmaW5lIENLQV9DSEVDS19WQUxVRQkJCSgweDkwKQorI2RlZmluZSBDS0FfS0VZX1RZUEUJCQkoMHgxMDApCisjZGVmaW5lIENLQV9TVUJKRUNUCQkJKDB4MTAxKQorI2RlZmluZSBDS0FfSUQJCQkJKDB4MTAyKQorI2RlZmluZSBDS0FfU0VOU0lUSVZFCQkJKDB4MTAzKQorI2RlZmluZSBDS0FfRU5DUllQVAkJCSgweDEwNCkKKyNkZWZpbmUgQ0tBX0RFQ1JZUFQJCQkoMHgxMDUpCisjZGVmaW5lIENLQV9XUkFQCQkJKDB4MTA2KQorI2RlZmluZSBDS0FfVU5XUkFQCQkJKDB4MTA3KQorI2RlZmluZSBDS0FfU0lHTgkJCSgweDEwOCkKKyNkZWZpbmUgQ0tBX1NJR05fUkVDT1ZFUgkJKDB4MTA5KQorI2RlZmluZSBDS0FfVkVSSUZZCQkJKDB4MTBhKQorI2RlZmluZSBDS0FfVkVSSUZZX1JFQ09WRVIJCSgweDEwYikKKyNkZWZpbmUgQ0tBX0RFUklWRQkJCSgweDEwYykKKyNkZWZpbmUgQ0tBX1NUQVJUX0RBVEUJCQkoMHgxMTApCisjZGVmaW5lIENLQV9FTkRfREFURQkJCSgweDExMSkKKyNkZWZpbmUgQ0tBX01PRFVMVVMJCQkoMHgxMjApCisjZGVmaW5lIENLQV9NT0RVTFVTX0JJVFMJCSgweDEyMSkKKyNkZWZpbmUgQ0tBX1BVQkxJQ19FWFBPTkVOVAkJKDB4MTIyKQorI2RlZmluZSBDS0FfUFJJVkFURV9FWFBPTkVOVAkJKDB4MTIzKQorI2RlZmluZSBDS0FfUFJJTUVfMQkJCSgweDEyNCkKKyNkZWZpbmUgQ0tBX1BSSU1FXzIJCQkoMHgxMjUpCisjZGVmaW5lIENLQV9FWFBPTkVOVF8xCQkJKDB4MTI2KQorI2RlZmluZSBDS0FfRVhQT05FTlRfMgkJCSgweDEyNykKKyNkZWZpbmUgQ0tBX0NPRUZGSUNJRU5UCQkJKDB4MTI4KQorI2RlZmluZSBDS0FfUFJJTUUJCQkoMHgxMzApCisjZGVmaW5lIENLQV9TVUJQUklNRQkJCSgweDEzMSkKKyNkZWZpbmUgQ0tBX0JBU0UJCQkoMHgxMzIpCisjZGVmaW5lIENLQV9QUklNRV9CSVRTCQkJKDB4MTMzKQorI2RlZmluZSBDS0FfU1VCX1BSSU1FX0JJVFMJCSgweDEzNCkKKyNkZWZpbmUgQ0tBX1ZBTFVFX0JJVFMJCQkoMHgxNjApCisjZGVmaW5lIENLQV9WQUxVRV9MRU4JCQkoMHgxNjEpCisjZGVmaW5lIENLQV9FWFRSQUNUQUJMRQkJCSgweDE2MikKKyNkZWZpbmUgQ0tBX0xPQ0FMCQkJKDB4MTYzKQorI2RlZmluZSBDS0FfTkVWRVJfRVhUUkFDVEFCTEUJCSgweDE2NCkKKyNkZWZpbmUgQ0tBX0FMV0FZU19TRU5TSVRJVkUJCSgweDE2NSkKKyNkZWZpbmUgQ0tBX0tFWV9HRU5fTUVDSEFOSVNNCQkoMHgxNjYpCisjZGVmaW5lIENLQV9NT0RJRklBQkxFCQkJKDB4MTcwKQorI2RlZmluZSBDS0FfRUNEU0FfUEFSQU1TCQkoMHgxODApCisjZGVmaW5lIENLQV9FQ19QQVJBTVMJCQkoMHgxODApCisjZGVmaW5lIENLQV9FQ19QT0lOVAkJCSgweDE4MSkKKyNkZWZpbmUgQ0tBX1NFQ09OREFSWV9BVVRICQkoMHgyMDApCisjZGVmaW5lIENLQV9BVVRIX1BJTl9GTEFHUwkJKDB4MjAxKQorI2RlZmluZSBDS0FfQUxXQVlTX0FVVEhFTlRJQ0FURQkJKDB4MjAyKQorI2RlZmluZSBDS0FfV1JBUF9XSVRIX1RSVVNURUQJCSgweDIxMCkKKyNkZWZpbmUgQ0tBX0hXX0ZFQVRVUkVfVFlQRQkJKDB4MzAwKQorI2RlZmluZSBDS0FfUkVTRVRfT05fSU5JVAkJKDB4MzAxKQorI2RlZmluZSBDS0FfSEFTX1JFU0VUCQkJKDB4MzAyKQorI2RlZmluZSBDS0FfUElYRUxfWAkJCSgweDQwMCkKKyNkZWZpbmUgQ0tBX1BJWEVMX1kJCQkoMHg0MDEpCisjZGVmaW5lIENLQV9SRVNPTFVUSU9OCQkJKDB4NDAyKQorI2RlZmluZSBDS0FfQ0hBUl9ST1dTCQkJKDB4NDAzKQorI2RlZmluZSBDS0FfQ0hBUl9DT0xVTU5TCQkoMHg0MDQpCisjZGVmaW5lIENLQV9DT0xPUgkJCSgweDQwNSkKKyNkZWZpbmUgQ0tBX0JJVFNfUEVSX1BJWEVMCQkoMHg0MDYpCisjZGVmaW5lIENLQV9DSEFSX1NFVFMJCQkoMHg0ODApCisjZGVmaW5lIENLQV9FTkNPRElOR19NRVRIT0RTCQkoMHg0ODEpCisjZGVmaW5lIENLQV9NSU1FX1RZUEVTCQkJKDB4NDgyKQorI2RlZmluZSBDS0FfTUVDSEFOSVNNX1RZUEUJCSgweDUwMCkKKyNkZWZpbmUgQ0tBX1JFUVVJUkVEX0NNU19BVFRSSUJVVEVTCSgweDUwMSkKKyNkZWZpbmUgQ0tBX0RFRkFVTFRfQ01TX0FUVFJJQlVURVMJKDB4NTAyKQorI2RlZmluZSBDS0FfU1VQUE9SVEVEX0NNU19BVFRSSUJVVEVTCSgweDUwMykKKyNkZWZpbmUgQ0tBX1dSQVBfVEVNUExBVEUJCShDS0ZfQVJSQVlfQVRUUklCVVRFIHwgMHgyMTEpCisjZGVmaW5lIENLQV9VTldSQVBfVEVNUExBVEUJCShDS0ZfQVJSQVlfQVRUUklCVVRFIHwgMHgyMTIpCisjZGVmaW5lIENLQV9BTExPV0VEX01FQ0hBTklTTVMJCShDS0ZfQVJSQVlfQVRUUklCVVRFIHwgMHg2MDApCisjZGVmaW5lIENLQV9WRU5ET1JfREVGSU5FRAkJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKKworc3RydWN0IGNrX2F0dHJpYnV0ZQoreworICBja19hdHRyaWJ1dGVfdHlwZV90IHR5cGU7CisgIHZvaWQgKnZhbHVlOworICB1bnNpZ25lZCBsb25nIHZhbHVlX2xlbjsKK307CisKKworc3RydWN0IGNrX2RhdGUKK3sKKyAgdW5zaWduZWQgY2hhciB5ZWFyWzRdOworICB1bnNpZ25lZCBjaGFyIG1vbnRoWzJdOworICB1bnNpZ25lZCBjaGFyIGRheVsyXTsKK307CisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX21lY2hhbmlzbV90eXBlX3Q7CisKKyNkZWZpbmUgQ0tNX1JTQV9QS0NTX0tFWV9QQUlSX0dFTgkoMCkKKyNkZWZpbmUgQ0tNX1JTQV9QS0NTCQkJKDEpCisjZGVmaW5lIENLTV9SU0FfOTc5NgkJCSgyKQorI2RlZmluZSBDS01fUlNBX1hfNTA5CQkJKDMpCisjZGVmaW5lIENLTV9NRDJfUlNBX1BLQ1MJCSg0KQorI2RlZmluZSBDS01fTUQ1X1JTQV9QS0NTCQkoNSkKKyNkZWZpbmUgQ0tNX1NIQTFfUlNBX1BLQ1MJCSg2KQorI2RlZmluZSBDS01fUklQRU1EMTI4X1JTQV9QS0NTCQkoNykKKyNkZWZpbmUgQ0tNX1JJUEVNRDE2MF9SU0FfUEtDUwkJKDgpCisjZGVmaW5lIENLTV9SU0FfUEtDU19PQUVQCQkoOSkKKyNkZWZpbmUgQ0tNX1JTQV9YOV8zMV9LRVlfUEFJUl9HRU4JKDB4YSkKKyNkZWZpbmUgQ0tNX1JTQV9YOV8zMQkJCSgweGIpCisjZGVmaW5lIENLTV9TSEExX1JTQV9YOV8zMQkJKDB4YykKKyNkZWZpbmUgQ0tNX1JTQV9QS0NTX1BTUwkJKDB4ZCkKKyNkZWZpbmUgQ0tNX1NIQTFfUlNBX1BLQ1NfUFNTCQkoMHhlKQorI2RlZmluZSBDS01fRFNBX0tFWV9QQUlSX0dFTgkJKDB4MTApCisjZGVmaW5lCUNLTV9EU0EJCQkJKDB4MTEpCisjZGVmaW5lIENLTV9EU0FfU0hBMQkJCSgweDEyKQorI2RlZmluZSBDS01fREhfUEtDU19LRVlfUEFJUl9HRU4JKDB4MjApCisjZGVmaW5lIENLTV9ESF9QS0NTX0RFUklWRQkJKDB4MjEpCisjZGVmaW5lCUNLTV9YOV80Ml9ESF9LRVlfUEFJUl9HRU4JKDB4MzApCisjZGVmaW5lIENLTV9YOV80Ml9ESF9ERVJJVkUJCSgweDMxKQorI2RlZmluZSBDS01fWDlfNDJfREhfSFlCUklEX0RFUklWRQkoMHgzMikKKyNkZWZpbmUgQ0tNX1g5XzQyX01RVl9ERVJJVkUJCSgweDMzKQorI2RlZmluZSBDS01fU0hBMjU2X1JTQV9QS0NTCQkoMHg0MCkKKyNkZWZpbmUgQ0tNX1NIQTM4NF9SU0FfUEtDUwkJKDB4NDEpCisjZGVmaW5lIENLTV9TSEE1MTJfUlNBX1BLQ1MJCSgweDQyKQorI2RlZmluZSBDS01fU0hBMjU2X1JTQV9QS0NTX1BTUwkJKDB4NDMpCisjZGVmaW5lIENLTV9TSEEzODRfUlNBX1BLQ1NfUFNTCQkoMHg0NCkKKyNkZWZpbmUgQ0tNX1NIQTUxMl9SU0FfUEtDU19QU1MJCSgweDQ1KQorI2RlZmluZSBDS01fUkMyX0tFWV9HRU4JCQkoMHgxMDApCisjZGVmaW5lIENLTV9SQzJfRUNCCQkJKDB4MTAxKQorI2RlZmluZQlDS01fUkMyX0NCQwkJCSgweDEwMikKKyNkZWZpbmUJQ0tNX1JDMl9NQUMJCQkoMHgxMDMpCisjZGVmaW5lIENLTV9SQzJfTUFDX0dFTkVSQUwJCSgweDEwNCkKKyNkZWZpbmUgQ0tNX1JDMl9DQkNfUEFECQkJKDB4MTA1KQorI2RlZmluZSBDS01fUkM0X0tFWV9HRU4JCQkoMHgxMTApCisjZGVmaW5lIENLTV9SQzQJCQkJKDB4MTExKQorI2RlZmluZSBDS01fREVTX0tFWV9HRU4JCQkoMHgxMjApCisjZGVmaW5lIENLTV9ERVNfRUNCCQkJKDB4MTIxKQorI2RlZmluZSBDS01fREVTX0NCQwkJCSgweDEyMikKKyNkZWZpbmUgQ0tNX0RFU19NQUMJCQkoMHgxMjMpCisjZGVmaW5lIENLTV9ERVNfTUFDX0dFTkVSQUwJCSgweDEyNCkKKyNkZWZpbmUgQ0tNX0RFU19DQkNfUEFECQkJKDB4MTI1KQorI2RlZmluZSBDS01fREVTMl9LRVlfR0VOCQkoMHgxMzApCisjZGVmaW5lIENLTV9ERVMzX0tFWV9HRU4JCSgweDEzMSkKKyNkZWZpbmUgQ0tNX0RFUzNfRUNCCQkJKDB4MTMyKQorI2RlZmluZSBDS01fREVTM19DQkMJCQkoMHgxMzMpCisjZGVmaW5lIENLTV9ERVMzX01BQwkJCSgweDEzNCkKKyNkZWZpbmUgQ0tNX0RFUzNfTUFDX0dFTkVSQUwJCSgweDEzNSkKKyNkZWZpbmUgQ0tNX0RFUzNfQ0JDX1BBRAkJKDB4MTM2KQorI2RlZmluZSBDS01fQ0RNRl9LRVlfR0VOCQkoMHgxNDApCisjZGVmaW5lIENLTV9DRE1GX0VDQgkJCSgweDE0MSkKKyNkZWZpbmUgQ0tNX0NETUZfQ0JDCQkJKDB4MTQyKQorI2RlZmluZSBDS01fQ0RNRl9NQUMJCQkoMHgxNDMpCisjZGVmaW5lIENLTV9DRE1GX01BQ19HRU5FUkFMCQkoMHgxNDQpCisjZGVmaW5lIENLTV9DRE1GX0NCQ19QQUQJCSgweDE0NSkKKyNkZWZpbmUgQ0tNX01EMgkJCQkoMHgyMDApCisjZGVmaW5lIENLTV9NRDJfSE1BQwkJCSgweDIwMSkKKyNkZWZpbmUgQ0tNX01EMl9ITUFDX0dFTkVSQUwJCSgweDIwMikKKyNkZWZpbmUgQ0tNX01ENQkJCQkoMHgyMTApCisjZGVmaW5lIENLTV9NRDVfSE1BQwkJCSgweDIxMSkKKyNkZWZpbmUgQ0tNX01ENV9ITUFDX0dFTkVSQUwJCSgweDIxMikKKyNkZWZpbmUgQ0tNX1NIQV8xCQkJKDB4MjIwKQorI2RlZmluZSBDS01fU0hBXzFfSE1BQwkJCSgweDIyMSkKKyNkZWZpbmUgQ0tNX1NIQV8xX0hNQUNfR0VORVJBTAkJKDB4MjIyKQorI2RlZmluZSBDS01fUklQRU1EMTI4CQkJKDB4MjMwKQorI2RlZmluZSBDS01fUklQRU1EMTI4X0hNQUMJCSgweDIzMSkKKyNkZWZpbmUgQ0tNX1JJUEVNRDEyOF9ITUFDX0dFTkVSQUwJKDB4MjMyKQorI2RlZmluZSBDS01fUklQRU1EMTYwCQkJKDB4MjQwKQorI2RlZmluZSBDS01fUklQRU1EMTYwX0hNQUMJCSgweDI0MSkKKyNkZWZpbmUgQ0tNX1JJUEVNRDE2MF9ITUFDX0dFTkVSQUwJKDB4MjQyKQorI2RlZmluZSBDS01fU0hBMjU2CQkJKDB4MjUwKQorI2RlZmluZSBDS01fU0hBMjU2X0hNQUMJCQkoMHgyNTEpCisjZGVmaW5lIENLTV9TSEEyNTZfSE1BQ19HRU5FUkFMCQkoMHgyNTIpCisjZGVmaW5lIENLTV9TSEEzODQJCQkoMHgyNjApCisjZGVmaW5lIENLTV9TSEEzODRfSE1BQwkJCSgweDI2MSkKKyNkZWZpbmUgQ0tNX1NIQTM4NF9ITUFDX0dFTkVSQUwJCSgweDI2MikKKyNkZWZpbmUgQ0tNX1NIQTUxMgkJCSgweDI3MCkKKyNkZWZpbmUgQ0tNX1NIQTUxMl9ITUFDCQkJKDB4MjcxKQorI2RlZmluZSBDS01fU0hBNTEyX0hNQUNfR0VORVJBTAkJKDB4MjcyKQorI2RlZmluZSBDS01fQ0FTVF9LRVlfR0VOCQkoMHgzMDApCisjZGVmaW5lIENLTV9DQVNUX0VDQgkJCSgweDMwMSkKKyNkZWZpbmUgQ0tNX0NBU1RfQ0JDCQkJKDB4MzAyKQorI2RlZmluZSBDS01fQ0FTVF9NQUMJCQkoMHgzMDMpCisjZGVmaW5lIENLTV9DQVNUX01BQ19HRU5FUkFMCQkoMHgzMDQpCisjZGVmaW5lIENLTV9DQVNUX0NCQ19QQUQJCSgweDMwNSkKKyNkZWZpbmUgQ0tNX0NBU1QzX0tFWV9HRU4JCSgweDMxMCkKKyNkZWZpbmUgQ0tNX0NBU1QzX0VDQgkJCSgweDMxMSkKKyNkZWZpbmUgQ0tNX0NBU1QzX0NCQwkJCSgweDMxMikKKyNkZWZpbmUgQ0tNX0NBU1QzX01BQwkJCSgweDMxMykKKyNkZWZpbmUgQ0tNX0NBU1QzX01BQ19HRU5FUkFMCQkoMHgzMTQpCisjZGVmaW5lIENLTV9DQVNUM19DQkNfUEFECQkoMHgzMTUpCisjZGVmaW5lIENLTV9DQVNUNV9LRVlfR0VOCQkoMHgzMjApCisjZGVmaW5lIENLTV9DQVNUMTI4X0tFWV9HRU4JCSgweDMyMCkKKyNkZWZpbmUgQ0tNX0NBU1Q1X0VDQgkJCSgweDMyMSkKKyNkZWZpbmUgQ0tNX0NBU1QxMjhfRUNCCQkJKDB4MzIxKQorI2RlZmluZSBDS01fQ0FTVDVfQ0JDCQkJKDB4MzIyKQorI2RlZmluZSBDS01fQ0FTVDEyOF9DQkMJCQkoMHgzMjIpCisjZGVmaW5lIENLTV9DQVNUNV9NQUMJCQkoMHgzMjMpCisjZGVmaW5lCUNLTV9DQVNUMTI4X01BQwkJCSgweDMyMykKKyNkZWZpbmUgQ0tNX0NBU1Q1X01BQ19HRU5FUkFMCQkoMHgzMjQpCisjZGVmaW5lIENLTV9DQVNUMTI4X01BQ19HRU5FUkFMCQkoMHgzMjQpCisjZGVmaW5lIENLTV9DQVNUNV9DQkNfUEFECQkoMHgzMjUpCisjZGVmaW5lIENLTV9DQVNUMTI4X0NCQ19QQUQJCSgweDMyNSkKKyNkZWZpbmUgQ0tNX1JDNV9LRVlfR0VOCQkJKDB4MzMwKQorI2RlZmluZSBDS01fUkM1X0VDQgkJCSgweDMzMSkKKyNkZWZpbmUgQ0tNX1JDNV9DQkMJCQkoMHgzMzIpCisjZGVmaW5lIENLTV9SQzVfTUFDCQkJKDB4MzMzKQorI2RlZmluZSBDS01fUkM1X01BQ19HRU5FUkFMCQkoMHgzMzQpCisjZGVmaW5lIENLTV9SQzVfQ0JDX1BBRAkJCSgweDMzNSkKKyNkZWZpbmUgQ0tNX0lERUFfS0VZX0dFTgkJKDB4MzQwKQorI2RlZmluZSBDS01fSURFQV9FQ0IJCQkoMHgzNDEpCisjZGVmaW5lCUNLTV9JREVBX0NCQwkJCSgweDM0MikKKyNkZWZpbmUgQ0tNX0lERUFfTUFDCQkJKDB4MzQzKQorI2RlZmluZSBDS01fSURFQV9NQUNfR0VORVJBTAkJKDB4MzQ0KQorI2RlZmluZSBDS01fSURFQV9DQkNfUEFECQkoMHgzNDUpCisjZGVmaW5lIENLTV9HRU5FUklDX1NFQ1JFVF9LRVlfR0VOCSgweDM1MCkKKyNkZWZpbmUgQ0tNX0NPTkNBVEVOQVRFX0JBU0VfQU5EX0tFWQkoMHgzNjApCisjZGVmaW5lIENLTV9DT05DQVRFTkFURV9CQVNFX0FORF9EQVRBCSgweDM2MikKKyNkZWZpbmUgQ0tNX0NPTkNBVEVOQVRFX0RBVEFfQU5EX0JBU0UJKDB4MzYzKQorI2RlZmluZSBDS01fWE9SX0JBU0VfQU5EX0RBVEEJCSgweDM2NCkKKyNkZWZpbmUgQ0tNX0VYVFJBQ1RfS0VZX0ZST01fS0VZCSgweDM2NSkKKyNkZWZpbmUgQ0tNX1NTTDNfUFJFX01BU1RFUl9LRVlfR0VOCSgweDM3MCkKKyNkZWZpbmUgQ0tNX1NTTDNfTUFTVEVSX0tFWV9ERVJJVkUJKDB4MzcxKQorI2RlZmluZSBDS01fU1NMM19LRVlfQU5EX01BQ19ERVJJVkUJKDB4MzcyKQorI2RlZmluZSBDS01fU1NMM19NQVNURVJfS0VZX0RFUklWRV9ESAkoMHgzNzMpCisjZGVmaW5lIENLTV9UTFNfUFJFX01BU1RFUl9LRVlfR0VOCSgweDM3NCkKKyNkZWZpbmUgQ0tNX1RMU19NQVNURVJfS0VZX0RFUklWRQkoMHgzNzUpCisjZGVmaW5lIENLTV9UTFNfS0VZX0FORF9NQUNfREVSSVZFCSgweDM3NikKKyNkZWZpbmUgQ0tNX1RMU19NQVNURVJfS0VZX0RFUklWRV9ESAkoMHgzNzcpCisjZGVmaW5lIENLTV9TU0wzX01ENV9NQUMJCSgweDM4MCkKKyNkZWZpbmUgQ0tNX1NTTDNfU0hBMV9NQUMJCSgweDM4MSkKKyNkZWZpbmUgQ0tNX01ENV9LRVlfREVSSVZBVElPTgkJKDB4MzkwKQorI2RlZmluZSBDS01fTUQyX0tFWV9ERVJJVkFUSU9OCQkoMHgzOTEpCisjZGVmaW5lIENLTV9TSEExX0tFWV9ERVJJVkFUSU9OCQkoMHgzOTIpCisjZGVmaW5lIENLTV9QQkVfTUQyX0RFU19DQkMJCSgweDNhMCkKKyNkZWZpbmUgQ0tNX1BCRV9NRDVfREVTX0NCQwkJKDB4M2ExKQorI2RlZmluZSBDS01fUEJFX01ENV9DQVNUX0NCQwkJKDB4M2EyKQorI2RlZmluZSBDS01fUEJFX01ENV9DQVNUM19DQkMJCSgweDNhMykKKyNkZWZpbmUgQ0tNX1BCRV9NRDVfQ0FTVDVfQ0JDCQkoMHgzYTQpCisjZGVmaW5lIENLTV9QQkVfTUQ1X0NBU1QxMjhfQ0JDCQkoMHgzYTQpCisjZGVmaW5lIENLTV9QQkVfU0hBMV9DQVNUNV9DQkMJCSgweDNhNSkKKyNkZWZpbmUgQ0tNX1BCRV9TSEExX0NBU1QxMjhfQ0JDCSgweDNhNSkKKyNkZWZpbmUgQ0tNX1BCRV9TSEExX1JDNF8xMjgJCSgweDNhNikKKyNkZWZpbmUgQ0tNX1BCRV9TSEExX1JDNF80MAkJKDB4M2E3KQorI2RlZmluZSBDS01fUEJFX1NIQTFfREVTM19FREVfQ0JDCSgweDNhOCkKKyNkZWZpbmUgQ0tNX1BCRV9TSEExX0RFUzJfRURFX0NCQwkoMHgzYTkpCisjZGVmaW5lIENLTV9QQkVfU0hBMV9SQzJfMTI4X0NCQwkoMHgzYWEpCisjZGVmaW5lIENLTV9QQkVfU0hBMV9SQzJfNDBfQ0JDCQkoMHgzYWIpCisjZGVmaW5lIENLTV9QS0NTNV9QQktEMgkJCSgweDNiMCkKKyNkZWZpbmUgQ0tNX1BCQV9TSEExX1dJVEhfU0hBMV9ITUFDCSgweDNjMCkKKyNkZWZpbmUgQ0tNX0tFWV9XUkFQX0xZTktTCQkoMHg0MDApCisjZGVmaW5lIENLTV9LRVlfV1JBUF9TRVRfT0FFUAkJKDB4NDAxKQorI2RlZmluZSBDS01fU0tJUEpBQ0tfS0VZX0dFTgkJKDB4MTAwMCkKKyNkZWZpbmUgQ0tNX1NLSVBKQUNLX0VDQjY0CQkoMHgxMDAxKQorI2RlZmluZSBDS01fU0tJUEpBQ0tfQ0JDNjQJCSgweDEwMDIpCisjZGVmaW5lIENLTV9TS0lQSkFDS19PRkI2NAkJKDB4MTAwMykKKyNkZWZpbmUgQ0tNX1NLSVBKQUNLX0NGQjY0CQkoMHgxMDA0KQorI2RlZmluZSBDS01fU0tJUEpBQ0tfQ0ZCMzIJCSgweDEwMDUpCisjZGVmaW5lIENLTV9TS0lQSkFDS19DRkIxNgkJKDB4MTAwNikKKyNkZWZpbmUgQ0tNX1NLSVBKQUNLX0NGQjgJCSgweDEwMDcpCisjZGVmaW5lIENLTV9TS0lQSkFDS19XUkFQCQkoMHgxMDA4KQorI2RlZmluZSBDS01fU0tJUEpBQ0tfUFJJVkFURV9XUkFQCSgweDEwMDkpCisjZGVmaW5lIENLTV9TS0lQSkFDS19SRUxBWVgJCSgweDEwMGEpCisjZGVmaW5lIENLTV9LRUFfS0VZX1BBSVJfR0VOCQkoMHgxMDEwKQorI2RlZmluZSBDS01fS0VBX0tFWV9ERVJJVkUJCSgweDEwMTEpCisjZGVmaW5lIENLTV9GT1JURVpaQV9USU1FU1RBTVAJCSgweDEwMjApCisjZGVmaW5lIENLTV9CQVRPTl9LRVlfR0VOCQkoMHgxMDMwKQorI2RlZmluZSBDS01fQkFUT05fRUNCMTI4CQkoMHgxMDMxKQorI2RlZmluZSBDS01fQkFUT05fRUNCOTYJCQkoMHgxMDMyKQorI2RlZmluZSBDS01fQkFUT05fQ0JDMTI4CQkoMHgxMDMzKQorI2RlZmluZSBDS01fQkFUT05fQ09VTlRFUgkJKDB4MTAzNCkKKyNkZWZpbmUgQ0tNX0JBVE9OX1NIVUZGTEUJCSgweDEwMzUpCisjZGVmaW5lIENLTV9CQVRPTl9XUkFQCQkJKDB4MTAzNikKKyNkZWZpbmUgQ0tNX0VDRFNBX0tFWV9QQUlSX0dFTgkJKDB4MTA0MCkKKyNkZWZpbmUgQ0tNX0VDX0tFWV9QQUlSX0dFTgkJKDB4MTA0MCkKKyNkZWZpbmUgQ0tNX0VDRFNBCQkJKDB4MTA0MSkKKyNkZWZpbmUgQ0tNX0VDRFNBX1NIQTEJCQkoMHgxMDQyKQorI2RlZmluZSBDS01fRUNESDFfREVSSVZFCQkoMHgxMDUwKQorI2RlZmluZSBDS01fRUNESDFfQ09GQUNUT1JfREVSSVZFCSgweDEwNTEpCisjZGVmaW5lIENLTV9FQ01RVl9ERVJJVkUJCSgweDEwNTIpCisjZGVmaW5lIENLTV9KVU5JUEVSX0tFWV9HRU4JCSgweDEwNjApCisjZGVmaW5lIENLTV9KVU5JUEVSX0VDQjEyOAkJKDB4MTA2MSkKKyNkZWZpbmUgQ0tNX0pVTklQRVJfQ0JDMTI4CQkoMHgxMDYyKQorI2RlZmluZSBDS01fSlVOSVBFUl9DT1VOVEVSCQkoMHgxMDYzKQorI2RlZmluZSBDS01fSlVOSVBFUl9TSFVGRkxFCQkoMHgxMDY0KQorI2RlZmluZSBDS01fSlVOSVBFUl9XUkFQCQkoMHgxMDY1KQorI2RlZmluZSBDS01fRkFTVEhBU0gJCQkoMHgxMDcwKQorI2RlZmluZSBDS01fQUVTX0tFWV9HRU4JCQkoMHgxMDgwKQorI2RlZmluZSBDS01fQUVTX0VDQgkJCSgweDEwODEpCisjZGVmaW5lIENLTV9BRVNfQ0JDCQkJKDB4MTA4MikKKyNkZWZpbmUgQ0tNX0FFU19NQUMJCQkoMHgxMDgzKQorI2RlZmluZSBDS01fQUVTX01BQ19HRU5FUkFMCQkoMHgxMDg0KQorI2RlZmluZSBDS01fQUVTX0NCQ19QQUQJCQkoMHgxMDg1KQorI2RlZmluZSBDS01fRFNBX1BBUkFNRVRFUl9HRU4JCSgweDIwMDApCisjZGVmaW5lIENLTV9ESF9QS0NTX1BBUkFNRVRFUl9HRU4JKDB4MjAwMSkKKyNkZWZpbmUgQ0tNX1g5XzQyX0RIX1BBUkFNRVRFUl9HRU4JKDB4MjAwMikKKyNkZWZpbmUgQ0tNX1ZFTkRPUl9ERUZJTkVECQkoKHVuc2lnbmVkIGxvbmcpICgxIDw8IDMxKSkKKworCitzdHJ1Y3QgY2tfbWVjaGFuaXNtCit7CisgIGNrX21lY2hhbmlzbV90eXBlX3QgbWVjaGFuaXNtOworICB2b2lkICpwYXJhbWV0ZXI7CisgIHVuc2lnbmVkIGxvbmcgcGFyYW1ldGVyX2xlbjsKK307CisKKworc3RydWN0IGNrX21lY2hhbmlzbV9pbmZvCit7CisgIHVuc2lnbmVkIGxvbmcgbWluX2tleV9zaXplOworICB1bnNpZ25lZCBsb25nIG1heF9rZXlfc2l6ZTsKKyAgY2tfZmxhZ3NfdCBmbGFnczsKK307CisKKyNkZWZpbmUgQ0tGX0hXCQkJKDEgPDwgMCkKKyNkZWZpbmUgQ0tGX0VOQ1JZUFQJCSgxIDw8IDgpCisjZGVmaW5lIENLRl9ERUNSWVBUCQkoMSA8PCA5KQorI2RlZmluZSBDS0ZfRElHRVNUCQkoMSA8PCAxMCkKKyNkZWZpbmUgQ0tGX1NJR04JCSgxIDw8IDExKQorI2RlZmluZSBDS0ZfU0lHTl9SRUNPVkVSCSgxIDw8IDEyKQorI2RlZmluZSBDS0ZfVkVSSUZZCQkoMSA8PCAxMykKKyNkZWZpbmUgQ0tGX1ZFUklGWV9SRUNPVkVSCSgxIDw8IDE0KQorI2RlZmluZSBDS0ZfR0VORVJBVEUJCSgxIDw8IDE1KQorI2RlZmluZSBDS0ZfR0VORVJBVEVfS0VZX1BBSVIJKDEgPDwgMTYpCisjZGVmaW5lIENLRl9XUkFQCQkoMSA8PCAxNykKKyNkZWZpbmUgQ0tGX1VOV1JBUAkJKDEgPDwgMTgpCisjZGVmaW5lIENLRl9ERVJJVkUJCSgxIDw8IDE5KQorI2RlZmluZSBDS0ZfRVhURU5TSU9OCQkoKHVuc2lnbmVkIGxvbmcpICgxIDw8IDMxKSkKKworCisvKiBGbGFncyBmb3IgQ19XYWl0Rm9yU2xvdEV2ZW50LiAgKi8KKyNkZWZpbmUgQ0tGX0RPTlRfQkxPQ0sJCQkJKDEpCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNrX3J2X3Q7CisKKwordHlwZWRlZiBja19ydl90ICgqY2tfbm90aWZ5X3QpIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCQkJY2tfbm90aWZpY2F0aW9uX3QgZXZlbnQsIHZvaWQgKmFwcGxpY2F0aW9uKTsKKworLyogRm9yd2FyZCByZWZlcmVuY2UuICAqLworc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3Q7CisKKyNkZWZpbmUgX0NLX0RFQ0xBUkVfRlVOQ1RJT04obmFtZSwgYXJncykJXAordHlwZWRlZiBja19ydl90ICgqQ0tfICMjIG5hbWUpIGFyZ3M7CQlcCitja19ydl90IENLX1NQRUMgbmFtZSBhcmdzCisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0luaXRpYWxpemUsICh2b2lkICppbml0X2FyZ3MpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0ZpbmFsaXplLCAodm9pZCAqcmVzZXJ2ZWQpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldEluZm8sIChzdHJ1Y3QgY2tfaW5mbyAqaW5mbykpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0RnVuY3Rpb25MaXN0LAorCQkgICAgICAoc3RydWN0IGNrX2Z1bmN0aW9uX2xpc3QgKipmdW5jdGlvbl9saXN0KSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldFNsb3RMaXN0LAorCQkgICAgICAodW5zaWduZWQgY2hhciB0b2tlbl9wcmVzZW50LCBja19zbG90X2lkX3QgKnNsb3RfbGlzdCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmNvdW50KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRTbG90SW5mbywKKwkJICAgICAgKGNrX3Nsb3RfaWRfdCBzbG90X2lkLCBzdHJ1Y3QgY2tfc2xvdF9pbmZvICppbmZvKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRUb2tlbkluZm8sCisJCSAgICAgIChja19zbG90X2lkX3Qgc2xvdF9pZCwgc3RydWN0IGNrX3Rva2VuX2luZm8gKmluZm8pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1dhaXRGb3JTbG90RXZlbnQsCisJCSAgICAgIChja19mbGFnc190IGZsYWdzLCBja19zbG90X2lkX3QgKnNsb3QsIHZvaWQgKnJlc2VydmVkKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRNZWNoYW5pc21MaXN0LAorCQkgICAgICAoY2tfc2xvdF9pZF90IHNsb3RfaWQsCisJCSAgICAgICBja19tZWNoYW5pc21fdHlwZV90ICptZWNoYW5pc21fbGlzdCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmNvdW50KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRNZWNoYW5pc21JbmZvLAorCQkgICAgICAoY2tfc2xvdF9pZF90IHNsb3RfaWQsIGNrX21lY2hhbmlzbV90eXBlX3QgdHlwZSwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc21faW5mbyAqaW5mbykpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfSW5pdFRva2VuLAorCQkgICAgICAoY2tfc2xvdF9pZF90IHNsb3RfaWQsIHVuc2lnbmVkIGNoYXIgKnBpbiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGluX2xlbiwgdW5zaWduZWQgY2hhciAqbGFiZWwpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0luaXRQSU4sCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sIHVuc2lnbmVkIGNoYXIgKnBpbiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGluX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2V0UElOLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLCB1bnNpZ25lZCBjaGFyICpvbGRfcGluLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBjaGFyICpuZXdfcGluLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBuZXdfbGVuKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX09wZW5TZXNzaW9uLAorCQkgICAgICAoY2tfc2xvdF9pZF90IHNsb3RfaWQsIGNrX2ZsYWdzX3QgZmxhZ3MsCisJCSAgICAgICB2b2lkICphcHBsaWNhdGlvbiwgY2tfbm90aWZ5X3Qgbm90aWZ5LAorCQkgICAgICAgY2tfc2Vzc2lvbl9oYW5kbGVfdCAqc2Vzc2lvbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfQ2xvc2VTZXNzaW9uLCAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19DbG9zZUFsbFNlc3Npb25zLCAoY2tfc2xvdF9pZF90IHNsb3RfaWQpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0dldFNlc3Npb25JbmZvLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX3Nlc3Npb25faW5mbyAqaW5mbykpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0T3BlcmF0aW9uU3RhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpvcGVyYXRpb25fc3RhdGUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpvcGVyYXRpb25fc3RhdGVfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TZXRPcGVyYXRpb25TdGF0ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKm9wZXJhdGlvbl9zdGF0ZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgb3BlcmF0aW9uX3N0YXRlX2xlbiwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBlbmNyeXB0aW9uX2tleSwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBhdXRoZW50aWF0aW9uX2tleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfTG9naW4sCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sIGNrX3VzZXJfdHlwZV90IHVzZXJfdHlwZSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBpbiwgdW5zaWduZWQgbG9uZyBwaW5fbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19Mb2dvdXQsIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24pKTsKKworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfQ3JlYXRlT2JqZWN0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBja19vYmplY3RfaGFuZGxlX3QgKm9iamVjdCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfQ29weU9iamVjdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwgY2tfb2JqZWN0X2hhbmRsZV90IG9iamVjdCwKKwkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnRlbXBsLCB1bnNpZ25lZCBsb25nIGNvdW50LAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICpuZXdfb2JqZWN0KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EZXN0cm95T2JqZWN0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IG9iamVjdCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2V0T2JqZWN0U2l6ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaXplKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRBdHRyaWJ1dGVWYWx1ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBvYmplY3QsCisJCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1NldEF0dHJpYnV0ZVZhbHVlLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IG9iamVjdCwKKwkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnRlbXBsLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRmluZE9iamVjdHNJbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqdGVtcGwsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19GaW5kT2JqZWN0cywKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCAqb2JqZWN0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYXhfb2JqZWN0X2NvdW50LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb2JqZWN0X2NvdW50KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19GaW5kT2JqZWN0c0ZpbmFsLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0VuY3J5cHRJbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRW5jcnlwdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgZGF0YV9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfZGF0YSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmVuY3J5cHRlZF9kYXRhX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRW5jcnlwdFVwZGF0ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBhcnQsIHVuc2lnbmVkIGxvbmcgcGFydF9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmVuY3J5cHRlZF9wYXJ0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRW5jcnlwdEZpbmFsLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqbGFzdF9lbmNyeXB0ZWRfcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmxhc3RfZW5jcnlwdGVkX3BhcnRfbGVuKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHRJbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90IGtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGVjcnlwdCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9kYXRhLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmNyeXB0ZWRfZGF0YV9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nICpkYXRhX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGVjcnlwdFVwZGF0ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9wYXJ0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmNyeXB0ZWRfcGFydF9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nICpwYXJ0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGVjcnlwdEZpbmFsLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqbGFzdF9wYXJ0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbGFzdF9wYXJ0X2xlbikpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EaWdlc3RJbml0LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EaWdlc3QsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGlnZXN0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqZGlnZXN0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0VXBkYXRlLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwgdW5zaWduZWQgbG9uZyBwYXJ0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGlnZXN0S2V5LAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLCBja19vYmplY3RfaGFuZGxlX3Qga2V5KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19EaWdlc3RGaW5hbCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmRpZ2VzdF9sZW4pKTsKKworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfU2lnbkluaXQsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qga2V5KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TaWduLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBkYXRhX2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnNpZ25hdHVyZV9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1NpZ25VcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nIHBhcnRfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TaWduRmluYWwsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaWduYXR1cmVfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TaWduUmVjb3ZlckluaXQsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qga2V5KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TaWduUmVjb3ZlciwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgZGF0YV9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaWduYXR1cmVfbGVuKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1ZlcmlmeUluaXQsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qga2V5KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19WZXJpZnksCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGRhdGFfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmVfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19WZXJpZnlVcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nIHBhcnRfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19WZXJpZnlGaW5hbCwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfVmVyaWZ5UmVjb3ZlckluaXQsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qga2V5KSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19WZXJpZnlSZWNvdmVyLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmVfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmRhdGFfbGVuKSk7CisKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RpZ2VzdEVuY3J5cHRVcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LCB1bnNpZ25lZCBsb25nIHBhcnRfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW5jcnlwdGVkX3BhcnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICplbmNyeXB0ZWRfcGFydF9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0RlY3J5cHREaWdlc3RVcGRhdGUsCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5jcnlwdGVkX3BhcnRfbGVuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBhcnRfbGVuKSk7CitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TaWduRW5jcnlwdFVwZGF0ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBhcnQsIHVuc2lnbmVkIGxvbmcgcGFydF9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfcGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmVuY3J5cHRlZF9wYXJ0X2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfRGVjcnlwdFZlcmlmeVVwZGF0ZSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9wYXJ0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmNyeXB0ZWRfcGFydF9sZW4sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwYXJ0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcGFydF9sZW4pKTsKKworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2VuZXJhdGVLZXksCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICBzdHJ1Y3QgY2tfbWVjaGFuaXNtICptZWNoYW5pc20sCisJCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgKmtleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2VuZXJhdGVLZXlQYWlyLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGNrX21lY2hhbmlzbSAqbWVjaGFuaXNtLAorCQkgICAgICAgc3RydWN0IGNrX2F0dHJpYnV0ZSAqcHVibGljX2tleV90ZW1wbGF0ZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcHVibGljX2tleV9hdHRyaWJ1dGVfY291bnQsCisJCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICpwcml2YXRlX2tleV90ZW1wbGF0ZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZV9rZXlfYXR0cmlidXRlX2NvdW50LAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICpwdWJsaWNfa2V5LAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICpwcml2YXRlX2tleSkpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfV3JhcEtleSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCB3cmFwcGluZ19rZXksCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3Qga2V5LAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqd3JhcHBlZF9rZXksCisJCSAgICAgICB1bnNpZ25lZCBsb25nICp3cmFwcGVkX2tleV9sZW4pKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX1Vud3JhcEtleSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCB1bndyYXBwaW5nX2tleSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKndyYXBwZWRfa2V5LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyB3cmFwcGVkX2tleV9sZW4sCisJCSAgICAgICBzdHJ1Y3QgY2tfYXR0cmlidXRlICp0ZW1wbCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlX2NvdW50LAorCQkgICAgICAgY2tfb2JqZWN0X2hhbmRsZV90ICprZXkpKTsKK19DS19ERUNMQVJFX0ZVTkNUSU9OIChDX0Rlcml2ZUtleSwKKwkJICAgICAgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbiwKKwkJICAgICAgIHN0cnVjdCBja19tZWNoYW5pc20gKm1lY2hhbmlzbSwKKwkJICAgICAgIGNrX29iamVjdF9oYW5kbGVfdCBiYXNlX2tleSwKKwkJICAgICAgIHN0cnVjdCBja19hdHRyaWJ1dGUgKnRlbXBsLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGVfY291bnQsCisJCSAgICAgICBja19vYmplY3RfaGFuZGxlX3QgKmtleSkpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19TZWVkUmFuZG9tLAorCQkgICAgICAoY2tfc2Vzc2lvbl9oYW5kbGVfdCBzZXNzaW9uLCB1bnNpZ25lZCBjaGFyICpzZWVkLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBzZWVkX2xlbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfR2VuZXJhdGVSYW5kb20sCisJCSAgICAgIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpyYW5kb21fZGF0YSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcmFuZG9tX2xlbikpOworCitfQ0tfREVDTEFSRV9GVU5DVElPTiAoQ19HZXRGdW5jdGlvblN0YXR1cywgKGNrX3Nlc3Npb25faGFuZGxlX3Qgc2Vzc2lvbikpOworX0NLX0RFQ0xBUkVfRlVOQ1RJT04gKENfQ2FuY2VsRnVuY3Rpb24sIChja19zZXNzaW9uX2hhbmRsZV90IHNlc3Npb24pKTsKKworCitzdHJ1Y3QgY2tfZnVuY3Rpb25fbGlzdAoreworICBzdHJ1Y3QgY2tfdmVyc2lvbiB2ZXJzaW9uOworICBDS19DX0luaXRpYWxpemUgQ19Jbml0aWFsaXplOworICBDS19DX0ZpbmFsaXplIENfRmluYWxpemU7CisgIENLX0NfR2V0SW5mbyBDX0dldEluZm87CisgIENLX0NfR2V0RnVuY3Rpb25MaXN0IENfR2V0RnVuY3Rpb25MaXN0OworICBDS19DX0dldFNsb3RMaXN0IENfR2V0U2xvdExpc3Q7CisgIENLX0NfR2V0U2xvdEluZm8gQ19HZXRTbG90SW5mbzsKKyAgQ0tfQ19HZXRUb2tlbkluZm8gQ19HZXRUb2tlbkluZm87CisgIENLX0NfR2V0TWVjaGFuaXNtTGlzdCBDX0dldE1lY2hhbmlzbUxpc3Q7CisgIENLX0NfR2V0TWVjaGFuaXNtSW5mbyBDX0dldE1lY2hhbmlzbUluZm87CisgIENLX0NfSW5pdFRva2VuIENfSW5pdFRva2VuOworICBDS19DX0luaXRQSU4gQ19Jbml0UElOOworICBDS19DX1NldFBJTiBDX1NldFBJTjsKKyAgQ0tfQ19PcGVuU2Vzc2lvbiBDX09wZW5TZXNzaW9uOworICBDS19DX0Nsb3NlU2Vzc2lvbiBDX0Nsb3NlU2Vzc2lvbjsKKyAgQ0tfQ19DbG9zZUFsbFNlc3Npb25zIENfQ2xvc2VBbGxTZXNzaW9uczsKKyAgQ0tfQ19HZXRTZXNzaW9uSW5mbyBDX0dldFNlc3Npb25JbmZvOworICBDS19DX0dldE9wZXJhdGlvblN0YXRlIENfR2V0T3BlcmF0aW9uU3RhdGU7CisgIENLX0NfU2V0T3BlcmF0aW9uU3RhdGUgQ19TZXRPcGVyYXRpb25TdGF0ZTsKKyAgQ0tfQ19Mb2dpbiBDX0xvZ2luOworICBDS19DX0xvZ291dCBDX0xvZ291dDsKKyAgQ0tfQ19DcmVhdGVPYmplY3QgQ19DcmVhdGVPYmplY3Q7CisgIENLX0NfQ29weU9iamVjdCBDX0NvcHlPYmplY3Q7CisgIENLX0NfRGVzdHJveU9iamVjdCBDX0Rlc3Ryb3lPYmplY3Q7CisgIENLX0NfR2V0T2JqZWN0U2l6ZSBDX0dldE9iamVjdFNpemU7CisgIENLX0NfR2V0QXR0cmlidXRlVmFsdWUgQ19HZXRBdHRyaWJ1dGVWYWx1ZTsKKyAgQ0tfQ19TZXRBdHRyaWJ1dGVWYWx1ZSBDX1NldEF0dHJpYnV0ZVZhbHVlOworICBDS19DX0ZpbmRPYmplY3RzSW5pdCBDX0ZpbmRPYmplY3RzSW5pdDsKKyAgQ0tfQ19GaW5kT2JqZWN0cyBDX0ZpbmRPYmplY3RzOworICBDS19DX0ZpbmRPYmplY3RzRmluYWwgQ19GaW5kT2JqZWN0c0ZpbmFsOworICBDS19DX0VuY3J5cHRJbml0IENfRW5jcnlwdEluaXQ7CisgIENLX0NfRW5jcnlwdCBDX0VuY3J5cHQ7CisgIENLX0NfRW5jcnlwdFVwZGF0ZSBDX0VuY3J5cHRVcGRhdGU7CisgIENLX0NfRW5jcnlwdEZpbmFsIENfRW5jcnlwdEZpbmFsOworICBDS19DX0RlY3J5cHRJbml0IENfRGVjcnlwdEluaXQ7CisgIENLX0NfRGVjcnlwdCBDX0RlY3J5cHQ7CisgIENLX0NfRGVjcnlwdFVwZGF0ZSBDX0RlY3J5cHRVcGRhdGU7CisgIENLX0NfRGVjcnlwdEZpbmFsIENfRGVjcnlwdEZpbmFsOworICBDS19DX0RpZ2VzdEluaXQgQ19EaWdlc3RJbml0OworICBDS19DX0RpZ2VzdCBDX0RpZ2VzdDsKKyAgQ0tfQ19EaWdlc3RVcGRhdGUgQ19EaWdlc3RVcGRhdGU7CisgIENLX0NfRGlnZXN0S2V5IENfRGlnZXN0S2V5OworICBDS19DX0RpZ2VzdEZpbmFsIENfRGlnZXN0RmluYWw7CisgIENLX0NfU2lnbkluaXQgQ19TaWduSW5pdDsKKyAgQ0tfQ19TaWduIENfU2lnbjsKKyAgQ0tfQ19TaWduVXBkYXRlIENfU2lnblVwZGF0ZTsKKyAgQ0tfQ19TaWduRmluYWwgQ19TaWduRmluYWw7CisgIENLX0NfU2lnblJlY292ZXJJbml0IENfU2lnblJlY292ZXJJbml0OworICBDS19DX1NpZ25SZWNvdmVyIENfU2lnblJlY292ZXI7CisgIENLX0NfVmVyaWZ5SW5pdCBDX1ZlcmlmeUluaXQ7CisgIENLX0NfVmVyaWZ5IENfVmVyaWZ5OworICBDS19DX1ZlcmlmeVVwZGF0ZSBDX1ZlcmlmeVVwZGF0ZTsKKyAgQ0tfQ19WZXJpZnlGaW5hbCBDX1ZlcmlmeUZpbmFsOworICBDS19DX1ZlcmlmeVJlY292ZXJJbml0IENfVmVyaWZ5UmVjb3ZlckluaXQ7CisgIENLX0NfVmVyaWZ5UmVjb3ZlciBDX1ZlcmlmeVJlY292ZXI7CisgIENLX0NfRGlnZXN0RW5jcnlwdFVwZGF0ZSBDX0RpZ2VzdEVuY3J5cHRVcGRhdGU7CisgIENLX0NfRGVjcnlwdERpZ2VzdFVwZGF0ZSBDX0RlY3J5cHREaWdlc3RVcGRhdGU7CisgIENLX0NfU2lnbkVuY3J5cHRVcGRhdGUgQ19TaWduRW5jcnlwdFVwZGF0ZTsKKyAgQ0tfQ19EZWNyeXB0VmVyaWZ5VXBkYXRlIENfRGVjcnlwdFZlcmlmeVVwZGF0ZTsKKyAgQ0tfQ19HZW5lcmF0ZUtleSBDX0dlbmVyYXRlS2V5OworICBDS19DX0dlbmVyYXRlS2V5UGFpciBDX0dlbmVyYXRlS2V5UGFpcjsKKyAgQ0tfQ19XcmFwS2V5IENfV3JhcEtleTsKKyAgQ0tfQ19VbndyYXBLZXkgQ19VbndyYXBLZXk7CisgIENLX0NfRGVyaXZlS2V5IENfRGVyaXZlS2V5OworICBDS19DX1NlZWRSYW5kb20gQ19TZWVkUmFuZG9tOworICBDS19DX0dlbmVyYXRlUmFuZG9tIENfR2VuZXJhdGVSYW5kb207CisgIENLX0NfR2V0RnVuY3Rpb25TdGF0dXMgQ19HZXRGdW5jdGlvblN0YXR1czsKKyAgQ0tfQ19DYW5jZWxGdW5jdGlvbiBDX0NhbmNlbEZ1bmN0aW9uOworICBDS19DX1dhaXRGb3JTbG90RXZlbnQgQ19XYWl0Rm9yU2xvdEV2ZW50OworfTsKKworCit0eXBlZGVmIGNrX3J2X3QgKCpja19jcmVhdGVtdXRleF90KSAodm9pZCAqKm11dGV4KTsKK3R5cGVkZWYgY2tfcnZfdCAoKmNrX2Rlc3Ryb3ltdXRleF90KSAodm9pZCAqbXV0ZXgpOwordHlwZWRlZiBja19ydl90ICgqY2tfbG9ja211dGV4X3QpICh2b2lkICptdXRleCk7Cit0eXBlZGVmIGNrX3J2X3QgKCpja191bmxvY2ttdXRleF90KSAodm9pZCAqbXV0ZXgpOworCisKK3N0cnVjdCBja19jX2luaXRpYWxpemVfYXJncworeworICBja19jcmVhdGVtdXRleF90IGNyZWF0ZV9tdXRleDsKKyAgY2tfZGVzdHJveW11dGV4X3QgZGVzdHJveV9tdXRleDsKKyAgY2tfbG9ja211dGV4X3QgbG9ja19tdXRleDsKKyAgY2tfdW5sb2NrbXV0ZXhfdCB1bmxvY2tfbXV0ZXg7CisgIGNrX2ZsYWdzX3QgZmxhZ3M7CisgIHZvaWQgKnJlc2VydmVkOworfTsKKworCisjZGVmaW5lIENLRl9MSUJSQVJZX0NBTlRfQ1JFQVRFX09TX1RIUkVBRFMJKDEgPDwgMCkKKyNkZWZpbmUgQ0tGX09TX0xPQ0tJTkdfT0sJCQkoMSA8PCAxKQorCisjZGVmaW5lIENLUl9PSwkJCQkJKDApCisjZGVmaW5lIENLUl9DQU5DRUwJCQkJKDEpCisjZGVmaW5lIENLUl9IT1NUX01FTU9SWQkJCQkoMikKKyNkZWZpbmUgQ0tSX1NMT1RfSURfSU5WQUxJRAkJCSgzKQorI2RlZmluZSBDS1JfR0VORVJBTF9FUlJPUgkJCSg1KQorI2RlZmluZSBDS1JfRlVOQ1RJT05fRkFJTEVECQkJKDYpCisjZGVmaW5lIENLUl9BUkdVTUVOVFNfQkFECQkJKDcpCisjZGVmaW5lIENLUl9OT19FVkVOVAkJCQkoOCkKKyNkZWZpbmUgQ0tSX05FRURfVE9fQ1JFQVRFX1RIUkVBRFMJCSg5KQorI2RlZmluZSBDS1JfQ0FOVF9MT0NLCQkJCSgweGEpCisjZGVmaW5lIENLUl9BVFRSSUJVVEVfUkVBRF9PTkxZCQkJKDB4MTApCisjZGVmaW5lIENLUl9BVFRSSUJVVEVfU0VOU0lUSVZFCQkJKDB4MTEpCisjZGVmaW5lIENLUl9BVFRSSUJVVEVfVFlQRV9JTlZBTElECQkoMHgxMikKKyNkZWZpbmUgQ0tSX0FUVFJJQlVURV9WQUxVRV9JTlZBTElECQkoMHgxMykKKyNkZWZpbmUgQ0tSX0RBVEFfSU5WQUxJRAkJCSgweDIwKQorI2RlZmluZSBDS1JfREFUQV9MRU5fUkFOR0UJCQkoMHgyMSkKKyNkZWZpbmUgQ0tSX0RFVklDRV9FUlJPUgkJCSgweDMwKQorI2RlZmluZSBDS1JfREVWSUNFX01FTU9SWQkJCSgweDMxKQorI2RlZmluZSBDS1JfREVWSUNFX1JFTU9WRUQJCQkoMHgzMikKKyNkZWZpbmUgQ0tSX0VOQ1JZUFRFRF9EQVRBX0lOVkFMSUQJCSgweDQwKQorI2RlZmluZSBDS1JfRU5DUllQVEVEX0RBVEFfTEVOX1JBTkdFCQkoMHg0MSkKKyNkZWZpbmUgQ0tSX0ZVTkNUSU9OX0NBTkNFTEVECQkJKDB4NTApCisjZGVmaW5lIENLUl9GVU5DVElPTl9OT1RfUEFSQUxMRUwJCSgweDUxKQorI2RlZmluZSBDS1JfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRAkJKDB4NTQpCisjZGVmaW5lIENLUl9LRVlfSEFORExFX0lOVkFMSUQJCQkoMHg2MCkKKyNkZWZpbmUgQ0tSX0tFWV9TSVpFX1JBTkdFCQkJKDB4NjIpCisjZGVmaW5lIENLUl9LRVlfVFlQRV9JTkNPTlNJU1RFTlQJCSgweDYzKQorI2RlZmluZSBDS1JfS0VZX05PVF9ORUVERUQJCQkoMHg2NCkKKyNkZWZpbmUgQ0tSX0tFWV9DSEFOR0VECQkJCSgweDY1KQorI2RlZmluZSBDS1JfS0VZX05FRURFRAkJCQkoMHg2NikKKyNkZWZpbmUgQ0tSX0tFWV9JTkRJR0VTVElCTEUJCQkoMHg2NykKKyNkZWZpbmUgQ0tSX0tFWV9GVU5DVElPTl9OT1RfUEVSTUlUVEVECQkoMHg2OCkKKyNkZWZpbmUgQ0tSX0tFWV9OT1RfV1JBUFBBQkxFCQkJKDB4NjkpCisjZGVmaW5lIENLUl9LRVlfVU5FWFRSQUNUQUJMRQkJCSgweDZhKQorI2RlZmluZSBDS1JfTUVDSEFOSVNNX0lOVkFMSUQJCQkoMHg3MCkKKyNkZWZpbmUgQ0tSX01FQ0hBTklTTV9QQVJBTV9JTlZBTElECQkoMHg3MSkKKyNkZWZpbmUgQ0tSX09CSkVDVF9IQU5ETEVfSU5WQUxJRAkJKDB4ODIpCisjZGVmaW5lIENLUl9PUEVSQVRJT05fQUNUSVZFCQkJKDB4OTApCisjZGVmaW5lIENLUl9PUEVSQVRJT05fTk9UX0lOSVRJQUxJWkVECQkoMHg5MSkKKyNkZWZpbmUgQ0tSX1BJTl9JTkNPUlJFQ1QJCQkoMHhhMCkKKyNkZWZpbmUgQ0tSX1BJTl9JTlZBTElECQkJCSgweGExKQorI2RlZmluZSBDS1JfUElOX0xFTl9SQU5HRQkJCSgweGEyKQorI2RlZmluZSBDS1JfUElOX0VYUElSRUQJCQkJKDB4YTMpCisjZGVmaW5lIENLUl9QSU5fTE9DS0VECQkJCSgweGE0KQorI2RlZmluZSBDS1JfU0VTU0lPTl9DTE9TRUQJCQkoMHhiMCkKKyNkZWZpbmUgQ0tSX1NFU1NJT05fQ09VTlQJCQkoMHhiMSkKKyNkZWZpbmUgQ0tSX1NFU1NJT05fSEFORExFX0lOVkFMSUQJCSgweGIzKQorI2RlZmluZSBDS1JfU0VTU0lPTl9QQVJBTExFTF9OT1RfU1VQUE9SVEVECSgweGI0KQorI2RlZmluZSBDS1JfU0VTU0lPTl9SRUFEX09OTFkJCQkoMHhiNSkKKyNkZWZpbmUgQ0tSX1NFU1NJT05fRVhJU1RTCQkJKDB4YjYpCisjZGVmaW5lIENLUl9TRVNTSU9OX1JFQURfT05MWV9FWElTVFMJCSgweGI3KQorI2RlZmluZSBDS1JfU0VTU0lPTl9SRUFEX1dSSVRFX1NPX0VYSVNUUwkoMHhiOCkKKyNkZWZpbmUgQ0tSX1NJR05BVFVSRV9JTlZBTElECQkJKDB4YzApCisjZGVmaW5lIENLUl9TSUdOQVRVUkVfTEVOX1JBTkdFCQkJKDB4YzEpCisjZGVmaW5lIENLUl9URU1QTEFURV9JTkNPTVBMRVRFCQkJKDB4ZDApCisjZGVmaW5lIENLUl9URU1QTEFURV9JTkNPTlNJU1RFTlQJCSgweGQxKQorI2RlZmluZSBDS1JfVE9LRU5fTk9UX1BSRVNFTlQJCQkoMHhlMCkKKyNkZWZpbmUgQ0tSX1RPS0VOX05PVF9SRUNPR05JWkVECQkoMHhlMSkKKyNkZWZpbmUgQ0tSX1RPS0VOX1dSSVRFX1BST1RFQ1RFRAkJKDB4ZTIpCisjZGVmaW5lCUNLUl9VTldSQVBQSU5HX0tFWV9IQU5ETEVfSU5WQUxJRAkoMHhmMCkKKyNkZWZpbmUgQ0tSX1VOV1JBUFBJTkdfS0VZX1NJWkVfUkFOR0UJCSgweGYxKQorI2RlZmluZSBDS1JfVU5XUkFQUElOR19LRVlfVFlQRV9JTkNPTlNJU1RFTlQJKDB4ZjIpCisjZGVmaW5lIENLUl9VU0VSX0FMUkVBRFlfTE9HR0VEX0lOCQkoMHgxMDApCisjZGVmaW5lIENLUl9VU0VSX05PVF9MT0dHRURfSU4JCQkoMHgxMDEpCisjZGVmaW5lIENLUl9VU0VSX1BJTl9OT1RfSU5JVElBTElaRUQJCSgweDEwMikKKyNkZWZpbmUgQ0tSX1VTRVJfVFlQRV9JTlZBTElECQkJKDB4MTAzKQorI2RlZmluZSBDS1JfVVNFUl9BTk9USEVSX0FMUkVBRFlfTE9HR0VEX0lOCSgweDEwNCkKKyNkZWZpbmUgQ0tSX1VTRVJfVE9PX01BTllfVFlQRVMJCQkoMHgxMDUpCisjZGVmaW5lIENLUl9XUkFQUEVEX0tFWV9JTlZBTElECQkJKDB4MTEwKQorI2RlZmluZSBDS1JfV1JBUFBFRF9LRVlfTEVOX1JBTkdFCQkoMHgxMTIpCisjZGVmaW5lIENLUl9XUkFQUElOR19LRVlfSEFORExFX0lOVkFMSUQJCSgweDExMykKKyNkZWZpbmUgQ0tSX1dSQVBQSU5HX0tFWV9TSVpFX1JBTkdFCQkoMHgxMTQpCisjZGVmaW5lIENLUl9XUkFQUElOR19LRVlfVFlQRV9JTkNPTlNJU1RFTlQJKDB4MTE1KQorI2RlZmluZSBDS1JfUkFORE9NX1NFRURfTk9UX1NVUFBPUlRFRAkJKDB4MTIwKQorI2RlZmluZSBDS1JfUkFORE9NX05PX1JORwkJCSgweDEyMSkKKyNkZWZpbmUgQ0tSX0RPTUFJTl9QQVJBTVNfSU5WQUxJRAkJKDB4MTMwKQorI2RlZmluZSBDS1JfQlVGRkVSX1RPT19TTUFMTAkJCSgweDE1MCkKKyNkZWZpbmUgQ0tSX1NBVkVEX1NUQVRFX0lOVkFMSUQJCQkoMHgxNjApCisjZGVmaW5lIENLUl9JTkZPUk1BVElPTl9TRU5TSVRJVkUJCSgweDE3MCkKKyNkZWZpbmUgQ0tSX1NUQVRFX1VOU0FWRUFCTEUJCQkoMHgxODApCisjZGVmaW5lIENLUl9DUllQVE9LSV9OT1RfSU5JVElBTElaRUQJCSgweDE5MCkKKyNkZWZpbmUgQ0tSX0NSWVBUT0tJX0FMUkVBRFlfSU5JVElBTElaRUQJKDB4MTkxKQorI2RlZmluZSBDS1JfTVVURVhfQkFECQkJCSgweDFhMCkKKyNkZWZpbmUgQ0tSX01VVEVYX05PVF9MT0NLRUQJCQkoMHgxYTEpCisjZGVmaW5lIENLUl9GVU5DVElPTl9SRUpFQ1RFRAkJCSgweDIwMCkKKyNkZWZpbmUgQ0tSX1ZFTkRPUl9ERUZJTkVECQkJKCh1bnNpZ25lZCBsb25nKSAoMSA8PCAzMSkpCisKKworCisvKiBDb21wYXRpYmlsaXR5IGxheWVyLiAgKi8KKworI2lmZGVmIENSWVBUT0tJX0NPTVBBVAorCisjdW5kZWYgQ0tfREVGSU5FX0ZVTkNUSU9OCisjZGVmaW5lIENLX0RFRklORV9GVU5DVElPTihyZXR2YWwsIG5hbWUpIHJldHZhbCBDS19TUEVDIG5hbWUKKworLyogRm9yIE5VTEwuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQ0tfQllURTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBDS19DSEFSOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIENLX1VURjhDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIENLX0JCT09MOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBDS19VTE9ORzsKK3R5cGVkZWYgbG9uZyBpbnQgQ0tfTE9ORzsKK3R5cGVkZWYgQ0tfQllURSAqQ0tfQllURV9QVFI7Cit0eXBlZGVmIENLX0NIQVIgKkNLX0NIQVJfUFRSOwordHlwZWRlZiBDS19VVEY4Q0hBUiAqQ0tfVVRGOENIQVJfUFRSOwordHlwZWRlZiBDS19VTE9ORyAqQ0tfVUxPTkdfUFRSOwordHlwZWRlZiB2b2lkICpDS19WT0lEX1BUUjsKK3R5cGVkZWYgdm9pZCAqKkNLX1ZPSURfUFRSX1BUUjsKKyNkZWZpbmUgQ0tfRkFMU0UgMAorI2RlZmluZSBDS19UUlVFIDEKKyNpZm5kZWYgQ0tfRElTQUJMRV9UUlVFX0ZBTFNFCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgY2tfdmVyc2lvbiBDS19WRVJTSU9OOwordHlwZWRlZiBzdHJ1Y3QgY2tfdmVyc2lvbiAqQ0tfVkVSU0lPTl9QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNrX2luZm8gQ0tfSU5GTzsKK3R5cGVkZWYgc3RydWN0IGNrX2luZm8gKkNLX0lORk9fUFRSOworCit0eXBlZGVmIGNrX3Nsb3RfaWRfdCAqQ0tfU0xPVF9JRF9QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNrX3Nsb3RfaW5mbyBDS19TTE9UX0lORk87Cit0eXBlZGVmIHN0cnVjdCBja19zbG90X2luZm8gKkNLX1NMT1RfSU5GT19QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNrX3Rva2VuX2luZm8gQ0tfVE9LRU5fSU5GTzsKK3R5cGVkZWYgc3RydWN0IGNrX3Rva2VuX2luZm8gKkNLX1RPS0VOX0lORk9fUFRSOworCit0eXBlZGVmIGNrX3Nlc3Npb25faGFuZGxlX3QgKkNLX1NFU1NJT05fSEFORExFX1BUUjsKKwordHlwZWRlZiBzdHJ1Y3QgY2tfc2Vzc2lvbl9pbmZvIENLX1NFU1NJT05fSU5GTzsKK3R5cGVkZWYgc3RydWN0IGNrX3Nlc3Npb25faW5mbyAqQ0tfU0VTU0lPTl9JTkZPX1BUUjsKKwordHlwZWRlZiBja19vYmplY3RfaGFuZGxlX3QgKkNLX09CSkVDVF9IQU5ETEVfUFRSOworCit0eXBlZGVmIGNrX29iamVjdF9jbGFzc190ICpDS19PQkpFQ1RfQ0xBU1NfUFRSOworCit0eXBlZGVmIHN0cnVjdCBja19hdHRyaWJ1dGUgQ0tfQVRUUklCVVRFOwordHlwZWRlZiBzdHJ1Y3QgY2tfYXR0cmlidXRlICpDS19BVFRSSUJVVEVfUFRSOworCit0eXBlZGVmIHN0cnVjdCBja19kYXRlIENLX0RBVEU7Cit0eXBlZGVmIHN0cnVjdCBja19kYXRlICpDS19EQVRFX1BUUjsKKwordHlwZWRlZiBja19tZWNoYW5pc21fdHlwZV90ICpDS19NRUNIQU5JU01fVFlQRV9QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNrX21lY2hhbmlzbSBDS19NRUNIQU5JU007Cit0eXBlZGVmIHN0cnVjdCBja19tZWNoYW5pc20gKkNLX01FQ0hBTklTTV9QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNrX21lY2hhbmlzbV9pbmZvIENLX01FQ0hBTklTTV9JTkZPOwordHlwZWRlZiBzdHJ1Y3QgY2tfbWVjaGFuaXNtX2luZm8gKkNLX01FQ0hBTklTTV9JTkZPX1BUUjsKKwordHlwZWRlZiBzdHJ1Y3QgY2tfZnVuY3Rpb25fbGlzdCBDS19GVU5DVElPTl9MSVNUOwordHlwZWRlZiBzdHJ1Y3QgY2tfZnVuY3Rpb25fbGlzdCAqQ0tfRlVOQ1RJT05fTElTVF9QVFI7Cit0eXBlZGVmIHN0cnVjdCBja19mdW5jdGlvbl9saXN0ICoqQ0tfRlVOQ1RJT05fTElTVF9QVFJfUFRSOworCit0eXBlZGVmIHN0cnVjdCBja19jX2luaXRpYWxpemVfYXJncyBDS19DX0lOSVRJQUxJWkVfQVJHUzsKK3R5cGVkZWYgc3RydWN0IGNrX2NfaW5pdGlhbGl6ZV9hcmdzICpDS19DX0lOSVRJQUxJWkVfQVJHU19QVFI7CisKKyNkZWZpbmUgTlVMTF9QVFIgTlVMTAorCisvKiBEZWxldGUgdGhlIGhlbHBlciBtYWNyb3MgZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAgKi8KKyN1bmRlZiBja19mbGFnc190CisjdW5kZWYgY2tfdmVyc2lvbgorCisjdW5kZWYgY2tfaW5mbworI3VuZGVmIGNyeXB0b2tpX3ZlcnNpb24KKyN1bmRlZiBtYW51ZmFjdHVyZXJfaWQKKyN1bmRlZiBsaWJyYXJ5X2Rlc2NyaXB0aW9uCisjdW5kZWYgbGlicmFyeV92ZXJzaW9uCisKKyN1bmRlZiBja19ub3RpZmljYXRpb25fdAorI3VuZGVmIGNrX3Nsb3RfaWRfdAorCisjdW5kZWYgY2tfc2xvdF9pbmZvCisjdW5kZWYgc2xvdF9kZXNjcmlwdGlvbgorI3VuZGVmIGhhcmR3YXJlX3ZlcnNpb24KKyN1bmRlZiBmaXJtd2FyZV92ZXJzaW9uCisKKyN1bmRlZiBja190b2tlbl9pbmZvCisjdW5kZWYgc2VyaWFsX251bWJlcgorI3VuZGVmIG1heF9zZXNzaW9uX2NvdW50CisjdW5kZWYgc2Vzc2lvbl9jb3VudAorI3VuZGVmIG1heF9yd19zZXNzaW9uX2NvdW50CisjdW5kZWYgcndfc2Vzc2lvbl9jb3VudAorI3VuZGVmIG1heF9waW5fbGVuCisjdW5kZWYgbWluX3Bpbl9sZW4KKyN1bmRlZiB0b3RhbF9wdWJsaWNfbWVtb3J5CisjdW5kZWYgZnJlZV9wdWJsaWNfbWVtb3J5CisjdW5kZWYgdG90YWxfcHJpdmF0ZV9tZW1vcnkKKyN1bmRlZiBmcmVlX3ByaXZhdGVfbWVtb3J5CisjdW5kZWYgdXRjX3RpbWUKKworI3VuZGVmIGNrX3Nlc3Npb25faGFuZGxlX3QKKyN1bmRlZiBja191c2VyX3R5cGVfdAorI3VuZGVmIGNrX3N0YXRlX3QKKworI3VuZGVmIGNrX3Nlc3Npb25faW5mbworI3VuZGVmIHNsb3RfaWQKKyN1bmRlZiBkZXZpY2VfZXJyb3IKKworI3VuZGVmIGNrX29iamVjdF9oYW5kbGVfdAorI3VuZGVmIGNrX29iamVjdF9jbGFzc190CisjdW5kZWYgY2tfaHdfZmVhdHVyZV90eXBlX3QKKyN1bmRlZiBja19rZXlfdHlwZV90CisjdW5kZWYgY2tfY2VydGlmaWNhdGVfdHlwZV90CisjdW5kZWYgY2tfYXR0cmlidXRlX3R5cGVfdAorCisjdW5kZWYgY2tfYXR0cmlidXRlCisjdW5kZWYgdmFsdWUKKyN1bmRlZiB2YWx1ZV9sZW4KKworI3VuZGVmIGNrX2RhdGUKKworI3VuZGVmIGNrX21lY2hhbmlzbV90eXBlX3QKKworI3VuZGVmIGNrX21lY2hhbmlzbQorI3VuZGVmIHBhcmFtZXRlcgorI3VuZGVmIHBhcmFtZXRlcl9sZW4KKworI3VuZGVmIGNrX21lY2hhbmlzbV9pbmZvCisjdW5kZWYgbWluX2tleV9zaXplCisjdW5kZWYgbWF4X2tleV9zaXplCisKKyN1bmRlZiBja19ydl90CisjdW5kZWYgY2tfbm90aWZ5X3QKKworI3VuZGVmIGNrX2Z1bmN0aW9uX2xpc3QKKworI3VuZGVmIGNrX2NyZWF0ZW11dGV4X3QKKyN1bmRlZiBja19kZXN0cm95bXV0ZXhfdAorI3VuZGVmIGNrX2xvY2ttdXRleF90CisjdW5kZWYgY2tfdW5sb2NrbXV0ZXhfdAorCisjdW5kZWYgY2tfY19pbml0aWFsaXplX2FyZ3MKKyN1bmRlZiBjcmVhdGVfbXV0ZXgKKyN1bmRlZiBkZXN0cm95X211dGV4CisjdW5kZWYgbG9ja19tdXRleAorI3VuZGVmIHVubG9ja19tdXRleAorI3VuZGVmIHJlc2VydmVkCisKKyNlbmRpZgkvKiBDUllQVE9LSV9DT01QQVQgKi8KKworCisvKiBTeXN0ZW0gZGVwZW5kZW5jaWVzLiAgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChDUllQVE9LSV9GT1JDRV9XSU4zMikKKyNwcmFnbWEgcGFjayhwb3AsIGNyeXB0b2tpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgkvKiBQS0NTMTFfSCAqLwpkaWZmIC0tZ2l0IGEvc2NhcmQtb3BlbnNjLmMgYi9zY2FyZC1vcGVuc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkYWUwNS4uMDAwMDAwMAotLS0gYS9zY2FyZC1vcGVuc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEp1aGEgWXJq9mzkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwMSBNYXJrdXMgRnJpZWRsLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpZiBkZWZpbmVkKFNNQVJUQ0FSRCkgJiYgZGVmaW5lZChVU0VfT1BFTlNDKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc2Mvb3BlbnNjLmg+Ci0jaW5jbHVkZSA8b3BlbnNjL3BrY3MxNS5oPgotCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgIm1pc2MuaCIKLSNpbmNsdWRlICJzY2FyZC5oIgotCi0jaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDcwMDBMICYmIGRlZmluZWQoQ1JZUFRPX0xPQ0tfRU5HSU5FKQotI2RlZmluZSBVU0VfRU5HSU5FCi0jZGVmaW5lIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QgUlNBX2dldF9kZWZhdWx0X29wZW5zc2xfbWV0aG9kCi0jZWxzZQotI2VuZGlmCi0KLSNpZmRlZiBVU0VfRU5HSU5FCi0jaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KLSNkZWZpbmUgc2NfZ2V0X3JzYSBzY19nZXRfZW5naW5lCi0jZWxzZQotI2RlZmluZSBzY19nZXRfcnNhIHNjX2dldF9yc2FfbWV0aG9kCi0jZW5kaWYKLQotc3RhdGljIGludCBzY19yZWFkZXJfaWQ7Ci1zdGF0aWMgc2NfY29udGV4dF90ICpjdHggPSBOVUxMOwotc3RhdGljIHNjX2NhcmRfdCAqY2FyZCA9IE5VTEw7Ci1zdGF0aWMgc2NfcGtjczE1X2NhcmRfdCAqcDE1Y2FyZCA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICpzY19waW4gPSBOVUxMOwotCi1zdHJ1Y3Qgc2NfcHJpdl9kYXRhCi17Ci0Jc3RydWN0IHNjX3BrY3MxNV9pZCBjZXJ0X2lkOwotCWludCByZWZfY291bnQ7Ci19OwotCi12b2lkCi1zY19jbG9zZSh2b2lkKQotewotCWlmIChwMTVjYXJkKSB7Ci0JCXNjX3BrY3MxNV91bmJpbmQocDE1Y2FyZCk7Ci0JCXAxNWNhcmQgPSBOVUxMOwotCX0KLQlpZiAoY2FyZCkgewotCQlzY19kaXNjb25uZWN0X2NhcmQoY2FyZCwgMCk7Ci0JCWNhcmQgPSBOVUxMOwotCX0KLQlpZiAoY3R4KSB7Ci0JCXNjX3JlbGVhc2VfY29udGV4dChjdHgpOwotCQljdHggPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludAotc2NfaW5pdCh2b2lkKQotewotCWludCByOwotCi0JciA9IHNjX2VzdGFibGlzaF9jb250ZXh0KCZjdHgsICJvcGVuc3NoIik7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOwotCWlmIChzY19yZWFkZXJfaWQgPj0gY3R4LT5yZWFkZXJfY291bnQpIHsKLQkJciA9IFNDX0VSUk9SX05PX1JFQURFUlNfRk9VTkQ7Ci0JCWVycm9yKCJJbGxlZ2FsIHJlYWRlciBudW1iZXIgJWQgKG1heCAlZCkiLCBzY19yZWFkZXJfaWQsCi0JCSAgICBjdHgtPnJlYWRlcl9jb3VudCAtMSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlyID0gc2NfY29ubmVjdF9jYXJkKGN0eC0+cmVhZGVyW3NjX3JlYWRlcl9pZF0sIDAsICZjYXJkKTsKLQlpZiAocikKLQkJZ290byBlcnI7Ci0JciA9IHNjX3BrY3MxNV9iaW5kKGNhcmQsICZwMTVjYXJkKTsKLQlpZiAocikKLQkJZ290byBlcnI7Ci0JcmV0dXJuIDA7Ci1lcnI6Ci0Jc2NfY2xvc2UoKTsKLQlyZXR1cm4gcjsKLX0KLQotLyogcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucyAqLwotCi1zdGF0aWMgaW50Ci1zY19wcmtleV9vcF9pbml0KFJTQSAqcnNhLCBzdHJ1Y3Qgc2NfcGtjczE1X29iamVjdCAqKmtleV9vYmpfb3V0LAotCXVuc2lnbmVkIGludCB1c2FnZSkKLXsKLQlpbnQgcjsKLQlzdHJ1Y3Qgc2NfcHJpdl9kYXRhICpwcml2OwotCXN0cnVjdCBzY19wa2NzMTVfb2JqZWN0ICprZXlfb2JqOwotCXN0cnVjdCBzY19wa2NzMTVfcHJrZXlfaW5mbyAqa2V5OwotCXN0cnVjdCBzY19wa2NzMTVfb2JqZWN0ICpwaW5fb2JqOwotCXN0cnVjdCBzY19wa2NzMTVfcGluX2luZm8gKnBpbjsKLQotCXByaXYgPSAoc3RydWN0IHNjX3ByaXZfZGF0YSAqKSBSU0FfZ2V0X2FwcF9kYXRhKHJzYSk7Ci0JaWYgKHByaXYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChwMTVjYXJkID09IE5VTEwpIHsKLQkJc2NfY2xvc2UoKTsKLQkJciA9IHNjX2luaXQoKTsKLQkJaWYgKHIpIHsKLQkJCWVycm9yKCJTbWFydENhcmQgaW5pdCBmYWlsZWQ6ICVzIiwgc2Nfc3RyZXJyb3IocikpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0JciA9IHNjX3BrY3MxNV9maW5kX3Bya2V5X2J5X2lkX3VzYWdlKHAxNWNhcmQsICZwcml2LT5jZXJ0X2lkLAotCQl1c2FnZSwgJmtleV9vYmopOwotCWlmIChyKSB7Ci0JCWVycm9yKCJVbmFibGUgdG8gZmluZCBwcml2YXRlIGtleSBmcm9tIFNtYXJ0Q2FyZDogJXMiLAotCQkgICAgICBzY19zdHJlcnJvcihyKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlrZXkgPSBrZXlfb2JqLT5kYXRhOwotCXIgPSBzY19wa2NzMTVfZmluZF9waW5fYnlfYXV0aF9pZChwMTVjYXJkLCAma2V5X29iai0+YXV0aF9pZCwKLQkJCQkJICAmcGluX29iaik7Ci0JaWYgKHIgPT0gU0NfRVJST1JfT0JKRUNUX05PVF9GT1VORCkgewotCQkvKiBubyBwaW4gcmVxdWlyZWQgKi8KLQkJciA9IHNjX2xvY2soY2FyZCk7Ci0JCWlmIChyKSB7Ci0JCQllcnJvcigiVW5hYmxlIHRvIGxvY2sgc21hcnRjYXJkOiAlcyIsIHNjX3N0cmVycm9yKHIpKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCSprZXlfb2JqX291dCA9IGtleV9vYmo7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAocikgewotCQllcnJvcigiVW5hYmxlIHRvIGZpbmQgUElOIG9iamVjdCBmcm9tIFNtYXJ0Q2FyZDogJXMiLAotCQkgICAgICBzY19zdHJlcnJvcihyKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlwaW4gPSBwaW5fb2JqLT5kYXRhOwotCXIgPSBzY19sb2NrKGNhcmQpOwotCWlmIChyKSB7Ci0JCWVycm9yKCJVbmFibGUgdG8gbG9jayBzbWFydGNhcmQ6ICVzIiwgc2Nfc3RyZXJyb3IocikpOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKHNjX3BpbiAhPSBOVUxMKSB7Ci0JCXIgPSBzY19wa2NzMTVfdmVyaWZ5X3BpbihwMTVjYXJkLCBwaW4sIHNjX3BpbiwKLQkJCQkJIHN0cmxlbihzY19waW4pKTsKLQkJaWYgKHIpIHsKLQkJCXNjX3VubG9jayhjYXJkKTsKLQkJCWVycm9yKCJQSU4gY29kZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlcyIsCi0JCQkgICAgICBzY19zdHJlcnJvcihyKSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQkqa2V5X29ial9vdXQgPSBrZXlfb2JqOwotCXJldHVybiAwOwotZXJyOgotCXNjX2Nsb3NlKCk7Ci0JcmV0dXJuIC0xOwotfQotCi0jZGVmaW5lIFNDX1VTQUdFX0RFQ1JZUFQJU0NfUEtDUzE1X1BSS0VZX1VTQUdFX0RFQ1JZUFQgfCBcCi0JCQkJU0NfUEtDUzE1X1BSS0VZX1VTQUdFX1VOV1JBUAotCi1zdGF0aWMgaW50Ci1zY19wcml2YXRlX2RlY3J5cHQoaW50IGZsZW4sIHVfY2hhciAqZnJvbSwgdV9jaGFyICp0bywgUlNBICpyc2EsCi0gICAgaW50IHBhZGRpbmcpCi17Ci0Jc3RydWN0IHNjX3BrY3MxNV9vYmplY3QgKmtleV9vYmo7Ci0JaW50IHI7Ci0KLQlpZiAocGFkZGluZyAhPSBSU0FfUEtDUzFfUEFERElORykKLQkJcmV0dXJuIC0xOwotCXIgPSBzY19wcmtleV9vcF9pbml0KHJzYSwgJmtleV9vYmosIFNDX1VTQUdFX0RFQ1JZUFQpOwotCWlmIChyKQotCQlyZXR1cm4gLTE7Ci0JciA9IHNjX3BrY3MxNV9kZWNpcGhlcihwMTVjYXJkLCBrZXlfb2JqLCBTQ19BTEdPUklUSE1fUlNBX1BBRF9QS0NTMSwKLQkgICAgZnJvbSwgZmxlbiwgdG8sIGZsZW4pOwotCXNjX3VubG9jayhjYXJkKTsKLQlpZiAociA8IDApIHsKLQkJZXJyb3IoInNjX3BrY3MxNV9kZWNpcGhlcigpIGZhaWxlZDogJXMiLCBzY19zdHJlcnJvcihyKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXR1cm4gcjsKLWVycjoKLQlzY19jbG9zZSgpOwotCXJldHVybiAtMTsKLX0KLQotI2RlZmluZSBTQ19VU0FHRV9TSUdOIAkJU0NfUEtDUzE1X1BSS0VZX1VTQUdFX1NJR04gfCBcCi0JCQkJU0NfUEtDUzE1X1BSS0VZX1VTQUdFX1NJR05SRUNPVkVSCi0KLXN0YXRpYyBpbnQKLXNjX3NpZ24oaW50IHR5cGUsIHVfY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuLAotCXVuc2lnbmVkIGNoYXIgKnNpZ3JldCwgdW5zaWduZWQgaW50ICpzaWdsZW4sIFJTQSAqcnNhKQotewotCXN0cnVjdCBzY19wa2NzMTVfb2JqZWN0ICprZXlfb2JqOwotCWludCByOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0JLyogWFhYOiBzY19wcmtleV9vcF9pbml0IHdpbGwgc2VhcmNoIGZvciBhIHBrY3MxNSBwcml2YXRlCi0JICoga2V5IG9iamVjdCB3aXRoIHRoZSBzaWduIG9yIHNpZ25yZWNvdmVyIHVzYWdlIGZsYWcgc2V0LgotCSAqIElmIHRoZSBzaWduaW5nIGtleSBoYXMgb25seSB0aGUgbm9uLXJlcHVkaWF0aW9uIGZsYWcgc2V0Ci0JICogdGhlIGtleSB3aWxsIGJlIHJlamVjdGVkIGFzIHVzaW5nIGEgbm9uLXJlcHVkaWF0aW9uIGtleQotCSAqIGZvciBhdXRoZW50aWNhdGlvbiBpcyBub3QgcmVjb21tZW5kZWQuIE5vdGU6IFRoaXMgZG9lcyBub3QKLQkgKiBwcmV2ZW50IHRoZSB1c2Ugb2YgYSBub24tcmVwdWRpYXRpb24ga2V5IGZvciBhdXRoZW50aWNhdGlvbgotCSAqIGlmIHRoZSBzaWduIG9yIHNpZ25yZWNvdmVyIGZsYWcgaXMgc2V0IGFzIHdlbGwuCi0JICovCi0JciA9IHNjX3Bya2V5X29wX2luaXQocnNhLCAma2V5X29iaiwgU0NfVVNBR0VfU0lHTik7Ci0JaWYgKHIpCi0JCXJldHVybiAtMTsKLQkvKiBGSVhNRTogbGVuZ3RoIG9mIHNpZ3JldCBjb3JyZWN0PyAqLwotCS8qIEZJWE1FOiBjaGVjayAndHlwZScgYW5kIG1vZGlmeSBmbGFncyBhY2NvcmRpbmdseSAqLwotCWZsYWdzID0gU0NfQUxHT1JJVEhNX1JTQV9QQURfUEtDUzEgfCBTQ19BTEdPUklUSE1fUlNBX0hBU0hfU0hBMTsKLQlyID0gc2NfcGtjczE1X2NvbXB1dGVfc2lnbmF0dXJlKHAxNWNhcmQsIGtleV9vYmosIGZsYWdzLAotCQkJCQltLCBtX2xlbiwgc2lncmV0LCBSU0Ffc2l6ZShyc2EpKTsKLQlzY191bmxvY2soY2FyZCk7Ci0JaWYgKHIgPCAwKSB7Ci0JCWVycm9yKCJzY19wa2NzMTVfY29tcHV0ZV9zaWduYXR1cmUoKSBmYWlsZWQ6ICVzIiwKLQkJICAgICAgc2Nfc3RyZXJyb3IocikpOwotCQlnb3RvIGVycjsKLQl9Ci0JKnNpZ2xlbiA9IHI7Ci0JcmV0dXJuIDE7Ci1lcnI6Ci0Jc2NfY2xvc2UoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2NfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCB1X2NoYXIgKmZyb20sIHVfY2hhciAqdG8sIFJTQSAqcnNhLAotICAgIGludCBwYWRkaW5nKQotewotCWVycm9yKCJQcml2YXRlIGtleSBlbmNyeXB0aW9uIG5vdCBzdXBwb3J0ZWQiKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIGNhbGxlZCBvbiBmcmVlICovCi0KLXN0YXRpYyBpbnQgKCpvcmlnX2ZpbmlzaCkoUlNBICpyc2EpID0gTlVMTDsKLQotc3RhdGljIGludAotc2NfZmluaXNoKFJTQSAqcnNhKQotewotCXN0cnVjdCBzY19wcml2X2RhdGEgKnByaXY7Ci0KLQlwcml2ID0gUlNBX2dldF9hcHBfZGF0YShyc2EpOwotCXByaXYtPnJlZl9jb3VudC0tOwotCWlmIChwcml2LT5yZWZfY291bnQgPT0gMCkgewotCQlmcmVlKHByaXYpOwotCQlzY19jbG9zZSgpOwotCX0KLQlpZiAob3JpZ19maW5pc2gpCi0JCW9yaWdfZmluaXNoKHJzYSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIGVuZ2luZSBmb3Igb3ZlcmxvYWRpbmcgcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucyAqLwotCi1zdGF0aWMgUlNBX01FVEhPRCAqCi1zY19nZXRfcnNhX21ldGhvZCh2b2lkKQotewotCXN0YXRpYyBSU0FfTUVUSE9EIHNtYXJ0X3JzYTsKLQljb25zdCBSU0FfTUVUSE9EICpkZWYgPSBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCk7Ci0KLQkvKiB1c2UgdGhlIE9wZW5TU0wgdmVyc2lvbiAqLwotCW1lbWNweSgmc21hcnRfcnNhLCBkZWYsIHNpemVvZihzbWFydF9yc2EpKTsKLQotCXNtYXJ0X3JzYS5uYW1lCQk9ICJvcGVuc2MiOwotCi0JLyogb3ZlcmxvYWQgKi8KLQlzbWFydF9yc2EucnNhX3ByaXZfZW5jCT0gc2NfcHJpdmF0ZV9lbmNyeXB0OwotCXNtYXJ0X3JzYS5yc2FfcHJpdl9kZWMJPSBzY19wcml2YXRlX2RlY3J5cHQ7Ci0Jc21hcnRfcnNhLnJzYV9zaWduCT0gc2Nfc2lnbjsKLQotCS8qIHNhdmUgb3JpZ2luYWwgKi8KLQlvcmlnX2ZpbmlzaAkJPSBkZWYtPmZpbmlzaDsKLQlzbWFydF9yc2EuZmluaXNoCT0gc2NfZmluaXNoOwotCi0JcmV0dXJuICZzbWFydF9yc2E7Ci19Ci0KLSNpZmRlZiBVU0VfRU5HSU5FCi1zdGF0aWMgRU5HSU5FICoKLXNjX2dldF9lbmdpbmUodm9pZCkKLXsKLQlzdGF0aWMgRU5HSU5FICpzbWFydF9lbmdpbmUgPSBOVUxMOwotCi0JaWYgKChzbWFydF9lbmdpbmUgPSBFTkdJTkVfbmV3KCkpID09IE5VTEwpCi0JCWZhdGFsKCJFTkdJTkVfbmV3IGZhaWxlZCIpOwotCi0JRU5HSU5FX3NldF9pZChzbWFydF9lbmdpbmUsICJvcGVuc2MiKTsKLQlFTkdJTkVfc2V0X25hbWUoc21hcnRfZW5naW5lLCAiT3BlblNDIik7Ci0KLQlFTkdJTkVfc2V0X1JTQShzbWFydF9lbmdpbmUsIHNjX2dldF9yc2FfbWV0aG9kKCkpOwotCUVOR0lORV9zZXRfRFNBKHNtYXJ0X2VuZ2luZSwgRFNBX2dldF9kZWZhdWx0X29wZW5zc2xfbWV0aG9kKCkpOwotCUVOR0lORV9zZXRfREgoc21hcnRfZW5naW5lLCBESF9nZXRfZGVmYXVsdF9vcGVuc3NsX21ldGhvZCgpKTsKLQlFTkdJTkVfc2V0X1JBTkQoc21hcnRfZW5naW5lLCBSQU5EX1NTTGVheSgpKTsKLQlFTkdJTkVfc2V0X0JOX21vZF9leHAoc21hcnRfZW5naW5lLCBCTl9tb2RfZXhwKTsKLQotCXJldHVybiBzbWFydF9lbmdpbmU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWNvbnZlcnRfcnNhX3RvX3JzYTEoS2V5ICogaW4sIEtleSAqIG91dCkKLXsKLQlzdHJ1Y3Qgc2NfcHJpdl9kYXRhICpwcml2OwotCi0Jb3V0LT5yc2EtPmZsYWdzID0gaW4tPnJzYS0+ZmxhZ3M7Ci0Jb3V0LT5mbGFncyA9IGluLT5mbGFnczsKLQlSU0Ffc2V0X21ldGhvZChvdXQtPnJzYSwgUlNBX2dldF9tZXRob2QoaW4tPnJzYSkpOwotCUJOX2NvcHkob3V0LT5yc2EtPm4sIGluLT5yc2EtPm4pOwotCUJOX2NvcHkob3V0LT5yc2EtPmUsIGluLT5yc2EtPmUpOwotCXByaXYgPSBSU0FfZ2V0X2FwcF9kYXRhKGluLT5yc2EpOwotCXByaXYtPnJlZl9jb3VudCsrOwotCVJTQV9zZXRfYXBwX2RhdGEob3V0LT5yc2EsIHByaXYpOwotCXJldHVybjsKLX0KLQotc3RhdGljIGludAotc2NfcmVhZF9wdWJrZXkoS2V5ICogaywgY29uc3Qgc3RydWN0IHNjX3BrY3MxNV9vYmplY3QgKmNlcnRfb2JqKQotewotCWludCByOwotCXNjX3BrY3MxNV9jZXJ0X3QgKmNlcnQgPSBOVUxMOwotCXN0cnVjdCBzY19wcml2X2RhdGEgKnByaXYgPSBOVUxMOwotCXNjX3BrY3MxNV9jZXJ0X2luZm9fdCAqY2luZm8gPSBjZXJ0X29iai0+ZGF0YTsKLQotCVg1MDkgKng1MDkgPSBOVUxMOwotCUVWUF9QS0VZICpwdWJrZXkgPSBOVUxMOwotCXU4ICpwOwotCWNoYXIgKnRtcDsKLQotCWRlYnVnKCJzY19yZWFkX3B1YmtleSgpIHdpdGggY2VydCBpZCAlMDJYIiwgY2luZm8tPmlkLnZhbHVlWzBdKTsKLQlyID0gc2NfcGtjczE1X3JlYWRfY2VydGlmaWNhdGUocDE1Y2FyZCwgY2luZm8sICZjZXJ0KTsKLQlpZiAocikgewotCQlsb2dpdCgiQ2VydGlmaWNhdGUgcmVhZCBmYWlsZWQ6ICVzIiwgc2Nfc3RyZXJyb3IocikpOwotCQlnb3RvIGVycjsKLQl9Ci0JeDUwOSA9IFg1MDlfbmV3KCk7Ci0JaWYgKHg1MDkgPT0gTlVMTCkgewotCQlyID0gLTE7Ci0JCWdvdG8gZXJyOwotCX0KLQlwID0gY2VydC0+ZGF0YTsKLQlpZiAoIWQyaV9YNTA5KCZ4NTA5LCAmcCwgY2VydC0+ZGF0YV9sZW4pKSB7Ci0JCWxvZ2l0KCJVbmFibGUgdG8gcGFyc2UgWC41MDkgY2VydGlmaWNhdGUiKTsKLQkJciA9IC0xOwotCQlnb3RvIGVycjsKLQl9Ci0Jc2NfcGtjczE1X2ZyZWVfY2VydGlmaWNhdGUoY2VydCk7Ci0JY2VydCA9IE5VTEw7Ci0JcHVia2V5ID0gWDUwOV9nZXRfcHVia2V5KHg1MDkpOwotCVg1MDlfZnJlZSh4NTA5KTsKLQl4NTA5ID0gTlVMTDsKLQlpZiAocHVia2V5LT50eXBlICE9IEVWUF9QS0VZX1JTQSkgewotCQlsb2dpdCgiUHVibGljIGtleSBpcyBvZiB1bmtub3duIHR5cGUiKTsKLQkJciA9IC0xOwotCQlnb3RvIGVycjsKLQl9Ci0Jay0+cnNhID0gRVZQX1BLRVlfZ2V0MV9SU0EocHVia2V5KTsKLQlFVlBfUEtFWV9mcmVlKHB1YmtleSk7Ci0KLQlrLT5yc2EtPmZsYWdzIHw9IFJTQV9GTEFHX1NJR05fVkVSOwotCVJTQV9zZXRfbWV0aG9kKGstPnJzYSwgc2NfZ2V0X3JzYV9tZXRob2QoKSk7Ci0JcHJpdiA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY19wcml2X2RhdGEpKTsKLQlwcml2LT5jZXJ0X2lkID0gY2luZm8tPmlkOwotCXByaXYtPnJlZl9jb3VudCA9IDE7Ci0JUlNBX3NldF9hcHBfZGF0YShrLT5yc2EsIHByaXYpOwotCi0Jay0+ZmxhZ3MgPSBLRVlfRkxBR19FWFQ7Ci0JdG1wID0ga2V5X2ZpbmdlcnByaW50KGssIFNTSF9GUF9NRDUsIFNTSF9GUF9IRVgpOwotCWRlYnVnKCJmaW5nZXJwcmludCAlZCAlcyIsIGtleV9zaXplKGspLCB0bXApOwotCXhmcmVlKHRtcCk7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlpZiAoY2VydCkKLQkJc2NfcGtjczE1X2ZyZWVfY2VydGlmaWNhdGUoY2VydCk7Ci0JaWYgKHB1YmtleSkKLQkJRVZQX1BLRVlfZnJlZShwdWJrZXkpOwotCWlmICh4NTA5KQotCQlYNTA5X2ZyZWUoeDUwOSk7Ci0JcmV0dXJuIHI7Ci19Ci0KLUtleSAqKgotc2NfZ2V0X2tleXMoY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnBpbikKLXsKLQlLZXkgKmssICoqa2V5czsKLQlpbnQgaSwgciwgcmVhbF9jb3VudCA9IDAsIGtleV9jb3VudDsKLQlzY19wa2NzMTVfaWRfdCBjZXJ0X2lkOwotCXNjX3BrY3MxNV9vYmplY3RfdCAqY2VydHNbMzJdOwotCWNoYXIgKmJ1ZiA9IHhzdHJkdXAoaWQpLCAqcDsKLQotCWRlYnVnKCJzY19nZXRfa2V5cyBjYWxsZWQ6IGlkID0gJXMiLCBpZCk7Ci0KLQlpZiAoc2NfcGluICE9IE5VTEwpCi0JCXhmcmVlKHNjX3Bpbik7Ci0Jc2NfcGluID0gKHBpbiA9PSBOVUxMKSA/IE5VTEwgOiB4c3RyZHVwKHBpbik7Ci0KLQljZXJ0X2lkLmxlbiA9IDA7Ci0JaWYgKChwID0gc3RyY2hyKGJ1ZiwgJzonKSkgIT0gTlVMTCkgewotCQkqcCA9IDA7Ci0JCXArKzsKLQkJc2NfcGtjczE1X2hleF9zdHJpbmdfdG9faWQocCwgJmNlcnRfaWQpOwotCX0KLQlyID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnNjX3JlYWRlcl9pZCk7Ci0JeGZyZWUoYnVmKTsKLQlpZiAociAhPSAxKQotCQlnb3RvIGVycjsKLQlpZiAocDE1Y2FyZCA9PSBOVUxMKSB7Ci0JCXNjX2Nsb3NlKCk7Ci0JCXIgPSBzY19pbml0KCk7Ci0JCWlmIChyKSB7Ci0JCQllcnJvcigiU21hcnRjYXJkIGluaXQgZmFpbGVkOiAlcyIsIHNjX3N0cmVycm9yKHIpKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCWlmIChjZXJ0X2lkLmxlbikgewotCQlyID0gc2NfcGtjczE1X2ZpbmRfY2VydF9ieV9pZChwMTVjYXJkLCAmY2VydF9pZCwgJmNlcnRzWzBdKTsKLQkJaWYgKHIgPCAwKQotCQkJZ290byBlcnI7Ci0JCWtleV9jb3VudCA9IDE7Ci0JfSBlbHNlIHsKLQkJciA9IHNjX3BrY3MxNV9nZXRfb2JqZWN0cyhwMTVjYXJkLCBTQ19QS0NTMTVfVFlQRV9DRVJUX1g1MDksCi0JCQkJCSAgY2VydHMsIDMyKTsKLQkJaWYgKHIgPT0gMCkgewotCQkJbG9naXQoIk5vIGNlcnRpZmljYXRlcyBmb3VuZCBvbiBzbWFydGNhcmQiKTsKLQkJCXIgPSAtMTsKLQkJCWdvdG8gZXJyOwotCQl9IGVsc2UgaWYgKHIgPCAwKSB7Ci0JCQllcnJvcigiQ2VydGlmaWNhdGUgZW51bWVyYXRpb24gZmFpbGVkOiAlcyIsCi0JCQkgICAgICBzY19zdHJlcnJvcihyKSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlrZXlfY291bnQgPSByOwotCX0KLQlpZiAoa2V5X2NvdW50ID4gMTAyNCkKLQkJZmF0YWwoIlRvbyBtYW55IGtleXMgKCV1KSwgZXhwZWN0ZWQgPD0gMTAyNCIsIGtleV9jb3VudCk7Ci0Ja2V5cyA9IHhjYWxsb2Moa2V5X2NvdW50ICogMiArIDEsIHNpemVvZihLZXkgKikpOwotCWZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7IGkrKykgewotCQlzY19wa2NzMTVfb2JqZWN0X3QgKnRtcF9vYmogPSBOVUxMOwotCQljZXJ0X2lkID0gKChzY19wa2NzMTVfY2VydF9pbmZvX3QgKikoY2VydHNbaV0tPmRhdGEpKS0+aWQ7Ci0JCWlmIChzY19wa2NzMTVfZmluZF9wcmtleV9ieV9pZChwMTVjYXJkLCAmY2VydF9pZCwgJnRtcF9vYmopKQotCQkJLyogc2tpcCB0aGUgcHVibGljIGtleSAoY2VydGlmaWNhdGUpIGlmIG5vCi0JCQkgKiBjb3JyZXNwb25kaW5nIHByaXZhdGUga2V5IGlzIHByZXNlbnQgKi8KLQkJCWNvbnRpbnVlOwotCQlrID0ga2V5X25ldyhLRVlfUlNBKTsKLQkJaWYgKGsgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlyID0gc2NfcmVhZF9wdWJrZXkoaywgY2VydHNbaV0pOwotCQlpZiAocikgewotCQkJZXJyb3IoInNjX3JlYWRfcHVia2V5IGZhaWxlZDogJXMiLCBzY19zdHJlcnJvcihyKSk7Ci0JCQlrZXlfZnJlZShrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWtleXNbcmVhbF9jb3VudF0gPSBrOwotCQlyZWFsX2NvdW50Kys7Ci0JCWsgPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQkJaWYgKGsgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQljb252ZXJ0X3JzYV90b19yc2ExKGtleXNbcmVhbF9jb3VudC0xXSwgayk7Ci0JCWtleXNbcmVhbF9jb3VudF0gPSBrOwotCQlyZWFsX2NvdW50Kys7Ci0JfQotCWtleXNbcmVhbF9jb3VudF0gPSBOVUxMOwotCi0JcmV0dXJuIGtleXM7Ci1lcnI6Ci0Jc2NfY2xvc2UoKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotaW50Ci1zY19wdXRfa2V5KEtleSAqcHJ2LCBjb25zdCBjaGFyICppZCkKLXsKLQllcnJvcigia2V5IHVwbG9hZGluZyBub3QgeWV0IHN1cHBvcnRlZCIpOwotCXJldHVybiAtMTsKLX0KLQotY2hhciAqCi1zY19nZXRfa2V5X2xhYmVsKEtleSAqa2V5KQotewotCWludCByOwotCWNvbnN0IHN0cnVjdCBzY19wcml2X2RhdGEgKnByaXY7Ci0Jc3RydWN0IHNjX3BrY3MxNV9vYmplY3QgKmtleV9vYmo7Ci0KLQlwcml2ID0gKGNvbnN0IHN0cnVjdCBzY19wcml2X2RhdGEgKikgUlNBX2dldF9hcHBfZGF0YShrZXktPnJzYSk7Ci0JaWYgKHByaXYgPT0gTlVMTCB8fCBwMTVjYXJkID09IE5VTEwpIHsKLQkJbG9naXQoIlNtYXJ0Q2FyZCBrZXkgbm90IGxvYWRlZCIpOwotCQkvKiBpbnRlcm5hbCBlcnJvciA9PiByZXR1cm4gZGVmYXVsdCBsYWJlbCAqLwotCQlyZXR1cm4geHN0cmR1cCgic21hcnRjYXJkIGtleSIpOwotCX0KLQlyID0gc2NfcGtjczE1X2ZpbmRfcHJrZXlfYnlfaWQocDE1Y2FyZCwgJnByaXYtPmNlcnRfaWQsICZrZXlfb2JqKTsKLQlpZiAocikgewotCQlsb2dpdCgiVW5hYmxlIHRvIGZpbmQgcHJpdmF0ZSBrZXkgZnJvbSBTbWFydENhcmQ6ICVzIiwKLQkJICAgICAgc2Nfc3RyZXJyb3IocikpOwotCQlyZXR1cm4geHN0cmR1cCgic21hcnRjYXJkIGtleSIpOwotCX0KLQlpZiAoa2V5X29iaiA9PSBOVUxMIHx8IGtleV9vYmotPmxhYmVsID09IE5VTEwpCi0JCS8qIHRoZSBvcHRpb25hbCBQS0NTIzE1IGxhYmVsIGRvZXMgbm90IGV4aXN0cwotCQkgKiA9PiByZXR1cm4gdGhlIGRlZmF1bHQgbGFiZWwgKi8KLQkJcmV0dXJuIHhzdHJkdXAoInNtYXJ0Y2FyZCBrZXkiKTsKLQlyZXR1cm4geHN0cmR1cChrZXlfb2JqLT5sYWJlbCk7Ci19Ci0KLSNlbmRpZiAvKiBTTUFSVENBUkQgKi8KZGlmZiAtLWdpdCBhL3NjYXJkLmMgYi9zY2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQzY2ExLi4wMDAwMDAwCi0tLSBhL3NjYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzEgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNjYXJkLmMsdiAxLjM2IDIwMDYvMTEvMDYgMjE6MjU6MjggbWFya3VzIEV4cCAkICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZXMuaCIKLSNpZiBkZWZpbmVkKFNNQVJUQ0FSRCkgJiYgZGVmaW5lZChVU0VfU0VDVE9LKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzZWN0b2suaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0KLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAia2V5LmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAibWlzYy5oIgotI2luY2x1ZGUgInNjYXJkLmgiCi0KLSNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNzAwMEwKLSNkZWZpbmUgVVNFX0VOR0lORQotI2RlZmluZSBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kIFJTQV9nZXRfZGVmYXVsdF9vcGVuc3NsX21ldGhvZAotI2Vsc2UKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0VOR0lORQotI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+Ci0jZGVmaW5lIHNjX2dldF9yc2Egc2NfZ2V0X2VuZ2luZQotI2Vsc2UKLSNkZWZpbmUgc2NfZ2V0X3JzYSBzY19nZXRfcnNhX21ldGhvZAotI2VuZGlmCi0KLSNkZWZpbmUgQ0xBX1NTSCAweDA1Ci0jZGVmaW5lIElOU19ERUNSWVBUIDB4MTAKLSNkZWZpbmUgSU5TX0dFVF9LRVlMRU5HVEggMHgyMAotI2RlZmluZSBJTlNfR0VUX1BVQktFWSAweDMwCi0jZGVmaW5lIElOU19HRVRfUkVTUE9OU0UgMHhjMAotCi0jZGVmaW5lIE1BWF9CVUZfU0laRSAyNTYKLQotdV9jaGFyIERFRkFVVDBbXSA9IHsweGFkLCAweDlmLCAweDYxLCAweGZlLCAweGZhLCAweDIwLCAweGNlLCAweDYzfTsKLQotc3RhdGljIGludCBzY19mZCA9IC0xOwotc3RhdGljIGNoYXIgKnNjX3JlYWRlcl9pZCA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqc2NfcGluID0gTlVMTDsKLXN0YXRpYyBpbnQgY2xhID0gMHgwMDsJLyogY2xhc3MgKi8KLQotc3RhdGljIHZvaWQgc2NfbWtfZGlnZXN0KGNvbnN0IGNoYXIgKnBpbiwgdV9jaGFyICpkaWdlc3QpOwotc3RhdGljIGludCBnZXRfQVVUMCh1X2NoYXIgKmF1dDApOwotc3RhdGljIGludCB0cnlfQVVUMCh2b2lkKTsKLQotLyogaW50ZXJmYWNlIHRvIGxpYnNlY3RvayAqLwotCi1zdGF0aWMgaW50Ci1zY19vcGVuKHZvaWQpCi17Ci0JaW50IHN3OwotCi0JaWYgKHNjX2ZkID49IDApCi0JCXJldHVybiBzY19mZDsKLQotCXNjX2ZkID0gc2VjdG9rX2ZyaWVuZGx5X29wZW4oc2NfcmVhZGVyX2lkLCBTVE9OT1dBSVQsICZzdyk7Ci0JaWYgKHNjX2ZkIDwgMCkgewotCQllcnJvcigic2VjdG9rX29wZW4gZmFpbGVkOiAlcyIsIHNlY3Rva19nZXRfc3coc3cpKTsKLQkJcmV0dXJuIFNDQVJEX0VSUk9SX0ZBSUw7Ci0JfQotCWlmICghIHNlY3Rva19jYXJkcHJlc2VudChzY19mZCkpIHsKLQkJZGVidWcoInNtYXJ0Y2FyZCBpbiByZWFkZXIgJXMgbm90IHByZXNlbnQsIHNraXBwaW5nIiwKLQkJICAgIHNjX3JlYWRlcl9pZCk7Ci0JCXNjX2Nsb3NlKCk7Ci0JCXJldHVybiBTQ0FSRF9FUlJPUl9OT0NBUkQ7Ci0JfQotCWlmIChzZWN0b2tfcmVzZXQoc2NfZmQsIDAsIE5VTEwsICZzdykgPD0gMCkgewotCQllcnJvcigic2VjdG9rX3Jlc2V0IGZhaWxlZDogJXMiLCBzZWN0b2tfZ2V0X3N3KHN3KSk7Ci0JCXNjX2ZkID0gLTE7Ci0JCXJldHVybiBTQ0FSRF9FUlJPUl9GQUlMOwotCX0KLQlpZiAoKGNsYSA9IGN5YmVyZmxleF9pbnFfY2xhc3Moc2NfZmQpKSA8IDApCi0JCWNsYSA9IDA7Ci0KLQlkZWJ1Zygic2Nfb3BlbiBvayAlZCIsIHNjX2ZkKTsKLQlyZXR1cm4gc2NfZmQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXNjX2VuYWJsZV9hcHBsZXQodm9pZCkKLXsKLQlzdGF0aWMgdV9jaGFyIGFpZFtdID0gezB4ZmMsIDB4NTMsIDB4NzMsIDB4NjgsIDB4MmUsIDB4NjIsIDB4NjksIDB4NmV9OwotCWludCBzdyA9IDA7Ci0KLQkvKiBzZWxlY3QgYXBwbGV0IGlkICovCi0Jc2VjdG9rX2FwZHUoc2NfZmQsIGNsYSwgMHhhNCwgMHgwNCwgMCwgc2l6ZW9mIGFpZCwgYWlkLCAwLCBOVUxMLCAmc3cpOwotCWlmICghc2VjdG9rX3N3T0soc3cpKSB7Ci0JCWVycm9yKCJzZWN0b2tfYXBkdSBmYWlsZWQ6ICVzIiwgc2VjdG9rX2dldF9zdyhzdykpOwotCQlzY19jbG9zZSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zY19pbml0KHZvaWQpCi17Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IHNjX29wZW4oKTsKLQlpZiAoc3RhdHVzID09IFNDQVJEX0VSUk9SX05PQ0FSRCkgewotCQlyZXR1cm4gU0NBUkRfRVJST1JfTk9DQVJEOwotCX0KLQlpZiAoc3RhdHVzIDwgMCkgewotCQllcnJvcigic2Nfb3BlbiBmYWlsZWQiKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JaWYgKHNjX2VuYWJsZV9hcHBsZXQoKSA8IDApIHsKLQkJZXJyb3IoInNjX2VuYWJsZV9hcHBsZXQgZmFpbGVkIik7Ci0JCXJldHVybiBTQ0FSRF9FUlJPUl9BUFBMRVQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zY19yZWFkX3B1YmtleShLZXkgKiBrKQotewotCXVfY2hhciBidWZbMl0sICpuOwotCWNoYXIgKnA7Ci0JaW50IGxlbiwgc3csIHN0YXR1cyA9IC0xOwotCi0JbGVuID0gc3cgPSAwOwotCW4gPSBOVUxMOwotCi0JaWYgKHNjX2ZkIDwgMCkgewotCQlpZiAoc2NfaW5pdCgpIDwgMCkKLQkJCWdvdG8gZXJyOwotCX0KLQotCS8qIGdldCBrZXkgc2l6ZSAqLwotCXNlY3Rva19hcGR1KHNjX2ZkLCBDTEFfU1NILCBJTlNfR0VUX0tFWUxFTkdUSCwgMCwgMCwgMCwgTlVMTCwKLQkgICAgc2l6ZW9mKGJ1ZiksIGJ1ZiwgJnN3KTsKLQlpZiAoIXNlY3Rva19zd09LKHN3KSkgewotCQllcnJvcigiY291bGQgbm90IG9idGFpbiBrZXkgbGVuZ3RoOiAlcyIsIHNlY3Rva19nZXRfc3coc3cpKTsKLQkJZ290byBlcnI7Ci0JfQotCWxlbiA9IChidWZbMF0gPDwgOCkgfCBidWZbMV07Ci0JbGVuIC89IDg7Ci0JZGVidWcoIklOU19HRVRfS0VZTEVOR1RIOiBsZW4gJWQgc3cgJXMiLCBsZW4sIHNlY3Rva19nZXRfc3coc3cpKTsKLQotCW4gPSB4bWFsbG9jKGxlbik7Ci0JLyogZ2V0IG4gKi8KLQlzZWN0b2tfYXBkdShzY19mZCwgQ0xBX1NTSCwgSU5TX0dFVF9QVUJLRVksIDAsIDAsIDAsIE5VTEwsIGxlbiwgbiwgJnN3KTsKLQotCWlmIChzdyA9PSAweDY5ODIpIHsKLQkJaWYgKHRyeV9BVVQwKCkgPCAwKQotCQkJZ290byBlcnI7Ci0JCXNlY3Rva19hcGR1KHNjX2ZkLCBDTEFfU1NILCBJTlNfR0VUX1BVQktFWSwgMCwgMCwgMCwgTlVMTCwgbGVuLCBuLCAmc3cpOwotCX0KLQlpZiAoIXNlY3Rva19zd09LKHN3KSkgewotCQllcnJvcigiY291bGQgbm90IG9idGFpbiBwdWJsaWMga2V5OiAlcyIsIHNlY3Rva19nZXRfc3coc3cpKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JZGVidWcoIklOU19HRVRfS0VZTEVOR1RIOiBzdyAlcyIsIHNlY3Rva19nZXRfc3coc3cpKTsKLQotCWlmIChCTl9iaW4yYm4obiwgbGVuLCBrLT5yc2EtPm4pID09IE5VTEwpIHsKLQkJZXJyb3IoImNfcmVhZF9wdWJrZXk6IEJOX2JpbjJibiBmYWlsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogY3VycmVudGx5IHRoZSBqYXZhIGFwcGxldCBqdXN0IHN0b3JlcyAnbicgKi8KLQlpZiAoIUJOX3NldF93b3JkKGstPnJzYS0+ZSwgMzUpKSB7Ci0JCWVycm9yKCJjX3JlYWRfcHVia2V5OiBCTl9zZXRfd29yZChlLCAzNSkgZmFpbGVkIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXN0YXR1cyA9IDA7Ci0JcCA9IGtleV9maW5nZXJwcmludChrLCBTU0hfRlBfTUQ1LCBTU0hfRlBfSEVYKTsKLQlkZWJ1ZygiZmluZ2VycHJpbnQgJXUgJXMiLCBrZXlfc2l6ZShrKSwgcCk7Ci0JeGZyZWUocCk7Ci0KLWVycjoKLQlpZiAobiAhPSBOVUxMKQotCQl4ZnJlZShuKTsKLQlzY19jbG9zZSgpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIHByaXZhdGUga2V5IG9wZXJhdGlvbnMgKi8KLQotc3RhdGljIGludAotc2NfcHJpdmF0ZV9kZWNyeXB0KGludCBmbGVuLCB1X2NoYXIgKmZyb20sIHVfY2hhciAqdG8sIFJTQSAqcnNhLAotICAgIGludCBwYWRkaW5nKQotewotCXVfY2hhciAqcGFkZGVkID0gTlVMTDsKLQlpbnQgc3csIGxlbiwgb2xlbiwgc3RhdHVzID0gLTE7Ci0KLQlkZWJ1Zygic2NfcHJpdmF0ZV9kZWNyeXB0IGNhbGxlZCIpOwotCi0Jb2xlbiA9IGxlbiA9IHN3ID0gMDsKLQlpZiAoc2NfZmQgPCAwKSB7Ci0JCXN0YXR1cyA9IHNjX2luaXQoKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIGVycjsKLQl9Ci0JaWYgKHBhZGRpbmcgIT0gUlNBX1BLQ1MxX1BBRERJTkcpCi0JCWdvdG8gZXJyOwotCi0JbGVuID0gQk5fbnVtX2J5dGVzKHJzYS0+bik7Ci0JcGFkZGVkID0geG1hbGxvYyhsZW4pOwotCi0Jc2VjdG9rX2FwZHUoc2NfZmQsIENMQV9TU0gsIElOU19ERUNSWVBULCAwLCAwLCBsZW4sIGZyb20sIGxlbiwgcGFkZGVkLCAmc3cpOwotCi0JaWYgKHN3ID09IDB4Njk4MikgewotCQlpZiAodHJ5X0FVVDAoKSA8IDApCi0JCQlnb3RvIGVycjsKLQkJc2VjdG9rX2FwZHUoc2NfZmQsIENMQV9TU0gsIElOU19ERUNSWVBULCAwLCAwLCBsZW4sIGZyb20sIGxlbiwgcGFkZGVkLCAmc3cpOwotCX0KLQlpZiAoIXNlY3Rva19zd09LKHN3KSkgewotCQllcnJvcigic2NfcHJpdmF0ZV9kZWNyeXB0OiBJTlNfREVDUllQVCBmYWlsZWQ6ICVzIiwKLQkJICAgIHNlY3Rva19nZXRfc3coc3cpKTsKLQkJZ290byBlcnI7Ci0JfQotCW9sZW4gPSBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIodG8sIGxlbiwgcGFkZGVkICsgMSwgbGVuIC0gMSwKLQkgICAgbGVuKTsKLWVycjoKLQlpZiAocGFkZGVkKQotCQl4ZnJlZShwYWRkZWQpOwotCXNjX2Nsb3NlKCk7Ci0JcmV0dXJuIChvbGVuID49IDAgPyBvbGVuIDogc3RhdHVzKTsKLX0KLQotc3RhdGljIGludAotc2NfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCB1X2NoYXIgKmZyb20sIHVfY2hhciAqdG8sIFJTQSAqcnNhLAotICAgIGludCBwYWRkaW5nKQotewotCXVfY2hhciAqcGFkZGVkID0gTlVMTDsKLQlpbnQgc3csIGxlbiwgc3RhdHVzID0gLTE7Ci0KLQlsZW4gPSBzdyA9IDA7Ci0JaWYgKHNjX2ZkIDwgMCkgewotCQlzdGF0dXMgPSBzY19pbml0KCk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBlcnI7Ci0JfQotCWlmIChwYWRkaW5nICE9IFJTQV9QS0NTMV9QQURESU5HKQotCQlnb3RvIGVycjsKLQotCWRlYnVnKCJzY19wcml2YXRlX2VuY3J5cHQgY2FsbGVkIik7Ci0JbGVuID0gQk5fbnVtX2J5dGVzKHJzYS0+bik7Ci0JcGFkZGVkID0geG1hbGxvYyhsZW4pOwotCi0JaWYgKFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzEocGFkZGVkLCBsZW4sICh1X2NoYXIgKilmcm9tLCBmbGVuKSA8PSAwKSB7Ci0JCWVycm9yKCJSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8xIGZhaWxlZCIpOwotCQlnb3RvIGVycjsKLQl9Ci0Jc2VjdG9rX2FwZHUoc2NfZmQsIENMQV9TU0gsIElOU19ERUNSWVBULCAwLCAwLCBsZW4sIHBhZGRlZCwgbGVuLCB0bywgJnN3KTsKLQlpZiAoc3cgPT0gMHg2OTgyKSB7Ci0JCWlmICh0cnlfQVVUMCgpIDwgMCkKLQkJCWdvdG8gZXJyOwotCQlzZWN0b2tfYXBkdShzY19mZCwgQ0xBX1NTSCwgSU5TX0RFQ1JZUFQsIDAsIDAsIGxlbiwgcGFkZGVkLCBsZW4sIHRvLCAmc3cpOwotCX0KLQlpZiAoIXNlY3Rva19zd09LKHN3KSkgewotCQllcnJvcigic2NfcHJpdmF0ZV9lbmNyeXB0OiBJTlNfREVDUllQVCBmYWlsZWQ6ICVzIiwKLQkJICAgIHNlY3Rva19nZXRfc3coc3cpKTsKLQkJZ290byBlcnI7Ci0JfQotZXJyOgotCWlmIChwYWRkZWQpCi0JCXhmcmVlKHBhZGRlZCk7Ci0Jc2NfY2xvc2UoKTsKLQlyZXR1cm4gKGxlbiA+PSAwID8gbGVuIDogc3RhdHVzKTsKLX0KLQotLyogY2FsbGVkIG9uIGZyZWUgKi8KLQotc3RhdGljIGludCAoKm9yaWdfZmluaXNoKShSU0EgKnJzYSkgPSBOVUxMOwotCi1zdGF0aWMgaW50Ci1zY19maW5pc2goUlNBICpyc2EpCi17Ci0JaWYgKG9yaWdfZmluaXNoKQotCQlvcmlnX2ZpbmlzaChyc2EpOwotCXNjX2Nsb3NlKCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIGVuZ2luZSBmb3Igb3ZlcmxvYWRpbmcgcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucyAqLwotCi1zdGF0aWMgUlNBX01FVEhPRCAqCi1zY19nZXRfcnNhX21ldGhvZCh2b2lkKQotewotCXN0YXRpYyBSU0FfTUVUSE9EIHNtYXJ0X3JzYTsKLQljb25zdCBSU0FfTUVUSE9EICpkZWYgPSBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCk7Ci0KLQkvKiB1c2UgdGhlIE9wZW5TU0wgdmVyc2lvbiAqLwotCW1lbWNweSgmc21hcnRfcnNhLCBkZWYsIHNpemVvZihzbWFydF9yc2EpKTsKLQotCXNtYXJ0X3JzYS5uYW1lCQk9ICJzZWN0b2siOwotCi0JLyogb3ZlcmxvYWQgKi8KLQlzbWFydF9yc2EucnNhX3ByaXZfZW5jCT0gc2NfcHJpdmF0ZV9lbmNyeXB0OwotCXNtYXJ0X3JzYS5yc2FfcHJpdl9kZWMJPSBzY19wcml2YXRlX2RlY3J5cHQ7Ci0KLQkvKiBzYXZlIG9yaWdpbmFsICovCi0Jb3JpZ19maW5pc2gJCT0gZGVmLT5maW5pc2g7Ci0Jc21hcnRfcnNhLmZpbmlzaAk9IHNjX2ZpbmlzaDsKLQotCXJldHVybiAmc21hcnRfcnNhOwotfQotCi0jaWZkZWYgVVNFX0VOR0lORQotc3RhdGljIEVOR0lORSAqCi1zY19nZXRfZW5naW5lKHZvaWQpCi17Ci0Jc3RhdGljIEVOR0lORSAqc21hcnRfZW5naW5lID0gTlVMTDsKLQotCWlmICgoc21hcnRfZW5naW5lID0gRU5HSU5FX25ldygpKSA9PSBOVUxMKQotCQlmYXRhbCgiRU5HSU5FX25ldyBmYWlsZWQiKTsKLQotCUVOR0lORV9zZXRfaWQoc21hcnRfZW5naW5lLCAic2VjdG9rIik7Ci0JRU5HSU5FX3NldF9uYW1lKHNtYXJ0X2VuZ2luZSwgImxpYnNlY3RvayIpOwotCi0JRU5HSU5FX3NldF9SU0Eoc21hcnRfZW5naW5lLCBzY19nZXRfcnNhX21ldGhvZCgpKTsKLQlFTkdJTkVfc2V0X0RTQShzbWFydF9lbmdpbmUsIERTQV9nZXRfZGVmYXVsdF9vcGVuc3NsX21ldGhvZCgpKTsKLQlFTkdJTkVfc2V0X0RIKHNtYXJ0X2VuZ2luZSwgREhfZ2V0X2RlZmF1bHRfb3BlbnNzbF9tZXRob2QoKSk7Ci0JRU5HSU5FX3NldF9SQU5EKHNtYXJ0X2VuZ2luZSwgUkFORF9TU0xlYXkoKSk7Ci0JRU5HSU5FX3NldF9CTl9tb2RfZXhwKHNtYXJ0X2VuZ2luZSwgQk5fbW9kX2V4cCk7Ci0KLQlyZXR1cm4gc21hcnRfZW5naW5lOwotfQotI2VuZGlmCi0KLXZvaWQKLXNjX2Nsb3NlKHZvaWQpCi17Ci0JaWYgKHNjX2ZkID49IDApIHsKLQkJc2VjdG9rX2Nsb3NlKHNjX2ZkKTsKLQkJc2NfZmQgPSAtMTsKLQl9Ci19Ci0KLUtleSAqKgotc2NfZ2V0X2tleXMoY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnBpbikKLXsKLQlLZXkgKmssICpuLCAqKmtleXM7Ci0JaW50IHN0YXR1cywgbmtleXMgPSAyOwotCi0JaWYgKHNjX3JlYWRlcl9pZCAhPSBOVUxMKQotCQl4ZnJlZShzY19yZWFkZXJfaWQpOwotCXNjX3JlYWRlcl9pZCA9IHhzdHJkdXAoaWQpOwotCi0JaWYgKHNjX3BpbiAhPSBOVUxMKQotCQl4ZnJlZShzY19waW4pOwotCXNjX3BpbiA9IChwaW4gPT0gTlVMTCkgPyBOVUxMIDogeHN0cmR1cChwaW4pOwotCi0JayA9IGtleV9uZXcoS0VZX1JTQSk7Ci0JaWYgKGsgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RhdHVzID0gc2NfcmVhZF9wdWJrZXkoayk7Ci0JaWYgKHN0YXR1cyA9PSBTQ0FSRF9FUlJPUl9OT0NBUkQpIHsKLQkJa2V5X2ZyZWUoayk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc3RhdHVzIDwgMCkgewotCQllcnJvcigic2NfcmVhZF9wdWJrZXkgZmFpbGVkIik7Ci0JCWtleV9mcmVlKGspOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Ja2V5cyA9IHhjYWxsb2MoKG5rZXlzKzEpLCBzaXplb2YoS2V5ICopKTsKLQotCW4gPSBrZXlfbmV3KEtFWV9SU0ExKTsKLQlpZiAoKEJOX2NvcHkobi0+cnNhLT5uLCBrLT5yc2EtPm4pID09IE5VTEwpIHx8Ci0JICAgIChCTl9jb3B5KG4tPnJzYS0+ZSwgay0+cnNhLT5lKSA9PSBOVUxMKSkKLQkJZmF0YWwoInNjX2dldF9rZXlzOiBCTl9jb3B5IGZhaWxlZCIpOwotCVJTQV9zZXRfbWV0aG9kKG4tPnJzYSwgc2NfZ2V0X3JzYSgpKTsKLQluLT5mbGFncyB8PSBLRVlfRkxBR19FWFQ7Ci0Ja2V5c1swXSA9IG47Ci0KLQluID0ga2V5X25ldyhLRVlfUlNBKTsKLQlpZiAoKEJOX2NvcHkobi0+cnNhLT5uLCBrLT5yc2EtPm4pID09IE5VTEwpIHx8Ci0JICAgIChCTl9jb3B5KG4tPnJzYS0+ZSwgay0+cnNhLT5lKSA9PSBOVUxMKSkKLQkJZmF0YWwoInNjX2dldF9rZXlzOiBCTl9jb3B5IGZhaWxlZCIpOwotCVJTQV9zZXRfbWV0aG9kKG4tPnJzYSwgc2NfZ2V0X3JzYSgpKTsKLQluLT5mbGFncyB8PSBLRVlfRkxBR19FWFQ7Ci0Ja2V5c1sxXSA9IG47Ci0KLQlrZXlzWzJdID0gTlVMTDsKLQotCWtleV9mcmVlKGspOwotCXJldHVybiBrZXlzOwotfQotCi0jZGVmaW5lIE5VTV9SU0FfS0VZX0VMRU1FTlRTIDUrMQotI2RlZmluZSBDT1BZX1JTQV9LRVkoeCwgaSkgXAotCWRvIHsgXAotCQlsZW4gPSBCTl9udW1fYnl0ZXMocHJ2LT5yc2EtPngpOyBcCi0JCWVsZW1lbnRzW2ldID0geG1hbGxvYyhsZW4pOyBcCi0JCWRlYnVnKCIjYnl0ZXMgJWQiLCBsZW4pOyBcCi0JCWlmIChCTl9ibjJiaW4ocHJ2LT5yc2EtPngsIGVsZW1lbnRzW2ldKSA8IDApIFwKLQkJCWdvdG8gZG9uZTsgXAotCX0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkCi1zY19ta19kaWdlc3QoY29uc3QgY2hhciAqcGluLCB1X2NoYXIgKmRpZ2VzdCkKLXsKLQljb25zdCBFVlBfTUQgKmV2cF9tZCA9IEVWUF9zaGExKCk7Ci0JRVZQX01EX0NUWCBtZDsKLQotCUVWUF9EaWdlc3RJbml0KCZtZCwgZXZwX21kKTsKLQlFVlBfRGlnZXN0VXBkYXRlKCZtZCwgcGluLCBzdHJsZW4ocGluKSk7Ci0JRVZQX0RpZ2VzdEZpbmFsKCZtZCwgZGlnZXN0LCBOVUxMKTsKLX0KLQotc3RhdGljIGludAotZ2V0X0FVVDAodV9jaGFyICphdXQwKQotewotCWNoYXIgKnBhc3M7Ci0KLQlwYXNzID0gcmVhZF9wYXNzcGhyYXNlKCJFbnRlciBwYXNzcGhyYXNlIGZvciBzbWFydGNhcmQ6ICIsIFJQX0FMTE9XX1NURElOKTsKLQlpZiAocGFzcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFzdHJjbXAocGFzcywgIi0iKSkgewotCQltZW1jcHkoYXV0MCwgREVGQVVUMCwgc2l6ZW9mIERFRkFVVDApOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2NfbWtfZGlnZXN0KHBhc3MsIGF1dDApOwotCW1lbXNldChwYXNzLCAwLCBzdHJsZW4ocGFzcykpOwotCXhmcmVlKHBhc3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci10cnlfQVVUMCh2b2lkKQotewotCXVfY2hhciBhdXQwW0VWUF9NQVhfTURfU0laRV07Ci0KLQkvKiBwZXJtaXNzaW9uIGRlbmllZDsgdHJ5IFBJTiBpZiBwcm92aWRlZCAqLwotCWlmIChzY19waW4gJiYgc3RybGVuKHNjX3BpbikgPiAwKSB7Ci0JCXNjX21rX2RpZ2VzdChzY19waW4sIGF1dDApOwotCQlpZiAoY3liZXJmbGV4X3ZlcmlmeV9BVVQwKHNjX2ZkLCBjbGEsIGF1dDAsIDgpIDwgMCkgewotCQkJZXJyb3IoInNtYXJ0Y2FyZCBwYXNzcGhyYXNlIGluY29ycmVjdCIpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiB0cnkgZGVmYXVsdCBBVVQwIGtleSAqLwotCQlpZiAoY3liZXJmbGV4X3ZlcmlmeV9BVVQwKHNjX2ZkLCBjbGEsIERFRkFVVDAsIDgpIDwgMCkgewotCQkJLyogZGVmYXVsdCBBVVQwIGtleSBmYWlsZWQ7IHByb21wdCBmb3IgcGFzc3BocmFzZSAqLwotCQkJaWYgKGdldF9BVVQwKGF1dDApIDwgMCB8fAotCQkJICAgIGN5YmVyZmxleF92ZXJpZnlfQVVUMChzY19mZCwgY2xhLCBhdXQwLCA4KSA8IDApIHsKLQkJCQllcnJvcigic21hcnRjYXJkIHBhc3NwaHJhc2UgaW5jb3JyZWN0Iik7Ci0JCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotaW50Ci1zY19wdXRfa2V5KEtleSAqcHJ2LCBjb25zdCBjaGFyICppZCkKLXsKLQl1X2NoYXIgKmVsZW1lbnRzW05VTV9SU0FfS0VZX0VMRU1FTlRTXTsKLQl1X2NoYXIga2V5X2ZpZFsyXTsKLQl1X2NoYXIgQVVUMFtFVlBfTUFYX01EX1NJWkVdOwotCWludCBsZW4sIHN0YXR1cyA9IC0xLCBpLCBmZCA9IC0xLCByZXQ7Ci0JaW50IHN3ID0gMCwgY2xhID0gMHgwMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fUlNBX0tFWV9FTEVNRU5UUzsgaSsrKQotCQllbGVtZW50c1tpXSA9IE5VTEw7Ci0KLQlDT1BZX1JTQV9LRVkocSwgMCk7Ci0JQ09QWV9SU0FfS0VZKHAsIDEpOwotCUNPUFlfUlNBX0tFWShpcW1wLCAyKTsKLQlDT1BZX1JTQV9LRVkoZG1xMSwgMyk7Ci0JQ09QWV9SU0FfS0VZKGRtcDEsIDQpOwotCUNPUFlfUlNBX0tFWShuLCA1KTsKLQlsZW4gPSBCTl9udW1fYnl0ZXMocHJ2LT5yc2EtPm4pOwotCWZkID0gc2VjdG9rX2ZyaWVuZGx5X29wZW4oaWQsIFNUT05PV0FJVCwgJnN3KTsKLQlpZiAoZmQgPCAwKSB7Ci0JCWVycm9yKCJzZWN0b2tfb3BlbiBmYWlsZWQ6ICVzIiwgc2VjdG9rX2dldF9zdyhzdykpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICghIHNlY3Rva19jYXJkcHJlc2VudChmZCkpIHsKLQkJZXJyb3IoInNtYXJ0Y2FyZCBpbiByZWFkZXIgJXMgbm90IHByZXNlbnQiLCBpZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gc2VjdG9rX3Jlc2V0KGZkLCAwLCBOVUxMLCAmc3cpOwotCWlmIChyZXQgPD0gMCkgewotCQllcnJvcigic2VjdG9rX3Jlc2V0IGZhaWxlZDogJXMiLCBzZWN0b2tfZ2V0X3N3KHN3KSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKChjbGEgPSBjeWJlcmZsZXhfaW5xX2NsYXNzKGZkKSkgPCAwKSB7Ci0JCWVycm9yKCJjeWJlcmZsZXhfaW5xX2NsYXNzIGZhaWxlZCIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCW1lbWNweShBVVQwLCBERUZBVVQwLCBzaXplb2YoREVGQVVUMCkpOwotCWlmIChjeWJlcmZsZXhfdmVyaWZ5X0FVVDAoZmQsIGNsYSwgQVVUMCwgc2l6ZW9mKERFRkFVVDApKSA8IDApIHsKLQkJaWYgKGdldF9BVVQwKEFVVDApIDwgMCB8fAotCQkgICAgY3liZXJmbGV4X3ZlcmlmeV9BVVQwKGZkLCBjbGEsIEFVVDAsIHNpemVvZihERUZBVVQwKSkgPCAwKSB7Ci0JCQltZW1zZXQoQVVUMCwgMCwgc2l6ZW9mKERFRkFVVDApKTsKLQkJCWVycm9yKCJzbWFydGNhcmQgcGFzc3BocmFzZSBpbmNvcnJlY3QiKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQltZW1zZXQoQVVUMCwgMCwgc2l6ZW9mKERFRkFVVDApKTsKLQlrZXlfZmlkWzBdID0gMHgwMDsKLQlrZXlfZmlkWzFdID0gMHgxMjsKLQlpZiAoY3liZXJmbGV4X2xvYWRfcnNhX3ByaXYoZmQsIGNsYSwga2V5X2ZpZCwgNSwgOCpsZW4sIGVsZW1lbnRzLAotCSAgICAmc3cpIDwgMCkgewotCQllcnJvcigiY3liZXJmbGV4X2xvYWRfcnNhX3ByaXYgZmFpbGVkOiAlcyIsIHNlY3Rva19nZXRfc3coc3cpKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXNlY3Rva19zd09LKHN3KSkKLQkJZ290byBkb25lOwotCWxvZ2l0KCJjeWJlcmZsZXhfbG9hZF9yc2FfcHJpdiBkb25lIik7Ci0Ja2V5X2ZpZFswXSA9IDB4NzM7Ci0Ja2V5X2ZpZFsxXSA9IDB4Njg7Ci0JaWYgKGN5YmVyZmxleF9sb2FkX3JzYV9wdWIoZmQsIGNsYSwga2V5X2ZpZCwgbGVuLCBlbGVtZW50c1s1XSwKLQkgICAgJnN3KSA8IDApIHsKLQkJZXJyb3IoImN5YmVyZmxleF9sb2FkX3JzYV9wdWIgZmFpbGVkOiAlcyIsIHNlY3Rva19nZXRfc3coc3cpKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXNlY3Rva19zd09LKHN3KSkKLQkJZ290byBkb25lOwotCWxvZ2l0KCJjeWJlcmZsZXhfbG9hZF9yc2FfcHViIGRvbmUiKTsKLQlzdGF0dXMgPSAwOwotCi1kb25lOgotCW1lbXNldChlbGVtZW50c1swXSwgJ1wwJywgQk5fbnVtX2J5dGVzKHBydi0+cnNhLT5xKSk7Ci0JbWVtc2V0KGVsZW1lbnRzWzFdLCAnXDAnLCBCTl9udW1fYnl0ZXMocHJ2LT5yc2EtPnApKTsKLQltZW1zZXQoZWxlbWVudHNbMl0sICdcMCcsIEJOX251bV9ieXRlcyhwcnYtPnJzYS0+aXFtcCkpOwotCW1lbXNldChlbGVtZW50c1szXSwgJ1wwJywgQk5fbnVtX2J5dGVzKHBydi0+cnNhLT5kbXExKSk7Ci0JbWVtc2V0KGVsZW1lbnRzWzRdLCAnXDAnLCBCTl9udW1fYnl0ZXMocHJ2LT5yc2EtPmRtcDEpKTsKLQltZW1zZXQoZWxlbWVudHNbNV0sICdcMCcsIEJOX251bV9ieXRlcyhwcnYtPnJzYS0+bikpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9SU0FfS0VZX0VMRU1FTlRTOyBpKyspCi0JCWlmIChlbGVtZW50c1tpXSkKLQkJCXhmcmVlKGVsZW1lbnRzW2ldKTsKLQlpZiAoZmQgIT0gLTEpCi0JCXNlY3Rva19jbG9zZShmZCk7Ci0JcmV0dXJuIChzdGF0dXMpOwotfQotCi1jaGFyICoKLXNjX2dldF9rZXlfbGFiZWwoS2V5ICprZXkpCi17Ci0JcmV0dXJuIHhzdHJkdXAoInNtYXJ0Y2FyZCBrZXkiKTsKLX0KLQotI2VuZGlmIC8qIFNNQVJUQ0FSRCAmJiBVU0VfU0VDVE9LICovCmRpZmYgLS1naXQgYS9zY2FyZC5oIGIvc2NhcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlZmU0OC4uMDAwMDAwMAotLS0gYS9zY2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogJE9wZW5CU0Q6IHNjYXJkLmgsdiAxLjE0IDIwMDYvMDgvMDMgMDM6MzQ6NDIgZGVyYWFkdCBFeHAgJCAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIE1hcmt1cyBGcmllZGwuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIFNDQVJEX0gKLSNkZWZpbmUgU0NBUkRfSAotCi0jZGVmaW5lIFNDQVJEX0VSUk9SX0ZBSUwJLTEKLSNkZWZpbmUgU0NBUkRfRVJST1JfTk9DQVJECS0yCi0jZGVmaW5lIFNDQVJEX0VSUk9SX0FQUExFVAktMwotCi1LZXkJKipzY19nZXRfa2V5cyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci12b2lkCSBzY19jbG9zZSh2b2lkKTsKLWludAkgc2NfcHV0X2tleShLZXkgKiwgY29uc3QgY2hhciAqKTsKLWNoYXIJKnNjX2dldF9rZXlfbGFiZWwoS2V5ICopOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NjYXJkL01ha2VmaWxlLmluIGIvc2NhcmQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTllMjAuLjAwMDAwMDAKLS0tIGEvc2NhcmQvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jICRJZDogTWFrZWZpbGUuaW4sdiAxLjUgMjAwNi8xMC8yMyAyMTo0NDo0NyB0aW0gRXhwICQKLQotcHJlZml4PUBwcmVmaXhACi1kYXRhZGlyPUBkYXRhZGlyQAotZGF0YXJvb3RkaXI9QGRhdGFyb290ZGlyQAotc3JjZGlyPUBzcmNkaXJACi10b3Bfc3JjZGlyPUB0b3Bfc3JjZGlyQAotCi1JTlNUQUxMPUBJTlNUQUxMQAotCi1WUEFUSD1Ac3JjZGlyQAotCi1hbGw6Ci0KLSNTc2guYmluOiAgU3NoLmJpbi51dQotIwl1dWRlY29kZSBTc2guYmluLnV1Ci0KLWNsZWFuOgotIwlybSAtcmYgU3NoLmJpbgotCi1kaXN0cHJlcDoKLQl1dWRlY29kZSBTc2guYmluLnV1Ci0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSAqfgotCi1pbnN0YWxsOiAkKHNyY2RpcikvU3NoLmJpbgotCSQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKERFU1RESVIpJChkYXRhZGlyKQotCSQoSU5TVEFMTCkgLW0gMDY0NCAkKHNyY2RpcikvU3NoLmJpbiAkKERFU1RESVIpJChkYXRhZGlyKS9Tc2guYmluCmRpZmYgLS1naXQgYS9zY2FyZC9Tc2guYmluLnV1IGIvc2NhcmQvU3NoLmJpbi51dQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzOTg2YS4uMDAwMDAwMAotLS0gYS9zY2FyZC9Tc2guYmluLnV1CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotYmVnaW4gNjQ0IFNzaC5iaW4KLU1gUCkhJlBgODAxWGA+YGAhYEVAImAvWUBcYDRgX0onUCEwISEmVCQ9YD9aQFxgNGAwMU0hJ2AnXj4vLCEKLU1gNCQ7MDFYIV9HI1MlUCdeMF0sMWA/WUBcITBgX0cvUycwI148XTRgYEQkO0xgNGBfRiczYGAjXjg9LCUKLU1gL1pBVGAkIV9KIzApUCdeSF0sKmA/WkNUUERgX0cvNSJQN144PSwnYE9aQVRgSGBfSiMwJEAzXjotLEAKLU1gVCQ7YFBgJWAvWUBgPFBgYCQkPFxAXGBgJCQ9XEIkYGAkJD5cQWBgYC9gMF9fKCVgQDghYDBIYGAmYGAKLU0wMjA1ISFEKUkkTGAiMEowYCZgYCohNCQmNThgYGBgYGAuUGBgYGAlX19fX1BgYGBgLkRgYGBgMGBgYGAKLU0sUGBgYCJgYGBgIydgYGBgLGBgYGAoVGBgYGBSYGBgYFYhNCMmMEEqYGBEKjtAIUBgIkA1IVFEKmAvXF0KLU0oNmBgMUEpKmBgRCo5UCFAYCJAKi9QIUBgJExLIjEpQGAkTEshNmBgNCFQJCMwMCMyQGAuIzAxQGAlNUAKLU1gJUlAYCJAMzdgYD4lMEAyJTBBPmAlXCgkRmBgOSUoYDpgSF9gJmBgMlJMKjxWQUBgJExLOGAhSSIxYFUKLU0oMTQjYFEpQGAmWDwhYFQkYFRMYCJQLDI4YCFENEBgLiMwMUBgJTVAYCVJQGAiQTJgIlg1YFBIJGAmYGAKLU08UkwjITZgYDklKGAnMTQjIkAkIjhgIVMqUCwlOGAhRDRAYCw0QGApIkZUYDhgYEg2MGBgXGArX1xAJCEKLU1gMERgImBgYCJJYGA4YGBINjAjUCRfX1JgMCQiIjBgLGBgIUIwMUxNN1BgXCpVRGBgYCNQJE9fVmAwJCMKLU1gMGA4YGBgMzdgYD43QGBSMTBgLyRVUGAnQEhgUmBEMDdAYFchJT5QIT9fUmAwJCRgQGBcYGBgMzdQYGAKLU0kViteSDJVP2BgNT1gYEgzOE9aQCs1XGAjVVRgJSEtQl9HQE0iQDBgN1BgOTcwYD4iQDBgOGBgQzEwYCkKLS8iRjxgOGBgSCRVWGArNURgYGBgYAotYAotZW5kCmRpZmYgLS1naXQgYS9zY2FyZC9Tc2guamF2YSBiL3NjYXJkL1NzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDE4OTU3Li4wMDAwMDAwCi0tLSBhL3NjYXJkL1NzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vICRJZDogU3NoLmphdmEsdiAxLjMgMjAwMi8wNS8yMiAwNDoyNDowMiBkam0gRXhwICQKLS8vCi0vLyBTc2guamF2YQotLy8gU1NIIC8gc21hcnRjYXJkIGludGVncmF0aW9uIHByb2plY3QsIHNtYXJ0Y2FyZCBzaWRlCi0vLwotLy8gVG9tb2tvIEZ1a3V6YXdhLCBjcmVhdGVkLCBGZWIuLCAyMDAwCi0vLwotLy8gTmFvbWFydSBJdG9pLCBtb2RpZmllZCwgQXByLiwgMjAwMAotLy8KLQotLy8gY29weXJpZ2h0IDIwMDAKLS8vIHRoZSByZWdlbnRzIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuCi0vLyBhbGwgcmlnaHRzIHJlc2VydmVkCi0vLwotLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgY3JlYXRlIGRlcml2YXRpdmUgd29ya3MKLS8vIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzCi0vLyBmb3IgYW55IHB1cnBvc2UsIHNvIGxvbmcgYXMgdGhlIG5hbWUgb2YgdGhlIHVuaXZlcnNpdHkgb2YKLS8vIG1pY2hpZ2FuIGlzIG5vdCB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKLS8vIHBlcnRhaW5pbmcgdG8gdGhlIHVzZSBvciBkaXN0cmlidXRpb24gb2YgdGhpcyBzb2Z0d2FyZQotLy8gd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBhdXRob3JpemF0aW9uLiAgaWYgdGhlCi0vLyBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIG9yIGFueSBvdGhlciBpZGVudGlmaWNhdGlvbiBvZiB0aGUKLS8vIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gaXMgaW5jbHVkZWQgaW4gYW55IGNvcHkgb2YgYW55Ci0vLyBwb3J0aW9uIG9mIHRoaXMgc29mdHdhcmUsIHRoZW4gdGhlIGRpc2NsYWltZXIgYmVsb3cgbXVzdAotLy8gYWxzbyBiZSBpbmNsdWRlZC4KLS8vCi0vLyB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzIGlzLCB3aXRob3V0IHJlcHJlc2VudGF0aW9uCi0vLyBmcm9tIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGFzIHRvIGl0cyBmaXRuZXNzIGZvciBhbnkKLS8vIHB1cnBvc2UsIGFuZCB3aXRob3V0IHdhcnJhbnR5IGJ5IHRoZSB1bml2ZXJzaXR5IG9mCi0vLyBtaWNoaWdhbiBvZiBhbnkga2luZCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nCi0vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZgotLy8gbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gdGhlCi0vLyByZWdlbnRzIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIHNoYWxsIG5vdCBiZSBsaWFibGUKLS8vIGZvciBhbnkgZGFtYWdlcywgaW5jbHVkaW5nIHNwZWNpYWwsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBvcgotLy8gY29uc2VxdWVudGlhbCBkYW1hZ2VzLCB3aXRoIHJlc3BlY3QgdG8gYW55IGNsYWltIGFyaXNpbmcKLS8vIG91dCBvZiBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlIHVzZSBvZiB0aGUgc29mdHdhcmUsIGV2ZW4KLS8vIGlmIGl0IGhhcyBiZWVuIG9yIGlzIGhlcmVhZnRlciBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZgotLy8gc3VjaCBkYW1hZ2VzLgotCi1pbXBvcnQgamF2YWNhcmQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgamF2YWNhcmR4LmZyYW1ld29yay4qOwotaW1wb3J0IGphdmFjYXJkeC5jcnlwdG8uKjsKLQotcHVibGljIGNsYXNzIFNzaCBleHRlbmRzIGphdmFjYXJkLmZyYW1ld29yay5BcHBsZXQKLXsKLSAgICAvLyBDaGFuZ2UgdGhpcyB3aGVuIHRoZSBhcHBsZXQgY2hhbmdlczsgaGkgYnl0ZSBpcyBtYWpvciwgbG93IGJ5dGUgaXMgbWlub3IKLSAgICBzdGF0aWMgZmluYWwgc2hvcnQgYXBwbGV0X3ZlcnNpb24gPSAoc2hvcnQpMHgwMTAyOwotCi0gICAgLyogY29uc3RhbnRzIGRlY2xhcmF0aW9uICovCi0gICAgLy8gY29kZSBvZiBDTEEgYnl0ZSBpbiB0aGUgY29tbWFuZCBBUERVIGhlYWRlcgotICAgIHN0YXRpYyBmaW5hbCBieXRlIFNzaF9DTEEgPShieXRlKTB4MDU7Ci0KLSAgICAvLyBjb2RlcyBvZiBJTlMgYnl0ZSBpbiB0aGUgY29tbWFuZCBBUERVIGhlYWRlcgotICAgIHN0YXRpYyBmaW5hbCBieXRlIERFQ1JZUFQgPSAoYnl0ZSkgMHgxMDsKLSAgICBzdGF0aWMgZmluYWwgYnl0ZSBHRVRfS0VZTEVOR1RIID0gKGJ5dGUpIDB4MjA7Ci0gICAgc3RhdGljIGZpbmFsIGJ5dGUgR0VUX1BVQktFWSA9IChieXRlKSAweDMwOwotICAgIHN0YXRpYyBmaW5hbCBieXRlIEdFVF9WRVJTSU9OID0gKGJ5dGUpIDB4MzI7Ci0gICAgc3RhdGljIGZpbmFsIGJ5dGUgR0VUX1JFU1BPTlNFID0gKGJ5dGUpIDB4YzA7Ci0KLSAgICBzdGF0aWMgZmluYWwgc2hvcnQga2V5c2l6ZSA9IDEwMjQ7Ci0gICAgc3RhdGljIGZpbmFsIHNob3J0IHJvb3RfZmlkID0gKHNob3J0KTB4M2YwMDsKLSAgICBzdGF0aWMgZmluYWwgc2hvcnQgcHJpdmtleV9maWQgPSAoc2hvcnQpMHgwMDEyOwotICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBwdWJrZXlfZmlkID0gKHNob3J0KSgoJ3MnPDw4KXwnaCcpOwotCi0gICAgLyogaW5zdGFuY2UgdmFyaWFibGVzIGRlY2xhcmF0aW9uICovCi0gICAgQXN5bUtleSByc2FrZXk7Ci0gICAgQ3liZXJmbGV4RmlsZSBmaWxlOwotICAgIEN5YmVyZmxleE9TIG9zOwotCi0gICAgcHJpdmF0ZSBTc2goKQotICAgIHsKLQlmaWxlID0gbmV3IEN5YmVyZmxleEZpbGUoKTsKLQlvcyA9IG5ldyBDeWJlcmZsZXhPUygpOwotCi0JcnNha2V5ID0gbmV3IFJTQV9DUlRfUHJpdmF0ZUtleSAoa2V5c2l6ZSk7Ci0KLQlpZiAoICEgcnNha2V5LmlzU3VwcG9ydGVkTGVuZ3RoIChrZXlzaXplKSApCi0JICAgIElTT0V4Y2VwdGlvbi50aHJvd0l0IChJU08uU1dfV1JPTkdfTEVOR1RIKTsKLQotCXJlZ2lzdGVyKCk7Ci0gICAgfSAvLyBlbmQgb2YgdGhlIGNvbnN0cnVjdG9yCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoKSB7Ci0JaWYgKCFyc2FrZXkuaXNJbml0aWFsaXplZCgpKQotCSAgICByc2FrZXkuc2V0S2V5SW5zdGFuY2UgKChzaG9ydCkweGM4LCAoc2hvcnQpMHgxMCk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChBUERVIGFwZHUpCi0gICAgewotCW5ldyBTc2goKTsJLy8gY3JlYXRlIGEgU3NoIGFwcGxldCBpbnN0YW5jZSAoY2FyZCkKLSAgICB9IC8vIGVuZCBvZiBpbnN0YWxsIG1ldGhvZAotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCUlTT0V4Y2VwdGlvbi50aHJvd0l0KChzaG9ydCkgMHg5MDAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKEFQRFUgYXBkdSkKLSAgICB7Ci0JLy8gQVBEVSBvYmplY3QgY2FycmllcyBhIGJ5dGUgYXJyYXkgKGJ1ZmZlcikgdG8KLQkvLyB0cmFuc2ZlciBpbmNvbWluZyBhbmQgb3V0Z29pbmcgQVBEVSBoZWFkZXIKLQkvLyBhbmQgZGF0YSBieXRlcyBiZXR3ZWVuIGNhcmQgYW5kIENBRAotCWJ5dGUgYnVmZmVyW10gPSBhcGR1LmdldEJ1ZmZlcigpOwotCXNob3J0IHNpemUsIHN0OwotCi0JLy8gdmVyaWZ5IHRoYXQgaWYgdGhlIGFwcGxldCBjYW4gYWNjZXB0IHRoaXMKLQkvLyBBUERVIG1lc3NhZ2UKLQkvLyBOSTogY2hhbmdlIHN1Z2dlc3RlZCBieSBXYXluZSBEeWtzZW4sIFB1cmR1ZQotCWlmIChidWZmZXJbSVNPLk9GRlNFVF9JTlNdID09IElTTy5JTlNfU0VMRUNUKQotCSAgICBJU09FeGNlcHRpb24udGhyb3dJdChJU08uU1dfTk9fRVJST1IpOwotCi0Jc3dpdGNoIChidWZmZXJbSVNPLk9GRlNFVF9JTlNdKSB7Ci0JY2FzZSBERUNSWVBUOgotCSAgICBpZiAoYnVmZmVyW0lTTy5PRkZTRVRfQ0xBXSAhPSBTc2hfQ0xBKQotCQlJU09FeGNlcHRpb24udGhyb3dJdChJU08uU1dfQ0xBX05PVF9TVVBQT1JURUQpOwotCSAgICAvL2RlY3J5cHQgKGFwZHUpOwotCSAgICBzaXplID0gKHNob3J0KSAoYnVmZmVyW0lTTy5PRkZTRVRfTENdICYgMHgwMEZGKTsKLQotCSAgICBpZiAoYXBkdS5zZXRJbmNvbWluZ0FuZFJlY2VpdmUoKSAhPSBzaXplKQotCQlJU09FeGNlcHRpb24udGhyb3dJdCAoSVNPLlNXX1dST05HX0xFTkdUSCk7Ci0KLQkgICAgLy8gY2hlY2sgYWNjZXNzOyBkZXBlbmRzIG9uIGJpdCAyICh4L2EpCi0JICAgIGZpbGUuc2VsZWN0RmlsZShyb290X2ZpZCk7Ci0JICAgIGZpbGUuc2VsZWN0RmlsZShwcml2a2V5X2ZpZCk7Ci0JICAgIHN0ID0gb3MuY2hlY2tBY2Nlc3MoQUNMLkVYRUNVVEUpOwotCSAgICBpZiAoc3QgIT0gU1QuQUNDRVNTX0NMRUFSRUQpIHsKLQkJQ3liZXJmbGV4QVBEVS5wcmVwYXJlU1cxU1cyKHN0KTsKLQkJSVNPRXhjZXB0aW9uLnRocm93SXQoQ3liZXJmbGV4QVBEVS5nZXRTVzFTVzIoKSk7Ci0JICAgIH0KLQotCSAgICByc2FrZXkuY3J5cHRvVXBkYXRlIChidWZmZXIsIChzaG9ydCkgSVNPLk9GRlNFVF9DREFUQSwgc2l6ZSwKLQkJCQkgYnVmZmVyLCAoc2hvcnQpIElTTy5PRkZTRVRfQ0RBVEEpOwotCi0JICAgIGFwZHUuc2V0T3V0Z29pbmdBbmRTZW5kICgoc2hvcnQpIElTTy5PRkZTRVRfQ0RBVEEsIHNpemUpOwotCSAgICBicmVhazsKLQljYXNlIEdFVF9QVUJLRVk6Ci0JICAgIGZpbGUuc2VsZWN0RmlsZShyb290X2ZpZCk7IC8vIHNlbGVjdCByb290Ci0JICAgIGZpbGUuc2VsZWN0RmlsZShwdWJrZXlfZmlkKTsgLy8gc2VsZWN0IHB1YmxpYyBrZXkgZmlsZQotCSAgICBzaXplID0gKHNob3J0KShmaWxlLmdldEZpbGVTaXplKCkgLSAxNik7Ci0JICAgIHN0ID0gb3MucmVhZEJpbmFyeUZpbGUoYnVmZmVyLCAoc2hvcnQpMCwgKHNob3J0KTAsIHNpemUpOwotCSAgICBpZiAoc3QgPT0gU1QuU1VDQ0VTUykKLQkJYXBkdS5zZXRPdXRnb2luZ0FuZFNlbmQoKHNob3J0KTAsIHNpemUpOwotCSAgICBlbHNlIHsKLQkJQ3liZXJmbGV4QVBEVS5wcmVwYXJlU1cxU1cyKHN0KTsKLQkJSVNPRXhjZXB0aW9uLnRocm93SXQoQ3liZXJmbGV4QVBEVS5nZXRTVzFTVzIoKSk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBHRVRfS0VZTEVOR1RIOgotCSAgICBVdGlsLnNldFNob3J0KGJ1ZmZlciwgKHNob3J0KTAsIGtleXNpemUpOwotCSAgICBhcGR1LnNldE91dGdvaW5nQW5kU2VuZCAoKHNob3J0KTAsIChzaG9ydCkyKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBHRVRfVkVSU0lPTjoKLQkgICAgVXRpbC5zZXRTaG9ydChidWZmZXIsIChzaG9ydCkwLCBhcHBsZXRfdmVyc2lvbik7Ci0JICAgIGFwZHUuc2V0T3V0Z29pbmdBbmRTZW5kICgoc2hvcnQpMCwgKHNob3J0KTIpOwotCSAgICBicmVhazsKLQljYXNlIEdFVF9SRVNQT05TRToKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgSVNPRXhjZXB0aW9uLnRocm93SXQgKElTTy5TV19JTlNfTk9UX1NVUFBPUlRFRCk7Ci0JfQotCi0gICAgfSAvLyBlbmQgb2YgcHJvY2VzcyBtZXRob2QKLQotfSAvLyBlbmQgb2YgY2xhc3MgU3NoCg==